From: Mel Gorman <mgorman@techsingularity.net>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Nicolas Saenz Julienne <nsaenzju@redhat.com>,
Marcelo Tosatti <mtosatti@redhat.com>,
Michal Hocko <mhocko@kernel.org>, Hugh Dickins <hughd@google.com>,
LKML <linux-kernel@vger.kernel.org>,
Linux-MM <linux-mm@kvack.org>
Subject: Re: [PATCH 7/7] mm/page_alloc: Replace local_lock with normal spinlock
Date: Tue, 21 Jun 2022 10:26:33 +0100 [thread overview]
Message-ID: <20220621092633.GD15453@techsingularity.net> (raw)
In-Reply-To: <43033655-2e78-621b-cc76-c3dc53024d00@suse.cz>
On Thu, Jun 16, 2022 at 07:01:53PM +0200, Vlastimil Babka wrote:
> On 6/13/22 14:56, Mel Gorman wrote:
> > struct per_cpu_pages is no longer strictly local as PCP lists can be
> > drained remotely using a lock for protection. While the use of local_lock
> > works, it goes against the intent of local_lock which is for "pure
> > CPU local concurrency control mechanisms and not suited for inter-CPU
> > concurrency control" (Documentation/locking/locktypes.rst)
> >
> > local_lock protects against migration between when the percpu pointer is
> > accessed and the pcp->lock acquired. The lock acquisition is a preemption
> > point so in the worst case, a task could migrate to another NUMA node
> > and accidentally allocate remote memory. The main requirement is to pin
> > the task to a CPU that is suitable for PREEMPT_RT and !PREEMPT_RT.
> >
> > Replace local_lock with helpers that pin a task to a CPU, lookup the
> > per-cpu structure and acquire the embedded lock. It's similar to local_lock
> > without breaking the intent behind the API. It is not a complete API
> > as only the parts needed for PCP-alloc are implemented but in theory,
> > the generic helpers could be promoted to a general API if there was
> > demand for an embedded lock within a per-cpu struct with a guarantee
> > that the per-cpu structure locked matches the running CPU and cannot use
> > get_cpu_var due to RT concerns. PCP requires these semantics to avoid
> > accidentally allocating remote memory.
> >
> > Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
>
> ...
>
> > @@ -3367,30 +3429,17 @@ static int nr_pcp_high(struct per_cpu_pages *pcp, struct zone *zone,
> > return min(READ_ONCE(pcp->batch) << 2, high);
> > }
> >
> > -/* Returns true if the page was committed to the per-cpu list. */
> > -static bool free_unref_page_commit(struct page *page, int migratetype,
> > - unsigned int order, bool locked)
> > +static void free_unref_page_commit(struct per_cpu_pages *pcp, struct zone *zone,
> > + struct page *page, int migratetype,
> > + unsigned int order)
>
> Hmm given this drops the "bool locked" and bool return value again, my
> suggestion for patch 5/7 would result in less churn as those woudn't need to
> be introduced?
>
It would. I considered doing exactly that but I didn't want to drop the
reviewed-bys and tested-bys and the change was significant enough to do
that. As multiple fixes are needed, I'll do that.
> ...
>
> > @@ -3794,19 +3805,29 @@ static struct page *rmqueue_pcplist(struct zone *preferred_zone,
> > struct list_head *list;
> > struct page *page;
> > unsigned long flags;
> > + unsigned long __maybe_unused UP_flags;
> >
> > - local_lock_irqsave(&pagesets.lock, flags);
> > + /*
> > + * spin_trylock_irqsave is not necessary right now as it'll only be
> > + * true when contending with a remote drain. It's in place as a
> > + * preparation step before converting pcp locking to spin_trylock
> > + * to protect against IRQ reentry.
> > + */
> > + pcp_trylock_prepare(UP_flags);
> > + pcp = pcp_spin_trylock_irqsave(zone->per_cpu_pageset, flags);
> > + if (!pcp)
>
> Besides the missing unpin Andrew fixed, I think also this is missing
> pcp_trylock_finish(UP_flags); ?
>
Yes.
--
Mel Gorman
SUSE Labs
next prev parent reply other threads:[~2022-06-21 9:26 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-13 12:56 [PATCH v4 00/7] Drain remote per-cpu directly Mel Gorman
2022-06-13 12:56 ` [PATCH 1/7] mm/page_alloc: Add page->buddy_list and page->pcp_list Mel Gorman
2022-06-13 12:56 ` [PATCH 2/7] mm/page_alloc: Use only one PCP list for THP-sized allocations Mel Gorman
2022-06-13 12:56 ` [PATCH 3/7] mm/page_alloc: Split out buddy removal code from rmqueue into separate helper Mel Gorman
2022-06-13 12:56 ` [PATCH 4/7] mm/page_alloc: Remove mistaken page == NULL check in rmqueue Mel Gorman
2022-06-13 12:56 ` [PATCH 5/7] mm/page_alloc: Protect PCP lists with a spinlock Mel Gorman
2022-06-16 15:59 ` Vlastimil Babka
2022-06-13 12:56 ` [PATCH 6/7] mm/page_alloc: Remotely drain per-cpu lists Mel Gorman
2022-06-16 16:41 ` Vlastimil Babka
2022-06-13 12:56 ` [PATCH 7/7] mm/page_alloc: Replace local_lock with normal spinlock Mel Gorman
2022-06-15 22:43 ` Yu Zhao
2022-06-15 22:48 ` Marek Szyprowski
2022-06-15 23:04 ` Andrew Morton
2022-06-16 3:05 ` Yu Zhao
2022-06-17 7:55 ` Vlastimil Babka
2022-06-17 6:47 ` Marek Szyprowski
2022-06-21 9:21 ` Mel Gorman
2022-06-16 17:01 ` Vlastimil Babka
2022-06-16 21:07 ` Yu Zhao
2022-06-17 7:57 ` Vlastimil Babka
2022-06-21 9:27 ` Mel Gorman
2022-06-21 9:26 ` Mel Gorman [this message]
2022-06-17 9:39 ` Nicolas Saenz Julienne
2022-06-21 9:29 ` Mel Gorman
2022-06-21 9:31 ` Nicolas Saenz Julienne
2022-07-03 9:44 ` [mm/page_alloc] 2bd8eec68f: BUG:sleeping_function_called_from_invalid_context_at_mm/gup.c kernel test robot
2022-07-03 9:44 ` kernel test robot
2022-07-03 20:22 ` Andrew Morton
2022-07-03 20:22 ` Andrew Morton
2022-07-05 13:51 ` Oliver Sang
2022-07-05 13:51 ` Oliver Sang
2022-07-06 9:55 ` Mel Gorman
2022-07-06 9:55 ` Mel Gorman
2022-07-06 11:53 ` Mel Gorman
2022-07-06 11:53 ` Mel Gorman
2022-07-06 14:21 ` Oliver Sang
2022-07-06 14:21 ` Oliver Sang
2022-07-06 14:52 ` Mel Gorman
2022-07-06 14:52 ` Mel Gorman
2022-07-07 8:22 ` Oliver Sang
2022-07-07 8:22 ` Oliver Sang
2022-07-06 14:25 ` Oliver Sang
2022-07-06 14:25 ` Oliver Sang
2022-07-06 14:53 ` Mel Gorman
2022-07-06 14:53 ` Mel Gorman
2022-07-07 21:55 ` Vlastimil Babka
2022-07-07 21:55 ` Vlastimil Babka
2022-07-08 10:56 ` Mel Gorman
2022-07-08 10:56 ` Mel Gorman
2022-07-12 5:04 ` Oliver Sang
2022-07-12 5:04 ` Oliver Sang
-- strict thread matches above, loose matches on Subject: below --
2022-06-24 12:54 [PATCH v5 00/7] Drain remote per-cpu directly Mel Gorman
2022-06-24 12:54 ` [PATCH 7/7] mm/page_alloc: Replace local_lock with normal spinlock Mel Gorman
2022-06-24 18:59 ` Yu Zhao
2022-07-04 14:39 ` Vlastimil Babka
2022-07-04 16:33 ` Nicolas Saenz Julienne
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=20220621092633.GD15453@techsingularity.net \
--to=mgorman@techsingularity.net \
--cc=akpm@linux-foundation.org \
--cc=hughd@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@kernel.org \
--cc=mtosatti@redhat.com \
--cc=nsaenzju@redhat.com \
--cc=vbabka@suse.cz \
/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.