mm: vm_unmapped_area() lookup function
Implement vm_unmapped_area() using the rb_subtree_gap and highest_vm_end information to look up for suitable virtual address space gaps. struct vm_unmapped_area_info is used to define the desired allocation request: - lowest or highest possible address matching the remaining constraints - desired gap length - low/high address limits that the gap must fit into - alignment mask and offset Also update the generic arch_get_unmapped_area[_topdown] functions to make use of vm_unmapped_area() instead of implementing a brute force search. [akpm@linux-foundation.org: checkpatch fixes] Signed-off-by: Michel Lespinasse <walken@google.com> Reviewed-by: Rik van Riel <riel@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Russell King <linux@arm.linux.org.uk> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Paul Mundt <lethal@linux-sh.org> Cc: "David S. Miller" <davem@davemloft.net> Cc: Chris Metcalf <cmetcalf@tilera.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
e4c6bfd2d7
commit
db4fbfb952
@@ -1456,6 +1456,37 @@ extern unsigned long vm_mmap(struct file *, unsigned long,
|
||||
unsigned long, unsigned long,
|
||||
unsigned long, unsigned long);
|
||||
|
||||
struct vm_unmapped_area_info {
|
||||
#define VM_UNMAPPED_AREA_TOPDOWN 1
|
||||
unsigned long flags;
|
||||
unsigned long length;
|
||||
unsigned long low_limit;
|
||||
unsigned long high_limit;
|
||||
unsigned long align_mask;
|
||||
unsigned long align_offset;
|
||||
};
|
||||
|
||||
extern unsigned long unmapped_area(struct vm_unmapped_area_info *info);
|
||||
extern unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info);
|
||||
|
||||
/*
|
||||
* Search for an unmapped address range.
|
||||
*
|
||||
* We are looking for a range that:
|
||||
* - does not intersect with any VMA;
|
||||
* - is contained within the [low_limit, high_limit) interval;
|
||||
* - is at least the desired size.
|
||||
* - satisfies (begin_addr & align_mask) == (align_offset & align_mask)
|
||||
*/
|
||||
static inline unsigned long
|
||||
vm_unmapped_area(struct vm_unmapped_area_info *info)
|
||||
{
|
||||
if (!(info->flags & VM_UNMAPPED_AREA_TOPDOWN))
|
||||
return unmapped_area(info);
|
||||
else
|
||||
return unmapped_area_topdown(info);
|
||||
}
|
||||
|
||||
/* truncate.c */
|
||||
extern void truncate_inode_pages(struct address_space *, loff_t);
|
||||
extern void truncate_inode_pages_range(struct address_space *,
|
||||
|
||||
Reference in New Issue
Block a user