All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] slub: Add back check for free nonslab objects
@ 2021-09-27 12:26 Kefeng Wang
  2021-09-28 15:09   ` Shakeel Butt
  0 siblings, 1 reply; 4+ messages in thread
From: Kefeng Wang @ 2021-09-27 12:26 UTC (permalink / raw)
  To: shakeelb, vbabka, Christoph Lameter, Pekka Enberg,
	David Rientjes, Joonsoo Kim, Andrew Morton, linux-mm,
	linux-kernel, Matthew Wilcox
  Cc: Kefeng Wang

After commit ("f227f0faf63b slub: fix unreclaimable slab stat for bulk
free"), the check for free nonslab page is replaced by VM_BUG_ON_PAGE,
which only check with CONFIG_DEBUG_VM enabled, but this config may
impact performance, so it only for debug.

Commit ("0937502af7c9 slub: Add check for kfree() of non slab objects.")
add the ability, which should be needed in any configs to catch the
invalid free, they even could be potential issue, eg, memory corruption,
use after free and double-free, so replace VM_BUG_ON_PAGE to WARN_ON, add
dump_page() and object address printing to help use to debug the issue.

Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
v2: Add object address printing suggested by Matthew Wilcox

 mm/slub.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/mm/slub.c b/mm/slub.c
index 3095b889fab4..157973e22faf 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -3522,7 +3522,11 @@ static inline void free_nonslab_page(struct page *page, void *object)
 {
 	unsigned int order = compound_order(page);
 
-	VM_BUG_ON_PAGE(!PageCompound(page), page);
+	if (WARN_ON(!PageCompound(page))) {
+		dump_page(page, "invalid free nonslab page");
+		pr_warn("object pointer: 0x%p\n", object);
+	}
+
 	kfree_hook(object);
 	mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, -(PAGE_SIZE << order));
 	__free_pages(page, order);
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] slub: Add back check for free nonslab objects
  2021-09-27 12:26 [PATCH v2] slub: Add back check for free nonslab objects Kefeng Wang
@ 2021-09-28 15:09   ` Shakeel Butt
  0 siblings, 0 replies; 4+ messages in thread
From: Shakeel Butt @ 2021-09-28 15:09 UTC (permalink / raw)
  To: Kefeng Wang
  Cc: Vlastimil Babka, Christoph Lameter, Pekka Enberg, David Rientjes,
	Joonsoo Kim, Andrew Morton, Linux MM, LKML, Matthew Wilcox

On Mon, Sep 27, 2021 at 5:24 AM Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
>
> After commit ("f227f0faf63b slub: fix unreclaimable slab stat for bulk
> free"), the check for free nonslab page is replaced by VM_BUG_ON_PAGE,
> which only check with CONFIG_DEBUG_VM enabled, but this config may
> impact performance, so it only for debug.
>
> Commit ("0937502af7c9 slub: Add check for kfree() of non slab objects.")
> add the ability, which should be needed in any configs to catch the
> invalid free, they even could be potential issue, eg, memory corruption,
> use after free and double-free, so replace VM_BUG_ON_PAGE to WARN_ON, add
> dump_page() and object address printing to help use to debug the issue.
>
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
> v2: Add object address printing suggested by Matthew Wilcox
>
>  mm/slub.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/mm/slub.c b/mm/slub.c
> index 3095b889fab4..157973e22faf 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -3522,7 +3522,11 @@ static inline void free_nonslab_page(struct page *page, void *object)
>  {
>         unsigned int order = compound_order(page);
>
> -       VM_BUG_ON_PAGE(!PageCompound(page), page);
> +       if (WARN_ON(!PageCompound(page))) {

If there is a problem then this would be too noisy. Why not WARN_ON_ONCE()?

> +               dump_page(page, "invalid free nonslab page");
> +               pr_warn("object pointer: 0x%p\n", object);

Actually why not add 'once' semantics for the whole if-block?

> +       }
> +
>         kfree_hook(object);
>         mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, -(PAGE_SIZE << order));
>         __free_pages(page, order);
> --
> 2.26.2
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] slub: Add back check for free nonslab objects
@ 2021-09-28 15:09   ` Shakeel Butt
  0 siblings, 0 replies; 4+ messages in thread
From: Shakeel Butt @ 2021-09-28 15:09 UTC (permalink / raw)
  To: Kefeng Wang
  Cc: Vlastimil Babka, Christoph Lameter, Pekka Enberg, David Rientjes,
	Joonsoo Kim, Andrew Morton, Linux MM, LKML, Matthew Wilcox

On Mon, Sep 27, 2021 at 5:24 AM Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
>
> After commit ("f227f0faf63b slub: fix unreclaimable slab stat for bulk
> free"), the check for free nonslab page is replaced by VM_BUG_ON_PAGE,
> which only check with CONFIG_DEBUG_VM enabled, but this config may
> impact performance, so it only for debug.
>
> Commit ("0937502af7c9 slub: Add check for kfree() of non slab objects.")
> add the ability, which should be needed in any configs to catch the
> invalid free, they even could be potential issue, eg, memory corruption,
> use after free and double-free, so replace VM_BUG_ON_PAGE to WARN_ON, add
> dump_page() and object address printing to help use to debug the issue.
>
> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
> ---
> v2: Add object address printing suggested by Matthew Wilcox
>
>  mm/slub.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/mm/slub.c b/mm/slub.c
> index 3095b889fab4..157973e22faf 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -3522,7 +3522,11 @@ static inline void free_nonslab_page(struct page *page, void *object)
>  {
>         unsigned int order = compound_order(page);
>
> -       VM_BUG_ON_PAGE(!PageCompound(page), page);
> +       if (WARN_ON(!PageCompound(page))) {

If there is a problem then this would be too noisy. Why not WARN_ON_ONCE()?

> +               dump_page(page, "invalid free nonslab page");
> +               pr_warn("object pointer: 0x%p\n", object);

Actually why not add 'once' semantics for the whole if-block?

> +       }
> +
>         kfree_hook(object);
>         mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, -(PAGE_SIZE << order));
>         __free_pages(page, order);
> --
> 2.26.2
>


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] slub: Add back check for free nonslab objects
  2021-09-28 15:09   ` Shakeel Butt
  (?)
