X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=drivers%2Fxen%2Fballoon.c;h=cfab1d24e4bccd8ec12165b81d53d656f9fba3e2;hb=6cfa28eca52e58f4ee4b007babe03cd7d61ebad3;hp=12eab503efd1bb8793fff55eca83649e1f564426;hpb=6e37592900f1e75c2031ec10886f4858a260aeec;p=firefly-linux-kernel-4.4.55.git diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 12eab503efd1..cfab1d24e4bc 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -247,6 +247,19 @@ static enum bp_state update_schedule(enum bp_state state) } #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG +static void release_memory_resource(struct resource *resource) +{ + if (!resource) + return; + + /* + * No need to reset region to identity mapped since we now + * know that no I/O can be in this region + */ + release_resource(resource); + kfree(resource); +} + static struct resource *additional_memory_resource(phys_addr_t size) { struct resource *res; @@ -268,20 +281,21 @@ static struct resource *additional_memory_resource(phys_addr_t size) return NULL; } - return res; -} - -static void release_memory_resource(struct resource *resource) -{ - if (!resource) - return; +#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 - /* - * No need to reset region to identity mapped since we now - * know that no I/O can be in this region - */ - release_resource(resource); - kfree(resource); + return res; } static enum bp_state reserve_additional_memory(void)