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 | /* |
