mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Rémi Denis-Courmont" <remi@remlab.net>
To: Zijing Yin <yzjaurora@gmail.com>,
	Remi Denis-Courmont <courmisch@gmail.com>
Cc: "David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Simon Horman <horms@kernel.org>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	stable@vger.kernel.org
Subject: Re: [PATCH net] phonet/pep: disable BH around forwarded sk_receive_skb()
Date: Wed, 20 May 2026 14:53:31 +0300	[thread overview]
Message-ID: <4172DA29-330F-42FE-91FE-C247D67F852A@remlab.net> (raw)
In-Reply-To: <20260519172635.86304-1-yzjaurora@gmail.com>



Le 19 mai 2026 20:26:33 GMT+03:00, Zijing Yin <yzjaurora@gmail.com> a écrit :
>The networking receive path is usually run from softirq context, but
>protocols that take the socket lock may have packets stored in the
>backlog and processed later from process context. In that case
>release_sock() -> __release_sock() drops the slock with spin_unlock_bh()
>and then calls sk->sk_backlog_rcv() with bottom halves enabled.
>
>Typical sk_backlog_rcv handlers process the socket whose backlog is
>being drained, so the BH state at entry is irrelevant for the slocks
>they touch. pep_do_rcv() is different: when the inbound skb targets an
>existing PEP pipe, it forwards the skb to a different *child* socket
>via sk_receive_skb(). That helper takes the child slock with
>bh_lock_sock_nested(), which is just spin_lock_nested() and assumes BH
>is already off. The same child slock therefore ends up acquired with
>BH on (process path) and with BH off (softirq path):
>
>  process context                   softirq context
>  ---------------                   ---------------
>  release_sock(listener)            __netif_receive_skb()
>   __release_sock()                  phonet_rcv()
>    spin_unlock_bh()                  __sk_receive_skb(listener)
>    [BH now ENABLED]                  [BH already disabled]
>    sk_backlog_rcv:                   sk_backlog_rcv:
>     pep_do_rcv()                      pep_do_rcv()
>      sk_receive_skb(child)             sk_receive_skb(child)
>       bh_lock_sock_nested(child)        bh_lock_sock_nested(child)
>       => SOFTIRQ-ON-W                   => IN-SOFTIRQ-W
>
>Lockdep flags this as inconsistent lock state, and it can become a real
>self-deadlock if a softirq on the same CPU tries to receive to the same
>child socket while its slock is held in the BH-enabled path:
>
>  WARNING: inconsistent lock state
>  inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
>   (slock-AF_PHONET/1){+.?.}-{3:3}, at: __sk_receive_skb+0x1cf/0x900
>    __sk_receive_skb              net/core/sock.c:563
>    sk_receive_skb                include/net/sock.h:2022 [inline]
>    pep_do_rcv                    net/phonet/pep.c:675
>    sk_backlog_rcv                include/net/sock.h:1190
>    __release_sock                net/core/sock.c:3216
>    release_sock                  net/core/sock.c:3815
>    pep_sock_accept               net/phonet/pep.c:879
>
>Wrap the forwarded sk_receive_skb() in local_bh_disable() /
>local_bh_enable() so the child slock is always acquired with BH off.
>local_bh_disable() nests safely on the softirq path.
>
>Discovered via in-house syzkaller fuzzing; the same root cause also
>on the linux-6.1.y syzbot dashboard as extid 44f0626dd6284f02663c.
>Reproduced under KASAN + LOCKDEP + PROVE_LOCKING, reproducer:
>https://pastebin.com/A3t8xzCR
>
>Fixes: 9641458d3ec4 ("Phonet: Pipe End Point for Phonet Pipes protocol")
>Link: https://syzkaller.appspot.com/bug?extid=44f0626dd6284f02663c
>Cc: stable@vger.kernel.org
>Signed-off-by: Zijing Yin <yzjaurora@gmail.com>

Acked-by: Rémi Denis-Courmont <remi@remlab.net>

  reply	other threads:[~2026-05-20 12:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-19 17:26 Zijing Yin
2026-05-20 11:53 ` Rémi Denis-Courmont [this message]
2026-05-20 13:48   ` Eric Dumazet
2026-05-21 14:50 ` patchwork-bot+netdevbpf

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=4172DA29-330F-42FE-91FE-C247D67F852A@remlab.net \
    --to=remi@remlab.net \
    --cc=courmisch@gmail.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=stable@vger.kernel.org \
    --cc=yzjaurora@gmail.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

all inboxes | Powered by JetHome®