All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hugh Dickins <hughd@google.com>
To: Matthew Wilcox <willy@infradead.org>
Cc: Alex Shi <alex.shi@linux.alibaba.com>,
	akpm@linux-foundation.org, mgorman@techsingularity.net,
	tj@kernel.org, hughd@google.com, khlebnikov@yandex-team.ru,
	daniel.m.jordan@oracle.com, hannes@cmpxchg.org, lkp@intel.com,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	cgroups@vger.kernel.org, shakeelb@google.com,
	iamjoonsoo.kim@lge.com, richard.weiyang@gmail.com,
	kirill@shutemov.name, alexander.duyck@gmail.com,
	rong.a.chen@intel.com, mhocko@suse.com, vdavydov.dev@gmail.com,
	shy828301@gmail.com, Andrea Arcangeli <aarcange@redhat.com>
Subject: Re: [PATCH v18 06/32] mm/thp: narrow lru locking
Date: Fri, 18 Sep 2020 18:00:48 -0700 (PDT)	[thread overview]
Message-ID: <alpine.LSU.2.11.2009181723090.12148@eggly.anvils> (raw)
In-Reply-To: <20200913152703.GI6583@casper.infradead.org>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 5857 bytes --]

On Sun, 13 Sep 2020, Matthew Wilcox wrote:
> On Fri, Sep 11, 2020 at 11:37:50AM +0800, Alex Shi wrote:
> > 在 2020/9/10 下午9:49, Matthew Wilcox 写道:
> > > On Mon, Aug 24, 2020 at 08:54:39PM +0800, Alex Shi wrote:
> > >> lru_lock and page cache xa_lock have no reason with current sequence,
> > >> put them together isn't necessary. let's narrow the lru locking, but
> > >> left the local_irq_disable to block interrupt re-entry and statistic update.
> > > 
> > > What stats are you talking about here?
> > 
> > Hi Matthew,
> > 
> > Thanks for comments!
> > 
> > like __dec_node_page_state(head, NR_SHMEM_THPS); will have preemptive warning...
> 
> OK, but those stats are guarded by 'if (mapping)', so this patch doesn't
> produce that warning because we'll have taken the xarray lock and disabled
> interrupts.
> 
> > > How about this patch instead?  It occurred to me we already have
> > > perfectly good infrastructure to track whether or not interrupts are
> > > already disabled, and so we should use that instead of ensuring that
> > > interrupts are disabled, or tracking that ourselves.
> > 
> > So your proposal looks like;
> > 1, xa_lock_irq(&mapping->i_pages); (optional)
> > 2, spin_lock_irqsave(&ds_queue->split_queue_lock, flags);
> > 3, spin_lock_irqsave(&pgdat->lru_lock, flags);
> > 
> > Is there meaningful for the 2nd and 3rd flags?
> 
> Yes.  We want to avoid doing:
> 
> 	if (mapping)
> 		spin_lock(&ds_queue->split_queue_lock);
> 	else
> 		spin_lock_irq(&ds_queue->split_queue_lock);
> ...
> 	if (mapping)
> 		spin_unlock(&ds_queue->split_queue_lock);
> 	else
> 		spin_unlock_irq(&ds_queue->split_queue_lock);
> 
> Just using _irqsave has the same effect and is easier to reason about.
> 
> > IIRC, I had a similar proposal as your, the flags used in xa_lock_irqsave(),
> > but objected by Hugh.
> 
> I imagine Hugh's objection was that we know it's safe to disable/enable
> interrupts here because we're in a sleepable context.  But for the
> other two locks, we'd rather not track whether we've already disabled
> interrupts or not.
> 
> Maybe you could dig up the email from Hugh?  I can't find it.

I did not find exactly the objection Alex seems to be remembering, but
I have certainly expressed frustration with the lack of a reason for
the THP split lock reordering, and in private mail in June while I was
testing and sending back fixes: "I'd prefer that you never got into this:
it looks like an unrelated and debatable cleanup, and I can see more
such cleanup to make there, that we'd better not get into right now."

