diff options
Diffstat (limited to 'kernel/resource.c')
| -rw-r--r-- | kernel/resource.c | 49 | 
1 files changed, 33 insertions, 16 deletions
diff --git a/kernel/resource.c b/kernel/resource.c index 7ea4306503c5..76036a41143b 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -487,8 +487,8 @@ int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,  	while (start < end &&  	       !find_next_iomem_res(start, end, flags, IORES_DESC_NONE,  				    false, &res)) { -		pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT; -		end_pfn = (res.end + 1) >> PAGE_SHIFT; +		pfn = PFN_UP(res.start); +		end_pfn = PFN_DOWN(res.end + 1);  		if (end_pfn > pfn)  			ret = (*func)(pfn, end_pfn - pfn, arg);  		if (ret) @@ -1644,19 +1644,8 @@ void resource_list_free(struct list_head *head)  EXPORT_SYMBOL(resource_list_free);  #ifdef CONFIG_DEVICE_PRIVATE -/** - * devm_request_free_mem_region - find free region for device private memory - * - * @dev: device struct to bind the resource to - * @size: size in bytes of the device memory to add - * @base: resource tree to look in - * - * This function tries to find an empty range of physical address big enough to - * contain the new resource, so that it can later be hotplugged as ZONE_DEVICE - * memory, which in turn allocates struct pages. - */ -struct resource *devm_request_free_mem_region(struct device *dev, -		struct resource *base, unsigned long size) +static struct resource *__request_free_mem_region(struct device *dev, +		struct resource *base, unsigned long size, const char *name)  {  	resource_size_t end, addr;  	struct resource *res; @@ -1670,7 +1659,10 @@ struct resource *devm_request_free_mem_region(struct device *dev,  				REGION_DISJOINT)  			continue; -		res = devm_request_mem_region(dev, addr, size, dev_name(dev)); +		if (dev) +			res = devm_request_mem_region(dev, addr, size, name); +		else +			res = request_mem_region(addr, size, name);  		if (!res)  			return ERR_PTR(-ENOMEM);  		res->desc = IORES_DESC_DEVICE_PRIVATE_MEMORY; @@ -1679,7 +1671,32 @@ struct resource *devm_request_free_mem_region(struct device *dev,  	return ERR_PTR(-ERANGE);  } + +/** + * devm_request_free_mem_region - find free region for device private memory + * + * @dev: device struct to bind the resource to + * @size: size in bytes of the device memory to add + * @base: resource tree to look in + * + * This function tries to find an empty range of physical address big enough to + * contain the new resource, so that it can later be hotplugged as ZONE_DEVICE + * memory, which in turn allocates struct pages. + */ +struct resource *devm_request_free_mem_region(struct device *dev, +		struct resource *base, unsigned long size) +{ +	return __request_free_mem_region(dev, base, size, dev_name(dev)); +}  EXPORT_SYMBOL_GPL(devm_request_free_mem_region); + +struct resource *request_free_mem_region(struct resource *base, +		unsigned long size, const char *name) +{ +	return __request_free_mem_region(NULL, base, size, name); +} +EXPORT_SYMBOL_GPL(request_free_mem_region); +  #endif /* CONFIG_DEVICE_PRIVATE */  static int __init strict_iomem(char *str)  |