From: Jakub Kicinski <kuba@kernel.org>
To: "Paul E. McKenney" <paulmck@kernel.org>
Cc: Kirill Tkhai <tkhai@ya.ru>,
Linux Kernel Network Developers <netdev@vger.kernel.org>,
davem@davemloft.net, edumazet@google.com, pabeni@redhat.com,
kuniyu@amazon.com, gorcunov@gmail.com
Subject: Re: [PATCH net-next] unix: Guarantee sk_state relevance in case of it was assigned by a task on other cpu
Date: Thu, 26 Jan 2023 13:33:22 -0800 [thread overview]
Message-ID: <20230126133322.3bfab5e0@kernel.org> (raw)
In-Reply-To: <20230126202511.GL2948950@paulmck-ThinkPad-P17-Gen-1>
On Thu, 26 Jan 2023 12:25:11 -0800 Paul E. McKenney wrote:
> > Me trying to prove that memory ordering is transitive would be 100%
> > speculation. Let's ask Paul instead - is the above valid? Or the fact
> > that CPU1 observes state from CPU0 and is strongly ordered with CPU2
> > implies that CPU2 will also observe CPU0's state?
>
> Hmmm... What is listen() doing? There seem to be a lot of them
> in the kernel.
>
> But proceeding on first principles...
>
> Sometimes. Memory ordering is transitive only when the ordering is
> sufficiently strong.
>
> In this case, I do not see any ordering between CPU 0 and anything else.
> If the listen() function were to acquire the same mutex as CPU1 and CPU2
> did, and if it acquired it first, then CPU2 would be guaranteed to see
> anything CPU0 did while holding that mutex.
The fuller picture would be:
[CPU0] [CPU1] [CPU2]
WRITE_ONCE(sk->sk_state,
TCP_LISTEN);
val = READ_ONCE(sk->sk_state)
mutex_lock()
shared_mem_var = val
mutex_unlock()
mutex_lock()
if (shared_mem_var == TCP_LISTEN)
BUG_ON(READ_ONCE(sk->sk_state)
!= TCP_LISTEN)
mutex_unlock()
> Alternatively, if CPU0 wrote to some memory, and CPU1 read that value
> before releasing the mutex (including possibly before acquiring that
> mutex), then CPU2 would be guaranteed to see that value (or the value
> written by some later write to that same memory) after acquiring that
> mutex.
Which I believe is exactly what happens in the example.
> So here are some things you can count on transitively:
>
> 1. After acquiring a given lock (or mutex or whatever), you will
> see any values written or read prior to any earlier conflicting
> release of that same lock.
>
> 2. After an access with acquire semantics (for example,
> smp_load_acquire()) you will see any values written or read
> prior to any earlier access with release semantics (for example,
> smp_store_release()).
>
> Or in all cases, you might see later values, in case someone else also
> did a write to the location in question.
>
> Does that help, or am I missing a turn in there somewhere?
Very much so, thank you!
next prev parent reply other threads:[~2023-01-26 21:33 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-22 22:21 [PATCH net-next] unix: Guarantee sk_state relevance in case of it was assigned by a task on other cpu Kirill Tkhai
2023-01-24 17:57 ` Kuniyuki Iwashima
2023-01-24 21:05 ` Kirill Tkhai
2023-01-24 22:32 ` Cyrill Gorcunov
2023-01-25 1:35 ` Jakub Kicinski
2023-01-25 21:09 ` Kirill Tkhai
2023-01-26 6:10 ` Jakub Kicinski
2023-01-26 20:25 ` Paul E. McKenney
2023-01-26 21:33 ` Jakub Kicinski [this message]
2023-01-26 21:47 ` Paul E. McKenney
2023-02-02 19:42 ` Kirill Tkhai
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=20230126133322.3bfab5e0@kernel.org \
--to=kuba@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gorcunov@gmail.com \
--cc=kuniyu@amazon.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=paulmck@kernel.org \
--cc=tkhai@ya.ru \
/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.