forked from luck/tmp_suning_uos_patched
mm: use vm_unmapped_area() on parisc architecture
Update the parisc arch_get_unmapped_area function to make use of vm_unmapped_area() instead of implementing a brute force search. [akpm@linux-foundation.org: remove now-unused DCACHE_ALIGN(), per James] Signed-off-by: Michel Lespinasse <walken@google.com> Acked-by: Rik van Riel <riel@redhat.com> Cc: "James E.J. Bottomley" <jejb@parisc-linux.org> Acked-by: Helge Deller <deller@gmx.de> Tested-by: Helge Deller <deller@gmx.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f7a3c997af
commit
a003119771
|
@ -35,22 +35,17 @@
|
||||||
|
|
||||||
static unsigned long get_unshared_area(unsigned long addr, unsigned long len)
|
static unsigned long get_unshared_area(unsigned long addr, unsigned long len)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma;
|
struct vm_unmapped_area_info info;
|
||||||
|
|
||||||
addr = PAGE_ALIGN(addr);
|
info.flags = 0;
|
||||||
|
info.length = len;
|
||||||
for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
|
info.low_limit = PAGE_ALIGN(addr);
|
||||||
/* At this point: (!vma || addr < vma->vm_end). */
|
info.high_limit = TASK_SIZE;
|
||||||
if (TASK_SIZE - len < addr)
|
info.align_mask = 0;
|
||||||
return -ENOMEM;
|
info.align_offset = 0;
|
||||||
if (!vma || addr + len <= vma->vm_start)
|
return vm_unmapped_area(&info);
|
||||||
return addr;
|
|
||||||
addr = vma->vm_end;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DCACHE_ALIGN(addr) (((addr) + (SHMLBA - 1)) &~ (SHMLBA - 1))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We need to know the offset to use. Old scheme was to look for
|
* We need to know the offset to use. Old scheme was to look for
|
||||||
* existing mapping and use the same offset. New scheme is to use the
|
* existing mapping and use the same offset. New scheme is to use the
|
||||||
|
@ -63,30 +58,21 @@ static unsigned long get_unshared_area(unsigned long addr, unsigned long len)
|
||||||
*/
|
*/
|
||||||
static int get_offset(struct address_space *mapping)
|
static int get_offset(struct address_space *mapping)
|
||||||
{
|
{
|
||||||
int offset = (unsigned long) mapping << (PAGE_SHIFT - 8);
|
return (unsigned long) mapping >> 8;
|
||||||
return offset & 0x3FF000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned long get_shared_area(struct address_space *mapping,
|
static unsigned long get_shared_area(struct address_space *mapping,
|
||||||
unsigned long addr, unsigned long len, unsigned long pgoff)
|
unsigned long addr, unsigned long len, unsigned long pgoff)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma;
|
struct vm_unmapped_area_info info;
|
||||||
int offset = mapping ? get_offset(mapping) : 0;
|
|
||||||
|
|
||||||
offset = (offset + (pgoff << PAGE_SHIFT)) & 0x3FF000;
|
info.flags = 0;
|
||||||
|
info.length = len;
|
||||||
addr = DCACHE_ALIGN(addr - offset) + offset;
|
info.low_limit = PAGE_ALIGN(addr);
|
||||||
|
info.high_limit = TASK_SIZE;
|
||||||
for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
|
info.align_mask = PAGE_MASK & (SHMLBA - 1);
|
||||||
/* At this point: (!vma || addr < vma->vm_end). */
|
info.align_offset = (get_offset(mapping) + pgoff) << PAGE_SHIFT;
|
||||||
if (TASK_SIZE - len < addr)
|
return vm_unmapped_area(&info);
|
||||||
return -ENOMEM;
|
|
||||||
if (!vma || addr + len <= vma->vm_start)
|
|
||||||
return addr;
|
|
||||||
addr = DCACHE_ALIGN(vma->vm_end - offset) + offset;
|
|
||||||
if (addr < vma->vm_end) /* handle wraparound */
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user