Commit 0c24811b authored by Matthew Wilcox (Oracle)'s avatar Matthew Wilcox (Oracle) Committed by Vlastimil Babka

mm: Convert __ksize() to struct slab

In SLUB, use folios, and struct slab to access slab_cache field.
In SLOB, use folios to properly resolve pointers beyond
PAGE_SIZE offset of the object.

[ vbabka@suse.cz: use folios, and only convert folio_test_slab() == true
  folios to struct slab ]
Signed-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
Acked-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
Reviewed-by: default avatarRoman Gushchin <guro@fb.com>
parent 82c1775d
...@@ -570,7 +570,7 @@ EXPORT_SYMBOL(kfree); ...@@ -570,7 +570,7 @@ EXPORT_SYMBOL(kfree);
/* can't use ksize for kmem_cache_alloc memory, only kmalloc */ /* can't use ksize for kmem_cache_alloc memory, only kmalloc */
size_t __ksize(const void *block) size_t __ksize(const void *block)
{ {
struct page *sp; struct folio *folio;
int align; int align;
unsigned int *m; unsigned int *m;
...@@ -578,9 +578,9 @@ size_t __ksize(const void *block) ...@@ -578,9 +578,9 @@ size_t __ksize(const void *block)
if (unlikely(block == ZERO_SIZE_PTR)) if (unlikely(block == ZERO_SIZE_PTR))
return 0; return 0;
sp = virt_to_page(block); folio = virt_to_folio(block);
if (unlikely(!PageSlab(sp))) if (unlikely(!folio_test_slab(folio)))
return page_size(sp); return folio_size(folio);
align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN);
m = (unsigned int *)(block - align); m = (unsigned int *)(block - align);
......
...@@ -4527,19 +4527,17 @@ void __check_heap_object(const void *ptr, unsigned long n, struct page *page, ...@@ -4527,19 +4527,17 @@ void __check_heap_object(const void *ptr, unsigned long n, struct page *page,
size_t __ksize(const void *object) size_t __ksize(const void *object)
{ {
struct page *page; struct folio *folio;
if (unlikely(object == ZERO_SIZE_PTR)) if (unlikely(object == ZERO_SIZE_PTR))
return 0; return 0;
page = virt_to_head_page(object); folio = virt_to_folio(object);
if (unlikely(!PageSlab(page))) { if (unlikely(!folio_test_slab(folio)))
WARN_ON(!PageCompound(page)); return folio_size(folio);
return page_size(page);
}
return slab_ksize(page->slab_cache); return slab_ksize(folio_slab(folio)->slab_cache);
} }
EXPORT_SYMBOL(__ksize); EXPORT_SYMBOL(__ksize);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment