From: Paul Mundt Date: Thu, 8 Jan 2009 12:04:48 +0000 (+0000) Subject: NOMMU: Teach kobjsize() about VMA regions. X-Git-Tag: v2.6.29-rc1~22^2~1 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=ab2e83ead4eca9e045daac4cbf66eb1e7a244bb2;p=linux-2.6-omap-h63xx.git 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 Signed-off-by: David Howells Tested-by: Mike Frysinger --- diff --git a/mm/nommu.c b/mm/nommu.c index a6e8ccfbd40..60ed8375c98 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -148,6 +148,20 @@ unsigned int kobjsize(const void *objp) if (PageSlab(page)) 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 * returned by kmalloc(). So handle arbitrary pointers here.