2021-03-16 18:19:51

by Maninder Singh

[permalink] [raw]
Subject: [PATCH 1/3] mm/slub: fixing backtrace of objects because of redzone adjustment

fixing commit 8e7f37f2aaa5 ("mm: Add mem_dump_obj() to print source
of memory block")

with current code, Backtrace of allocated object is coming wrong:
/ # cat /proc/meminfo
[ 14.969843] slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at 0x6b6b6b6b
[ 14.970635] 0x6b6b6b6b
[ 14.970794] 0x6b6b6b6b
[ 14.970932] 0x6b6b6b6b
[ 14.971077] 0x6b6b6b6b
[ 14.971202] 0x6b6b6b6b
[ 14.971317] 0x6b6b6b6b
[ 14.971423] 0x6b6b6b6b
[ 14.971635] 0x6b6b6b6b
[ 14.971740] 0x6b6b6b6b
[ 14.971871] 0x6b6b6b6b
[ 14.972229] 0x6b6b6b6b
[ 14.972363] 0x6b6b6b6b
[ 14.972505] 0xa56b6b6b
[ 14.972631] 0xbbbbbbbb
[ 14.972734] 0xc8ab0400
[ 14.972891] meminfo_proc_show+0x40/0x4fc

And reason is red zone was not adjusted from object address.
after adding fixup for redzone, backtrace is coming correct:
/ # cat /proc/meminfo
[ 14.870782] slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 128 size 64 allocated at meminfo_proc_show+0x40/0x4f4
[ 14.871817] meminfo_proc_show+0x40/0x4f4
[ 14.872035] seq_read_iter+0x18c/0x4c4
[ 14.872229] proc_reg_read_iter+0x84/0xac
[ 14.872433] generic_file_splice_read+0xe8/0x17c
[ 14.872621] splice_direct_to_actor+0xb8/0x290
[ 14.872747] do_splice_direct+0xa0/0xe0
[ 14.872896] do_sendfile+0x2d0/0x438
[ 14.873044] sys_sendfile64+0x12c/0x140
[ 14.873229] ret_fast_syscall+0x0/0x58
[ 14.873372] 0xbe861de4

Signed-off-by: Vaneet Narang <[email protected]>
Signed-off-by: Maninder Singh <[email protected]>
---
mm/slub.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/mm/slub.c b/mm/slub.c
index 1912c4614248..9d13f0117ae6 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4052,6 +4052,7 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
!(s->flags & SLAB_STORE_USER))
return;
#ifdef CONFIG_SLUB_DEBUG
+ objp = fixup_red_left(s, objp);
trackp = get_track(s, objp, TRACK_ALLOC);
kpp->kp_ret = (void *)trackp->addr;
#ifdef CONFIG_STACKTRACE
--
2.17.1


2021-03-16 18:21:33

by Maninder Singh

[permalink] [raw]
Subject: [PATCH 2/3] mm/slub: Add Support for free path information of an object.

Adding support for inforamtion of free path along with allocation
path of an object:

slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at meminfo_proc_show+0x40/0x4fc
[ 20.192078] meminfo_proc_show+0x40/0x4fc
[ 20.192263] seq_read_iter+0x18c/0x4c4
[ 20.192430] proc_reg_read_iter+0x84/0xac
[ 20.192617] generic_file_splice_read+0xe8/0x17c
[ 20.192816] splice_direct_to_actor+0xb8/0x290
[ 20.193008] do_splice_direct+0xa0/0xe0
[ 20.193185] do_sendfile+0x2d0/0x438
[ 20.193345] sys_sendfile64+0x12c/0x140
[ 20.193523] ret_fast_syscall+0x0/0x58
[ 20.193695] 0xbeeacde4
[ 20.193822] Free path:
[ 20.193935] meminfo_proc_show+0x5c/0x4fc
[ 20.194115] seq_read_iter+0x18c/0x4c4
[ 20.194285] proc_reg_read_iter+0x84/0xac
[ 20.194475] generic_file_splice_read+0xe8/0x17c
[ 20.194685] splice_direct_to_actor+0xb8/0x290
[ 20.194870] do_splice_direct+0xa0/0xe0
[ 20.195014] do_sendfile+0x2d0/0x438
[ 20.195174] sys_sendfile64+0x12c/0x140
[ 20.195336] ret_fast_syscall+0x0/0x58
[ 20.195491] 0xbeeacde4

Co-developed-by: Vaneet Narang <[email protected]>
Signed-off-by: Vaneet Narang <[email protected]>
Signed-off-by: Maninder Singh <[email protected]>
---
mm/slab.h | 1 +
mm/slab_common.c | 12 +++++++++++-
mm/slub.c | 7 +++++++
mm/util.c | 2 +-
4 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/mm/slab.h b/mm/slab.h
index c96bca9825d9..e360e3326232 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -644,6 +644,7 @@ struct kmem_obj_info {
struct kmem_cache *kp_slab_cache;
void *kp_ret;
void *kp_stack[KS_ADDRS_COUNT];
+ void *kp_free_stack[KS_ADDRS_COUNT];
};
void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page);
#endif
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 4c6107e39f9a..42288db97a52 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -556,7 +556,7 @@ EXPORT_SYMBOL_GPL(kmem_valid_obj);
* depends on the type of object and on how much debugging is enabled.
* For a slab-cache object, the fact that it is a slab object is printed,
* and, if available, the slab name, return address, and stack trace from
- * the allocation of that object.
+ * the allocation and last free path of that object.
*
* This function will splat if passed a pointer to a non-slab object.
* If you are not sure what type of object you have, you should instead
@@ -601,6 +601,16 @@ void kmem_dump_obj(void *object)
break;
pr_info(" %pS\n", kp.kp_stack[i]);
}
+
+ if (kp.kp_free_stack[0])
+ pr_cont(" Free path:\n");
+
+ for (i = 0; i < ARRAY_SIZE(kp.kp_free_stack); i++) {
+ if (!kp.kp_free_stack[i])
+ break;
+ pr_info(" %pS\n", kp.kp_free_stack[i]);
+ }
+
}
EXPORT_SYMBOL_GPL(kmem_dump_obj);
#endif
diff --git a/mm/slub.c b/mm/slub.c
index 9d13f0117ae6..a0cb90487b1a 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4061,6 +4061,13 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
if (!kpp->kp_stack[i])
break;
}
+
+ trackp = get_track(s, objp, TRACK_FREE);
+ for (i = 0; i < KS_ADDRS_COUNT && i < TRACK_ADDRS_COUNT; i++) {
+ kpp->kp_free_stack[i] = (void *)trackp->addrs[i];
+ if (!kpp->kp_free_stack[i])
+ break;
+ }
#endif
#endif
}
diff --git a/mm/util.c b/mm/util.c
index 143c627fb3e8..9d69ca30514a 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -993,7 +993,7 @@ int __weak memcmp_pages(struct page *page1, struct page *page2)
* depends on the type of object and on how much debugging is enabled.
* For example, for a slab-cache object, the slab name is printed, and,
* if available, the return address and stack trace from the allocation
- * of that object.
+ * and last free path of that object.
*/
void mem_dump_obj(void *object)
{
--
2.17.1

2021-03-16 21:07:03

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH 1/3] mm/slub: fixing backtrace of objects because of redzone adjustment

On Tue, Mar 16, 2021 at 04:07:10PM +0530, Maninder Singh wrote:
> fixing commit 8e7f37f2aaa5 ("mm: Add mem_dump_obj() to print source
> of memory block")
>
> with current code, Backtrace of allocated object is coming wrong:
> / # cat /proc/meminfo
> [ 14.969843] slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at 0x6b6b6b6b
> [ 14.970635] 0x6b6b6b6b
> [ 14.970794] 0x6b6b6b6b
> [ 14.970932] 0x6b6b6b6b
> [ 14.971077] 0x6b6b6b6b
> [ 14.971202] 0x6b6b6b6b
> [ 14.971317] 0x6b6b6b6b
> [ 14.971423] 0x6b6b6b6b
> [ 14.971635] 0x6b6b6b6b
> [ 14.971740] 0x6b6b6b6b
> [ 14.971871] 0x6b6b6b6b
> [ 14.972229] 0x6b6b6b6b
> [ 14.972363] 0x6b6b6b6b
> [ 14.972505] 0xa56b6b6b
> [ 14.972631] 0xbbbbbbbb
> [ 14.972734] 0xc8ab0400
> [ 14.972891] meminfo_proc_show+0x40/0x4fc
>
> And reason is red zone was not adjusted from object address.
> after adding fixup for redzone, backtrace is coming correct:
> / # cat /proc/meminfo
> [ 14.870782] slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 128 size 64 allocated at meminfo_proc_show+0x40/0x4f4
> [ 14.871817] meminfo_proc_show+0x40/0x4f4
> [ 14.872035] seq_read_iter+0x18c/0x4c4
> [ 14.872229] proc_reg_read_iter+0x84/0xac
> [ 14.872433] generic_file_splice_read+0xe8/0x17c
> [ 14.872621] splice_direct_to_actor+0xb8/0x290
> [ 14.872747] do_splice_direct+0xa0/0xe0
> [ 14.872896] do_sendfile+0x2d0/0x438
> [ 14.873044] sys_sendfile64+0x12c/0x140
> [ 14.873229] ret_fast_syscall+0x0/0x58
> [ 14.873372] 0xbe861de4
>
> Signed-off-by: Vaneet Narang <[email protected]>
> Signed-off-by: Maninder Singh <[email protected]>

Good catch, thank you! For the series:

Acked-by: Paul E. McKenney <[email protected]>

On the other hand, if you would like me to take these, we need to get
a maintainer ack.

Thanx, Paul

> ---
> mm/slub.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/mm/slub.c b/mm/slub.c
> index 1912c4614248..9d13f0117ae6 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -4052,6 +4052,7 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
> !(s->flags & SLAB_STORE_USER))
> return;
> #ifdef CONFIG_SLUB_DEBUG
> + objp = fixup_red_left(s, objp);
> trackp = get_track(s, objp, TRACK_ALLOC);
> kpp->kp_ret = (void *)trackp->addr;
> #ifdef CONFIG_STACKTRACE
> --
> 2.17.1
>

