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 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.