All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: Baolin Wang <baolin.wang@linux.alibaba.com>,
	"Huang, Ying" <ying.huang@intel.com>
Cc: akpm@linux-foundation.org, mgorman@techsingularity.net,
	vbabka@suse.cz, linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] mm: compaction: skip memory hole rapidly when isolating migratable pages
Date: Mon, 12 Jun 2023 11:54:51 +0200	[thread overview]
Message-ID: <55e05ac0-041d-75eb-4707-e053dc3f2976@redhat.com> (raw)
In-Reply-To: <d8444045-9497-1073-5cf9-e2959197701d@linux.alibaba.com>

On 12.06.23 11:36, Baolin Wang wrote:
> 
> 
> On 6/12/2023 2:39 PM, Huang, Ying wrote:
>> Baolin Wang <baolin.wang@linux.alibaba.com> writes:
>>
>>> On some machines, the normal zone can have a large memory hole like
>>> below memory layout, and we can see the range from 0x100000000 to
>>> 0x1800000000 is a hole. So when isolating some migratable pages, the
>>> scanner can meet the hole and it will take more time to skip the large
>>> hole. From my measurement, I can see the isolation scanner will take
>>> 80us ~ 100us to skip the large hole [0x100000000 - 0x1800000000].
>>>
>>> So adding a new helper to fast search next online memory section
>>> to skip the large hole can help to find next suitable pageblock
>>> efficiently. With this patch, I can see the large hole scanning only
>>> takes < 1us.
>>>
>>> [    0.000000] Zone ranges:
>>> [    0.000000]   DMA      [mem 0x0000000040000000-0x00000000ffffffff]
>>> [    0.000000]   DMA32    empty
>>> [    0.000000]   Normal   [mem 0x0000000100000000-0x0000001fa7ffffff]
>>> [    0.000000] Movable zone start for each node
>>> [    0.000000] Early memory node ranges
>>> [    0.000000]   node   0: [mem 0x0000000040000000-0x0000000fffffffff]
>>> [    0.000000]   node   0: [mem 0x0000001800000000-0x0000001fa3c7ffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa3c80000-0x0000001fa3ffffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa4000000-0x0000001fa402ffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa4030000-0x0000001fa40effff]
>>> [    0.000000]   node   0: [mem 0x0000001fa40f0000-0x0000001fa73cffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa73d0000-0x0000001fa745ffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa7460000-0x0000001fa746ffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa7470000-0x0000001fa758ffff]
>>> [    0.000000]   node   0: [mem 0x0000001fa7590000-0x0000001fa7ffffff]
>>>
>>> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
>>> ---
>>>    include/linux/mmzone.h | 10 ++++++++++
>>>    mm/compaction.c        | 23 ++++++++++++++++++++++-
>>>    2 files changed, 32 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
>>> index 5a7ada0413da..87e6c535d895 100644
>>> --- a/include/linux/mmzone.h
>>> +++ b/include/linux/mmzone.h
>>> @@ -2000,6 +2000,16 @@ static inline unsigned long next_present_section_nr(unsigned long section_nr)
>>>    	return -1;
>>>    }
>>>    
>>> +static inline unsigned long next_online_section_nr(unsigned long section_nr)
>>> +{
>>> +	while (++section_nr <= __highest_present_section_nr) {
>>> +		if (online_section_nr(section_nr))
>>> +			return section_nr;
>>> +	}
>>> +
>>> +	return -1UL;
>>> +}
>>> +
>>>    /*
>>>     * These are _only_ used during initialisation, therefore they
>>>     * can use __initdata ...  They could have names to indicate
>>> diff --git a/mm/compaction.c b/mm/compaction.c
>>> index 3398ef3a55fe..3a55fdd20c49 100644
>>> --- a/mm/compaction.c
>>> +++ b/mm/compaction.c
>>> @@ -229,6 +229,21 @@ static void reset_cached_positions(struct zone *zone)
>>>    				pageblock_start_pfn(zone_end_pfn(zone) - 1);
>>>    }
>>>    
>>> +static unsigned long skip_hole_pageblock(unsigned long start_pfn)
>>> +{
>>> +	unsigned long next_online_nr;
>>> +	unsigned long start_nr = pfn_to_section_nr(start_pfn);
>>> +
>>> +	if (online_section_nr(start_nr))
>>> +		return -1UL;
>>
>> Define a macro for the maigic "-1UL"?  Which is used for multiple times
>> in the patch.
> 
> I am struggling to find a readable macro for these '-1UL', since the
> '-1UL' in next_online_section_nr() indicates that it can not find an
> online section. However the '-1' in skip_hole_pageblock() indicates that
> it can not find an online pfn.

Maybe something like

#define SECTION_NR_INVALID -1UL

> 
> So after more thinking, I will change to return 'NR_MEM_SECTIONS' if can
> not find next online section in next_online_section_nr(). And in
> skip_hole_pageblock(), I will change to return 0 if can not find next
> online pfn. What do you think?

Well, 0 "might be" (and most likely is) a valid section number, so you'd 
simulate some kind-of a wraparound. I guess I'd prefer 
SECTION_NR_INVALID instead.

-- 
Cheers,

David / dhildenb



  reply	other threads:[~2023-06-12  9:54 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-09  9:45 [PATCH] mm: compaction: skip memory hole rapidly when isolating migratable pages Baolin Wang
2023-06-09 14:48 ` kernel test robot
2023-06-11  1:38   ` Baolin Wang
2023-06-12  6:39 ` Huang, Ying
2023-06-12  9:36   ` Baolin Wang
2023-06-12  9:54     ` David Hildenbrand [this message]
2023-06-12 10:10       ` Baolin Wang
2023-06-12 10:11         ` David Hildenbrand
2023-06-13  1:08     ` Huang, Ying

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55e05ac0-041d-75eb-4707-e053dc3f2976@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@techsingularity.net \
    --cc=vbabka@suse.cz \
    --cc=ying.huang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.