lib/genalloc.c: Add power aligned algorithm
Subsystems (6)
PATCH v6 1/5 lib/genalloc.c: Add power aligned algorithm
One of the more common algorithms used for allocation is to align the start address of the allocation to the order of size requested. Add this as an algorithm option for genalloc.
--- include/linux/genalloc.h | 4 ++++ lib/genalloc.c | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+)
include/linux/genalloc.h +4 -0
@@ -110,6 +110,10 @@ extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,extern unsigned long gen_pool_first_fit (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data); +extern unsigned long gen_pool_first_fit_order_align (unsigned long *map, +unsigned long size,unsigned long start,unsigned int nr, +void *data); +extern unsigned long gen_pool_best_fit (unsigned long *map,unsigned long size,unsigned long start,unsigned int nr,void *data);
lib/genalloc.c +21 -0
@@ -481,6 +481,27 @@ unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,EXPORT_SYMBOL (gen_pool_first_fit);/** +* gen_pool_first_fit_order_align - find the first available region +* of memory matching the size requirement. The region will be aligned +* to the order of the size specified. +* @map: The address to base the search on +* @size: The bitmap size in bits +* @start: The bitnumber to start searching at +* @nr: The number of zeroed bits we're looking for +* @data: additional data - unused +*/ +unsigned long gen_pool_first_fit_order_align (unsigned long *map, +unsigned long size,unsigned long start, +unsigned int nr,void *data) +{ +unsigned long order = (unsigned long ) data; +unsigned long align_mask = (1 <<get_order (nr << order)) -1 ; + +return bitmap_find_next_zero_area (map, size, start, nr, align_mask); +} +EXPORT_SYMBOL (gen_pool_first_fit_order_align); + +/** * gen_pool_best_fit - find the best fitting region of memory * macthing the size requirement (no alignment constraint) * @map: The address to base the search on
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 2/5 lib/genalloc.c: Add genpool range check function
After allocating an address from a particular genpool, there is no good way to verify if that address actually belongs to a genpool. Introduce addr_in_gen_pool which will return if an address plus size falls completely within the genpool range.
--- include/linux/genalloc.h | 3 +++ lib/genalloc.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+)
include/linux/genalloc.h +3 -0
@@ -121,6 +121,9 @@ extern struct gen_pool *devm_gen_pool_create(struct device *dev, int min_alloc_order, int nid);extern struct gen_pool *dev_get_gen_pool (struct device *dev); +bool addr_in_gen_pool (struct gen_pool *pool,unsigned long start, +size_t size); +#ifdef CONFIG_OF extern struct gen_pool *of_get_named_gen_pool (struct device_node *np,const char *propname,int index);
lib/genalloc.c +29 -0
@@ -403,6 +403,35 @@ void gen_pool_for_each_chunk(struct gen_pool *pool,EXPORT_SYMBOL (gen_pool_for_each_chunk);/** +* addr_in_gen_pool - checks if an address falls within the range of a pool +* @pool: the generic memory pool +* @start: start address +* @size: size of the region +* +* Check if the range of addresses falls within the specified pool. Takes +* the rcu_read_lock for the duration of the check. +*/ +bool addr_in_gen_pool (struct gen_pool *pool,unsigned long start, +size_t size) +{ +bool found = false; +unsigned long end = start + size; +struct gen_pool_chunk *chunk; + +rcu_read_lock (); +list_for_each_entry_rcu (chunk, &(pool)->chunks, next_chunk) { +if (start >= chunk->start_addr && start <= chunk->end_addr) { +if (end <= chunk->end_addr) { + found = true; +break ; + } + } + } +rcu_read_unlock (); +return found; +} + +/** * gen_pool_avail - get available free space of the pool * @pool: pool to get available free space *
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
Andrew Morton
maintainerRe: [PATCHv6 2/5] lib/genalloc.c: Add genpool range check function
Quoted 9 lines · On Fri, 8 Aug 2014 13:23:14 -0700 Laura Abbott <[email protected]> wrote:
After allocating an address from a particular genpool, there is no good way to verify if that address actually belongs to a genpool. Introduce
addr_in_gen_poolwhich will return if an address plus size falls completely within the genpool range....
Quoted 7 lines
/**
+ *addr_in_gen_pool- checks if an address falls within the range of a pool
+ * @pool: the generic memory pool
+ * @start: start address
+ * @size: size of the region
+ *
+ * Check if the range of addresses falls within the specified pool.
This description should make it clear that the entire range must be within the pool - that an overlap is "no".
Quoted 2 lines
Takes
+ * thercu_read_lockfor the duration of the check.
I don't think this part is worth including.
Quoted 20 lines
+ */
lib/genalloc.c +19
-0+bool addr_in_gen_pool (struct gen_pool *pool,unsigned long start, +size_t size) +{ +bool found = false; +unsigned long end = start + size; +struct gen_pool_chunk *chunk; + +rcu_read_lock (); +list_for_each_entry_rcu (chunk, &(pool)->chunks, next_chunk) { +if (start >= chunk->start_addr && start <= chunk->end_addr) { +if (end <= chunk->end_addr) { + found = true; +break ; + } + } + } +rcu_read_unlock (); +return found; +}
PATCH v6 3/5 common: dma-mapping: Introduce common remapping functions
In reply to Laura AbbottFor architectures without coherent DMA, memory for DMA may need to be remapped with coherent attributes. Factor out the the remapping code from arm and put it in a common location to reduce code duplication.
As part of this, the arm APIs are now migrated away from ioremap_page_range to the common APIs which use map_vm_area for remapping. This should be an equivalent change and using map_vm_area is more correct as ioremap_page_range is intended to bring in io addresses into the cpu space and not regular kernel managed memory.
--- arch/arm/mm/dma-mapping.c | 57 +++++---------------------- drivers/base/dma-mapping.c | 67 ++++++++++++++++++++++++++++++++ include/asm-generic/dma-mapping-common.h | 9 +++++ 3 files changed, 85 insertions(+), 48 deletions(-)
arch/arm/mm/dma-mapping.c +9 -48
@@ -297,37 +297,19 @@ static void * __dma_alloc_remap(struct page *page, size_t size, gfp_t gfp, pgprot_t prot, const void *caller) { - struct vm_struct *area; -unsigned long addr; - /* * DMA allocation can be mapped to user space, so lets * set VM_USERMAP flags too. */ - area =get_vm_area_caller (size,VM_ARM_DMA_CONSISTENT |VM_USERMAP , - caller); -if (!area) -return NULL ; - addr = (unsigned long )area->addr; - area->phys_addr =__pfn_to_phys (page_to_pfn (page)); - -if (ioremap_page_range (addr, addr + size, area->phys_addr, prot)) { -vunmap ((void *)addr); -return NULL ; - } -return (void *)addr; + return dma_common_contiguous_remap(page, size, + VM_ARM_DMA_CONSISTENT | VM_USERMAP, + prot, caller); }static void __dma_free_remap (void *cpu_addr,size_t size) { -unsigned int flags =VM_ARM_DMA_CONSISTENT |VM_USERMAP ; -struct vm_struct *area =find_vm_area (cpu_addr); -if (!area || (area->flags & flags) != flags) { -WARN (1 ,"trying to free invalid coherent area: %p\n" , cpu_addr); -return ; - } -unmap_kernel_range ((unsigned long )cpu_addr, size); -vunmap (cpu_addr); +dma_common_free_remap (cpu_addr, size, +VM_ARM_DMA_CONSISTENT |VM_USERMAP ); }#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K
@@ -1261,29 +1243,8 @@ static void * __iommu_alloc_remap(struct page **pages, size_t size, gfp_t gfp, pgprot_t prot, const void *caller) { - unsigned int i, nr_pages = PAGE_ALIGN(size) >> PAGE_SHIFT; -struct vm_struct *area; -unsigned long p; - - area =get_vm_area_caller (size,VM_ARM_DMA_CONSISTENT |VM_USERMAP , - caller); -if (!area) -return NULL ; - - area->pages = pages; - area->nr_pages = nr_pages; - p = (unsigned long )area->addr; - -for (i =0 ; i < nr_pages; i++) { -phys_addr_t phys =__pfn_to_phys (page_to_pfn (pages[i])); -if (ioremap_page_range (p, p +PAGE_SIZE , phys, prot)) - goto err; - p +=PAGE_SIZE ; - } -return area->addr; -err: -unmap_kernel_range ((unsigned long )area->addr, size); -vunmap (area->addr); + return dma_common_pages_remap(pages, size, + VM_ARM_DMA_CONSISTENT | VM_USERMAP, prot, caller);return NULL ; }
@@ -1491,8 +1452,8 @@ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, }if (!dma_get_attr (DMA_ATTR_NO_KERNEL_MAPPING , attrs)) { -unmap_kernel_range ((unsigned long )cpu_addr, size); -vunmap (cpu_addr); +dma_common_free_remap (cpu_addr, size, +VM_ARM_DMA_CONSISTENT |VM_USERMAP ); }__iommu_remove_mapping (dev, handle, size);
drivers/base/dma-mapping.c +67 -0
76 lines not on this page · raw message
include/asm-generic/dma-mapping-common.h +9 -0
@@ -179,6 +179,15 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,extern int dma_common_mmap (struct device *dev,struct vm_area_struct *vma,void *cpu_addr,dma_addr_t dma_addr,size_t size); +void *dma_common_contiguous_remap (struct page *page,size_t size, +unsigned long vm_flags, +pgprot_t prot,const void *caller); + +void *dma_common_pages_remap (struct page **pages,size_t size, +unsigned long vm_flags,pgprot_t prot, +const void *caller); +void dma_common_free_remap (void *cpu_addr,size_t size,unsigned long vm_flags); +/** * dma_mmap_attrs - map a coherent DMA allocation into user space * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
Andrew Morton
maintainerRe: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
Quoted 28 lines · On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <[email protected]> wrote:
For architectures without coherent DMA, memory for DMA may need to be remapped with coherent attributes. Factor out the the remapping code from arm and put it in a common location to reduce code duplication.
As part of this, the arm APIs are now migrated away from
ioremap_page_rangeto the common APIs which usemap_vm_areafor remapping. This should be an equivalent change and usingmap_vm_areais more correct asioremap_page_rangeis intended to bring in io addresses into the cpu space and not regular kernel managed memory....
drivers/base/dma-mapping.c +10
-0@@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,return ret; }EXPORT_SYMBOL (dma_common_mmap); + +/* +* remaps an allocated contiguous region into another vm_area. +* Cannot be used in non-sleeping contexts +*/ + +void *dma_common_contiguous_remap (struct page *page,size_t size, +unsigned long vm_flags, +pgprot_t prot,const void *caller) +{
drivers/base/dma-mapping.c int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, · line 291
Quoted 10 lines
drivers/base/dma-mapping.c +10
-0+int i; +struct page **pages; +void *ptr; + + pages =kmalloc (sizeof (struct page *) <<get_order (size),GFP_KERNEL ); +if (!pages) +return NULL ; + +for (i =0 ; i < (size >>PAGE_SHIFT ); i++) + pages[i] = page + i;
Assumes a single mem_map[] array. That's not the case for sparsemem (at least).
Quoted 7 lines
drivers/base/dma-mapping.c +7
-0+ ptr =dma_common_pages_remap (pages, size, vm_flags, prot, caller); + +kfree (pages); + +return ptr; +} +
Re: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
Quoted 35 lines · Andrew Morton
Quoted 33 lines · On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <[email protected]> wrote:
For architectures without coherent DMA, memory for DMA may need to be remapped with coherent attributes. Factor out the the remapping code from arm and put it in a common location to reduce code duplication.
As part of this, the arm APIs are now migrated away from
ioremap_page_rangeto the common APIs which usemap_vm_areafor remapping. This should be an equivalent change and usingmap_vm_areais more correct asioremap_page_rangeis intended to bring in io addresses into the cpu space and not regular kernel managed memory....
drivers/base/dma-mapping.c +15
-0@@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,return ret; }EXPORT_SYMBOL (dma_common_mmap); + +/* +* remaps an allocated contiguous region into another vm_area. +* Cannot be used in non-sleeping contexts +*/ + +void *dma_common_contiguous_remap (struct page *page,size_t size, +unsigned long vm_flags, +pgprot_t prot,const void *caller) +{ +int i; +struct page **pages; +void *ptr; + + pages =kmalloc (sizeof (struct page *) <<get_order (size),GFP_KERNEL );
Quoted 10 lines
drivers/base/dma-mapping.c int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, · line 291
Quoted 5 lines
drivers/base/dma-mapping.c +5
-0+if (!pages) +return NULL ; + +for (i =0 ; i < (size >>PAGE_SHIFT ); i++) + pages[i] = page + i;Assumes a single mem_map[] array. That's not the case for sparsemem (at least).
Good point. I guess the best option is to increment via pfn and call pfn_to_page. Either that or go back to slightly abusing ioremap_page_range to remap normal memory.
Thanks,
Laura
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation
Catalin Marinas
maintainerRe: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
Quoted 43 lines · Laura Abbott
Quoted 33 lines · Andrew Morton
Quoted 32 lines · On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <[email protected]> wrote:
For architectures without coherent DMA, memory for DMA may need to be remapped with coherent attributes. Factor out the the remapping code from arm and put it in a common location to reduce code duplication.
As part of this, the arm APIs are now migrated away from
ioremap_page_rangeto the common APIs which usemap_vm_areafor remapping. This should be an equivalent change and usingmap_vm_areais more correct asioremap_page_rangeis intended to bring in io addresses into the cpu space and not regular kernel managed memory....
drivers/base/dma-mapping.c +15
-0@@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,return ret; }EXPORT_SYMBOL (dma_common_mmap); + +/* +* remaps an allocated contiguous region into another vm_area. +* Cannot be used in non-sleeping contexts +*/ + +void *dma_common_contiguous_remap (struct page *page,size_t size, +unsigned long vm_flags, +pgprot_t prot,const void *caller) +{ +int i; +struct page **pages; +void *ptr; + + pages =kmalloc (sizeof (struct page *) <<get_order (size),GFP_KERNEL );Quoted 8 lines
drivers/base/dma-mapping.c int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, · line 291
Quoted 5 lines
drivers/base/dma-mapping.c +5
-0+if (!pages) +return NULL ; + +for (i =0 ; i < (size >>PAGE_SHIFT ); i++) + pages[i] = page + i;Assumes a single mem_map[] array. That's not the case for sparsemem (at least).
Quoted 3 lines
Good point. I guess the best option is to increment via pfn and call
pfn_to_page. Either that or go back to slightly abusingioremap_page_rangeto remap normal memory.
I now noticed you suggested the pfn_to_page(). I think this should work and it's better than ioremap_page_range().
Signature · 1 line
Catalin
Catalin Marinas
maintainerRe: [PATCHv6 3/5] common: dma-mapping: Introduce common remapping functions
In reply to Andrew MortonQuoted 33 lines · Andrew Morton
Quoted 32 lines · On Fri, 8 Aug 2014 13:23:15 -0700 Laura Abbott <[email protected]> wrote:
For architectures without coherent DMA, memory for DMA may need to be remapped with coherent attributes. Factor out the the remapping code from arm and put it in a common location to reduce code duplication.
As part of this, the arm APIs are now migrated away from
ioremap_page_rangeto the common APIs which usemap_vm_areafor remapping. This should be an equivalent change and usingmap_vm_areais more correct asioremap_page_rangeis intended to bring in io addresses into the cpu space and not regular kernel managed memory....
drivers/base/dma-mapping.c +15
-0@@ -267,3 +269,68 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,return ret; }EXPORT_SYMBOL (dma_common_mmap); + +/* +* remaps an allocated contiguous region into another vm_area. +* Cannot be used in non-sleeping contexts +*/ + +void *dma_common_contiguous_remap (struct page *page,size_t size, +unsigned long vm_flags, +pgprot_t prot,const void *caller) +{ +int i; +struct page **pages; +void *ptr; + + pages =kmalloc (sizeof (struct page *) <<get_order (size),GFP_KERNEL );
Quoted 8 lines
drivers/base/dma-mapping.c int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, · line 291
Quoted 5 lines
drivers/base/dma-mapping.c +5
-0+if (!pages) +return NULL ; + +for (i =0 ; i < (size >>PAGE_SHIFT ); i++) + pages[i] = page + i;Assumes a single mem_map[] array. That's not the case for sparsemem (at least).
Good point. The "page" pointer (and memory range) passed to this function has been allocated with alloc_pages(), so the range is guaranteed to be physically contiguous but it does not imply a single mem_map[] array. For arm64 with SPARSEMEM_VMEMMAP_ENABLE it's safe but not all architectures use this (especially on 32-bit).
What about using pfn_to_page(pfn + i)?
Thanks.
Signature · 1 line
Catalin
PATCH v6 4/5 arm: use genalloc for the atomic pool
In reply to Laura AbbottARM currently uses a bitmap for tracking atomic allocations. genalloc already handles this type of memory pool allocation so switch to using that instead.
--- arch/arm/Kconfig | 1 + arch/arm/mm/dma-mapping.c | 153 +++++++++++++++------------------------------- 2 files changed, 50 insertions(+), 104 deletions(-)
arch/arm/Kconfig +1 -0
@@ -14,6 +14,7 @@ config ARM select CLONE_BACKWARDS select CPU_PM if (SUSPEND || CPU_IDLE) select DCACHE_WORD_ACCESS if HAVE_EFFICIENT_UNALIGNED_ACCESS + select GENERIC_ALLOCATOR select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI) select GENERIC_CLOCKEVENTS_BROADCAST if SMP select GENERIC_IDLE_POLL_SETUP
arch/arm/mm/dma-mapping.c +49 -104
231 lines not on this page · raw message
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
PATCH v6 5/5 arm64: Add atomic pool for non-coherent and CMA allocations.
In reply to Laura AbbottNeither CMA nor noncoherent allocations support atomic allocations. Add a dedicated atomic pool to support this.
--- arch/arm64/Kconfig | 1 + arch/arm64/mm/dma-mapping.c | 164 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 146 insertions(+), 19 deletions(-)
arch/arm64/Kconfig +1 -0
@@ -16,6 +16,7 @@ config ARM64 select COMMON_CLK select CPU_PM if (SUSPEND || CPU_IDLE) select DCACHE_WORD_ACCESS + select GENERIC_ALLOCATOR select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS_BROADCAST if SMP select GENERIC_CPU_AUTOPROBE
arch/arm64/mm/dma-mapping.c +145 -19
233 lines not on this page · raw message
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation
Andrew Morton
maintainerQuoted 10 lines · On Fri, 8 Aug 2014 13:23:13 -0700 Laura Abbott <[email protected]> wrote:
One of the more common algorithms used for allocation is to align the start address of the allocation to the order of size requested. Add this as an algorithm option for genalloc.
lib/genalloc.c +0
-0@@ -481,6 +481,27 @@ unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,EXPORT_SYMBOL (gen_pool_first_fit);
lib/genalloc.c unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, · line 491
Quoted 10 lines
lib/genalloc.c +8
-0/** +* gen_pool_first_fit_order_align - find the first available region +* of memory matching the size requirement. The region will be aligned +* to the order of the size specified. +* @map: The address to base the search on +* @size: The bitmap size in bits +* @start: The bitnumber to start searching at +* @nr: The number of zeroed bits we're looking for +* @data: additional data - unused
`data' is used.
lib/genalloc.c unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, · line 497
Quoted 6 lines
lib/genalloc.c +6
-0+*/ +unsigned long gen_pool_first_fit_order_align (unsigned long *map, +unsigned long size,unsigned long start, +unsigned int nr,void *data) +{ +unsigned long order = (unsigned long ) data;
Why pass a void*? Why not pass "unsigned order;"?
Quoted 10 lines
lib/genalloc.c +7
-0+unsigned long align_mask = (1 <<get_order (nr << order)) -1 ; + +return bitmap_find_next_zero_area (map, size, start, nr, align_mask); +} +EXPORT_SYMBOL (gen_pool_first_fit_order_align); + +/** * gen_pool_best_fit - find the best fitting region of memory * macthing the size requirement (no alignment constraint) * @map: The address to base the search on
Quoted 34 lines · Andrew Morton
Quoted 10 lines · On Fri, 8 Aug 2014 13:23:13 -0700 Laura Abbott <[email protected]> wrote:
One of the more common algorithms used for allocation is to align the start address of the allocation to the order of size requested. Add this as an algorithm option for genalloc.
lib/genalloc.c +0
-0@@ -481,6 +481,27 @@ unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,EXPORT_SYMBOL (gen_pool_first_fit);lib/genalloc.c unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, · line 491
Quoted 10 lines
lib/genalloc.c +8
-0/** +* gen_pool_first_fit_order_align - find the first available region +* of memory matching the size requirement. The region will be aligned +* to the order of the size specified. +* @map: The address to base the search on +* @size: The bitmap size in bits +* @start: The bitnumber to start searching at +* @nr: The number of zeroed bits we're looking for +* @data: additional data - unused `data' is used.
lib/genalloc.c unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, · line 497
Quoted 6 lines
lib/genalloc.c +6
-0+*/ +unsigned long gen_pool_first_fit_order_align (unsigned long *map, +unsigned long size,unsigned long start, +unsigned int nr,void *data) +{ +unsigned long order = (unsigned long ) data;Why pass a void*? Why not pass "unsigned order;"?
Quoted 11 lines
lib/genalloc.c unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, · line 507
Quoted 10 lines
lib/genalloc.c +7
-0+unsigned long align_mask = (1 <<get_order (nr << order)) -1 ; + +return bitmap_find_next_zero_area (map, size, start, nr, align_mask); +} +EXPORT_SYMBOL (gen_pool_first_fit_order_align); + +/** * gen_pool_best_fit - find the best fitting region of memory * macthing the size requirement (no alignment constraint) * @map: The address to base the search on
Ugh, I sent out the wrong version of this one which updated the function to not need the parameter. I'll update with the correct version in v7.
Laura
Signature · 2 lines
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation