|
@@ -770,7 +770,10 @@ int __remove_pages(struct zone *zone, unsigned long phys_start_pfn,
|
|
|
|
|
|
start = phys_start_pfn << PAGE_SHIFT;
|
|
|
size = nr_pages * PAGE_SIZE;
|
|
|
- ret = release_mem_region_adjustable(&iomem_resource, start, size);
|
|
|
+
|
|
|
+ /* in the ZONE_DEVICE case device driver owns the memory region */
|
|
|
+ if (!is_dev_zone(zone))
|
|
|
+ ret = release_mem_region_adjustable(&iomem_resource, start, size);
|
|
|
if (ret) {
|
|
|
resource_size_t endres = start + size - 1;
|
|
|
|
|
@@ -1207,8 +1210,13 @@ static int should_add_memory_movable(int nid, u64 start, u64 size)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int zone_for_memory(int nid, u64 start, u64 size, int zone_default)
|
|
|
+int zone_for_memory(int nid, u64 start, u64 size, int zone_default,
|
|
|
+ bool for_device)
|
|
|
{
|
|
|
+#ifdef CONFIG_ZONE_DEVICE
|
|
|
+ if (for_device)
|
|
|
+ return ZONE_DEVICE;
|
|
|
+#endif
|
|
|
if (should_add_memory_movable(nid, start, size))
|
|
|
return ZONE_MOVABLE;
|
|
|
|
|
@@ -1249,7 +1257,7 @@ int __ref add_memory(int nid, u64 start, u64 size)
|
|
|
}
|
|
|
|
|
|
/* call arch's memory hotadd */
|
|
|
- ret = arch_add_memory(nid, start, size);
|
|
|
+ ret = arch_add_memory(nid, start, size, false);
|
|
|
|
|
|
if (ret < 0)
|
|
|
goto error;
|