2021-03-18 12:36:52

by Vlastimil Babka

[permalink] [raw]
Subject: Re: [PATCH 1/3] mm/slub: fixing backtrace of objects because of redzone adjustment

On 3/16/21 11:37 AM, Maninder Singh wrote:
> fixing commit 8e7f37f2aaa5 ("mm: Add mem_dump_obj() to print source
> of memory block")
>
> with current code, Backtrace of allocated object is coming wrong:
> / # cat /proc/meminfo
> [ 14.969843] slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at 0x6b6b6b6b
> [ 14.970635] 0x6b6b6b6b
> [ 14.970794] 0x6b6b6b6b
> [ 14.970932] 0x6b6b6b6b
> [ 14.971077] 0x6b6b6b6b
> [ 14.971202] 0x6b6b6b6b
> [ 14.971317] 0x6b6b6b6b
> [ 14.971423] 0x6b6b6b6b
> [ 14.971635] 0x6b6b6b6b
> [ 14.971740] 0x6b6b6b6b
> [ 14.971871] 0x6b6b6b6b
> [ 14.972229] 0x6b6b6b6b
> [ 14.972363] 0x6b6b6b6b
> [ 14.972505] 0xa56b6b6b
> [ 14.972631] 0xbbbbbbbb
> [ 14.972734] 0xc8ab0400
> [ 14.972891] meminfo_proc_show+0x40/0x4fc
>
> And reason is red zone was not adjusted from object address.
> after adding fixup for redzone, backtrace is coming correct:
> / # cat /proc/meminfo
> [ 14.870782] slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 128 size 64 allocated at meminfo_proc_show+0x40/0x4f4
> [ 14.871817] meminfo_proc_show+0x40/0x4f4
> [ 14.872035] seq_read_iter+0x18c/0x4c4
> [ 14.872229] proc_reg_read_iter+0x84/0xac
> [ 14.872433] generic_file_splice_read+0xe8/0x17c
> [ 14.872621] splice_direct_to_actor+0xb8/0x290
> [ 14.872747] do_splice_direct+0xa0/0xe0
> [ 14.872896] do_sendfile+0x2d0/0x438
> [ 14.873044] sys_sendfile64+0x12c/0x140
> [ 14.873229] ret_fast_syscall+0x0/0x58
> [ 14.873372] 0xbe861de4
>
> Signed-off-by: Vaneet Narang <[email protected]>
> Signed-off-by: Maninder Singh <[email protected]>

Acked-by: Vlastimil Babka <[email protected]>

> ---
> mm/slub.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/mm/slub.c b/mm/slub.c
> index 1912c4614248..9d13f0117ae6 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -4052,6 +4052,7 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
> !(s->flags & SLAB_STORE_USER))
> return;
> #ifdef CONFIG_SLUB_DEBUG
> + objp = fixup_red_left(s, objp);
> trackp = get_track(s, objp, TRACK_ALLOC);
> kpp->kp_ret = (void *)trackp->addr;
> #ifdef CONFIG_STACKTRACE
>

