From: Alex Shi <alex.shi@linux.alibaba.com>
To: Alexander Duyck <alexander.duyck@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Mel Gorman <mgorman@techsingularity.net>,
Tejun Heo <tj@kernel.org>, Hugh Dickins <hughd@google.com>,
Konstantin Khlebnikov <khlebnikov@yandex-team.ru>,
Daniel Jordan <daniel.m.jordan@oracle.com>,
Yang Shi <yang.shi@linux.alibaba.com>,
Matthew Wilcox <willy@infradead.org>,
Johannes Weiner <hannes@cmpxchg.org>,
kbuild test robot <lkp@intel.com>, linux-mm <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>,
cgroups@vger.kernel.org, Shakeel Butt <shakeelb@google.com>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Wei Yang <richard.weiyang@gmail.com>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
Rong Chen <rong.a.chen@intel.com>,
Michal Hocko <mhocko@kernel.org>,
Vladimir Davydov <vdavydov.dev@gmail.com>
Subject: Re: [PATCH v17 17/21] mm/lru: replace pgdat lru_lock with lruvec lock
Date: Tue, 28 Jul 2020 15:15:34 +0800 [thread overview]
Message-ID: <49d2a784-3560-4d97-ece2-f2dfb6941495@linux.alibaba.com> (raw)
In-Reply-To: <CAKgT0UdaW4Rf43yULhQBuP07vQgmoPbaWHGKv1Z7fEPP6jH83w@mail.gmail.com>
在 2020/7/28 上午7:34, Alexander Duyck 写道:
>> @@ -847,11 +847,21 @@ static bool too_many_isolated(pg_data_t *pgdat)
>> * contention, to give chance to IRQs. Abort completely if
>> * a fatal signal is pending.
>> */
>> - if (!(low_pfn % SWAP_CLUSTER_MAX)
>> - && compact_unlock_should_abort(&pgdat->lru_lock,
>> - flags, &locked, cc)) {
>> - low_pfn = 0;
>> - goto fatal_pending;
>> + if (!(low_pfn % SWAP_CLUSTER_MAX)) {
>> + if (locked_lruvec) {
>> + unlock_page_lruvec_irqrestore(locked_lruvec,
>> + flags);
>> + locked_lruvec = NULL;
>> + }
>> +
>> + if (fatal_signal_pending(current)) {
>> + cc->contended = true;
>> +
>> + low_pfn = 0;
>> + goto fatal_pending;
>> + }
>> +
>> + cond_resched();
>> }
>>
>> if (!pfn_valid_within(low_pfn))
>
> I'm noticing this patch introduces a bunch of noise. What is the
> reason for getting rid of compact_unlock_should_abort? It seems like
> you just open coded it here. If there is some sort of issue with it
> then it might be better to replace it as part of a preparatory patch
> before you introduce this one as changes like this make it harder to
> review.
Thanks for comments, Alex.
the func compact_unlock_should_abort should be removed since one of parameters
changed from 'bool *locked' to 'struct lruvec *lruvec'. So it's not applicable
now. I have to open it here instead of adding a only one user func.
>
> It might make more sense to look at modifying
> compact_unlock_should_abort and compact_lock_irqsave (which always
> returns true so should probably be a void) to address the deficiencies
> they have that make them unusable for you.
I am wondering if people like a patch which just open compact_unlock_should_abort
func and move bool to void as a preparation patch, do you like this?
>> @@ -966,10 +975,20 @@ static bool too_many_isolated(pg_data_t *pgdat)
>> if (!TestClearPageLRU(page))
>> goto isolate_fail_put;
>>
>> + rcu_read_lock();
>> + lruvec = mem_cgroup_page_lruvec(page, pgdat);
>> +
>> /* If we already hold the lock, we can skip some rechecking */
>> - if (!locked) {
>> - locked = compact_lock_irqsave(&pgdat->lru_lock,
>> - &flags, cc);
>> + if (lruvec != locked_lruvec) {
>> + if (locked_lruvec)
>> + unlock_page_lruvec_irqrestore(locked_lruvec,
>> + flags);
>> +
>> + compact_lock_irqsave(&lruvec->lru_lock, &flags, cc);
>> + locked_lruvec = lruvec;
>> + rcu_read_unlock();
>> +
>> + lruvec_memcg_debug(lruvec, page);
>>
>> /* Try get exclusive access under lock */
>> if (!skip_updated) {
>
> So this bit makes things a bit complicated. From what I can can tell
> the comment about exclusive access under the lock is supposed to apply
> to the pageblock via the lru_lock. However you are having to retest
> the lock for each page because it is possible the page was moved to
> another memory cgroup while the lru_lock was released correct? So in
The pageblock is aligned by pfn, so pages in them maynot on same memcg
originally. and yes, page may be changed memcg also.
> this case is the lru vector lock really providing any protection for
> the skip_updated portion of this code block if the lock isn't
> exclusive to the pageblock? In theory this would probably make more
> sense to have protected the skip bits under the zone lock, but I
> imagine that was avoided due to the additional overhead.
when we change to lruvec->lru_lock, it does the same thing as pgdat->lru_lock.
just may get a bit more chance to here, and find out this is a skipable
pageblock and quit.
Yes, logically, pgdat lru_lock seems better, but since we are holding lru_lock.
It's fine to not bother more locks.
>
>> @@ -1876,6 +1876,12 @@ static unsigned noinline_for_stack move_pages_to_lru(struct lruvec *lruvec,
>> * list_add(&page->lru,)
>> * list_add(&page->lru,) //corrupt
>> */
>> + new_lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page));
>> + if (new_lruvec != lruvec) {
>> + if (lruvec)
>> + spin_unlock_irq(&lruvec->lru_lock);
>> + lruvec = lock_page_lruvec_irq(page);
>> + }
>> SetPageLRU(page);
>>
>> if (unlikely(put_page_testzero(page))) {
>
> I was going through the code of the entire patch set and I noticed
> these changes in move_pages_to_lru. What is the reason for adding the
> new_lruvec logic? My understanding is that we are moving the pages to
> the lruvec provided are we not?If so why do we need to add code to get
> a new lruvec? The code itself seems to stand out from the rest of the
> patch as it is introducing new code instead of replacing existing
> locking code, and it doesn't match up with the description of what
> this function is supposed to do since it changes the lruvec.
A code here since some bugs happened. I will check it again anyway.
Thanks!
next prev parent reply other threads:[~2020-07-28 7:15 UTC|newest]
Thread overview: 101+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-25 12:59 [PATCH v17 00/21] per memcg lru lock Alex Shi
2020-07-25 12:59 ` [PATCH v17 01/21] mm/vmscan: remove unnecessary lruvec adding Alex Shi
2020-08-06 3:47 ` Alex Shi
2020-07-25 12:59 ` [PATCH v17 02/21] mm/page_idle: no unlikely double check for idle page counting Alex Shi
2020-07-25 12:59 ` [PATCH v17 03/21] mm/compaction: correct the comments of compact_defer_shift Alex Shi
2020-07-27 17:29 ` Alexander Duyck
2020-07-28 11:59 ` Alex Shi
2020-07-28 14:17 ` Alexander Duyck
2020-07-25 12:59 ` [PATCH v17 04/21] mm/compaction: rename compact_deferred as compact_should_defer Alex Shi
2020-07-25 12:59 ` [PATCH v17 05/21] mm/thp: move lru_add_page_tail func to huge_memory.c Alex Shi
2020-07-25 12:59 ` [PATCH v17 06/21] mm/thp: clean up lru_add_page_tail Alex Shi
2020-07-25 12:59 ` [PATCH v17 07/21] mm/thp: remove code path which never got into Alex Shi
2020-07-25 12:59 ` [PATCH v17 08/21] mm/thp: narrow lru locking Alex Shi
2020-07-25 12:59 ` [PATCH v17 09/21] mm/memcg: add debug checking in lock_page_memcg Alex Shi
2020-07-25 12:59 ` [PATCH v17 10/21] mm/swap: fold vm event PGROTATED into pagevec_move_tail_fn Alex Shi
2020-07-25 12:59 ` [PATCH v17 11/21] mm/lru: move lru_lock holding in func lru_note_cost_page Alex Shi
2020-08-05 21:18 ` Alexander Duyck
2020-07-25 12:59 ` [PATCH v17 12/21] mm/lru: move lock into lru_note_cost Alex Shi
2020-07-25 12:59 ` [PATCH v17 13/21] mm/lru: introduce TestClearPageLRU Alex Shi
2020-07-29 3:53 ` Alex Shi
2020-08-05 22:43 ` Alexander Duyck
2020-08-06 1:54 ` Alex Shi
2020-08-06 14:41 ` Alexander Duyck
2020-07-25 12:59 ` [PATCH v17 14/21] mm/compaction: do page isolation first in compaction Alex Shi
2020-08-04 21:35 ` Alexander Duyck
2020-08-06 18:38 ` Alexander Duyck
2020-08-07 3:24 ` Alex Shi
2020-08-07 14:51 ` Alexander Duyck
2020-08-10 13:10 ` Alex Shi
2020-08-10 14:41 ` Alexander Duyck
2020-08-11 8:22 ` Alex Shi
2020-08-11 14:47 ` Alexander Duyck
2020-08-12 11:43 ` Alex Shi
2020-08-12 12:16 ` Alex Shi
2020-08-12 16:51 ` Alexander Duyck
2020-08-13 1:46 ` Alex Shi
2020-08-13 2:17 ` Alexander Duyck
2020-08-13 3:52 ` Alex Shi
2020-08-13 4:02 ` [RFC PATCH 0/3] " Alexander Duyck
2020-08-13 4:02 ` [RFC PATCH 1/3] mm: Drop locked from isolate_migratepages_block Alexander Duyck
2020-08-13 6:56 ` Alex Shi
2020-08-13 14:32 ` Alexander Duyck
2020-08-14 7:25 ` Alex Shi
2020-08-13 7:44 ` Alex Shi
2020-08-13 14:26 ` Alexander Duyck
2020-08-13 4:02 ` [RFC PATCH 2/3] mm: Drop use of test_and_set_skip in favor of just setting skip Alexander Duyck
2020-08-14 7:19 ` Alex Shi
2020-08-14 14:24 ` Alexander Duyck
2020-08-14 21:15 ` Alexander Duyck
[not found] ` <650ab639-e66f-5ca6-a9a5-31e61c134ae7@linux.alibaba.com>
2020-08-17 15:38 ` Alexander Duyck
2020-08-18 6:50 ` Alex Shi
2020-08-13 4:02 ` [RFC PATCH 3/3] mm: Identify compound pages sooner in isolate_migratepages_block Alexander Duyck
2020-08-14 7:20 ` Alex Shi
2020-08-17 22:58 ` [PATCH v17 14/21] mm/compaction: do page isolation first in compaction Alexander Duyck
2020-07-25 12:59 ` [PATCH v17 15/21] mm/thp: add tail pages into lru anyway in split_huge_page() Alex Shi
2020-07-25 12:59 ` [PATCH v17 16/21] mm/swap: serialize memcg changes in pagevec_lru_move_fn Alex Shi
2020-07-25 12:59 ` [PATCH v17 17/21] mm/lru: replace pgdat lru_lock with lruvec lock Alex Shi
2020-07-27 23:34 ` Alexander Duyck
2020-07-28 7:15 ` Alex Shi [this message]
2020-07-28 11:19 ` Alex Shi
2020-07-28 14:54 ` Alexander Duyck
2020-07-29 1:00 ` Alex Shi
2020-07-29 1:27 ` Alexander Duyck
2020-07-29 2:27 ` Alex Shi
2020-07-28 15:39 ` Alex Shi
2020-07-28 15:55 ` Alexander Duyck
2020-07-29 0:48 ` Alex Shi
2020-07-29 3:54 ` Alex Shi
2020-08-06 7:41 ` Alex Shi
2020-07-25 12:59 ` [PATCH v17 18/21] mm/lru: introduce the relock_page_lruvec function Alex Shi
2020-07-29 17:52 ` Alexander Duyck
2020-07-30 6:08 ` Alex Shi
2020-07-31 14:20 ` Alexander Duyck
2020-07-31 21:14 ` [PATCH RFC] mm: Add function for testing if the current lruvec lock is valid alexander.h.duyck
2020-07-31 23:54 ` Alex Shi
2020-08-02 18:20 ` Alexander Duyck
2020-08-04 6:13 ` Alex Shi
2020-07-25 12:59 ` [PATCH v17 19/21] mm/vmscan: use relock for move_pages_to_lru Alex Shi
2020-08-03 22:49 ` Alexander Duyck
2020-08-04 6:23 ` Alex Shi
2020-07-25 12:59 ` [PATCH v17 20/21] mm/pgdat: remove pgdat lru_lock Alex Shi
2020-08-03 22:42 ` Alexander Duyck
2020-08-03 22:45 ` Alexander Duyck
2020-08-04 6:22 ` Alex Shi
2020-07-25 12:59 ` [PATCH v17 21/21] mm/lru: revise the comments of lru_lock Alex Shi
2020-08-03 22:37 ` Alexander Duyck
2020-08-04 10:04 ` Alex Shi
2020-08-04 14:29 ` Alexander Duyck
2020-08-06 1:39 ` Alex Shi
2020-08-06 16:27 ` Alexander Duyck
2020-07-27 5:40 ` [PATCH v17 00/21] per memcg lru lock Alex Shi
2020-07-29 14:49 ` Alex Shi
2020-07-29 18:06 ` Hugh Dickins
2020-07-30 2:16 ` Alex Shi
2020-08-03 15:07 ` Michal Hocko
2020-08-04 6:14 ` Alex Shi
2020-07-31 21:31 ` Alexander Duyck
2020-08-04 8:36 ` Alex Shi
2020-08-04 8:36 ` Alex Shi
2020-08-04 8:37 ` Alex Shi
2020-08-04 8:37 ` Alex Shi
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=49d2a784-3560-4d97-ece2-f2dfb6941495@linux.alibaba.com \
--to=alex.shi@linux.alibaba.com \
--cc=akpm@linux-foundation.org \
--cc=alexander.duyck@gmail.com \
--cc=cgroups@vger.kernel.org \
--cc=daniel.m.jordan@oracle.com \
--cc=hannes@cmpxchg.org \
--cc=hughd@google.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=khlebnikov@yandex-team.ru \
--cc=kirill@shutemov.name \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lkp@intel.com \
--cc=mgorman@techsingularity.net \
--cc=mhocko@kernel.org \
--cc=richard.weiyang@gmail.com \
--cc=rong.a.chen@intel.com \
--cc=shakeelb@google.com \
--cc=tj@kernel.org \
--cc=vdavydov.dev@gmail.com \
--cc=willy@infradead.org \
--cc=yang.shi@linux.alibaba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).