diff mbox series

mm: skip reserved page for kmem leak scanning

Message ID 1661483530-11308-1-git-send-email-zhaoyang.huang@unisoc.com (mailing list archive)
State New
Headers show
Series mm: skip reserved page for kmem leak scanning | expand

Commit Message

zhaoyang.huang Aug. 26, 2022, 3:12 a.m. UTC
From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>

It is no need to scan reserved page, skip it.

Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
---
 mm/kmemleak.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Zhaoyang Huang Aug. 26, 2022, 3:23 a.m. UTC | #1
On Fri, Aug 26, 2022 at 11:13 AM zhaoyang.huang
<zhaoyang.huang@unisoc.com> wrote:
>
> From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
>
> It is no need to scan reserved page, skip it.
>
> Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> ---
>  mm/kmemleak.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/mm/kmemleak.c b/mm/kmemleak.c
> index a182f5d..c546250 100644
> --- a/mm/kmemleak.c
> +++ b/mm/kmemleak.c
> @@ -1471,7 +1471,7 @@ static void kmemleak_scan(void)
>                         if (page_zone(page) != zone)
>                                 continue;
>                         /* only scan if page is in use */
> -                       if (page_count(page) == 0)
> +                       if (page_count(page) == 0 || PageReserved(page))
Sorry for previous stupid code by my faint, correct it here
>                                 continue;
>                         scan_block(page, page + 1, NULL);
>                         if (!(pfn & 63))
> --
> 1.9.1
>
David Hildenbrand Aug. 29, 2022, 12:18 p.m. UTC | #2
On 26.08.22 05:23, Zhaoyang Huang wrote:
> On Fri, Aug 26, 2022 at 11:13 AM zhaoyang.huang
> <zhaoyang.huang@unisoc.com> wrote:
>>
>> From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
>>
>> It is no need to scan reserved page, skip it.
>>
>> Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
>> ---
>>  mm/kmemleak.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/mm/kmemleak.c b/mm/kmemleak.c
>> index a182f5d..c546250 100644
>> --- a/mm/kmemleak.c
>> +++ b/mm/kmemleak.c
>> @@ -1471,7 +1471,7 @@ static void kmemleak_scan(void)
>>                         if (page_zone(page) != zone)
>>                                 continue;
>>                         /* only scan if page is in use */
>> -                       if (page_count(page) == 0)
>> +                       if (page_count(page) == 0 || PageReserved(page))
> Sorry for previous stupid code by my faint, correct it here

Did you even test the initial patch?

I wonder why we should consider this change

(a) I doubt it's a performance issue. If it is, please provide numbers
    before/after.
(b) We'll stop scanning early allocations. As the memmap is usually
    allocated early during boot ... we'll stop scanning essentially the
    whole mmap and that whole loop would be dead code? What am i
    missing?
Zhaoyang Huang Aug. 30, 2022, 2:41 a.m. UTC | #3
On Mon, Aug 29, 2022 at 8:19 PM David Hildenbrand <david@redhat.com> wrote:
>
> On 26.08.22 05:23, Zhaoyang Huang wrote:
> > On Fri, Aug 26, 2022 at 11:13 AM zhaoyang.huang
> > <zhaoyang.huang@unisoc.com> wrote:
> >>
> >> From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> >>
> >> It is no need to scan reserved page, skip it.
> >>
> >> Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> >> ---
> >>  mm/kmemleak.c | 2 +-
> >>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >> diff --git a/mm/kmemleak.c b/mm/kmemleak.c
> >> index a182f5d..c546250 100644
> >> --- a/mm/kmemleak.c
> >> +++ b/mm/kmemleak.c
> >> @@ -1471,7 +1471,7 @@ static void kmemleak_scan(void)
> >>                         if (page_zone(page) != zone)
> >>                                 continue;
> >>                         /* only scan if page is in use */
> >> -                       if (page_count(page) == 0)
> >> +                       if (page_count(page) == 0 || PageReserved(page))
> > Sorry for previous stupid code by my faint, correct it here
>
> Did you even test the initial patch?
>
> I wonder why we should consider this change
>
> (a) I doubt it's a performance issue. If it is, please provide numbers
>     before/after.
For Android-like SOC systems where AP(cpu runs linux) are one of the
memory consumers which are composed of other processors such as modem,
isp,wcn etc. The reserved memory occupies a certain number of
memory(could be 30% of MemTotal) which makes scan reserved pages
pointless.
> (b) We'll stop scanning early allocations. As the memmap is usually
>     allocated early during boot ... we'll stop scanning essentially the
>     whole mmap and that whole loop would be dead code? What am i
>     missing?
memmap refers to pages here? If we can surpass these as it exist
permanently during life period. Besides, I wonder if PageLRU should
also be skipped?
-                       if (page_count(page) == 0)
+                       if (page_count(page) == 0 ||
PageReserved(page) || PageLRU(page))
>
> --
> Thanks,
>
> David / dhildenb
>
David Hildenbrand Aug. 30, 2022, 8:03 a.m. UTC | #4
On 30.08.22 04:41, Zhaoyang Huang wrote:
> On Mon, Aug 29, 2022 at 8:19 PM David Hildenbrand <david@redhat.com> wrote:
>>
>> On 26.08.22 05:23, Zhaoyang Huang wrote:
>>> On Fri, Aug 26, 2022 at 11:13 AM zhaoyang.huang
>>> <zhaoyang.huang@unisoc.com> wrote:
>>>>
>>>> From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
>>>>
>>>> It is no need to scan reserved page, skip it.
>>>>
>>>> Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
>>>> ---
>>>>  mm/kmemleak.c | 2 +-
>>>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>>>
>>>> diff --git a/mm/kmemleak.c b/mm/kmemleak.c
>>>> index a182f5d..c546250 100644
>>>> --- a/mm/kmemleak.c
>>>> +++ b/mm/kmemleak.c
>>>> @@ -1471,7 +1471,7 @@ static void kmemleak_scan(void)
>>>>                         if (page_zone(page) != zone)
>>>>                                 continue;
>>>>                         /* only scan if page is in use */
>>>> -                       if (page_count(page) == 0)
>>>> +                       if (page_count(page) == 0 || PageReserved(page))
>>> Sorry for previous stupid code by my faint, correct it here
>>
>> Did you even test the initial patch?
>>
>> I wonder why we should consider this change
>>
>> (a) I doubt it's a performance issue. If it is, please provide numbers
>>     before/after.
> For Android-like SOC systems where AP(cpu runs linux) are one of the
> memory consumers which are composed of other processors such as modem,
> isp,wcn etc. The reserved memory occupies a certain number of
> memory(could be 30% of MemTotal) which makes scan reserved pages
> pointless.

