From: David Laight <david.laight.linux@gmail.com>
To: Mateusz Guzik <mjguzik@gmail.com>
Cc: Matthew Wilcox <willy@infradead.org>,
ebiederm@xmission.com, oleg@redhat.com, brauner@kernel.org,
akpm@linux-foundation.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Subject: Re: [PATCH v3 6/6] pid: drop irq disablement around pidmap_lock
Date: Sun, 2 Feb 2025 20:44:49 +0000 [thread overview]
Message-ID: <20250202204449.77cab5e5@pumpkin> (raw)
In-Reply-To: <CAGudoHED5-oPqb62embitG39P1Rf7EtEVODY38WB25G21-GGyQ@mail.gmail.com>
On Sun, 2 Feb 2025 20:34:48 +0100
Mateusz Guzik <mjguzik@gmail.com> wrote:
> On Sun, Feb 2, 2025 at 2:55 PM David Laight
> <david.laight.linux@gmail.com> wrote:
> >
> > On Sat, 1 Feb 2025 22:00:06 +0000
> > Matthew Wilcox <willy@infradead.org> wrote:
> >
> > > On Sat, Feb 01, 2025 at 09:51:05PM +0000, David Laight wrote:
> > > > I'm not sure what you mean.
> > > > Disabling interrupts isn't as cheap as it ought to be, but probably isn't
> > > > that bad.
> > >
> > > Time it. You'll see.
> >
> > The best scheme I've seen is to just increment a per-cpu value.
> > Let the interrupt happen, notice it isn't allowed and return with
> > interrupts disabled.
> > Then re-issue the interrupt when the count is decremented to zero.
> > Easy with level sensitive interrupts.
> > But I don't think Linux ever uses that scheme.
> >
>
> I presume you are talking about the splhigh/splx set of primivitives
> from Unix kernels.
>
> While "entering" is indeed cheap, undoing the work still needs to be
> atomic vs interrupts.
>
> I see NetBSD uses local cmpxchg8b on the interrupt level and interrupt
> mask, while the rest takes the irq trip.
>
> The NetBSD solution is still going to be visibly slower than not
> messing with any of it as spin_unlock on amd64 is merely a store of 0
> and cmpxchg even without the lock prefix costs several clocks.
>
> Maybe there is other hackery which could be done, but see below.
I was thinking it might be possible to merge an 'interrupts disabled' count
with the existing 'pre-emption disabled' count.
IIRC (on x86 at least) this is just a per-cpu variabled accessed from %fs/%gs.
So you add one to disable pre-emption and (say) 1<<16 to disable interrupts.
If an interrupt happens while the count is 'big' the count value is changed
so the last decrement of 1<<16 will set carry (or overflow), and a return
from interrupt is done that leaves interrupts disabled (traditionally easy).
The interrupt enable call just subtracts the 1<<16 and checks for carry (or
overflow), if not set all is fine, it set it needs to call something to
re-issue the interrupt - that is probably the hard bit.
>
> >
> > > > > So while this is indeed a tradeoff, as I understand the sane default
> > > > > is to *not* disable interrupts unless necessary.
> > > >
> > > > I bet to differ.
> > >
> > > You're wrong. It is utterly standard to take spinlocks without
> > > disabling IRQs. We do it all over the kernel. If you think that needs
> > > to change, then make your case, don't throw a driveby review.
> > >
> > > And I don't mean by arguing. Make a change, measure the difference.
> >
> > The analysis was done on some userspace code that basically does:
> > for (;;) {
> > pthread_mutex_enter(lock);
> > item = get_head(list);
> > if (!item)
> > break;
> > pthead_mutex_exit(lock);
> > process(item);
> > }
> > For the test there were about 10000 items on the list and 30 threads
> > processing it (that was the target of the tests).
> > The entire list needs to be processed in 10ms (RTP audio).
> > There was a bit more code with the mutex held, but only 100 or so
> > instructions.
> > Mostly it works fine, some threads get delayed by interrupts (etc) but
> > the other threads carry on working and all the items get processed.
> >
> > However sometimes an interrupt happens while the mutex is held.
> > In that case the other 29 threads get stuck waiting for the mutex.
> > No progress is made until the interrupt completes and it overruns
> > the 10ms period.
> >
> > While this is a userspace test, the same thing will happen with
> > spin locks in the kernel.
> >
> > In userspace you can't disable interrupts, but for kernel spinlocks
> > you can.
> >
> > The problem is likely to show up as unexpected latency affecting
> > code with a hot mutex that is only held for short periods while
> > running a lot of network traffic.
> > That is also latency that affects all cpu at the same time.
> > The interrupt itself will always cause latency to one cpu.
> >
>
> Nobody is denying there is potential that lock hold time will get
> significantly extended if you get unlucky enough vs interrupts. It is
> questioned whether defaulting to irqs off around lock-protected areas
> is the right call.
I really commented because you were changing one lock which could
easily be 'hot' enough for there to be side effects, without even
a comment about any pitfalls.
David
>
> As I noted in my previous e-mail the spin_lock_irq stuff disables
> interrupts upfront and does not touch them afterwards even when
> waiting for the lock to become free. Patching that up with queued
> locks may be non-trivial, if at all possible. Thus contention on
> irq-disabled locks *will* add latency to their handling unless this
> gets addressed. Note maintaining forward progress guarantee in the
> locking mechanism is non-negotiable, so punting to TAS or similar
> unfair locks does not cut it.
>
> This is on top of having to solve the overhead problem for taking the
> trips (see earlier in the e-mail).
>
> I would argue if the network stuff specifically is known to add
> visible latency, then perhaps that's something to investigate.
>
> Anyhow, as Willy said, you are welcome to code this up and demonstrate
> it is better overall.
>
next prev parent reply other threads:[~2025-02-02 20:44 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-01 16:31 [PATCH v3 0/6] reduce tasklist_lock hold time on exit and do some Mateusz Guzik
2025-02-01 16:31 ` [PATCH v3 1/6] exit: perform add_device_randomness() without tasklist_lock Mateusz Guzik
2025-02-03 17:51 ` Oleg Nesterov
2025-02-03 17:55 ` Mateusz Guzik
2025-02-01 16:31 ` [PATCH v3 2/6] exit: hoist get_pid() in release_task() outside of tasklist_lock Mateusz Guzik
2025-02-03 19:27 ` Liam R. Howlett
2025-02-03 19:35 ` Mateusz Guzik
2025-02-03 20:13 ` Liam R. Howlett
2025-02-03 20:22 ` Mateusz Guzik
2025-02-03 20:28 ` Liam R. Howlett
2025-02-04 1:51 ` Andrew Morton
2025-02-01 16:31 ` [PATCH v3 3/6] exit: postpone tty_kref_put() until after tasklist_lock is dropped Mateusz Guzik
2025-02-03 18:06 ` Oleg Nesterov
2025-02-03 19:33 ` Mateusz Guzik
2025-02-04 11:22 ` Oleg Nesterov
2025-02-04 12:12 ` Mateusz Guzik
2025-02-01 16:31 ` [PATCH v3 4/6] pid: sprinkle tasklist_lock asserts Mateusz Guzik
2025-02-01 16:31 ` [PATCH v3 5/6] pid: perform free_pid() calls outside of tasklist_lock Mateusz Guzik
2025-02-03 18:49 ` Oleg Nesterov
2025-02-03 19:31 ` Mateusz Guzik
2025-02-03 20:02 ` Oleg Nesterov
2025-02-01 16:31 ` [PATCH v3 6/6] pid: drop irq disablement around pidmap_lock Mateusz Guzik
2025-02-01 17:42 ` Oleg Nesterov
2025-02-01 17:45 ` Oleg Nesterov
2025-02-01 18:19 ` David Laight
2025-02-01 18:42 ` Mateusz Guzik
2025-02-01 21:51 ` David Laight
2025-02-01 22:00 ` Matthew Wilcox
2025-02-02 13:55 ` David Laight
2025-02-02 19:34 ` Mateusz Guzik
2025-02-02 20:44 ` David Laight [this message]
2025-02-02 22:06 ` Matthew Wilcox
2025-02-03 17:47 ` [PATCH v3 0/6] reduce tasklist_lock hold time on exit and do some Oleg Nesterov
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=20250202204449.77cab5e5@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=ebiederm@xmission.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mjguzik@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=oleg@redhat.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.