I've several times toyed with just leaving this patch out of the series:
but each time ended up, for better or worse, deciding we'd better keep
it in - partly because we've never tested without it, and it cannot be
dropped without making some other change (to stabilize the memcg in
the !list case) - easily doable, but already done by this patch.

Alex asked me to improve his commit message to satisfy my objections,
here's what I sent him last night:

===
lru_lock and page cache xa_lock have no obvious reason to be taken
one way round or the other: until now, lru_lock has been taken before
page cache xa_lock, when splitting a THP; but nothing else takes them
together.  Reverse that ordering: let's narrow the lru locking - but
leave local_irq_disable to block interrupts throughout, like before.

Hugh Dickins point: split_huge_page_to_list() was already silly, to be
using the _irqsave variant: it's just been taking sleeping locks, so
would already be broken if entered with interrupts enabled.  So we
can save passing flags argument down to __split_huge_page().

Why change the lock ordering here? That was hard to decide. One reason:
when this series reaches per-memcg lru locking, it relies on the THP's
memcg to be stable when taking the lru_lock: that is now done after the
THP's refcount has been frozen, which ensures page memcg cannot change.

Another reason: previously, lock_page_memcg()'s move_lock was presumed
to nest inside lru_lock; but now lru_lock must nest inside (page cache
lock inside) move_lock, so it becomes possible to use lock_page_memcg()
to stabilize page memcg before taking its lru_lock.  That is not the
mechanism used in this series, but it is an option we want to keep open.
===

It's still the case that I want to avoid further cleanups and
bikeshedding here for now.  I took an open-minded look at Alex's
patch versus Matthew's patch, and do prefer Alex's: largely because
it's simple and explicit about where the irq disabling and enabling
is done (exactly where it was done before), and doesn't need irqsave
clutter in between.  If this were to be the only local_irq_disable()
in mm I'd NAK it, but that's not so - and as I said before, I don't
take the RT THP case very seriously anyway.