2021-03-18 12:37:28

by Vlastimil Babka

[permalink] [raw]
Subject: Re: [PATCH 2/3] mm/slub: Add Support for free path information of an object.

On 3/16/21 11:37 AM, Maninder Singh wrote:
> Adding support for inforamtion of free path along with allocation
> path of an object:
>
> slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at meminfo_proc_show+0x40/0x4fc
> [ 20.192078] meminfo_proc_show+0x40/0x4fc
> [ 20.192263] seq_read_iter+0x18c/0x4c4
> [ 20.192430] proc_reg_read_iter+0x84/0xac
> [ 20.192617] generic_file_splice_read+0xe8/0x17c
> [ 20.192816] splice_direct_to_actor+0xb8/0x290
> [ 20.193008] do_splice_direct+0xa0/0xe0
> [ 20.193185] do_sendfile+0x2d0/0x438
> [ 20.193345] sys_sendfile64+0x12c/0x140
> [ 20.193523] ret_fast_syscall+0x0/0x58
> [ 20.193695] 0xbeeacde4
> [ 20.193822] Free path:
> [ 20.193935] meminfo_proc_show+0x5c/0x4fc
> [ 20.194115] seq_read_iter+0x18c/0x4c4
> [ 20.194285] proc_reg_read_iter+0x84/0xac
> [ 20.194475] generic_file_splice_read+0xe8/0x17c
> [ 20.194685] splice_direct_to_actor+0xb8/0x290
> [ 20.194870] do_splice_direct+0xa0/0xe0
> [ 20.195014] do_sendfile+0x2d0/0x438
> [ 20.195174] sys_sendfile64+0x12c/0x140
> [ 20.195336] ret_fast_syscall+0x0/0x58
> [ 20.195491] 0xbeeacde4
>
> Co-developed-by: Vaneet Narang <[email protected]>
> Signed-off-by: Vaneet Narang <[email protected]>
> Signed-off-by: Maninder Singh <[email protected]>

Acked-by: Vlastimil Babka <[email protected]>

2021-03-19 23:28:32

by Paul E. McKenney

[permalink] [raw]
Subject: Re: [PATCH 2/3] mm/slub: Add Support for free path information of an object.

On Thu, Mar 18, 2021 at 01:35:37PM +0100, Vlastimil Babka wrote:
> On 3/16/21 11:37 AM, Maninder Singh wrote:
> > Adding support for inforamtion of free path along with allocation
> > path of an object:
> >
> > slab kmalloc-64 start c8ab0140 data offset 64 pointer offset 0 size 64 allocated at meminfo_proc_show+0x40/0x4fc
> > [ 20.192078] meminfo_proc_show+0x40/0x4fc
> > [ 20.192263] seq_read_iter+0x18c/0x4c4
> > [ 20.192430] proc_reg_read_iter+0x84/0xac
> > [ 20.192617] generic_file_splice_read+0xe8/0x17c
> > [ 20.192816] splice_direct_to_actor+0xb8/0x290
> > [ 20.193008] do_splice_direct+0xa0/0xe0
> > [ 20.193185] do_sendfile+0x2d0/0x438
> > [ 20.193345] sys_sendfile64+0x12c/0x140
> > [ 20.193523] ret_fast_syscall+0x0/0x58
> > [ 20.193695] 0xbeeacde4
> > [ 20.193822] Free path:
> > [ 20.193935] meminfo_proc_show+0x5c/0x4fc
> > [ 20.194115] seq_read_iter+0x18c/0x4c4
> > [ 20.194285] proc_reg_read_iter+0x84/0xac
> > [ 20.194475] generic_file_splice_read+0xe8/0x17c
> > [ 20.194685] splice_direct_to_actor+0xb8/0x290
> > [ 20.194870] do_splice_direct+0xa0/0xe0
> > [ 20.195014] do_sendfile+0x2d0/0x438
> > [ 20.195174] sys_sendfile64+0x12c/0x140
> > [ 20.195336] ret_fast_syscall+0x0/0x58
> > [ 20.195491] 0xbeeacde4
> >
> > Co-developed-by: Vaneet Narang <[email protected]>
> > Signed-off-by: Vaneet Narang <[email protected]>
> > Signed-off-by: Maninder Singh <[email protected]>
>
> Acked-by: Vlastimil Babka <[email protected]>

I have queued 1/3 and 2/3, thank you both!

Would any of the ARM folks be willing to ack 3/3?

Thanx, Paul