But we only scan the memmap (struct page) here and not the actual
memory. Do you have any performance numbers showing that there is even
an observable change?

>> (b) We'll stop scanning early allocations. As the memmap is usually
>>     allocated early during boot ... we'll stop scanning essentially the
>>     whole mmap and that whole loop would be dead code? What am i
>>     missing?
> memmap refers to pages here? If we can surpass these as it exist
> permanently during life period. Besides, I wonder if PageLRU should
> also be skipped?
> -                       if (page_count(page) == 0)
> +                       if (page_count(page) == 0 ||
> PageReserved(page) || PageLRU(page))

I think we need a really good justification to start poking holes into
the memmap scanner. I'm no expert on this code (and under which
circumstances we actually might find referenced objects in a memmap),
though.

But we should be careful with that.
Zhaoyang Huang Aug. 30, 2022, 8:52 a.m. UTC | #5
On Tue, Aug 30, 2022 at 4:03 PM David Hildenbrand <david@redhat.com> wrote:
>
> On 30.08.22 04:41, Zhaoyang Huang wrote:
> > On Mon, Aug 29, 2022 at 8:19 PM David Hildenbrand <david@redhat.com> wrote:
> >>
> >> On 26.08.22 05:23, Zhaoyang Huang wrote:
> >>> On Fri, Aug 26, 2022 at 11:13 AM zhaoyang.huang
> >>> <zhaoyang.huang@unisoc.com> wrote:
> >>>>
> >>>> From: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> >>>>
> >>>> It is no need to scan reserved page, skip it.
> >>>>
> >>>> Signed-off-by: Zhaoyang Huang <zhaoyang.huang@unisoc.com>
> >>>> ---
> >>>>  mm/kmemleak.c | 2 +-
> >>>>  1 file changed, 1 insertion(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/mm/kmemleak.c b/mm/kmemleak.c
> >>>> index a182f5d..c546250 100644
> >>>> --- a/mm/kmemleak.c
> >>>> +++ b/mm/kmemleak.c
> >>>> @@ -1471,7 +1471,7 @@ static void kmemleak_scan(void)
> >>>>                         if (page_zone(page) != zone)
> >>>>                                 continue;
> >>>>                         /* only scan if page is in use */
> >>>> -                       if (page_count(page) == 0)
> >>>> +                       if (page_count(page) == 0 || PageReserved(page))
> >>> Sorry for previous stupid code by my faint, correct it here
> >>
> >> Did you even test the initial patch?
> >>
> >> I wonder why we should consider this change
> >>
> >> (a) I doubt it's a performance issue. If it is, please provide numbers
> >>     before/after.
> > For Android-like SOC systems where AP(cpu runs linux) are one of the
> > memory consumers which are composed of other processors such as modem,
> > isp,wcn etc. The reserved memory occupies a certain number of
> > memory(could be 30% of MemTotal) which makes scan reserved pages
> > pointless.
>
> But we only scan the memmap (struct page) here and not the actual
> memory. Do you have any performance numbers showing that there is even
> an observable change?
>
> >> (b) We'll stop scanning early allocations. As the memmap is usually
> >>     allocated early during boot ... we'll stop scanning essentially the
> >>     whole mmap and that whole loop would be dead code? What am i
> >>     missing?
> > memmap refers to pages here? If we can surpass these as it exist
> > permanently during life period. Besides, I wonder if PageLRU should
> > also be skipped?
> > -                       if (page_count(page) == 0)
> > +                       if (page_count(page) == 0 ||
> > PageReserved(page) || PageLRU(page))
>
> I think we need a really good justification to start poking holes into
> the memmap scanner. I'm no expert on this code (and under which
> circumstances we actually might find referenced objects in a memmap),
> though.
>
> But we should be careful with that.
Agree. It may be helpless as kmemleak is for debugging purposes. Nack
this patch by myself. Sorry for interrupt.
>
> --
> Thanks,
>
> David / dhildenb
>
diff mbox series

Patch

diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index a182f5d..c546250 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -1471,7 +1471,7 @@  static void kmemleak_scan(void)
 			if (page_zone(page) != zone)
 				continue;
 			/* only scan if page is in use */
-			if (page_count(page) == 0)
+			if (page_count(page) == 0 && !PageReserved(page))
 				continue;
 			scan_block(page, page + 1, NULL);
 			if (!(pfn & 63))