One slight worry in Matthew's version:

	spin_lock_irqsave(&ds_queue->split_queue_lock, flags);
	count = page_count(head);
	mapcount = total_mapcount(head);
	if (!mapcount && page_ref_freeze(head, 1 + extra_pins)) {
		if (!list_empty(page_deferred_list(head))) {
			ds_queue->split_queue_len--;
			list_del(page_deferred_list(head));
		}
		spin_unlock_irqrestore(&ds_queue->split_queue_lock, flags);
		if (mapping) {
			if (PageSwapBacked(head))
				__dec_node_page_state(head, NR_SHMEM_THPS);
			else
				__dec_node_page_state(head, NR_FILE_THPS);
		}
		__split_huge_page(page, list, end);

In the Anon case, interrupts are enabled when calling __split_huge_page()
there, but head's refcount is frozen: I'm uneasy about preemption when a
refcount is frozen.  But I'd worry much more if it were the mapping case:
no, that has interrupts safely disabled at that point (as does Anon in
the current kernel, and with Alex's patch).

Hugh

  reply	other threads:[~2020-09-19  1:01 UTC|newest]

Thread overview: 201+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-08-24 12:54 [PATCH v18 00/32] per memcg lru_lock Alex Shi
2020-08-24 12:54 ` [PATCH v18 01/32] mm/memcg: warning on !memcg after readahead page charged Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 02/32] mm/memcg: bail out early from swap accounting when memcg is disabled Alex Shi
2020-08-24 12:54 ` [PATCH v18 03/32] mm/thp: move lru_add_page_tail func to huge_memory.c Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 04/32] mm/thp: clean up lru_add_page_tail Alex Shi
2020-08-24 12:54 ` [PATCH v18 05/32] mm/thp: remove code path which never got into Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 06/32] mm/thp: narrow lru locking Alex Shi
2020-09-10 13:49   ` Matthew Wilcox
2020-09-10 13:49     ` Matthew Wilcox
2020-09-11  3:37     ` Alex Shi
2020-09-11  3:37       ` Alex Shi
2020-09-13 15:27       ` Matthew Wilcox
2020-09-13 15:27         ` Matthew Wilcox
2020-09-19  1:00         ` Hugh Dickins [this message]
2020-09-19  1:00           ` Hugh Dickins
2020-08-24 12:54 ` [PATCH v18 07/32] mm/swap.c: stop deactivate_file_page if page not on lru Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 08/32] mm/vmscan: remove unnecessary lruvec adding Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 09/32] mm/page_idle: no unlikely double check for idle page counting Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 10/32] mm/compaction: rename compact_deferred as compact_should_defer Alex Shi
2020-08-24 12:54 ` [PATCH v18 11/32] mm/memcg: add debug checking in lock_page_memcg Alex Shi
2020-08-24 12:54 ` [PATCH v18 12/32] mm/memcg: optimize mem_cgroup_page_lruvec Alex Shi
2020-08-24 12:54 ` [PATCH v18 13/32] mm/swap.c: fold vm event PGROTATED into pagevec_move_tail_fn Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 14/32] mm/lru: move lru_lock holding in func lru_note_cost_page Alex Shi
2020-08-24 12:54 ` [PATCH v18 15/32] mm/lru: move lock into lru_note_cost Alex Shi
2020-09-21 21:36   ` Hugh Dickins
2020-09-21 21:36     ` Hugh Dickins
2020-09-21 21:36     ` Hugh Dickins
2020-09-21 22:03     ` Hugh Dickins
2020-09-21 22:03       ` Hugh Dickins
2020-09-22  3:39       ` Alex Shi
2020-09-22  3:39         ` Alex Shi
2020-09-22  3:38     ` Alex Shi
2020-09-22  3:38       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 16/32] mm/lru: introduce TestClearPageLRU Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-09-21 23:16   ` Hugh Dickins
2020-09-21 23:16     ` Hugh Dickins
2020-09-21 23:16     ` Hugh Dickins
2020-09-22  3:53     ` Alex Shi
2020-09-22  3:53       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 17/32] mm/compaction: do page isolation first in compaction Alex Shi
2020-09-21 23:49   ` Hugh Dickins
2020-09-21 23:49     ` Hugh Dickins
2020-09-22  4:57     ` Alex Shi
2020-09-22  4:57       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 18/32] mm/thp: add tail pages into lru anyway in split_huge_page() Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 19/32] mm/swap.c: serialize memcg changes in pagevec_lru_move_fn Alex Shi
2020-09-22  0:42   ` Hugh Dickins
2020-09-22  0:42     ` Hugh Dickins
2020-09-22  0:42     ` Hugh Dickins
2020-09-22  5:00     ` Alex Shi
2020-09-22  5:00       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 20/32] mm/lru: replace pgdat lru_lock with lruvec lock Alex Shi
2020-09-22  5:27   ` Hugh Dickins
2020-09-22  5:27     ` Hugh Dickins
2020-09-22  5:27     ` Hugh Dickins
2020-09-22  8:58     ` Alex Shi
2020-09-22  8:58       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 21/32] mm/lru: introduce the relock_page_lruvec function Alex Shi
2020-09-22  5:40   ` Hugh Dickins
2020-09-22  5:40     ` Hugh Dickins
2020-09-22  5:40     ` Hugh Dickins
2020-08-24 12:54 ` [PATCH v18 22/32] mm/vmscan: use relock for move_pages_to_lru Alex Shi
2020-09-22  5:44   ` Hugh Dickins
2020-09-22  5:44     ` Hugh Dickins
2020-09-23  1:55     ` Alex Shi
2020-09-23  1:55       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 23/32] mm/lru: revise the comments of lru_lock Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-09-22  5:48   ` Hugh Dickins
2020-09-22  5:48     ` Hugh Dickins
2020-08-24 12:54 ` [PATCH v18 24/32] mm/pgdat: remove pgdat lru_lock Alex Shi
2020-09-22  5:53   ` Hugh Dickins
2020-09-22  5:53     ` Hugh Dickins
2020-09-23  1:55     ` Alex Shi
2020-09-23  1:55       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 25/32] mm/mlock: remove lru_lock on TestClearPageMlocked in munlock_vma_page Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-26  5:52   ` Alex Shi
2020-08-26  5:52     ` Alex Shi
2020-09-22  6:13   ` Hugh Dickins
2020-09-22  6:13     ` Hugh Dickins
2020-09-22  6:13     ` Hugh Dickins
2020-09-23  1:58     ` Alex Shi
2020-09-23  1:58       ` Alex Shi
2020-08-24 12:54 ` [PATCH v18 26/32] mm/mlock: remove __munlock_isolate_lru_page Alex Shi
2020-08-24 12:54   ` Alex Shi
2020-08-24 12:55 ` [PATCH v18 27/32] mm/swap.c: optimizing __pagevec_lru_add lru_lock Alex Shi
2020-08-24 12:55   ` Alex Shi
2020-08-26  9:07   ` Alex Shi
2020-08-24 12:55 ` [PATCH v18 28/32] mm/compaction: Drop locked from isolate_migratepages_block Alex Shi
2020-08-24 12:55 ` [PATCH v18 29/32] mm: Identify compound pages sooner in isolate_migratepages_block Alex Shi
2020-08-24 12:55   ` Alex Shi
2020-08-24 12:55 ` [PATCH v18 30/32] mm: Drop use of test_and_set_skip in favor of just setting skip Alex Shi
2020-08-24 12:55 ` [PATCH v18 31/32] mm: Add explicit page decrement in exception path for isolate_lru_pages Alex Shi
2020-08-24 12:55   ` Alex Shi
2020-09-09  1:01   ` Matthew Wilcox
2020-09-09  1:01     ` Matthew Wilcox
2020-09-09 15:43     ` Alexander Duyck
2020-09-09 15:43       ` Alexander Duyck
2020-09-09 15:43       ` Alexander Duyck
2020-09-09 17:07       ` Matthew Wilcox
2020-09-09 17:07         ` Matthew Wilcox
2020-09-09 18:24       ` Hugh Dickins
2020-09-09 18:24         ` Hugh Dickins
2020-09-09 18:24         ` Hugh Dickins
2020-09-09 20:15         ` Matthew Wilcox
2020-09-09 20:15           ` Matthew Wilcox
2020-09-09 21:05           ` Hugh Dickins
2020-09-09 21:05             ` Hugh Dickins
2020-09-09 21:05             ` Hugh Dickins
2020-09-09 21:17         ` Alexander Duyck
2020-09-09 21:17           ` Alexander Duyck
2020-09-09 21:17           ` Alexander Duyck
2020-08-24 12:55 ` [PATCH v18 32/32] mm: Split release_pages work into 3 passes Alex Shi
2020-08-24 12:55   ` Alex Shi
2020-08-24 18:42 ` [PATCH v18 00/32] per memcg lru_lock Andrew Morton
2020-08-24 19:50   ` Qian Cai
2020-08-24 19:50     ` Qian Cai
2020-08-24 20:24   ` Hugh Dickins
2020-08-24 20:24     ` Hugh Dickins
2020-08-24 20:24     ` Hugh Dickins
2020-08-25  1:56     ` Daniel Jordan
2020-08-25  1:56       ` Daniel Jordan
2020-08-25  3:26       ` Alex Shi
2020-08-25  3:26         ` Alex Shi
2020-08-25 11:39         ` Matthew Wilcox
2020-08-25 11:39           ` Matthew Wilcox
2020-08-26  1:19         ` Daniel Jordan
2020-08-26  8:59           ` Alex Shi
2020-08-26  8:59             ` Alex Shi
2020-08-28  1:40             ` Daniel Jordan
2020-08-28  1:40               ` Daniel Jordan
2020-08-28  5:22               ` Alex Shi
2020-08-28  5:22                 ` Alex Shi
2020-09-09  2:44               ` Aaron Lu
2020-09-09  2:44                 ` Aaron Lu
2020-09-09 11:40                 ` Michal Hocko
2020-08-25  8:52       ` Alex Shi
2020-08-25  8:52         ` Alex Shi
2020-08-25 13:00         ` Alex Shi
2020-08-25 13:00           ` Alex Shi
2020-08-27  7:01     ` Hugh Dickins
2020-08-27  7:01       ` Hugh Dickins
2020-08-27 12:20       ` Race between freeing and waking page Matthew Wilcox
2020-09-08 23:41       ` [PATCH v18 00/32] per memcg lru_lock: reviews Hugh Dickins
2020-09-08 23:41         ` Hugh Dickins
2020-09-09  2:24         ` Wei Yang
2020-09-09  2:24           ` Wei Yang
2020-09-09 15:08         ` Alex Shi
2020-09-09 15:08           ` Alex Shi
2020-09-09 23:16           ` Hugh Dickins
2020-09-09 23:16             ` Hugh Dickins
2020-09-11  2:50             ` Alex Shi
2020-09-11  2:50               ` Alex Shi
2020-09-12  2:13               ` Hugh Dickins
2020-09-12  2:13                 ` Hugh Dickins
2020-09-13 14:21                 ` Alex Shi
2020-09-13 14:21                   ` Alex Shi
2020-09-15  8:21                   ` Hugh Dickins
2020-09-15  8:21                     ` Hugh Dickins
2020-09-15  8:21                     ` Hugh Dickins
2020-09-15 16:58                     ` Daniel Jordan
2020-09-15 16:58                       ` Daniel Jordan
2020-09-16 12:44                       ` Alex Shi
2020-09-17  2:37                       ` Alex Shi
2020-09-17  2:37                         ` Alex Shi
2020-09-17 14:35                         ` Daniel Jordan
2020-09-17 14:35                           ` Daniel Jordan
2020-09-17 15:39                           ` Alexander Duyck
2020-09-17 15:39                             ` Alexander Duyck
2020-09-17 15:39                             ` Alexander Duyck
2020-09-17 16:48                             ` Daniel Jordan
2020-09-17 16:48                               ` Daniel Jordan
2020-09-12  8:38           ` Hugh Dickins
2020-09-12  8:38             ` Hugh Dickins
2020-09-12  8:38             ` Hugh Dickins
2020-09-13 14:22             ` Alex Shi
2020-09-13 14:22               ` Alex Shi
2020-09-09 16:11         ` Alexander Duyck
2020-09-09 16:11           ` Alexander Duyck
2020-09-09 16:11           ` Alexander Duyck
2020-09-10  0:32           ` Hugh Dickins
2020-09-10  0:32             ` Hugh Dickins
2020-09-10  0:32             ` Hugh Dickins
2020-09-10 14:24             ` Alexander Duyck
2020-09-10 14:24               ` Alexander Duyck
2020-09-10 14:24               ` Alexander Duyck
2020-09-12  5:12               ` Hugh Dickins
2020-09-12  5:12                 ` Hugh Dickins
2020-09-12  5:12                 ` Hugh Dickins
2020-08-25  7:21   ` [PATCH v18 00/32] per memcg lru_lock Michal Hocko
2020-08-25  7:21     ` Michal Hocko

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=alpine.LSU.2.11.2009181723090.12148@eggly.anvils \
    --to=hughd@google.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=alex.shi@linux.alibaba.com \
    --cc=alexander.duyck@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=daniel.m.jordan@oracle.com \
    --cc=hannes@cmpxchg.org \
    --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@suse.com \
    --cc=richard.weiyang@gmail.com \
    --cc=rong.a.chen@intel.com \
    --cc=shakeelb@google.com \
    --cc=shy828301@gmail.com \
    --cc=tj@kernel.org \
    --cc=vdavydov.dev@gmail.com \
    --cc=willy@infradead.org \
    /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.