@ 2021-09-29  1:59   ` Kefeng Wang
  -1 siblings, 0 replies; 4+ messages in thread
From: Kefeng Wang @ 2021-09-29  1:59 UTC (permalink / raw)
  To: Shakeel Butt
  Cc: Vlastimil Babka, Christoph Lameter, Pekka Enberg, David Rientjes,
	Joonsoo Kim, Andrew Morton, Linux MM, LKML, Matthew Wilcox



On 2021/9/28 23:09, Shakeel Butt wrote:
> On Mon, Sep 27, 2021 at 5:24 AM Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
>>
>> After commit ("f227f0faf63b slub: fix unreclaimable slab stat for bulk
>> free"), the check for free nonslab page is replaced by VM_BUG_ON_PAGE,
>> which only check with CONFIG_DEBUG_VM enabled, but this config may
>> impact performance, so it only for debug.
>>
>> Commit ("0937502af7c9 slub: Add check for kfree() of non slab objects.")
>> add the ability, which should be needed in any configs to catch the
>> invalid free, they even could be potential issue, eg, memory corruption,
>> use after free and double-free, so replace VM_BUG_ON_PAGE to WARN_ON, add
>> dump_page() and object address printing to help use to debug the issue.
>>
>> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
>> ---
>> v2: Add object address printing suggested by Matthew Wilcox
>>
>>   mm/slub.c | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/mm/slub.c b/mm/slub.c
>> index 3095b889fab4..157973e22faf 100644
>> --- a/mm/slub.c
>> +++ b/mm/slub.c
>> @@ -3522,7 +3522,11 @@ static inline void free_nonslab_page(struct page *page, void *object)
>>   {
>>          unsigned int order = compound_order(page);
>>
>> -       VM_BUG_ON_PAGE(!PageCompound(page), page);
>> +       if (WARN_ON(!PageCompound(page))) {
> 
> If there is a problem then this would be too noisy. Why not WARN_ON_ONCE()?

If lots of abnormal/illegal pages are freed to freelist, the system
could be crash much more easier, with that in mind, I think the original 
logical use BUG_ON().

The ksize() use WARN_ON, looks no one report about too much log.

If we don't want too much dump, I will change it in v3.

> 
>> +               dump_page(page, "invalid free nonslab page");
>> +               pr_warn("object pointer: 0x%p\n", object);
> 
> Actually why not add 'once' semantics for the whole if-block?
> 
>> +       }
>> +
>>          kfree_hook(object);
>>          mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B, -(PAGE_SIZE << order));
>>          __free_pages(page, order);
>> --
>> 2.26.2
>>
> .
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-09-29  1:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-27 12:26 [PATCH v2] slub: Add back check for free nonslab objects Kefeng Wang
2021-09-28 15:09 ` Shakeel Butt
2021-09-28 15:09   ` Shakeel Butt
2021-09-29  1:59   ` Kefeng Wang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.