@@ -110,6 +110,7 @@ extern void __online_page_increment_counters(struct page *page);
extern void __online_page_free(struct page *page);
extern int try_online_node(int nid);
+int check_hotplug_memory_addressable(u64 start, u64 size);
extern int arch_add_memory(int nid, u64 start, u64 size,
struct mhp_restrictions *restrictions);
@@ -1030,6 +1030,17 @@ int try_online_node(int nid)
return ret;
}
+int check_hotplug_memory_addressable(u64 start, u64 size)
+{
+#ifdef MAX_PHYSMEM_BITS
+ if ((start + size - 1) >> MAX_PHYSMEM_BITS)
+ return -E2BIG;
+#endif
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(check_hotplug_memory_addressable);
+
static int check_hotplug_memory_range(u64 start, u64 size)
{
/* memory range must be block size aligned */
@@ -1040,7 +1051,7 @@ static int check_hotplug_memory_range(u64 start, u64 size)
return -EINVAL;
}
- return 0;
+ return check_hotplug_memory_addressable(start, size);
}
static int online_memory_block(struct memory_block *mem, void *arg)