NOMMU: Teach kobjsize() about VMA regions.
Now that we no longer use compound pages for all large allocations, kobjsize() actively breaks things like binfmt_flat by always handing back PAGE_SIZE for mmap'ed regions. Fix this up by looking up the VMA region for non-compounds. Ideally binfmt_flat wants to get rid of kobjsize() completely, but this is an incremental step. Signed-off-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: David Howells <dhowells@redhat.com> Tested-by: Mike Frysinger <vapier.adi@gmail.com>
This commit is contained in:
parent
0f3e442a40
commit
ab2e83ead4
14
mm/nommu.c
14
mm/nommu.c
|
@ -148,6 +148,20 @@ unsigned int kobjsize(const void *objp)
|
||||||
if (PageSlab(page))
|
if (PageSlab(page))
|
||||||
return ksize(objp);
|
return ksize(objp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If it's not a compound page, see if we have a matching VMA
|
||||||
|
* region. This test is intentionally done in reverse order,
|
||||||
|
* so if there's no VMA, we still fall through and hand back
|
||||||
|
* PAGE_SIZE for 0-order pages.
|
||||||
|
*/
|
||||||
|
if (!PageCompound(page)) {
|
||||||
|
struct vm_area_struct *vma;
|
||||||
|
|
||||||
|
vma = find_vma(current->mm, (unsigned long)objp);
|
||||||
|
if (vma)
|
||||||
|
return vma->vm_end - vma->vm_start;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The ksize() function is only guaranteed to work for pointers
|
* The ksize() function is only guaranteed to work for pointers
|
||||||
* returned by kmalloc(). So handle arbitrary pointers here.
|
* returned by kmalloc(). So handle arbitrary pointers here.
|
||||||
|
|
Loading…
Reference in New Issue