Skip to content

Commit 7213230

Browse files
Matthew Wilcox (Oracle)tehcaster
authored andcommitted
mm: Use struct slab in kmem_obj_info()
All three implementations of slab support kmem_obj_info() which reports details of an object allocated from the slab allocator. By using the slab type instead of the page type, we make it obvious that this can only be called for slabs. [ [email protected]: also convert the related kmem_valid_obj() to folios ] Signed-off-by: Matthew Wilcox (Oracle) <[email protected]> Signed-off-by: Vlastimil Babka <[email protected]> Reviewed-by: Roman Gushchin <[email protected]>
1 parent 0c24811 commit 7213230

File tree

5 files changed

+24
-23
lines changed

5 files changed

+24
-23
lines changed

mm/slab.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3646,21 +3646,21 @@ EXPORT_SYMBOL(__kmalloc_node_track_caller);
36463646
#endif /* CONFIG_NUMA */
36473647

36483648
#ifdef CONFIG_PRINTK
3649-
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
3649+
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab)
36503650
{
36513651
struct kmem_cache *cachep;
36523652
unsigned int objnr;
36533653
void *objp;
36543654

36553655
kpp->kp_ptr = object;
3656-
kpp->kp_page = page;
3657-
cachep = page->slab_cache;
3656+
kpp->kp_slab = slab;
3657+
cachep = slab->slab_cache;
36583658
kpp->kp_slab_cache = cachep;
36593659
objp = object - obj_offset(cachep);
36603660
kpp->kp_data_offset = obj_offset(cachep);
3661-
page = virt_to_head_page(objp);
3662-
objnr = obj_to_index(cachep, page, objp);
3663-
objp = index_to_obj(cachep, page, objnr);
3661+
slab = virt_to_slab(objp);
3662+
objnr = obj_to_index(cachep, slab_page(slab), objp);
3663+
objp = index_to_obj(cachep, slab_page(slab), objnr);
36643664
kpp->kp_objp = objp;
36653665
if (DEBUG && cachep->flags & SLAB_STORE_USER)
36663666
kpp->kp_ret = *dbg_userword(cachep, objp);

mm/slab.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,15 +801,15 @@ static inline void debugfs_slab_release(struct kmem_cache *s) { }
801801
#define KS_ADDRS_COUNT 16
802802
struct kmem_obj_info {
803803
void *kp_ptr;
804-
struct page *kp_page;
804+
struct slab *kp_slab;
805805
void *kp_objp;
806806
unsigned long kp_data_offset;
807807
struct kmem_cache *kp_slab_cache;
808808
void *kp_ret;
809809
void *kp_stack[KS_ADDRS_COUNT];
810810
void *kp_free_stack[KS_ADDRS_COUNT];
811811
};
812-
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page);
812+
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab);
813813
#endif
814814

815815
#endif /* MM_SLAB_H */

mm/slab_common.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -550,13 +550,13 @@ bool slab_is_available(void)
550550
*/
551551
bool kmem_valid_obj(void *object)
552552
{
553-
struct page *page;
553+
struct folio *folio;
554554

555555
/* Some arches consider ZERO_SIZE_PTR to be a valid address. */
556556
if (object < (void *)PAGE_SIZE || !virt_addr_valid(object))
557557
return false;
558-
page = virt_to_head_page(object);
559-
return PageSlab(page);
558+
folio = virt_to_folio(object);
559+
return folio_test_slab(folio);
560560
}
561561
EXPORT_SYMBOL_GPL(kmem_valid_obj);
562562

@@ -579,18 +579,18 @@ void kmem_dump_obj(void *object)
579579
{
580580
char *cp = IS_ENABLED(CONFIG_MMU) ? "" : "/vmalloc";
581581
int i;
582-
struct page *page;
582+
struct slab *slab;
583583
unsigned long ptroffset;
584584
struct kmem_obj_info kp = { };
585585

586586
if (WARN_ON_ONCE(!virt_addr_valid(object)))
587587
return;
588-
page = virt_to_head_page(object);
589-
if (WARN_ON_ONCE(!PageSlab(page))) {
588+
slab = virt_to_slab(object);
589+
if (WARN_ON_ONCE(!slab)) {
590590
pr_cont(" non-slab memory.\n");
591591
return;
592592
}
593-
kmem_obj_info(&kp, object, page);
593+
kmem_obj_info(&kp, object, slab);
594594
if (kp.kp_slab_cache)
595595
pr_cont(" slab%s %s", cp, kp.kp_slab_cache->name);
596596
else

mm/slob.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,10 +462,10 @@ static void slob_free(void *block, int size)
462462
}
463463

464464
#ifdef CONFIG_PRINTK
465-
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
465+
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab)
466466
{
467467
kpp->kp_ptr = object;
468-
kpp->kp_page = page;
468+
kpp->kp_slab = slab;
469469
}
470470
#endif
471471

mm/slub.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4322,31 +4322,32 @@ int __kmem_cache_shutdown(struct kmem_cache *s)
43224322
}
43234323

43244324
#ifdef CONFIG_PRINTK
4325-
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
4325+
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct slab *slab)
43264326
{
43274327
void *base;
43284328
int __maybe_unused i;
43294329
unsigned int objnr;
43304330
void *objp;
43314331
void *objp0;
4332-
struct kmem_cache *s = page->slab_cache;
4332+
struct kmem_cache *s = slab->slab_cache;
43334333
struct track __maybe_unused *trackp;
43344334

43354335
kpp->kp_ptr = object;
4336-
kpp->kp_page = page;
4336+
kpp->kp_slab = slab;
43374337
kpp->kp_slab_cache = s;
4338-
base = page_address(page);
4338+
base = slab_address(slab);
43394339
objp0 = kasan_reset_tag(object);
43404340
#ifdef CONFIG_SLUB_DEBUG
43414341
objp = restore_red_left(s, objp0);
43424342
#else
43434343
objp = objp0;
43444344
#endif
4345-
objnr = obj_to_index(s, page, objp);
4345+
objnr = obj_to_index(s, slab_page(slab), objp);
43464346
kpp->kp_data_offset = (unsigned long)((char *)objp0 - (char *)objp);
43474347
objp = base + s->size * objnr;
43484348
kpp->kp_objp = objp;
4349-
if (WARN_ON_ONCE(objp < base || objp >= base + page->objects * s->size || (objp - base) % s->size) ||
4349+
if (WARN_ON_ONCE(objp < base || objp >= base + slab->objects * s->size
4350+
|| (objp - base) % s->size) ||
43504351
!(s->flags & SLAB_STORE_USER))
43514352
return;
43524353
#ifdef CONFIG_SLUB_DEBUG

0 commit comments

Comments
 (0)