|
@@ -151,6 +151,8 @@ static DECLARE_WAIT_QUEUE_HEAD(balloon_wq);
|
|
|
static void balloon_process(struct work_struct *work);
|
|
|
static DECLARE_DELAYED_WORK(balloon_worker, balloon_process);
|
|
|
|
|
|
+static void release_memory_resource(struct resource *resource);
|
|
|
+
|
|
|
/* When ballooning out (allocating memory to return to Xen) we don't really
|
|
|
want the kernel to try too hard since that can trigger the oom killer. */
|
|
|
#define GFP_BALLOON \
|
|
@@ -267,6 +269,20 @@ static struct resource *additional_memory_resource(phys_addr_t size)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_SPARSEMEM
|
|
|
+ {
|
|
|
+ unsigned long limit = 1UL << (MAX_PHYSMEM_BITS - PAGE_SHIFT);
|
|
|
+ unsigned long pfn = res->start >> PAGE_SHIFT;
|
|
|
+
|
|
|
+ if (pfn > limit) {
|
|
|
+ pr_err("New System RAM resource outside addressable RAM (%lu > %lu)\n",
|
|
|
+ pfn, limit);
|
|
|
+ release_memory_resource(res);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
return res;
|
|
|
}
|
|
|
|