Skip to content

Commit 5a1603b

Browse files
pmundttorvalds
authored andcommitted
nommu: Correct kobjsize() page validity checks.
This implements a few changes on top of the recent kobjsize() refactoring introduced by commit 6cfd53f. As Christoph points out: virt_to_head_page cannot return NULL. virt_to_page also does not return NULL. pfn_valid() needs to be used to figure out if a page is valid. Otherwise the page struct reference that was returned may have PageReserved() set to indicate that it is not a valid page. As discussed further in the thread, virt_addr_valid() is the preferable way to validate the object pointer in this case. In addition to fixing up the reserved page case, it also has the benefit of encapsulating the hack introduced by commit 4016a13 on the impacted platforms, allowing us to get rid of the extra checking in kobjsize() for the platforms that don't perform this type of bizarre memory_end abuse (every nommu platform that isn't blackfin). If blackfin decides to get in line with every other platform and use PageReserved for the DMA pages in question, kobjsize() will also continue to work fine. It also turns out that compound_order() will give us back 0-order for non-head pages, so we can get rid of the PageCompound check and just use compound_order() directly. Clean that up while we're at it. Signed-off-by: Paul Mundt <[email protected]> Reviewed-by: Christoph Lameter <[email protected]> Acked-by: David Howells <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent f969c56 commit 5a1603b

File tree

1 file changed

+3
-18
lines changed

1 file changed

+3
-18
lines changed

mm/nommu.c

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -104,21 +104,15 @@ EXPORT_SYMBOL(vmtruncate);
104104
unsigned int kobjsize(const void *objp)
105105
{
106106
struct page *page;
107-
int order = 0;
108107

109108
/*
110109
* If the object we have should not have ksize performed on it,
111110
* return size of 0
112111
*/
113-
if (!objp)
114-
return 0;
115-
116-
if ((unsigned long)objp >= memory_end)
112+
if (!objp || !virt_addr_valid(objp))
117113
return 0;
118114

119115
page = virt_to_head_page(objp);
120-
if (!page)
121-
return 0;
122116

123117
/*
124118
* If the allocator sets PageSlab, we know the pointer came from
@@ -129,18 +123,9 @@ unsigned int kobjsize(const void *objp)
129123

130124
/*
131125
* The ksize() function is only guaranteed to work for pointers
132-
* returned by kmalloc(). So handle arbitrary pointers, that we expect
133-
* always to be compound pages, here.
134-
*/
135-
if (PageCompound(page))
136-
order = compound_order(page);
137-
138-
/*
139-
* Finally, handle arbitrary pointers that don't set PageSlab.
140-
* Default to 0-order in the case when we're unable to ksize()
141-
* the object.
126+
* returned by kmalloc(). So handle arbitrary pointers here.
142127
*/
143-
return PAGE_SIZE << order;
128+
return PAGE_SIZE << compound_order(page);
144129
}
145130

146131
/*

0 commit comments

Comments
 (0)