diff options
Diffstat (limited to 'mm/nommu.c')
-rw-r--r-- | mm/nommu.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/mm/nommu.c b/mm/nommu.c index dca93fcb8b7a..4462b6a3fcb9 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -109,16 +109,23 @@ unsigned int kobjsize(const void *objp) | |||
109 | * If the object we have should not have ksize performed on it, | 109 | * If the object we have should not have ksize performed on it, |
110 | * return size of 0 | 110 | * return size of 0 |
111 | */ | 111 | */ |
112 | if (!objp || (unsigned long)objp >= memory_end || !((page = virt_to_page(objp)))) | 112 | if (!objp || !virt_addr_valid(objp)) |
113 | return 0; | 113 | return 0; |
114 | 114 | ||
115 | page = virt_to_head_page(objp); | ||
116 | |||
117 | /* | ||
118 | * If the allocator sets PageSlab, we know the pointer came from | ||
119 | * kmalloc(). | ||
120 | */ | ||
115 | if (PageSlab(page)) | 121 | if (PageSlab(page)) |
116 | return ksize(objp); | 122 | return ksize(objp); |
117 | 123 | ||
118 | BUG_ON(page->index < 0); | 124 | /* |
119 | BUG_ON(page->index >= MAX_ORDER); | 125 | * The ksize() function is only guaranteed to work for pointers |
120 | 126 | * returned by kmalloc(). So handle arbitrary pointers here. | |
121 | return (PAGE_SIZE << page->index); | 127 | */ |
128 | return PAGE_SIZE << compound_order(page); | ||
122 | } | 129 | } |
123 | 130 | ||
124 | /* | 131 | /* |