From: "Théo Lebrun" <theo.lebrun@bootlin.com>
To: "Kevin Hao" <haokexin@gmail.com>, <netdev@vger.kernel.org>
Cc: "Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Vineeth Karumanchi" <vineeth.karumanchi@amd.com>,
"Harini Katakam" <harini.katakam@amd.com>,
"Théo Lebrun" <theo.lebrun@bootlin.com>,
stable@vger.kernel.org
Subject: Re: [PATCH net v2 2/2] net: macb: Protect access to net_device::ip_ptr with RCU lock
Date: Wed, 18 Mar 2026 10:57:51 +0100 [thread overview]
Message-ID: <DH5TI2EOIWTC.3TJ6GASDIV232@bootlin.com> (raw)
In-Reply-To: <20260318-macb-irq-v2-2-f1179768ab24@gmail.com>
Hello Kevin,
On Wed Mar 18, 2026 at 7:36 AM CET, Kevin Hao wrote:
> Access to net_device::ip_ptr and its associated members must be
> protected by an RCU lock. Since we are modifying this piece of code,
> let's also move it to execute only when WAKE_ARP is enabled.
>
> To minimize the duration of the RCU lock, a local variable is used to
> temporarily store the IP address. This change resolves the following
> RCU check warning:
> WARNING: suspicious RCU usage
> 7.0.0-rc3-next-20260310-yocto-standard+ #122 Not tainted
> -----------------------------
> drivers/net/ethernet/cadence/macb_main.c:5944 suspicious rcu_dereference_check() usage!
>
> other info that might help us debug this:
>
> rcu_scheduler_active = 2, debug_locks = 1
> 5 locks held by rtcwake/518:
> #0: ffff000803ab1408 (sb_writers#5){.+.+}-{0:0}, at: vfs_write+0xf8/0x368
> #1: ffff0008090bf088 (&of->mutex#2){+.+.}-{4:4}, at: kernfs_fop_write_iter+0xbc/0x1c8
> #2: ffff00080098d588 (kn->active#70){.+.+}-{0:0}, at: kernfs_fop_write_iter+0xcc/0x1c8
> #3: ffff800081c84888 (system_transition_mutex){+.+.}-{4:4}, at: pm_suspend+0x1ec/0x290
> #4: ffff0008009ba0f8 (&dev->mutex){....}-{4:4}, at: device_suspend+0x118/0x4f0
>
> stack backtrace:
> CPU: 3 UID: 0 PID: 518 Comm: rtcwake Not tainted 7.0.0-rc3-next-20260310-yocto-standard+ #122 PREEMPT
> Hardware name: ZynqMP ZCU102 Rev1.1 (DT)
> Call trace:
> show_stack+0x24/0x38 (C)
> __dump_stack+0x28/0x38
> dump_stack_lvl+0x64/0x88
> dump_stack+0x18/0x24
> lockdep_rcu_suspicious+0x134/0x1d8
> macb_suspend+0xd8/0x4c0
> device_suspend+0x218/0x4f0
> dpm_suspend+0x244/0x3a0
> dpm_suspend_start+0x50/0x78
> suspend_devices_and_enter+0xec/0x560
> pm_suspend+0x194/0x290
> state_store+0x110/0x158
> kobj_attr_store+0x1c/0x30
> sysfs_kf_write+0xa8/0xd0
> kernfs_fop_write_iter+0x11c/0x1c8
> vfs_write+0x248/0x368
> ksys_write+0x7c/0xf8
> __arm64_sys_write+0x28/0x40
> invoke_syscall+0x4c/0xe8
> el0_svc_common+0x98/0xf0
> do_el0_svc+0x28/0x40
> el0_svc+0x54/0x1e0
> el0t_64_sync_handler+0x84/0x130
> el0t_64_sync+0x198/0x1a0
>
> Fixes: 0cb8de39a776 ("net: macb: Add ARP support to WOL")
> Signed-off-by: Kevin Hao <haokexin@gmail.com>
> Cc: stable@vger.kernel.org
> ---
> drivers/net/ethernet/cadence/macb_main.c | 25 ++++++++++++++++---------
> 1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
> index 2d4304331e297accd91ab48813a9bd4722ce72dc..9856764402b17397928d0a61da61865a3b10484f 100644
> --- a/drivers/net/ethernet/cadence/macb_main.c
> +++ b/drivers/net/ethernet/cadence/macb_main.c
> @@ -5909,9 +5909,9 @@ static int __maybe_unused macb_suspend(struct device *dev)
> struct macb_queue *queue;
> struct in_device *idev;
> unsigned long flags;
> + u32 tmp, ifa_local;
> unsigned int q;
> int err;
> - u32 tmp;
>
> if (!device_may_wakeup(&bp->dev->dev))
> phy_exit(bp->phy);
> @@ -5920,14 +5920,21 @@ static int __maybe_unused macb_suspend(struct device *dev)
> return 0;
>
> if (bp->wol & MACB_WOL_ENABLED) {
> - /* Check for IP address in WOL ARP mode */
> - idev = __in_dev_get_rcu(bp->dev);
> - if (idev)
> - ifa = rcu_dereference(idev->ifa_list);
> - if ((bp->wolopts & WAKE_ARP) && !ifa) {
> - netdev_err(netdev, "IP address not assigned as required by WoL walk ARP\n");
> - return -EOPNOTSUPP;
> + if (bp->wolopts & WAKE_ARP) {
> + /* Check for IP address in WOL ARP mode */
> + rcu_read_lock();
> + idev = __in_dev_get_rcu(bp->dev);
> + if (idev)
> + ifa = rcu_dereference(idev->ifa_list);
> + if (!ifa) {
> + rcu_read_unlock();
> + netdev_err(netdev, "IP address not assigned as required by WoL walk ARP\n");
> + return -EOPNOTSUPP;
> + }
> + ifa_local = be32_to_cpu(ifa->ifa_local);
> + rcu_read_unlock();
> }
> +
> spin_lock_irqsave(&bp->lock, flags);
>
> /* Disable Tx and Rx engines before disabling the queues,
> @@ -5966,7 +5973,7 @@ static int __maybe_unused macb_suspend(struct device *dev)
> if (bp->wolopts & WAKE_ARP) {
> tmp |= MACB_BIT(ARP);
> /* write IP address into register */
> - tmp |= MACB_BFEXT(IP, be32_to_cpu(ifa->ifa_local));
> + tmp |= MACB_BFEXT(IP, ifa_local);
> }
> spin_unlock_irqrestore(&bp->lock, flags);
>
Even better to guard the RCU critical section inside a
`if (bp->wolopts & WAKE_ARP)` block.
Reviewed-by: Théo Lebrun <theo.lebrun@bootlin.com>
Thanks,
--
Théo Lebrun, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2026-03-18 9:57 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-18 6:36 [PATCH net v2 0/2] net: macb: Fix two lock warnings when WOL is used Kevin Hao
2026-03-18 6:36 ` [PATCH net v2 1/2] net: macb: Move devm_{free,request}_irq() out of spin lock area Kevin Hao
2026-03-18 6:36 ` [PATCH net v2 2/2] net: macb: Protect access to net_device::ip_ptr with RCU lock Kevin Hao
2026-03-18 9:57 ` Théo Lebrun [this message]
2026-03-21 1:30 ` [PATCH net v2 0/2] net: macb: Fix two lock warnings when WOL is used 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=DH5TI2EOIWTC.3TJ6GASDIV232@bootlin.com \
--to=theo.lebrun@bootlin.com \
--cc=andrew+netdev@lunn.ch \
--cc=claudiu.beznea@tuxon.dev \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=haokexin@gmail.com \
--cc=harini.katakam@amd.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=pabeni@redhat.com \
--cc=stable@vger.kernel.org \
--cc=vineeth.karumanchi@amd.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