Skip to content

Commit 2c1d697

Browse files
hygonitehcaster
authored andcommitted
mm/slab_common: drop kmem_alloc & avoid dereferencing fields when not using
Drop kmem_alloc event class, and define kmalloc and kmem_cache_alloc using TRACE_EVENT() macro. And then this patch does: - Do not pass pointer to struct kmem_cache to trace_kmalloc. gfp flag is enough to know if it's accounted or not. - Avoid dereferencing s->object_size and s->size when not using kmem_cache_alloc event. - Avoid dereferencing s->name in when not using kmem_cache_free event. - Adjust s->size to SLOB_UNITS(s->size) * SLOB_UNIT in SLOB Cc: Vasily Averin <[email protected]> Suggested-by: Vlastimil Babka <[email protected]> Signed-off-by: Hyeonggon Yoo <[email protected]> Reviewed-by: Vlastimil Babka <[email protected]> Signed-off-by: Vlastimil Babka <[email protected]>
1 parent 11e9734 commit 2c1d697

File tree

5 files changed

+64
-51
lines changed

5 files changed

+64
-51
lines changed

include/trace/events/kmem.h

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@
99
#include <linux/tracepoint.h>
1010
#include <trace/events/mmflags.h>
1111

12-
DECLARE_EVENT_CLASS(kmem_alloc,
12+
TRACE_EVENT(kmem_cache_alloc,
1313

1414
TP_PROTO(unsigned long call_site,
1515
const void *ptr,
1616
struct kmem_cache *s,
17-
size_t bytes_req,
18-
size_t bytes_alloc,
1917
gfp_t gfp_flags,
2018
int node),
2119

22-
TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node),
20+
TP_ARGS(call_site, ptr, s, gfp_flags, node),
2321

2422
TP_STRUCT__entry(
2523
__field( unsigned long, call_site )
@@ -34,13 +32,13 @@ DECLARE_EVENT_CLASS(kmem_alloc,
3432
TP_fast_assign(
3533
__entry->call_site = call_site;
3634
__entry->ptr = ptr;
37-
__entry->bytes_req = bytes_req;
38-
__entry->bytes_alloc = bytes_alloc;
35+
__entry->bytes_req = s->object_size;
36+
__entry->bytes_alloc = s->size;
3937
__entry->gfp_flags = (__force unsigned long)gfp_flags;
4038
__entry->node = node;
4139
__entry->accounted = IS_ENABLED(CONFIG_MEMCG_KMEM) ?
4240
((gfp_flags & __GFP_ACCOUNT) ||
43-
(s && s->flags & SLAB_ACCOUNT)) : false;
41+
(s->flags & SLAB_ACCOUNT)) : false;
4442
),
4543

4644
TP_printk("call_site=%pS ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d accounted=%s",
@@ -53,22 +51,44 @@ DECLARE_EVENT_CLASS(kmem_alloc,
5351
__entry->accounted ? "true" : "false")
5452
);
5553

56-
DEFINE_EVENT(kmem_alloc, kmalloc,
54+
TRACE_EVENT(kmalloc,
5755

58-
TP_PROTO(unsigned long call_site, const void *ptr,
59-
struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc,
60-
gfp_t gfp_flags, int node),
56+
TP_PROTO(unsigned long call_site,
57+
const void *ptr,
58+
size_t bytes_req,
59+
size_t bytes_alloc,
60+
gfp_t gfp_flags,
61+
int node),
6162

62-
TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node)
63-
);
63+
TP_ARGS(call_site, ptr, bytes_req, bytes_alloc, gfp_flags, node),
6464

65-
DEFINE_EVENT(kmem_alloc, kmem_cache_alloc,
65+
TP_STRUCT__entry(
66+
__field( unsigned long, call_site )
67+
__field( const void *, ptr )
68+
__field( size_t, bytes_req )
69+
__field( size_t, bytes_alloc )
70+
__field( unsigned long, gfp_flags )
71+
__field( int, node )
72+
),
6673

67-
TP_PROTO(unsigned long call_site, const void *ptr,
68-
struct kmem_cache *s, size_t bytes_req, size_t bytes_alloc,
69-
gfp_t gfp_flags, int node),
74+
TP_fast_assign(
75+
__entry->call_site = call_site;
76+
__entry->ptr = ptr;
77+
__entry->bytes_req = bytes_req;
78+
__entry->bytes_alloc = bytes_alloc;
79+
__entry->gfp_flags = (__force unsigned long)gfp_flags;
80+
__entry->node = node;
81+
),
7082

71-
TP_ARGS(call_site, ptr, s, bytes_req, bytes_alloc, gfp_flags, node)
83+
TP_printk("call_site=%pS ptr=%p bytes_req=%zu bytes_alloc=%zu gfp_flags=%s node=%d accounted=%s",
84+
(void *)__entry->call_site,
85+
__entry->ptr,
86+
__entry->bytes_req,
87+
__entry->bytes_alloc,
88+
show_gfp_flags(__entry->gfp_flags),
89+
__entry->node,
90+
(IS_ENABLED(CONFIG_MEMCG_KMEM) &&
91+
(__entry->gfp_flags & (__force unsigned long)__GFP_ACCOUNT)) ? "true" : "false")
7292
);
7393

7494
TRACE_EVENT(kfree,
@@ -93,20 +113,20 @@ TRACE_EVENT(kfree,
93113

94114
TRACE_EVENT(kmem_cache_free,
95115

96-
TP_PROTO(unsigned long call_site, const void *ptr, const char *name),
116+
TP_PROTO(unsigned long call_site, const void *ptr, const struct kmem_cache *s),
97117

98-
TP_ARGS(call_site, ptr, name),
118+
TP_ARGS(call_site, ptr, s),
99119

100120
TP_STRUCT__entry(
101121
__field( unsigned long, call_site )
102122
__field( const void *, ptr )
103-
__string( name, name )
123+
__string( name, s->name )
104124
),
105125

106126
TP_fast_assign(
107127
__entry->call_site = call_site;
108128
__entry->ptr = ptr;
109-
__assign_str(name, name);
129+
__assign_str(name, s->name);
110130
),
111131

112132
TP_printk("call_site=%pS ptr=%p name=%s",

mm/slab.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3440,8 +3440,7 @@ void *__kmem_cache_alloc_lru(struct kmem_cache *cachep, struct list_lru *lru,
34403440
{
34413441
void *ret = slab_alloc(cachep, lru, flags, cachep->object_size, _RET_IP_);
34423442

3443-
trace_kmem_cache_alloc(_RET_IP_, ret, cachep, cachep->object_size,
3444-
cachep->size, flags, NUMA_NO_NODE);
3443+
trace_kmem_cache_alloc(_RET_IP_, ret, cachep, flags, NUMA_NO_NODE);
34453444

34463445
return ret;
34473446
}
@@ -3536,8 +3535,7 @@ void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
35363535
{
35373536
void *ret = slab_alloc_node(cachep, NULL, flags, nodeid, cachep->object_size, _RET_IP_);
35383537

3539-
trace_kmem_cache_alloc(_RET_IP_, ret, cachep, cachep->object_size,
3540-
cachep->size, flags, nodeid);
3538+
trace_kmem_cache_alloc(_RET_IP_, ret, cachep, flags, nodeid);
35413539

35423540
return ret;
35433541
}
@@ -3607,7 +3605,7 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
36073605
if (!cachep)
36083606
return;
36093607

3610-
trace_kmem_cache_free(_RET_IP_, objp, cachep->name);
3608+
trace_kmem_cache_free(_RET_IP_, objp, cachep);
36113609
__do_kmem_cache_free(cachep, objp, _RET_IP_);
36123610
}
36133611
EXPORT_SYMBOL(kmem_cache_free);

mm/slab_common.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ void *__do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller
907907

908908
if (unlikely(size > KMALLOC_MAX_CACHE_SIZE)) {
909909
ret = __kmalloc_large_node(size, flags, node);
910-
trace_kmalloc(_RET_IP_, ret, NULL, size,
910+
trace_kmalloc(_RET_IP_, ret, size,
911911
PAGE_SIZE << get_order(size), flags, node);
912912
return ret;
913913
}
@@ -919,7 +919,7 @@ void *__do_kmalloc_node(size_t size, gfp_t flags, int node, unsigned long caller
919919

920920
ret = __kmem_cache_alloc_node(s, flags, node, size, caller);
921921
ret = kasan_kmalloc(s, ret, size, flags);
922-
trace_kmalloc(_RET_IP_, ret, s, size, s->size, flags, node);
922+
trace_kmalloc(_RET_IP_, ret, size, s->size, flags, node);
923923
return ret;
924924
}
925925

@@ -1005,7 +1005,7 @@ void *kmalloc_trace(struct kmem_cache *s, gfp_t gfpflags, size_t size)
10051005
void *ret = __kmem_cache_alloc_node(s, gfpflags, NUMA_NO_NODE,
10061006
size, _RET_IP_);
10071007

1008-
trace_kmalloc(_RET_IP_, ret, s, size, s->size, gfpflags, NUMA_NO_NODE);
1008+
trace_kmalloc(_RET_IP_, ret, size, s->size, gfpflags, NUMA_NO_NODE);
10091009

10101010
ret = kasan_kmalloc(s, ret, size, gfpflags);
10111011
return ret;
@@ -1017,7 +1017,7 @@ void *kmalloc_node_trace(struct kmem_cache *s, gfp_t gfpflags,
10171017
{
10181018
void *ret = __kmem_cache_alloc_node(s, gfpflags, node, size, _RET_IP_);
10191019

1020-
trace_kmalloc(_RET_IP_, ret, s, size, s->size, gfpflags, node);
1020+
trace_kmalloc(_RET_IP_, ret, size, s->size, gfpflags, node);
10211021

10221022
ret = kasan_kmalloc(s, ret, size, gfpflags);
10231023
return ret;
@@ -1072,8 +1072,8 @@ void *kmalloc_large(size_t size, gfp_t flags)
10721072
{
10731073
void *ret = __kmalloc_large_node(size, flags, NUMA_NO_NODE);
10741074

1075-
trace_kmalloc(_RET_IP_, ret, NULL, size,
1076-
PAGE_SIZE << get_order(size), flags, NUMA_NO_NODE);
1075+
trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << get_order(size),
1076+
flags, NUMA_NO_NODE);
10771077
return ret;
10781078
}
10791079
EXPORT_SYMBOL(kmalloc_large);
@@ -1082,8 +1082,8 @@ void *kmalloc_large_node(size_t size, gfp_t flags, int node)
10821082
{
10831083
void *ret = __kmalloc_large_node(size, flags, node);
10841084

1085-
trace_kmalloc(_RET_IP_, ret, NULL, size,
1086-
PAGE_SIZE << get_order(size), flags, node);
1085+
trace_kmalloc(_RET_IP_, ret, size, PAGE_SIZE << get_order(size),
1086+
flags, node);
10871087
return ret;
10881088
}
10891089
EXPORT_SYMBOL(kmalloc_large_node);

mm/slob.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -507,17 +507,15 @@ __do_kmalloc_node(size_t size, gfp_t gfp, int node, unsigned long caller)
507507
*m = size;
508508
ret = (void *)m + minalign;
509509

510-
trace_kmalloc(caller, ret, NULL, size,
511-
size + minalign, gfp, node);
510+
trace_kmalloc(caller, ret, size, size + minalign, gfp, node);
512511
} else {
513512
unsigned int order = get_order(size);
514513

515514
if (likely(order))
516515
gfp |= __GFP_COMP;
517516
ret = slob_new_pages(gfp, order, node);
518517

519-
trace_kmalloc(caller, ret, NULL, size,
520-
PAGE_SIZE << order, gfp, node);
518+
trace_kmalloc(caller, ret, size, PAGE_SIZE << order, gfp, node);
521519
}
522520

523521
kmemleak_alloc(ret, size, 1, gfp);
@@ -594,6 +592,9 @@ int __kmem_cache_create(struct kmem_cache *c, slab_flags_t flags)
594592
/* leave room for rcu footer at the end of object */
595593
c->size += sizeof(struct slob_rcu);
596594
}
595+
596+
/* Actual size allocated */
597+
c->size = SLOB_UNITS(c->size) * SLOB_UNIT;
597598
c->flags = flags;
598599
return 0;
599600
}
@@ -608,14 +609,10 @@ static void *slob_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
608609

609610
if (c->size < PAGE_SIZE) {
610611
b = slob_alloc(c->size, flags, c->align, node, 0);
611-
trace_kmem_cache_alloc(_RET_IP_, b, NULL, c->object_size,
612-
SLOB_UNITS(c->size) * SLOB_UNIT,
613-
flags, node);
612+
trace_kmem_cache_alloc(_RET_IP_, b, c, flags, node);
614613
} else {
615614
b = slob_new_pages(flags, get_order(c->size), node);
616-
trace_kmem_cache_alloc(_RET_IP_, b, NULL, c->object_size,
617-
PAGE_SIZE << get_order(c->size),
618-
flags, node);
615+
trace_kmem_cache_alloc(_RET_IP_, b, c, flags, node);
619616
}
620617

621618
if (b && c->ctor) {
@@ -671,7 +668,7 @@ static void kmem_rcu_free(struct rcu_head *head)
671668
void kmem_cache_free(struct kmem_cache *c, void *b)
672669
{
673670
kmemleak_free_recursive(b, c->flags);
674-
trace_kmem_cache_free(_RET_IP_, b, c->name);
671+
trace_kmem_cache_free(_RET_IP_, b, c);
675672
if (unlikely(c->flags & SLAB_TYPESAFE_BY_RCU)) {
676673
struct slob_rcu *slob_rcu;
677674
slob_rcu = b + (c->size - sizeof(struct slob_rcu));

mm/slub.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3243,8 +3243,7 @@ void *__kmem_cache_alloc_lru(struct kmem_cache *s, struct list_lru *lru,
32433243
{
32443244
void *ret = slab_alloc(s, lru, gfpflags, _RET_IP_, s->object_size);
32453245

3246-
trace_kmem_cache_alloc(_RET_IP_, ret, s, s->object_size,
3247-
s->size, gfpflags, NUMA_NO_NODE);
3246+
trace_kmem_cache_alloc(_RET_IP_, ret, s, gfpflags, NUMA_NO_NODE);
32483247

32493248
return ret;
32503249
}
@@ -3274,8 +3273,7 @@ void *kmem_cache_alloc_node(struct kmem_cache *s, gfp_t gfpflags, int node)
32743273
{
32753274
void *ret = slab_alloc_node(s, NULL, gfpflags, node, _RET_IP_, s->object_size);
32763275

3277-
trace_kmem_cache_alloc(_RET_IP_, ret, s, s->object_size,
3278-
s->size, gfpflags, node);
3276+
trace_kmem_cache_alloc(_RET_IP_, ret, s, gfpflags, node);
32793277

32803278
return ret;
32813279
}
@@ -3517,7 +3515,7 @@ void kmem_cache_free(struct kmem_cache *s, void *x)
35173515
s = cache_from_obj(s, x);
35183516
if (!s)
35193517
return;
3520-
trace_kmem_cache_free(_RET_IP_, x, s->name);
3518+
trace_kmem_cache_free(_RET_IP_, x, s);
35213519
slab_free(s, virt_to_slab(x), x, NULL, &x, 1, _RET_IP_);
35223520
}
35233521
EXPORT_SYMBOL(kmem_cache_free);

0 commit comments

Comments
 (0)