From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dl1-f51.google.com (mail-dl1-f51.google.com [74.125.82.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 829AD2C15B5 for ; Fri, 20 Mar 2026 01:25:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969907; cv=none; b=CCNFsCN+11KBF3zk14a7fFPQsVIPbBrU+siCG6ctCuQB+g0GPkDaXh3ZEDghJzONipcihDW+JQptzGmfnZtcg4AUE41C3Q4S57/K5b03RHIhqUj/JJBaPBXCJOd8hv8Nmdyjip44ieoA+axNfXFZzIjIwWFONSMBquCHcXU18fg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969907; c=relaxed/simple; bh=uhR2cakGptm0ZmW+/GIUCGLgF1VWhUBI079qUN2e4V0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kBVsby2yEl2VuqDAQwAb2mHgtAQt7/GaKes8BiaCCPHKEj3jxi+X0OYkjEDVvfeF0UmPitLvCm2rQYg0Uc6m2+aJIuR5hT5+mUbFETBqpiIQJyBQMqtaVZo3xKnEJWSrT+J62534zhnuPgIX4KyxbZLEASUwEW8ErtiQzTOKswg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dl1-f51.google.com with SMTP id a92af1059eb24-1273349c56bso213110c88.0 for ; Thu, 19 Mar 2026 18:25:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969905; x=1774574705; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Yf/HVmFfOm5ohkPNhRXNKW0xl30aRPHieitiLoYoy70=; b=IYy7dMMtPxBlibGseodrnXP4HhWyPUbh1dhUFi4m52s9nttM1LMQCxAL8TBCnFB2Ot tTp5l/GYtkPAfAmska2uB8tA6VVXtGChsSq9JKyBMbMzkFfETMx+xB8UCWK0KyM676Q1 xNb3OY9hh+4i1ga9mZybwNYhqGwduc5FFheOcLJTT7pQFMCuFXu7w/VEHOGeZGyj6PIn 5Nwa0nYsWS/fv8ANKb0yokIgEMRBhERCbNkpfcYGZRCmsXThM25DpMihG2PunehZKrbH SDlW0qwna7MxUDjXOfg+WOLLF8r1BvZ3jGueZaiSRhSC/WaaEUefHLLaSuTBPRyB0c2y cOKw== X-Forwarded-Encrypted: i=1; AJvYcCXhbbV8jk6ECpFkUQGu5bNKT3mqjZc35DKLU5nWkDOE64o9J7qD0qEM5P3q9rHOzY3yEziH0EWVp7g+pJk=@vger.kernel.org X-Gm-Message-State: AOJu0YzwPVeWhF+cOoYDL30stb7Qc7JlgfBs+UlqmlDuw7/hVWIqwloS 2fg/r1X4meqtvb5Qh+J4PRtx0qeXi2zTt+EBzyd8gudnD/k3WjSrr1bnzvpi X-Gm-Gg: ATEYQzy/qrkkkga9SihTjKET9GYF8OsTWl98ZER+kpwYQkupUf/2byqIjVU7oAWU7kv mATy8eeWuf/kb+kPn5cTwnji+eD2kDfucjyo1Ct+mdIjsyJ+gUwzK0UvFJh1RjQUe6hBUdaDlLz VQi6x99eGJJ7sd6qcPjj4Buw9P9zT4ZLoROHjmBzHQl8PNSOJtNwVx24yuD1vMNKJhUIDmH3Oc8 uwzbt6lIyFxidNrDrJk7kbjgvjLUfGgExw8eJwTT9WenPPLpAxqmjGjQayS2WWDZUFMEEUuwSGT LTRs/XfaZOdqa2KGnUiuBhrUHkj6IGoyg/eqXFtja44nD911pbPwlBBN3WYONRY35h065BsasFb jeLs77wLFBwJ2BwNIA9IpkNxlEOfpnHb/kZQv23E6K12CDtvgdyZhcYJxW/FxRBt5QZgMqg5lVm 31704NBd8bMqNiBcpQ098dwlFakzh/btgUtAz0tEJSfDGf+DMYcy4pJ6l4eyPoQ+HN8dmGvnEH4 p4TNrJUM/ABrSFlfg== X-Received: by 2002:a05:7022:3d11:b0:128:d7a7:526f with SMTP id a92af1059eb24-12a7264eb64mr555030c88.4.1773969904175; Thu, 19 Mar 2026 18:25:04 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12a734bbbc5sm746699c88.11.2026.03.19.18.25.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:03 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 01/13] net: add address list snapshot and reconciliation infrastructure Date: Thu, 19 Mar 2026 18:24:49 -0700 Message-ID: <20260320012501.2033548-2-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Introduce __hw_addr_list_snapshot() and __hw_addr_list_reconcile() for use by the upcoming ndo_set_rx_mode_async callback. The async rx_mode path needs to snapshot the device's unicast and multicast address lists under the addr_lock, hand those snapshots to the driver (which may sleep), and then propagate any sync_cnt changes back to the real lists. Two identical snapshots are taken: a work copy for the driver to pass to __hw_addr_sync_dev() and a reference copy to compute deltas against. __hw_addr_list_reconcile() walks the reference snapshot comparing each entry against the work snapshot to determine what the driver synced or unsynced. It then applies those deltas to the real list, handling concurrent modifications: - If the real entry was concurrently removed but the driver synced it to hardware (delta > 0), re-insert a stale entry so the next work run properly unsyncs it from hardware. - If the entry still exists, apply the delta normally. An entry whose refcount drops to zero is removed. Reviewed-by: Aleksandr Loktionov Signed-off-by: Stanislav Fomichev --- include/linux/netdevice.h | 6 + net/core/dev.h | 1 + net/core/dev_addr_lists.c | 110 ++++++++++- net/core/dev_addr_lists_test.c | 321 ++++++++++++++++++++++++++++++++- 4 files changed, 435 insertions(+), 3 deletions(-) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index ae269a2e7f4d..469b7cdb3237 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4985,6 +4985,12 @@ void __hw_addr_unsync_dev(struct netdev_hw_addr_list= *list, int (*unsync)(struct net_device *, const unsigned char *)); void __hw_addr_init(struct netdev_hw_addr_list *list); +int __hw_addr_list_snapshot(struct netdev_hw_addr_list *snap, + const struct netdev_hw_addr_list *list, + int addr_len); +void __hw_addr_list_reconcile(struct netdev_hw_addr_list *real_list, + struct netdev_hw_addr_list *work, + struct netdev_hw_addr_list *ref, int addr_len); =20 /* Functions used for device addresses handling */ void dev_addr_mod(struct net_device *dev, unsigned int offset, diff --git a/net/core/dev.h b/net/core/dev.h index 781619e76b3e..acc925b7b337 100644 --- a/net/core/dev.h +++ b/net/core/dev.h @@ -69,6 +69,7 @@ void linkwatch_run_queue(void); void dev_addr_flush(struct net_device *dev); int dev_addr_init(struct net_device *dev); void dev_addr_check(struct net_device *dev); +void __hw_addr_flush(struct netdev_hw_addr_list *list); =20 #if IS_ENABLED(CONFIG_NET_SHAPER) void net_shaper_flush_netdev(struct net_device *dev); diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 76c91f224886..754f5ea4c3db 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -481,7 +481,7 @@ void __hw_addr_unsync_dev(struct netdev_hw_addr_list *l= ist, } EXPORT_SYMBOL(__hw_addr_unsync_dev); =20 -static void __hw_addr_flush(struct netdev_hw_addr_list *list) +void __hw_addr_flush(struct netdev_hw_addr_list *list) { struct netdev_hw_addr *ha, *tmp; =20 @@ -501,6 +501,114 @@ void __hw_addr_init(struct netdev_hw_addr_list *list) } EXPORT_SYMBOL(__hw_addr_init); =20 +/** + * __hw_addr_list_snapshot - create a snapshot copy of an address list + * @snap: destination snapshot list (needs to be __hw_addr_init-initializ= ed) + * @list: source address list to snapshot + * @addr_len: length of addresses + * + * Creates a copy of @list with individually allocated entries suitable + * for use with __hw_addr_sync_dev() and other list manipulation helpers. + * Each entry is allocated with GFP_ATOMIC; must be called under a spinlo= ck. + * + * Return: 0 on success, -errno on failure. + */ +int __hw_addr_list_snapshot(struct netdev_hw_addr_list *snap, + const struct netdev_hw_addr_list *list, + int addr_len) +{ + struct netdev_hw_addr *ha, *entry; + + list_for_each_entry(ha, &list->list, list) { + entry =3D __hw_addr_create(ha->addr, addr_len, ha->type, + false, false); + if (!entry) { + __hw_addr_flush(snap); + return -ENOMEM; + } + entry->sync_cnt =3D ha->sync_cnt; + entry->refcount =3D ha->refcount; + + list_add_tail(&entry->list, &snap->list); + __hw_addr_insert(snap, entry, addr_len); + snap->count++; + } + + return 0; +} +EXPORT_SYMBOL(__hw_addr_list_snapshot); + +/** + * __hw_addr_list_reconcile - sync snapshot changes back and free snapsho= ts + * @real_list: the real address list to update + * @work: the working snapshot (modified by driver via __hw_addr_sync_dev) + * @ref: the reference snapshot (untouched copy of original state) + * @addr_len: length of addresses + * + * Walks the reference snapshot and compares each entry against the work + * snapshot to compute sync_cnt deltas. Applies those deltas to @real_lis= t. + * Frees both snapshots when done. + * Caller must hold netif_addr_lock_bh. + */ +void __hw_addr_list_reconcile(struct netdev_hw_addr_list *real_list, + struct netdev_hw_addr_list *work, + struct netdev_hw_addr_list *ref, int addr_len) +{ + struct netdev_hw_addr *ref_ha, *work_ha, *real_ha; + int delta; + + list_for_each_entry(ref_ha, &ref->list, list) { + work_ha =3D __hw_addr_lookup(work, ref_ha->addr, addr_len, + ref_ha->type); + if (work_ha) + delta =3D work_ha->sync_cnt - ref_ha->sync_cnt; + else + delta =3D -1; + + if (delta =3D=3D 0) + continue; + + real_ha =3D __hw_addr_lookup(real_list, ref_ha->addr, addr_len, + ref_ha->type); + if (!real_ha) { + /* The real entry was concurrently removed. If the + * driver synced this addr to hardware (delta > 0), + * re-insert it as a stale entry so the next work + * run unsyncs it from hardware. + */ + if (delta > 0) { + real_ha =3D __hw_addr_create(ref_ha->addr, + addr_len, + ref_ha->type, false, + false); + if (real_ha) { + real_ha->sync_cnt =3D 1; + real_ha->refcount =3D 1; + list_add_tail_rcu(&real_ha->list, + &real_list->list); + __hw_addr_insert(real_list, real_ha, + addr_len); + real_list->count++; + } + } + continue; + } + + real_ha->sync_cnt +=3D delta; + real_ha->refcount +=3D delta; + if (!real_ha->refcount) { + rb_erase(&real_ha->node, &real_list->tree); + list_del_rcu(&real_ha->list); + kfree_rcu(real_ha, rcu_head); + real_list->count--; + } + } + + __hw_addr_flush(work); + __hw_addr_flush(ref); +} +EXPORT_SYMBOL(__hw_addr_list_reconcile); + /* * Device addresses handling functions */ diff --git a/net/core/dev_addr_lists_test.c b/net/core/dev_addr_lists_test.c index 8e1dba825e94..c62ce06fc4d5 100644 --- a/net/core/dev_addr_lists_test.c +++ b/net/core/dev_addr_lists_test.c @@ -8,16 +8,24 @@ static const struct net_device_ops dummy_netdev_ops =3D { }; =20 +#define ADDR_A 1 +#define ADDR_B 2 +#define ADDR_C 3 + struct dev_addr_test_priv { u32 addr_seen; + u32 addr_synced; + u32 addr_unsynced; }; =20 static int dev_addr_test_sync(struct net_device *netdev, const unsigned ch= ar *a) { struct dev_addr_test_priv *datp =3D netdev_priv(netdev); =20 - if (a[0] < 31 && !memchr_inv(a, a[0], ETH_ALEN)) + if (a[0] < 31 && !memchr_inv(a, a[0], ETH_ALEN)) { datp->addr_seen |=3D 1 << a[0]; + datp->addr_synced |=3D 1 << a[0]; + } return 0; } =20 @@ -26,11 +34,22 @@ static int dev_addr_test_unsync(struct net_device *netd= ev, { struct dev_addr_test_priv *datp =3D netdev_priv(netdev); =20 - if (a[0] < 31 && !memchr_inv(a, a[0], ETH_ALEN)) + if (a[0] < 31 && !memchr_inv(a, a[0], ETH_ALEN)) { datp->addr_seen &=3D ~(1 << a[0]); + datp->addr_unsynced |=3D 1 << a[0]; + } return 0; } =20 +static void dev_addr_test_reset(struct net_device *netdev) +{ + struct dev_addr_test_priv *datp =3D netdev_priv(netdev); + + datp->addr_seen =3D 0; + datp->addr_synced =3D 0; + datp->addr_unsynced =3D 0; +} + static int dev_addr_test_init(struct kunit *test) { struct dev_addr_test_priv *datp; @@ -225,6 +244,300 @@ static void dev_addr_test_add_excl(struct kunit *test) rtnl_unlock(); } =20 +/* Snapshot test: basic sync with no concurrent modifications. + * Add one address, snapshot, driver syncs it, reconcile propagates + * sync_cnt delta back to real list. + */ +static void dev_addr_test_snapshot_sync(struct kunit *test) +{ + struct net_device *netdev =3D test->priv; + struct netdev_hw_addr_list snap, ref; + struct dev_addr_test_priv *datp; + struct netdev_hw_addr *ha; + u8 addr[ETH_ALEN]; + + datp =3D netdev_priv(netdev); + + rtnl_lock(); + + memset(addr, ADDR_A, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + + /* Snapshot: ADDR_A has sync_cnt=3D0, refcount=3D1 (new) */ + netif_addr_lock_bh(netdev); + __hw_addr_init(&snap); + __hw_addr_init(&ref); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&snap, &netdev->uc, ETH_ALEN)); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&ref, &netdev->uc, ETH_ALEN)); + netif_addr_unlock_bh(netdev); + + /* Driver syncs ADDR_A to hardware */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&snap, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 1 << ADDR_A, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 0, datp->addr_unsynced); + + /* Reconcile: delta=3D+1 applied to real entry */ + netif_addr_lock_bh(netdev); + __hw_addr_list_reconcile(&netdev->uc, &snap, &ref, ETH_ALEN); + netif_addr_unlock_bh(netdev); + + /* Real entry should now reflect the sync: sync_cnt=3D1, refcount=3D2 */ + KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + ha =3D list_first_entry(&netdev->uc.list, struct netdev_hw_addr, list); + KUNIT_EXPECT_MEMEQ(test, ha->addr, addr, ETH_ALEN); + KUNIT_EXPECT_EQ(test, 1, ha->sync_cnt); + KUNIT_EXPECT_EQ(test, 2, ha->refcount); + + /* Second work run: already synced, nothing to do */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&netdev->uc, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 0, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 0, datp->addr_unsynced); + KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + + rtnl_unlock(); +} + +/* Snapshot test: ADDR_A synced to hardware, then concurrently removed + * from the real list before reconcile runs. Reconcile re-inserts ADDR_A as + * a stale entry so the next work run unsyncs it from hardware. + */ +static void dev_addr_test_snapshot_remove_during_sync(struct kunit *test) +{ + struct net_device *netdev =3D test->priv; + struct netdev_hw_addr_list snap, ref; + struct dev_addr_test_priv *datp; + struct netdev_hw_addr *ha; + u8 addr[ETH_ALEN]; + + datp =3D netdev_priv(netdev); + + rtnl_lock(); + + memset(addr, ADDR_A, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + + /* Snapshot: ADDR_A is new (sync_cnt=3D0, refcount=3D1) */ + netif_addr_lock_bh(netdev); + __hw_addr_init(&snap); + __hw_addr_init(&ref); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&snap, &netdev->uc, ETH_ALEN)); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&ref, &netdev->uc, ETH_ALEN)); + netif_addr_unlock_bh(netdev); + + /* Driver syncs ADDR_A to hardware */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&snap, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 1 << ADDR_A, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 0, datp->addr_unsynced); + + /* Concurrent removal: user deletes ADDR_A while driver was working */ + memset(addr, ADDR_A, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_del(netdev, addr)); + KUNIT_EXPECT_EQ(test, 0, netdev->uc.count); + + /* Reconcile: ADDR_A gone from real list but driver synced it, + * so it gets re-inserted as stale (sync_cnt=3D1, refcount=3D1). + */ + netif_addr_lock_bh(netdev); + __hw_addr_list_reconcile(&netdev->uc, &snap, &ref, ETH_ALEN); + netif_addr_unlock_bh(netdev); + + KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + ha =3D list_first_entry(&netdev->uc.list, struct netdev_hw_addr, list); + KUNIT_EXPECT_MEMEQ(test, ha->addr, addr, ETH_ALEN); + KUNIT_EXPECT_EQ(test, 1, ha->sync_cnt); + KUNIT_EXPECT_EQ(test, 1, ha->refcount); + + /* Second work run: stale entry gets unsynced from HW and removed */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&netdev->uc, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 0, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 1 << ADDR_A, datp->addr_unsynced); + KUNIT_EXPECT_EQ(test, 0, netdev->uc.count); + + rtnl_unlock(); +} + +/* Snapshot test: ADDR_A was stale (unsynced from hardware by driver), + * but concurrently re-added by the user. The re-add bumps refcount of + * the existing stale entry. Reconcile applies delta=3D-1, leaving ADDR_A + * as a fresh entry (sync_cnt=3D0, refcount=3D1) for the next work run. + */ +static void dev_addr_test_snapshot_readd_during_unsync(struct kunit *test) +{ + struct net_device *netdev =3D test->priv; + struct netdev_hw_addr_list snap, ref; + struct dev_addr_test_priv *datp; + struct netdev_hw_addr *ha; + u8 addr[ETH_ALEN]; + + datp =3D netdev_priv(netdev); + + rtnl_lock(); + + memset(addr, ADDR_A, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + + /* Sync ADDR_A to hardware: sync_cnt=3D1, refcount=3D2 */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&netdev->uc, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 1 << ADDR_A, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 0, datp->addr_unsynced); + + /* User removes ADDR_A: refcount=3D1, sync_cnt=3D1 -> stale */ + KUNIT_EXPECT_EQ(test, 0, dev_uc_del(netdev, addr)); + + /* Snapshot: ADDR_A is stale (sync_cnt=3D1, refcount=3D1) */ + netif_addr_lock_bh(netdev); + __hw_addr_init(&snap); + __hw_addr_init(&ref); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&snap, &netdev->uc, ETH_ALEN)); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&ref, &netdev->uc, ETH_ALEN)); + netif_addr_unlock_bh(netdev); + + /* Driver unsyncs stale ADDR_A from hardware */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&snap, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 0, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 1 << ADDR_A, datp->addr_unsynced); + + /* Concurrent: user re-adds ADDR_A. dev_uc_add finds the existing + * stale entry and bumps refcount from 1 -> 2. sync_cnt stays 1. + */ + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + + /* Reconcile: ref sync_cnt=3D1 matches real sync_cnt=3D1, delta=3D-1 + * applied. Result: sync_cnt=3D0, refcount=3D1 (fresh). + */ + netif_addr_lock_bh(netdev); + __hw_addr_list_reconcile(&netdev->uc, &snap, &ref, ETH_ALEN); + netif_addr_unlock_bh(netdev); + + /* Entry survives as fresh: needs re-sync to HW */ + KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + ha =3D list_first_entry(&netdev->uc.list, struct netdev_hw_addr, list); + KUNIT_EXPECT_MEMEQ(test, ha->addr, addr, ETH_ALEN); + KUNIT_EXPECT_EQ(test, 0, ha->sync_cnt); + KUNIT_EXPECT_EQ(test, 1, ha->refcount); + + /* Second work run: fresh entry gets synced to HW */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&netdev->uc, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 1 << ADDR_A, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 0, datp->addr_unsynced); + + rtnl_unlock(); +} + +/* Snapshot test: ADDR_A is new (synced by driver), and independent ADDR_B + * is concurrently removed from the real list. A's sync delta propagates + * normally; B's absence doesn't interfere. + */ +static void dev_addr_test_snapshot_add_and_remove(struct kunit *test) +{ + struct net_device *netdev =3D test->priv; + struct netdev_hw_addr_list snap, ref; + struct dev_addr_test_priv *datp; + struct netdev_hw_addr *ha; + u8 addr[ETH_ALEN]; + + datp =3D netdev_priv(netdev); + + rtnl_lock(); + + /* Add ADDR_A and ADDR_B (will be synced then removed) */ + memset(addr, ADDR_A, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + memset(addr, ADDR_B, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + + /* Sync both to hardware: sync_cnt=3D1, refcount=3D2 */ + __hw_addr_sync_dev(&netdev->uc, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + + /* Add ADDR_C (new, will be synced by snapshot) */ + memset(addr, ADDR_C, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_add(netdev, addr)); + + /* Snapshot: A,B synced (sync_cnt=3D1,refcount=3D2); C new (0,1) */ + netif_addr_lock_bh(netdev); + __hw_addr_init(&snap); + __hw_addr_init(&ref); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&snap, &netdev->uc, ETH_ALEN)); + KUNIT_ASSERT_EQ(test, 0, + __hw_addr_list_snapshot(&ref, &netdev->uc, ETH_ALEN)); + netif_addr_unlock_bh(netdev); + + /* Driver syncs snapshot: ADDR_C is new -> synced; A,B already synced */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&snap, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 1 << ADDR_C, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 0, datp->addr_unsynced); + + /* Concurrent: user removes addr B while driver was working */ + memset(addr, ADDR_B, sizeof(addr)); + KUNIT_EXPECT_EQ(test, 0, dev_uc_del(netdev, addr)); + + /* Reconcile: ADDR_C's delta=3D+1 applied to real list. + * ADDR_B's delta=3D0 (unchanged in snapshot), + * so nothing to apply to ADDR_B. + */ + netif_addr_lock_bh(netdev); + __hw_addr_list_reconcile(&netdev->uc, &snap, &ref, ETH_ALEN); + netif_addr_unlock_bh(netdev); + + /* ADDR_A: unchanged (sync_cnt=3D1, refcount=3D2) + * ADDR_B: refcount went from 2->1 via dev_uc_del (still present, stale) + * ADDR_C: sync propagated (sync_cnt=3D1, refcount=3D2) + */ + KUNIT_EXPECT_EQ(test, 3, netdev->uc.count); + netdev_hw_addr_list_for_each(ha, &netdev->uc) { + u8 id =3D ha->addr[0]; + + if (!memchr_inv(ha->addr, id, ETH_ALEN)) { + if (id =3D=3D ADDR_A) { + KUNIT_EXPECT_EQ(test, 1, ha->sync_cnt); + KUNIT_EXPECT_EQ(test, 2, ha->refcount); + } else if (id =3D=3D ADDR_B) { + /* B: still present but now stale */ + KUNIT_EXPECT_EQ(test, 1, ha->sync_cnt); + KUNIT_EXPECT_EQ(test, 1, ha->refcount); + } else if (id =3D=3D ADDR_C) { + KUNIT_EXPECT_EQ(test, 1, ha->sync_cnt); + KUNIT_EXPECT_EQ(test, 2, ha->refcount); + } + } + } + + /* Second work run: ADDR_B is stale, gets unsynced and removed */ + dev_addr_test_reset(netdev); + __hw_addr_sync_dev(&netdev->uc, netdev, dev_addr_test_sync, + dev_addr_test_unsync); + KUNIT_EXPECT_EQ(test, 0, datp->addr_synced); + KUNIT_EXPECT_EQ(test, 1 << ADDR_B, datp->addr_unsynced); + KUNIT_EXPECT_EQ(test, 2, netdev->uc.count); + + rtnl_unlock(); +} + static struct kunit_case dev_addr_test_cases[] =3D { KUNIT_CASE(dev_addr_test_basic), KUNIT_CASE(dev_addr_test_sync_one), @@ -232,6 +545,10 @@ static struct kunit_case dev_addr_test_cases[] =3D { KUNIT_CASE(dev_addr_test_del_main), KUNIT_CASE(dev_addr_test_add_set), KUNIT_CASE(dev_addr_test_add_excl), + KUNIT_CASE(dev_addr_test_snapshot_sync), + KUNIT_CASE(dev_addr_test_snapshot_remove_during_sync), + KUNIT_CASE(dev_addr_test_snapshot_readd_during_unsync), + KUNIT_CASE(dev_addr_test_snapshot_add_and_remove), {} }; =20 --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dl1-f42.google.com (mail-dl1-f42.google.com [74.125.82.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6583C2D0617 for ; Fri, 20 Mar 2026 01:25:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969907; cv=none; b=ZfNC62NTGHgrVZ0WJiBMumRRxmGpG0DdXXrbhTgMemx1CcSb1KF9jqyrmZhldKZePtZl0m9Eo4RZlz7U2mTof03ruKeJSoh8n8MiXWlP9oGe0KVuJet1VNP+b8xT2ml2/rI8q8RK10ALmX9K7F4eSRdNxgeyGaFpplgPrVXM07Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969907; c=relaxed/simple; bh=fiWuZ9fcbL8sdigaSwTTvp8tHDm8kXTBMV+vvmAza+E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GUkddBNB1WPPTjBfP94PKjVKdSm4ka133OM2O5CSlcQ97sI+nPhC7b8U93843jdEBVORqYUtm+Qg0hwrup/z3n9CaEYr18PC9aJk7USY+ETsPMaMbR6Xa2B4UDxl8T4PkQOaCRtHYRbQVzksra04THJgfkgK8P8HjYLbH5kobTg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dl1-f42.google.com with SMTP id a92af1059eb24-128e4d0cc48so153580c88.1 for ; Thu, 19 Mar 2026 18:25:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969906; x=1774574706; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=7EJnW3kdUcA/mWdICiYp+Buoz7NoSHqg/f92gpxvDwE=; b=IrUQy2smjfwoNZJ7FD7wMl7POHQQDkjFNFbY+tWBn7ihT+hQwiFZqnxfv1Qb9MIN/n QBPQGqYEZ7gtApN5umzWuYA3TVNjmmD4iu3pjzYPkNfrycAM9SU7nTEvCgxAY3raM68/ RZtz4/dDRkZMrj9iXHwPPKZuH8B4x/ZCLBYXjNoSvfJ1zxR8PS60PLD5ymcb6C3BDi2P sJ67Zv747kbmkotXOaN/gHqf7o1B5T5A1OjC4HIs45Q+mv4rJq4B3UJVqJm3/u2/B1J3 115Ks++7OwdllHkb0Y6eqykM796hKVfDA88bm4nmc7Gbb5itMdnTBxkD27kZxmfp7mmt srnw== X-Forwarded-Encrypted: i=1; AJvYcCVApO0WrR1FRTmoCQVI2L9VlfiQacNKdd3bhfW5Ax2xlnn0JksF0VPTFqWXd9JTmAU358DxzVmKf1foirY=@vger.kernel.org X-Gm-Message-State: AOJu0YwMz+n638brndFcFWH8FVaARcS74QB3qOUW3vQ78G2lAI76rk7f 4Uc0ArVDFSenSVL+YgDJEXAkF4Pcdhy5CqZcvPU5xpIwRuJvkt6sgZE= X-Gm-Gg: ATEYQzzTGPVBKJ9FCu5d4/1l9OOF9kOxedLVHpkWU+j+U9ZLdFyVCGfTVsGv++9iMvq 7Ddc3Rn3Cvq0jx2iuK7JCYpgLCdfQpEw9llb5xg8mxUvpBW+LlJr81p9EaL8cFemPhVqJWSl/pj Jr8x+/NGMb1W9p3V+LpzZw24t5sUAHJwx2WqXLErlUXQDEwpU4yyOITw+ReUrb2+HP6AmFNzhoX sLO+lRclqsHRIBZ9UBdbtnpkNXw98AcE6p0b4CngklGvkjmGQG0HHx0iLGdjimvSINjzQWevKvJ 4FT0XyqdlJIGlGUdhuOlhxZ42iswYM9uAapkDCdWMioLwdJifpixcKLkM409Rjuqmc0iIc0w2GK m8SB9sVJhsiUbP7Rblfyex2VO46+79dEFLIYvl84TDbhDtGcRSHiPKMAjxWKrZhVyFCqGWRMX2T xDuC/Ry7xj11wUl9n03xwLym6mUtW2q32HRVHcuSUl1KJE6mT+96zy3hELnaI7hZtNyW1atG/DS mr83v3NtfY90Bt8iA== X-Received: by 2002:a05:7022:ec18:b0:128:d17b:e7ab with SMTP id a92af1059eb24-12a726f6573mr546108c88.36.1773969905386; Thu, 19 Mar 2026 18:25:05 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12a736b952asm749391c88.12.2026.03.19.18.25.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:05 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 02/13] wifi: cfg80211: use __rtnl_unlock in nl80211_pre_doit Date: Thu, 19 Mar 2026 18:24:50 -0700 Message-ID: <20260320012501.2033548-3-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" nl80211_pre_doit acquires rtnl_lock and then wiphy_lock, releasing rtnl while keeping wiphy_lock held until post_doit. With the introduction of rx_mode_wq and its flush in netdev_run_todo, calling rtnl_unlock here creates a circular lock dependency: Chain exists of: (wq_completion)rx_mode_wq --> rtnl_mutex --> &rdev->wiphy.mtx Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&rdev->wiphy.mtx); lock(rtnl_mutex); lock(&rdev->wiphy.mtx); lock((wq_completion)rx_mode_wq); Switch to __rtnl_unlock to skip netdev_run_todo in nl80211_pre_doit. This seems safe because we run before the op. Link: http://lore.kernel.org/netdev/69b5ad67.a00a0220.3b25d1.001a.GAE@googl= e.com Signed-off-by: Stanislav Fomichev --- net/core/rtnetlink.c | 1 + net/wireless/core.c | 1 + net/wireless/nl80211.c | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index dad4b1054955..b1bfb4a4aedd 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -150,6 +150,7 @@ void __rtnl_unlock(void) head =3D next; } } +EXPORT_SYMBOL_NS_GPL(__rtnl_unlock, "NETDEV_INTERNAL"); =20 void rtnl_unlock(void) { diff --git a/net/wireless/core.c b/net/wireless/core.c index 23afc250bc10..a78a9b613c94 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -41,6 +41,7 @@ MODULE_AUTHOR("Johannes Berg"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("wireless configuration support"); MODULE_ALIAS_GENL_FAMILY(NL80211_GENL_NAME); +MODULE_IMPORT_NS("NETDEV_INTERNAL"); =20 /* RCU-protected (and RTNL for writers) */ LIST_HEAD(cfg80211_rdev_list); diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index e15cd26f3a79..f8ed8730cf1c 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -18203,7 +18203,7 @@ static int nl80211_pre_doit(const struct genl_split= _ops *ops, __release(&rdev->wiphy.mtx); } if (!(internal_flags & NL80211_FLAG_NEED_RTNL)) - rtnl_unlock(); + __rtnl_unlock(); =20 return 0; out_unlock: --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f181.google.com (mail-dy1-f181.google.com [74.125.82.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D826C2D47E6 for ; Fri, 20 Mar 2026 01:25:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969910; cv=none; b=sxIzT+z/7NJTjwkvMNP3CB8iKK6ndEPub9l8oXSE6qoUY6/qTai+jQIiapCOylExepxAbQpgY71urDVbNfQdlAzfVnI01DxuLWWsPbdKxl99vchdUZhSermPYI6AJN9wM3n0HxBqeqtVjbg/NNES6ogwwkxxGk3xkNhHw2dOzlo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969910; c=relaxed/simple; bh=XclYFxLz8YWyIYAfWaCWDvbF9YZKt7pn6pNrTl1z7TY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fF/SqR5hQR9B2EkFDMVy7bxzh1i6m2Z+pEqsB3vSZHw6kaNKZGgayJONZZG266HFGCaaZbsmeVncInglGDHfdyVzXMx5dSMewaumfTrUeFBfIp+7Grrl2q9V6BgPtE4YdVq94MTl23qqwc9637wBLfp6c4cHZjRqDv7vBNs9PbU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f181.google.com with SMTP id 5a478bee46e88-2b4520f6b32so2342839eec.0 for ; Thu, 19 Mar 2026 18:25:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969907; x=1774574707; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0WCep2sMd+XcNQUXoONoloTYC004nnvk8vp16Ef+qqc=; b=dyAZklrM5H95SN/RCYwKAlCT24Z8KRaZGx6iyOLjWZELZrP60LabG4dsLz8yiBto+n mtg55Cq9qa/liqY7afFli5962U0Zkvd0zOHIvUkUwuUcyYCUs6DyJOiABM7gCxqop4+L 37hEwuscJiQCIC94MS4ZXSFPwtbxjmkLbo5F9QAewe9nTPlACVKrMctggCQgKgplyTAR zdSSLwuumiUWaqX4oq2FDciDemuZvuN8QarNCeSMn+t1qXj7XVnWCe1ePqOUUhHCNW75 ZN7HUFiQxVEirY1xOCAfi0kFXBVTmc15z1e6uo4JaM3I+fI/Vx74LKBYM2p9vGVsL6I5 lnxw== X-Forwarded-Encrypted: i=1; AJvYcCWz+JnzG+WdK4zMeSxpHDFuy2/uDLgUn2mpJ5C4SQsSN9rnIkseHaD+5/bdnhgERVDFIFPYF2B+/UvuQ2E=@vger.kernel.org X-Gm-Message-State: AOJu0YyiTIQhvPpm8hTVr+bK9vgmi0YIHUGsXjrq+7Gh9JxK7ZfKVmFb pT9dCUcQA9fS441G2XAE9+RnzdSkugCNQhZaNU2bWknkU2JP/mlOClQ= X-Gm-Gg: ATEYQzyrhM8FVh3ZMDYKastUYQ7V5UHeisA+Hsdvv4aTmLPYapbf88AG80HeTHF+gX2 DZbcguW8P0XWH8Pm9YbHYbrU8yyDe0vmNDbsksna02j1JwglkgkVt9kpKRyDz3yA0MAc5uWIJ3K 04/PlC2QlshztZjDILgVHhOgiVRtb3jfZXKKghS0Td3VuO0S0QiGV0ATje1VTP4VsUkUGPsepuK 5Y9ddIHSnQnIcGFHsGoDjOUyui9L287RGJH1xp63eBc8mnGcMTpiC5dLj1MFNwMU49Qbw3WVS9y VELJ3C0J3nKBFq9N6PMcJCUPN1U31t6jDtNL26f0GQd9QqeTUHCtYlN9Ts2r2FyE2QYrAn5izHZ 6GwxieoJaGNqeSYKdc1J6z7f3++GClKb80g3hZkCQnZy54BFd+lzgSNiebFg7Yjmfc/9amd16qV HaOx9AAz5fFjJ4qcdoL1AMSgY157dsa03IyDlDgEuF7Hs0InHRaMhfPcl1KttsNiBc+78pW3Vnu AAKgdYTybmYddA4/g== X-Received: by 2002:a05:7300:e208:b0:2b0:52cc:fe69 with SMTP id 5a478bee46e88-2c109567323mr694475eec.5.1773969906707; Thu, 19 Mar 2026 18:25:06 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b31ebd5sm1142605eec.27.2026.03.19.18.25.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:06 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 03/13] net: introduce ndo_set_rx_mode_async and dev_rx_mode_work Date: Thu, 19 Mar 2026 18:24:51 -0700 Message-ID: <20260320012501.2033548-4-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add ndo_set_rx_mode_async callback that drivers can implement instead of the legacy ndo_set_rx_mode. The legacy callback runs under the netif_addr_lock spinlock with BHs disabled, preventing drivers from sleeping. The async variant runs from a work queue with rtnl_lock and netdev_lock_ops held, in fully sleepable context. When __dev_set_rx_mode() sees ndo_set_rx_mode_async, it schedules dev_rx_mode_work instead of calling the driver inline. The work function takes two snapshots of each address list (uc/mc) under the addr_lock, then drops the lock and calls the driver with the work copies. After the driver returns, it reconciles the snapshots back to the real lists under the lock. Reviewed-by: Aleksandr Loktionov Signed-off-by: Stanislav Fomichev --- Documentation/networking/netdevices.rst | 8 +++ include/linux/netdevice.h | 20 ++++++ net/core/dev.c | 95 +++++++++++++++++++++++-- 3 files changed, 116 insertions(+), 7 deletions(-) diff --git a/Documentation/networking/netdevices.rst b/Documentation/networ= king/netdevices.rst index 35704d115312..dc83d78d3b27 100644 --- a/Documentation/networking/netdevices.rst +++ b/Documentation/networking/netdevices.rst @@ -289,6 +289,14 @@ struct net_device synchronization rules ndo_set_rx_mode: Synchronization: netif_addr_lock spinlock. Context: BHs disabled + Notes: Deprecated in favor of sleepable ndo_set_rx_mode_async. + +ndo_set_rx_mode_async: + Synchronization: rtnl_lock() semaphore. In addition, netdev instance + lock if the driver implements queue management or shaper API. + Context: process (from a work queue) + Notes: Sleepable version of ndo_set_rx_mode. Receives snapshots + of the unicast and multicast address lists. =20 ndo_setup_tc: ``TC_SETUP_BLOCK`` and ``TC_SETUP_FT`` are running under NFT locks diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 469b7cdb3237..b05bdd67b807 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -1117,6 +1117,16 @@ struct netdev_net_notifier { * This function is called device changes address list filtering. * If driver handles unicast address filtering, it should set * IFF_UNICAST_FLT in its priv_flags. + * Cannot sleep, called with netif_addr_lock_bh held. + * Deprecated in favor of sleepable ndo_set_rx_mode_async. + * + * void (*ndo_set_rx_mode_async)(struct net_device *dev, + * struct netdev_hw_addr_list *uc, + * struct netdev_hw_addr_list *mc); + * Sleepable version of ndo_set_rx_mode. Called from a work queue + * with rtnl_lock and netdev_lock_ops(dev) held. The uc/mc parameters + * are snapshots of the address lists - iterate with + * netdev_hw_addr_list_for_each(ha, uc). * * int (*ndo_set_mac_address)(struct net_device *dev, void *addr); * This function is called when the Media Access Control address @@ -1437,6 +1447,9 @@ struct net_device_ops { void (*ndo_change_rx_flags)(struct net_device *dev, int flags); void (*ndo_set_rx_mode)(struct net_device *dev); + void (*ndo_set_rx_mode_async)(struct net_device *dev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc); int (*ndo_set_mac_address)(struct net_device *dev, void *addr); int (*ndo_validate_addr)(struct net_device *dev); @@ -1903,6 +1916,7 @@ enum netdev_reg_state { * has been enabled due to the need to listen to * additional unicast addresses in a device that * does not implement ndo_set_rx_mode() + * @rx_mode_work: Work queue entry for ndo_set_rx_mode_async() * @uc: unicast mac addresses * @mc: multicast mac addresses * @dev_addrs: list of device hw addresses @@ -2293,6 +2307,7 @@ struct net_device { unsigned int promiscuity; unsigned int allmulti; bool uc_promisc; + struct work_struct rx_mode_work; #ifdef CONFIG_LOCKDEP unsigned char nested_level; #endif @@ -4661,6 +4676,11 @@ static inline bool netif_device_present(const struct= net_device *dev) return test_bit(__LINK_STATE_PRESENT, &dev->state); } =20 +static inline bool netif_up_and_present(const struct net_device *dev) +{ + return (dev->flags & IFF_UP) && netif_device_present(dev); +} + void netif_device_detach(struct net_device *dev); =20 void netif_device_attach(struct net_device *dev); diff --git a/net/core/dev.c b/net/core/dev.c index 200d44883fc1..fedc423306fc 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -2381,6 +2381,8 @@ static void netstamp_clear(struct work_struct *work) static DECLARE_WORK(netstamp_work, netstamp_clear); #endif =20 +static struct workqueue_struct *rx_mode_wq; + void net_enable_timestamp(void) { #ifdef CONFIG_JUMP_LABEL @@ -9669,22 +9671,84 @@ int netif_set_allmulti(struct net_device *dev, int = inc, bool notify) return 0; } =20 -/* - * Upload unicast and multicast address lists to device and - * configure RX filtering. When the device doesn't support unicast - * filtering it is put in promiscuous mode while unicast addresses - * are present. +static void dev_rx_mode_work(struct work_struct *work) +{ + struct net_device *dev =3D container_of(work, struct net_device, + rx_mode_work); + struct netdev_hw_addr_list uc_snap, mc_snap, uc_ref, mc_ref; + const struct net_device_ops *ops =3D dev->netdev_ops; + int err; + + __hw_addr_init(&uc_snap); + __hw_addr_init(&mc_snap); + __hw_addr_init(&uc_ref); + __hw_addr_init(&mc_ref); + + rtnl_lock(); + netdev_lock_ops(dev); + + if (!netif_up_and_present(dev)) + goto out; + + if (ops->ndo_set_rx_mode_async) { + netif_addr_lock_bh(dev); + + err =3D __hw_addr_list_snapshot(&uc_snap, &dev->uc, + dev->addr_len); + if (!err) + err =3D __hw_addr_list_snapshot(&uc_ref, &dev->uc, + dev->addr_len); + if (!err) + err =3D __hw_addr_list_snapshot(&mc_snap, &dev->mc, + dev->addr_len); + if (!err) + err =3D __hw_addr_list_snapshot(&mc_ref, &dev->mc, + dev->addr_len); + netif_addr_unlock_bh(dev); + + if (err) { + netdev_WARN(dev, "failed to sync uc/mc addresses\n"); + __hw_addr_flush(&uc_snap); + __hw_addr_flush(&uc_ref); + __hw_addr_flush(&mc_snap); + goto out; + } + + ops->ndo_set_rx_mode_async(dev, &uc_snap, &mc_snap); + + netif_addr_lock_bh(dev); + __hw_addr_list_reconcile(&dev->uc, &uc_snap, + &uc_ref, dev->addr_len); + __hw_addr_list_reconcile(&dev->mc, &mc_snap, + &mc_ref, dev->addr_len); + netif_addr_unlock_bh(dev); + } + +out: + netdev_unlock_ops(dev); + rtnl_unlock(); +} + +/** + * __dev_set_rx_mode() - upload unicast and multicast address lists to dev= ice + * and configure RX filtering. + * @dev: device + * + * When the device doesn't support unicast filtering it is put in promiscu= ous + * mode while unicast addresses are present. */ void __dev_set_rx_mode(struct net_device *dev) { const struct net_device_ops *ops =3D dev->netdev_ops; =20 /* dev_open will call this function so the list will stay sane. */ - if (!(dev->flags&IFF_UP)) + if (!netif_up_and_present(dev)) return; =20 - if (!netif_device_present(dev)) + if (ops->ndo_set_rx_mode_async) { + queue_work(rx_mode_wq, &dev->rx_mode_work); return; + } =20 if (!(dev->priv_flags & IFF_UNICAST_FLT)) { /* Unicast addresses changes may only happen under the rtnl, @@ -11708,6 +11772,16 @@ void netdev_run_todo(void) =20 __rtnl_unlock(); =20 + /* Make sure all pending rx_mode work completes before returning. + * + * rx_mode_wq may be NULL during early boot: + * core_initcall(netlink_proto_init) vs subsys_initcall(net_dev_init). + * + * Check current_work() to avoid flushing from the wq. + */ + if (rx_mode_wq && !current_work()) + flush_workqueue(rx_mode_wq); + /* Wait for rcu callbacks to finish before next phase */ if (!list_empty(&list)) rcu_barrier(); @@ -12099,6 +12173,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv= , const char *name, #endif =20 mutex_init(&dev->lock); + INIT_WORK(&dev->rx_mode_work, dev_rx_mode_work); =20 dev->priv_flags =3D IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM; setup(dev); @@ -12203,6 +12278,8 @@ void free_netdev(struct net_device *dev) =20 kfree(rcu_dereference_protected(dev->ingress_queue, 1)); =20 + cancel_work_sync(&dev->rx_mode_work); + /* Flush device addresses */ dev_addr_flush(dev); =20 @@ -13296,6 +13373,10 @@ static int __init net_dev_init(void) if (register_pernet_device(&default_device_ops)) goto out; =20 + rx_mode_wq =3D alloc_ordered_workqueue("rx_mode_wq", 0); + if (!rx_mode_wq) + goto out; + open_softirq(NET_TX_SOFTIRQ, net_tx_action); open_softirq(NET_RX_SOFTIRQ, net_rx_action); =20 --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f180.google.com (mail-dy1-f180.google.com [74.125.82.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 41E912DA74C for ; Fri, 20 Mar 2026 01:25:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969912; cv=none; b=KM9c6w8aqc9BmadqXQ1snXQ2zsuk2I8YU1ay9LVAIuTmbbMO/IL33ZAUPsUJ+7qZ4NjrzKB9IlsEIulYMsCmZ6wvKv3ymkp7zqGFCVfW1Na9/PLaazyKyLTkX8wSKH1nrkkcBgGQ77TKMehLIXSNkpmnHDWJZkhu8rpWswWrFH0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969912; c=relaxed/simple; bh=JjE0637pcnwOXC0khbMoNdB4WUERbKw2hmEt/HWjgOc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PuVqbDyItMYmZEFjZHYIYZZQQ2l9opm4J2EPf4GWWhbrItDRqlTPIMH49jJ3GrIZBwe6KugLfRGC6LLoBhqTZdrqhQjEhx5vXNfYYoYTB6oTet86VdhZ0It3a1J/XOTjzJAge3sSHSmcZzZ3iYQLeLaW+V1ZHw+GVBJzLYyZn9Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f180.google.com with SMTP id 5a478bee46e88-2bdcf5970cdso1112564eec.0 for ; Thu, 19 Mar 2026 18:25:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969908; x=1774574708; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=suEW+QJFcSsgWhqrlb5+SoMaziekppWcaVGrKT6pk3Q=; b=htny29P7viBtQG9HISxKWZGi4pZDSF9lLPUHsirjl3vVkx+udAy2J8dKDPyAmH/wcH ybP+OY2JnuAyBYHPwthgi9aItcJhJOzQLrqOVJudqZ02GiLOCmOl6n2G8wc7C7mzkjNa hQzqhLMoE+ecch3LkRwFYgbqBimW8/ol5BJc0gZtTkCyFbq9BYsVVIqBreNrfWraDDyY JCoWXDYi0L3fP/8iAqGe2rEwI8PpXSQh6FbZbPptPaSjd2tXuJOGXUU5Tnx/7zi9BA6g Cu8dd8YFpP/T7uiuRr6sDSYl3MXAi1N26OOHGt8GHy47HhZ3gdKd8rdRTQeWhDQp285c N4tA== X-Forwarded-Encrypted: i=1; AJvYcCUHZT8w8RdEfxKS60uDXDs0Zamqq1IQ5zlwO8zlIwGGOf9XPX22V+mTdzMwc/aKgjPi2FjbNuE5KqvUT3U=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/7J8QRSHdTJyClEplPjKwGDGzYHsuOY9F/yBiJDiiRWamGC2m UzQPN0dP8vJ+Gxmfezh8u3FNIr/zKV8viEZ3+hTrA05X9qjGTzPTZKM= X-Gm-Gg: ATEYQzzNjW5ol9PCpyWlbUc8Hz0DULKgNHJT/5y1r7SQ5sqfBoyQ0LaZptBNuG5GdiJ HmwCK+hdz8svSk0ct+oknfrhwjvmYTyF8mga7qQh6L5rOGxSJkpQ9jv4RqnYe6ofa+MBSfHTqU8 G5MWh/8hMcjedrzvmFbpQHnW82Rb4gtwe0Y0mtaWd0yk0fr6WQOwlRkkW+/i6Pb750i+Rhnj3M5 CS/KEL9jTpikt19NMVe+yQUQdhKFG3FWdK6tUM2qGX6SOrpcCFldRs+jJb7pR+GWwSTZu9wlmfC 1IGKz74kH2cKxidKi+nwDsqwEpq4QJ2XJQH/uqGBVPhWUYdC2ozf+87WbUA/m4dSlj7gHUF8zav 62RNGyy1e/ywSjubHCcX6ZfFQ9V/eeqLPKvIxMiW+j9i4U8VuIqJ0pUI9bRB/wGgUa/AMNxUVuQ 4A97YHnydGqDSsvoTQrLlO3KmoBfRd2jWUkNUJTv2yTnVFJVy6MYePhWG77zYme8bm1A0ki+Mp7 mTmPIY4GvNhie14yA== X-Received: by 2002:a05:7300:6428:b0:2a4:701a:b9ba with SMTP id 5a478bee46e88-2c10987b1cbmr609228eec.14.1773969908079; Thu, 19 Mar 2026 18:25:08 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b2e6c30sm1101353eec.25.2026.03.19.18.25.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:07 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 04/13] net: move promiscuity handling into dev_rx_mode_work Date: Thu, 19 Mar 2026 18:24:52 -0700 Message-ID: <20260320012501.2033548-5-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move unicast promiscuity tracking into dev_rx_mode_work so it runs under netdev_ops_lock instead of under the addr_lock spinlock. This is required because __dev_set_promiscuity calls dev_change_rx_flags and __dev_notify_flags, both of which may need to sleep. Change ASSERT_RTNL() to netdev_ops_assert_locked() in __dev_set_promiscuity, netif_set_allmulti and __dev_change_flags since these are now called from the work queue under the ops lock. Reviewed-by: Aleksandr Loktionov Signed-off-by: Stanislav Fomichev --- Documentation/networking/netdevices.rst | 4 ++ net/core/dev.c | 79 +++++++++++++++++-------- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/Documentation/networking/netdevices.rst b/Documentation/networ= king/netdevices.rst index dc83d78d3b27..5cdaa1a3dcc8 100644 --- a/Documentation/networking/netdevices.rst +++ b/Documentation/networking/netdevices.rst @@ -298,6 +298,10 @@ struct net_device synchronization rules Notes: Sleepable version of ndo_set_rx_mode. Receives snapshots of the unicast and multicast address lists. =20 +ndo_change_rx_flags: + Synchronization: rtnl_lock() semaphore. In addition, netdev instance + lock if the driver implements queue management or shaper API. + ndo_setup_tc: ``TC_SETUP_BLOCK`` and ``TC_SETUP_FT`` are running under NFT locks (i.e. no ``rtnl_lock`` and no device instance lock). The rest of diff --git a/net/core/dev.c b/net/core/dev.c index fedc423306fc..fc5c9b14faa0 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9574,7 +9574,7 @@ static int __dev_set_promiscuity(struct net_device *d= ev, int inc, bool notify) kuid_t uid; kgid_t gid; =20 - ASSERT_RTNL(); + netdev_ops_assert_locked(dev); =20 promiscuity =3D dev->promiscuity + inc; if (promiscuity =3D=3D 0) { @@ -9610,16 +9610,8 @@ static int __dev_set_promiscuity(struct net_device *= dev, int inc, bool notify) =20 dev_change_rx_flags(dev, IFF_PROMISC); } - if (notify) { - /* The ops lock is only required to ensure consistent locking - * for `NETDEV_CHANGE` notifiers. This function is sometimes - * called without the lock, even for devices that are ops - * locked, such as in `dev_uc_sync_multiple` when using - * bonding or teaming. - */ - netdev_ops_assert_locked(dev); + if (notify) __dev_notify_flags(dev, old_flags, IFF_PROMISC, 0, NULL); - } return 0; } =20 @@ -9641,7 +9633,7 @@ int netif_set_allmulti(struct net_device *dev, int in= c, bool notify) unsigned int old_flags =3D dev->flags, old_gflags =3D dev->gflags; unsigned int allmulti, flags; =20 - ASSERT_RTNL(); + netdev_ops_assert_locked(dev); =20 allmulti =3D dev->allmulti + inc; if (allmulti =3D=3D 0) { @@ -9671,12 +9663,36 @@ int netif_set_allmulti(struct net_device *dev, int = inc, bool notify) return 0; } =20 +/** + * dev_uc_promisc_update() - evaluate whether uc_promisc should be toggled. + * @dev: device + * + * Must be called under netif_addr_lock_bh. + * Return: +1 to enter promisc, -1 to leave, 0 for no change. + */ +static int dev_uc_promisc_update(struct net_device *dev) +{ + if (dev->priv_flags & IFF_UNICAST_FLT) + return 0; + + if (!netdev_uc_empty(dev) && !dev->uc_promisc) { + dev->uc_promisc =3D true; + return 1; + } + if (netdev_uc_empty(dev) && dev->uc_promisc) { + dev->uc_promisc =3D false; + return -1; + } + return 0; +} + static void dev_rx_mode_work(struct work_struct *work) { struct net_device *dev =3D container_of(work, struct net_device, rx_mode_work); struct netdev_hw_addr_list uc_snap, mc_snap, uc_ref, mc_ref; const struct net_device_ops *ops =3D dev->netdev_ops; + int promisc_inc; int err; =20 __hw_addr_init(&uc_snap); @@ -9704,16 +9720,29 @@ static void dev_rx_mode_work(struct work_struct *wo= rk) if (!err) err =3D __hw_addr_list_snapshot(&mc_ref, &dev->mc, dev->addr_len); - netif_addr_unlock_bh(dev); =20 if (err) { netdev_WARN(dev, "failed to sync uc/mc addresses\n"); __hw_addr_flush(&uc_snap); __hw_addr_flush(&uc_ref); __hw_addr_flush(&mc_snap); + netif_addr_unlock_bh(dev); goto out; } =20 + promisc_inc =3D dev_uc_promisc_update(dev); + + netif_addr_unlock_bh(dev); + } else { + netif_addr_lock_bh(dev); + promisc_inc =3D dev_uc_promisc_update(dev); + netif_addr_unlock_bh(dev); + } + + if (promisc_inc) + __dev_set_promiscuity(dev, promisc_inc, false); + + if (ops->ndo_set_rx_mode_async) { ops->ndo_set_rx_mode_async(dev, &uc_snap, &mc_snap); =20 netif_addr_lock_bh(dev); @@ -9722,6 +9751,10 @@ static void dev_rx_mode_work(struct work_struct *wor= k) __hw_addr_list_reconcile(&dev->mc, &mc_snap, &mc_ref, dev->addr_len); netif_addr_unlock_bh(dev); + } else if (ops->ndo_set_rx_mode) { + netif_addr_lock_bh(dev); + ops->ndo_set_rx_mode(dev); + netif_addr_unlock_bh(dev); } =20 out: @@ -9740,28 +9773,22 @@ static void dev_rx_mode_work(struct work_struct *wo= rk) void __dev_set_rx_mode(struct net_device *dev) { const struct net_device_ops *ops =3D dev->netdev_ops; + int promisc_inc; =20 /* dev_open will call this function so the list will stay sane. */ if (!netif_up_and_present(dev)) return; =20 - if (ops->ndo_set_rx_mode_async) { + if (ops->ndo_set_rx_mode_async || ops->ndo_change_rx_flags) { queue_work(rx_mode_wq, &dev->rx_mode_work); return; } =20 - if (!(dev->priv_flags & IFF_UNICAST_FLT)) { - /* Unicast addresses changes may only happen under the rtnl, - * therefore calling __dev_set_promiscuity here is safe. - */ - if (!netdev_uc_empty(dev) && !dev->uc_promisc) { - __dev_set_promiscuity(dev, 1, false); - dev->uc_promisc =3D true; - } else if (netdev_uc_empty(dev) && dev->uc_promisc) { - __dev_set_promiscuity(dev, -1, false); - dev->uc_promisc =3D false; - } - } + /* Legacy path for non-ops locked HW devices. */ + + promisc_inc =3D dev_uc_promisc_update(dev); + if (promisc_inc) + __dev_set_promiscuity(dev, promisc_inc, false); =20 if (ops->ndo_set_rx_mode) ops->ndo_set_rx_mode(dev); @@ -9811,7 +9838,7 @@ int __dev_change_flags(struct net_device *dev, unsign= ed int flags, unsigned int old_flags =3D dev->flags; int ret; =20 - ASSERT_RTNL(); + netdev_ops_assert_locked(dev); =20 /* * Set the flags on our device. --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dl1-f51.google.com (mail-dl1-f51.google.com [74.125.82.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E0C12DF138 for ; Fri, 20 Mar 2026 01:25:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969914; cv=none; b=N5xcbbQrcD5up+HhG54d3amVFDKWn0ltF0vZJaZ5lI8xa+e7KU9/+f+07Y9DBXyvYjlfuly5QppJhwntXbMb+J/5aUdQZsloeGW3OvgWZmX3K5HXambM3i60SUBf1n6eSb/KNeSsogiyhX8gqevcmP/DZdMuQ4lRh5X6j1rETu0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969914; c=relaxed/simple; bh=tlKgbNIWgXjZ/slb5MPH0/mHqdsJA6vJ0LluTcLD1PQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=L6wtWU5Kjk9EQYBcJnGeYKqN2L6KJVu/AIlZjSmS4oRwfAaipivsiPuEJZf58JUXjBdXqimEywtNTj9EWJ8qwcodZTJtRZVqioXwdmAo2oLOK8p/wLtBy6nSVqdlSsoyrqS6dPt6+sMEp+QCMGuBGHXj5+zy2HhkoA7zx+oT2ak= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dl1-f51.google.com with SMTP id a92af1059eb24-12732e6a123so2874785c88.1 for ; Thu, 19 Mar 2026 18:25:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969910; x=1774574710; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=IJxOxbLkNxTNWsN6hAmdg1mKxCY8QyUuCBIp5EpuSIA=; b=pGs50RYCkwtwSSP2BVrhm9EQTdJ9U7wXvnEkP4J2t61ekjA/SIfxYrxEeGZ4w1AaXa JP97ObPrZeAXbVLf1Z/aAQmLQ87K3KP/DUMzNiWeXnX1oJDjl0zEma88ggSsPpwLri30 3Df/XDIQJTTFRTE+uca1dfBy3dakFuCc2LKZcBtUv+bfnAw5fugpiWUNuffHOMRUH2S/ kdHJHXQwcbK0K+RVyJ+2TN/bmeA2MAZbF0nCGL09ldWLvOjWmxbUeUKumqOJ8UGjNcST DHdD3TZ4Pjjx5uz3nuk4U+olMdN/apAcD11yQl0ebRnDRxFXC6G/7/j82N23M7OVHf7H 5Dzw== X-Forwarded-Encrypted: i=1; AJvYcCWK8VWZTZakVizmqvKBOmILUYafXGjacCew9IVFfginy7WXgfMy3E8TGUwXt9VJZePKF0BCzdfjM1vCjKI=@vger.kernel.org X-Gm-Message-State: AOJu0YyCX+fHwQZrBGd1GpgbY7T2IwA1xqgMRryLQ44M0RR26/HhIOeH yphBPHMmoxKnYOiGVw0ea6lIi4abL340MoSdr1P5aOEPF2TfY00L65M= X-Gm-Gg: ATEYQzxQAJ9Ff20Kn3JoA8zf08KjZ1zEclKEMCeP841632AzqEukSS1gVX98NZWAQp2 x/AA5spDiwT5kZnvv8A1Ltvdbtyj0hPKmJ0V97LicTCygLPU/cgXS1+vRNK85z9TC9I/hrw8vWi eQxJ5k+VzJAY3ZiPt4BaRpqAXCs2T3z+XD32OYNO+jtZUO3BJr7yt9qF8cARNowVqqE+/Z5ywAc v+HlqYual38ecN6DEkvnCz2vMqrxvlsP5yCQDPfIR//a1YGXhWnnCYiTz/+nOFpOaA2R6FcPjiY 4bd3KqWHyO1Drmpof80rkcLDR1lPAYfHt/SG8N00COWoWcRRdy4SOaNQ8OerPeTqx5HrRljnrFO pDfLenXvJ+Scb6iss3wzWBcJVSvKBdRdw1Uj+vCrr0qI2UnX4eq7tNwNNHjsxHsJTVISTzwrOaP HSviWRrGrQv+MpvU6wpYePA1DcNKLW7XCR6kTePQWxjWYFs87M/cfBUsvTOjiThIK3JjFqXUnhD 80uUC7aMeOXxqoIgA== X-Received: by 2002:a05:7022:fa1:b0:123:2d38:929a with SMTP id a92af1059eb24-12a726f86c3mr611130c88.38.1773969909296; Thu, 19 Mar 2026 18:25:09 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b17a7c1sm1191627eec.7.2026.03.19.18.25.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:08 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 05/13] fbnic: convert to ndo_set_rx_mode_async Date: Thu, 19 Mar 2026 18:24:53 -0700 Message-ID: <20260320012501.2033548-6-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert fbnic from ndo_set_rx_mode to ndo_set_rx_mode_async. The driver's __fbnic_set_rx_mode() now takes explicit uc/mc list parameters and uses __hw_addr_sync_dev() on the snapshots instead of __dev_uc_sync/__dev_mc_sync on the netdev directly. Update callers in fbnic_up, fbnic_fw_config_after_crash, fbnic_bmc_rpc_check and fbnic_set_mac to pass the real address lists calling __fbnic_set_rx_mode outside the async work path. Cc: Alexander Duyck Cc: kernel-team@meta.com Reviewed-by: Aleksandr Loktionov Signed-off-by: Stanislav Fomichev --- .../net/ethernet/meta/fbnic/fbnic_netdev.c | 20 ++++++++++++------- .../net/ethernet/meta/fbnic/fbnic_netdev.h | 4 +++- drivers/net/ethernet/meta/fbnic/fbnic_pci.c | 4 ++-- drivers/net/ethernet/meta/fbnic/fbnic_rpc.c | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c b/drivers/net/e= thernet/meta/fbnic/fbnic_netdev.c index b4b396ca9bce..c406a3b56b37 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.c @@ -183,7 +183,9 @@ static int fbnic_mc_unsync(struct net_device *netdev, c= onst unsigned char *addr) return ret; } =20 -void __fbnic_set_rx_mode(struct fbnic_dev *fbd) +void __fbnic_set_rx_mode(struct fbnic_dev *fbd, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { bool uc_promisc =3D false, mc_promisc =3D false; struct net_device *netdev =3D fbd->netdev; @@ -213,10 +215,10 @@ void __fbnic_set_rx_mode(struct fbnic_dev *fbd) } =20 /* Synchronize unicast and multicast address lists */ - err =3D __dev_uc_sync(netdev, fbnic_uc_sync, fbnic_uc_unsync); + err =3D __hw_addr_sync_dev(uc, netdev, fbnic_uc_sync, fbnic_uc_unsync); if (err =3D=3D -ENOSPC) uc_promisc =3D true; - err =3D __dev_mc_sync(netdev, fbnic_mc_sync, fbnic_mc_unsync); + err =3D __hw_addr_sync_dev(mc, netdev, fbnic_mc_sync, fbnic_mc_unsync); if (err =3D=3D -ENOSPC) mc_promisc =3D true; =20 @@ -238,18 +240,21 @@ void __fbnic_set_rx_mode(struct fbnic_dev *fbd) fbnic_write_tce_tcam(fbd); } =20 -static void fbnic_set_rx_mode(struct net_device *netdev) +static void fbnic_set_rx_mode(struct net_device *netdev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct fbnic_net *fbn =3D netdev_priv(netdev); struct fbnic_dev *fbd =3D fbn->fbd; =20 /* No need to update the hardware if we are not running */ if (netif_running(netdev)) - __fbnic_set_rx_mode(fbd); + __fbnic_set_rx_mode(fbd, uc, mc); } =20 static int fbnic_set_mac(struct net_device *netdev, void *p) { + struct fbnic_net *fbn =3D netdev_priv(netdev); struct sockaddr *addr =3D p; =20 if (!is_valid_ether_addr(addr->sa_data)) @@ -257,7 +262,8 @@ static int fbnic_set_mac(struct net_device *netdev, voi= d *p) =20 eth_hw_addr_set(netdev, addr->sa_data); =20 - fbnic_set_rx_mode(netdev); + if (netif_running(netdev)) + __fbnic_set_rx_mode(fbn->fbd, &netdev->uc, &netdev->mc); =20 return 0; } @@ -551,7 +557,7 @@ static const struct net_device_ops fbnic_netdev_ops =3D= { .ndo_features_check =3D fbnic_features_check, .ndo_set_mac_address =3D fbnic_set_mac, .ndo_change_mtu =3D fbnic_change_mtu, - .ndo_set_rx_mode =3D fbnic_set_rx_mode, + .ndo_set_rx_mode_async =3D fbnic_set_rx_mode, .ndo_get_stats64 =3D fbnic_get_stats64, .ndo_bpf =3D fbnic_bpf, .ndo_hwtstamp_get =3D fbnic_hwtstamp_get, diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h b/drivers/net/e= thernet/meta/fbnic/fbnic_netdev.h index 9129a658f8fa..eded20b0e9e4 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h +++ b/drivers/net/ethernet/meta/fbnic/fbnic_netdev.h @@ -97,7 +97,9 @@ void fbnic_time_init(struct fbnic_net *fbn); int fbnic_time_start(struct fbnic_net *fbn); void fbnic_time_stop(struct fbnic_net *fbn); =20 -void __fbnic_set_rx_mode(struct fbnic_dev *fbd); +void __fbnic_set_rx_mode(struct fbnic_dev *fbd, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc); void fbnic_clear_rx_mode(struct fbnic_dev *fbd); =20 void fbnic_phylink_get_pauseparam(struct net_device *netdev, diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_pci.c b/drivers/net/ethe= rnet/meta/fbnic/fbnic_pci.c index e3aebbe3656d..6b139cf54256 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_pci.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_pci.c @@ -135,7 +135,7 @@ void fbnic_up(struct fbnic_net *fbn) =20 fbnic_rss_reinit_hw(fbn->fbd, fbn); =20 - __fbnic_set_rx_mode(fbn->fbd); + __fbnic_set_rx_mode(fbn->fbd, &fbn->netdev->uc, &fbn->netdev->mc); =20 /* Enable Tx/Rx processing */ fbnic_napi_enable(fbn); @@ -180,7 +180,7 @@ static int fbnic_fw_config_after_crash(struct fbnic_dev= *fbd) } =20 fbnic_rpc_reset_valid_entries(fbd); - __fbnic_set_rx_mode(fbd); + __fbnic_set_rx_mode(fbd, &fbd->netdev->uc, &fbd->netdev->mc); =20 return 0; } diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c b/drivers/net/ethe= rnet/meta/fbnic/fbnic_rpc.c index 42a186db43ea..fe95b6f69646 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c @@ -244,7 +244,7 @@ void fbnic_bmc_rpc_check(struct fbnic_dev *fbd) =20 if (fbd->fw_cap.need_bmc_tcam_reinit) { fbnic_bmc_rpc_init(fbd); - __fbnic_set_rx_mode(fbd); + __fbnic_set_rx_mode(fbd, &fbd->netdev->uc, &fbd->netdev->mc); fbd->fw_cap.need_bmc_tcam_reinit =3D false; } =20 --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dl1-f52.google.com (mail-dl1-f52.google.com [74.125.82.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 867032E091B for ; Fri, 20 Mar 2026 01:25:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969915; cv=none; b=PXfy3UuMifbO16QcWf/qCHFZtwb/oSHh38OC63KO55wdLBIrMzhEWQHWLU0GJRrSM/tRQ1t7phYVBPuyvlE1lHgkjnvCnz4xQh0kv9ftvoFEfxQ6k8v+3EeqAjOMYxIL14tzfWOrPPFkPc43+QRoKacQLsglhAMPymrRjatXeg4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969915; c=relaxed/simple; bh=6VyTRzvS/zWs9mQKfVDTKll2o8y5Axb3TbPtfre/2JU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QXV1MenS60vbhbxA/3ZVnCmLJR+tuQ3qfQTd2FWv9De1o0i5u5tHSxdAsUO6IKURwNDF+ObVq+RCX9SxYTyZqQa2aI/yiiijQtsDTicq/hcsZgLZahJlzSGZFYiftngBCZwihoN0xCOHkQUpn+n1g5ACwF3vSa/nmx8Gf1HeUqM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dl1-f52.google.com with SMTP id a92af1059eb24-128b9b7e3edso2688353c88.0 for ; Thu, 19 Mar 2026 18:25:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969911; x=1774574711; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=H5KBsIH2Vd7dbMr7n3P1e0mpKkNWfQsccxIqA1RpvZc=; b=LbEPmtlDvy7uuwW5gfKsfl2fmQShJqSE7+Q8BEb749lkEmS7tKUUBYxBVS4L28fEnh 4cUobcrKrTiGqE7MCF/AxY33vDBgo5C/OZxDwLaIlk+H0AJkp5QPVPAjO6cy84k7+3tO 3+acsDO0qQESyVQ2qVNIL6zDb7ypoTj+DeXYQPkINY6nqqNja8cA00kE4WcugDdvIx+F 99lhX5id95kozZ/hXSZL8YNjfGWPwwGv1VGg0Us84NsKBkp8MJpsEIRs3OdLgZ8BmbJw JBi+rUqgYN46pQPSficoVTpkB4Zckx8JRCrOtS0vXfCgnGt5Tn5tBv1y6bmm3hQBPEAf 5C8A== X-Forwarded-Encrypted: i=1; AJvYcCVJChrxQ+N/Bk9LBo+DlW7le3PzsN57Wke1ZTzbBTGSaoX/cVP7UXYiPHOSVBJsDNvn+dARn+TKSB5ed0c=@vger.kernel.org X-Gm-Message-State: AOJu0YytxBu0CQxerdTllCeL74QKcesKfM1GkqUJacJWhHetDa8aNAxA eC1lmUeG9kOdDgt3Mkm7P8XsPhw6I03ccRLXIIIZcAjA/XJnMGp1bck= X-Gm-Gg: ATEYQzy1aIAZIIosF5nNw85Q7O3qrZZApIvTZaGkGxIomSBfmb03i6nFSif8WCUtAD6 h2Eq2+3lv7/Z2+L5UFjo6ppMTR71G3m7snfyYZfRE++6pRmDYzRf8e895eVwLmoHTzKAWnvVsuR b4QLZaIaOJzuButlAvCaTiFkq9jTKStI6d+pD+F8j9gxnyJ1AfoAk5g8AtSr+yfqlQLR+PhPHts ZXK+bNUH44kRD/jy1ZioQqU1HAzmE43ldVHQXGRnA6ynDbcRkALfiEb++TjsQprPGMdS7uD6O0S /XV9GSaF1nwqjWOA5gr0a0e7uLbO3xTZ4SK456Kn1FOR3SyhhlGh52C9rpWNQ4cnkBHJ/yI4Qho gtfVckD51go+2tICTNFePAdLtbKOGF6Mo9fL6SOlIkJCpBPtQ+xISLnM4l7cuvfpvhXMZS69kOi tsB2i7uwt/7S1QcStPKzH7ZhaTnxFncwYALclLDfPmeTjDLlhkYIHSz0MuRLrFxStaxxcuJX552 n2SSWhPyouTLRovUw== X-Received: by 2002:a05:7022:4197:b0:123:2c98:f6af with SMTP id a92af1059eb24-12a7268250bmr769536c88.14.1773969910584; Thu, 19 Mar 2026 18:25:10 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12a733b4a99sm802180c88.1.2026.03.19.18.25.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:10 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org, Cosmin Ratiu Subject: [PATCH net-next v3 06/13] mlx5: convert to ndo_set_rx_mode_async Date: Thu, 19 Mar 2026 18:24:54 -0700 Message-ID: <20260320012501.2033548-7-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert mlx5 from ndo_set_rx_mode to ndo_set_rx_mode_async. The driver's mlx5e_set_rx_mode now receives uc/mc snapshots and calls mlx5e_fs_set_rx_mode_work directly instead of queueing work. mlx5e_sync_netdev_addr and mlx5e_handle_netdev_addr now take explicit uc/mc list parameters and iterate with netdev_hw_addr_list_for_each instead of netdev_for_each_{uc,mc}_addr. Fallback to netdev's uc/mc in a few places and grab addr lock. Cc: Saeed Mahameed Cc: Tariq Toukan Cc: Cosmin Ratiu Reviewed-by: Aleksandr Loktionov Signed-off-by: Stanislav Fomichev --- .../net/ethernet/mellanox/mlx5/core/en/fs.h | 5 +++- .../net/ethernet/mellanox/mlx5/core/en_fs.c | 30 ++++++++++++------- .../net/ethernet/mellanox/mlx5/core/en_main.c | 16 +++++++--- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h b/drivers/net/= ethernet/mellanox/mlx5/core/en/fs.h index c3408b3f7010..091b80a67189 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en/fs.h @@ -201,7 +201,10 @@ int mlx5e_add_vlan_trap(struct mlx5e_flow_steering *fs= , int trap_id, int tir_nu void mlx5e_remove_vlan_trap(struct mlx5e_flow_steering *fs); int mlx5e_add_mac_trap(struct mlx5e_flow_steering *fs, int trap_id, int t= ir_num); void mlx5e_remove_mac_trap(struct mlx5e_flow_steering *fs); -void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs, struct net_= device *netdev); +void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs, + struct net_device *netdev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc); int mlx5e_fs_vlan_rx_add_vid(struct mlx5e_flow_steering *fs, struct net_device *netdev, __be16 proto, u16 vid); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c b/drivers/net/= ethernet/mellanox/mlx5/core/en_fs.c index 55255fe6e415..a9daefbd8f8f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c @@ -609,20 +609,26 @@ static void mlx5e_execute_l2_action(struct mlx5e_flow= _steering *fs, } =20 static void mlx5e_sync_netdev_addr(struct mlx5e_flow_steering *fs, - struct net_device *netdev) + struct net_device *netdev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct netdev_hw_addr *ha; =20 - netif_addr_lock_bh(netdev); + if (!uc || !mc) { + netif_addr_lock_bh(netdev); + mlx5e_sync_netdev_addr(fs, netdev, &netdev->uc, &netdev->mc); + netif_addr_unlock_bh(netdev); + return; + } =20 mlx5e_add_l2_to_hash(fs->l2.netdev_uc, netdev->dev_addr); - netdev_for_each_uc_addr(ha, netdev) + + netdev_hw_addr_list_for_each(ha, uc) mlx5e_add_l2_to_hash(fs->l2.netdev_uc, ha->addr); =20 - netdev_for_each_mc_addr(ha, netdev) + netdev_hw_addr_list_for_each(ha, mc) mlx5e_add_l2_to_hash(fs->l2.netdev_mc, ha->addr); - - netif_addr_unlock_bh(netdev); } =20 static void mlx5e_fill_addr_array(struct mlx5e_flow_steering *fs, int list= _type, @@ -724,7 +730,9 @@ static void mlx5e_apply_netdev_addr(struct mlx5e_flow_s= teering *fs) } =20 static void mlx5e_handle_netdev_addr(struct mlx5e_flow_steering *fs, - struct net_device *netdev) + struct net_device *netdev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct mlx5e_l2_hash_node *hn; struct hlist_node *tmp; @@ -736,7 +744,7 @@ static void mlx5e_handle_netdev_addr(struct mlx5e_flow_= steering *fs, hn->action =3D MLX5E_ACTION_DEL; =20 if (fs->state_destroy) - mlx5e_sync_netdev_addr(fs, netdev); + mlx5e_sync_netdev_addr(fs, netdev, uc, mc); =20 mlx5e_apply_netdev_addr(fs); } @@ -820,7 +828,9 @@ static void mlx5e_destroy_promisc_table(struct mlx5e_fl= ow_steering *fs) } =20 void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steering *fs, - struct net_device *netdev) + struct net_device *netdev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct mlx5e_l2_table *ea =3D &fs->l2; =20 @@ -850,7 +860,7 @@ void mlx5e_fs_set_rx_mode_work(struct mlx5e_flow_steeri= ng *fs, if (enable_broadcast) mlx5e_add_l2_flow_rule(fs, &ea->broadcast, MLX5E_FULLMATCH); =20 - mlx5e_handle_netdev_addr(fs, netdev); + mlx5e_handle_netdev_addr(fs, netdev, uc, mc); =20 if (disable_broadcast) mlx5e_del_l2_flow_rule(fs, &ea->broadcast); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/ne= t/ethernet/mellanox/mlx5/core/en_main.c index f7009da94f0b..e86cf1ee108d 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -4108,11 +4108,16 @@ static void mlx5e_nic_set_rx_mode(struct mlx5e_priv= *priv) queue_work(priv->wq, &priv->set_rx_mode_work); } =20 -static void mlx5e_set_rx_mode(struct net_device *dev) +static void mlx5e_set_rx_mode(struct net_device *dev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct mlx5e_priv *priv =3D netdev_priv(dev); =20 - mlx5e_nic_set_rx_mode(priv); + if (mlx5e_is_uplink_rep(priv)) + return; /* no rx mode for uplink rep */ + + mlx5e_fs_set_rx_mode_work(priv->fs, dev, uc, mc); } =20 static int mlx5e_set_mac(struct net_device *netdev, void *addr) @@ -5287,7 +5292,7 @@ const struct net_device_ops mlx5e_netdev_ops =3D { .ndo_setup_tc =3D mlx5e_setup_tc, .ndo_select_queue =3D mlx5e_select_queue, .ndo_get_stats64 =3D mlx5e_get_stats, - .ndo_set_rx_mode =3D mlx5e_set_rx_mode, + .ndo_set_rx_mode_async =3D mlx5e_set_rx_mode, .ndo_set_mac_address =3D mlx5e_set_mac, .ndo_vlan_rx_add_vid =3D mlx5e_vlan_rx_add_vid, .ndo_vlan_rx_kill_vid =3D mlx5e_vlan_rx_kill_vid, @@ -6272,8 +6277,11 @@ void mlx5e_set_rx_mode_work(struct work_struct *work) { struct mlx5e_priv *priv =3D container_of(work, struct mlx5e_priv, set_rx_mode_work); + struct net_device *dev =3D priv->netdev; =20 - return mlx5e_fs_set_rx_mode_work(priv->fs, priv->netdev); + netdev_lock_ops(dev); + mlx5e_fs_set_rx_mode_work(priv->fs, dev, NULL, NULL); + netdev_unlock_ops(dev); } =20 /* mlx5e generic netdev management API (move to en_common.c) */ --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f177.google.com (mail-dy1-f177.google.com [74.125.82.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 038EA2D979C for ; Fri, 20 Mar 2026 01:25:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969915; cv=none; b=qLaYCraO/RlLmfGoyunoHCCPK7Cya7M69fKNhcp01HwWQiTc/pg+v53EwSIFAdg7DdBC/+p1ANeqlXO0zybZFW+xIXK5xpPXgONXmVsB1gsI0Z98UCZA0OUPb0q2mj0dxUhzYtNw7xXW7+jA1Tg5Lwds8ellj7y7YgtMzrKd00c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969915; c=relaxed/simple; bh=YM3u0it3wWyko/sNve4E8SApgNH7HFUTOMIScZJQq9U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HjMWQsMJl41//EMO0dkWR9dqEVIiqFDaV+ZIewkPzYNCcNJiD88KNW56NHmpsZ+kLkQkQPSUh7HxD1staWjrvheqRMl6qIe4ZdFhjmsLl6oM4FCFysHbLZ0EgS4P0FYhjVrBXeVdpcf1fbb7IBHeAf6iX9UxBrl4FK6UJ42S/6M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f177.google.com with SMTP id 5a478bee46e88-2c10a2e2cd1so849771eec.0 for ; Thu, 19 Mar 2026 18:25:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969912; x=1774574712; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=pcE3963mtoxNpsjtfnMGkLcMdWR/4YpWXWFsCalwpQc=; b=c5NIueRD2W6mPlmznd1NHwKsGtYrSW947tqx+WA7HrQAuWkbdCKsYC08VEvIZZVm/P sAkVDEpDiZ4DBQqjxB+eNIpprSXh0dssVTOyT53FGZEZmDsv/RfbhziGtNIDKhpxaKo7 8iYkEry7dilxazqnL0SiyVfMte/FMOLTK56TvdPZTp7RUuELcmW6v5KH6DRaUnLFjuJb wxkNJngu2TNn/ZkipUiPJ4VbvNuklHY5Rm/UYP/SLaDBpJAuEFy50hTBGcg1+cU9V3gq DYigfwXmnbLRWNON0mV88+/8iU+xy1RRHGpO3kOIzllJEX+ZOQEIDyywSZyxP94RKhYW RT4A== X-Forwarded-Encrypted: i=1; AJvYcCUXlFisyVAqR7lKvkLX/YO2duzVj1JXoLWM7OkfRSsiLKIRG7BWnFEIBCtKmIhnTj2DrsswbXCxqasMFd0=@vger.kernel.org X-Gm-Message-State: AOJu0Yywoo/aNw2ZgGvOoXcRIs4QtJeLNVrA4AkJ1O4Sp8sOinT3Hq58 P17gwHYUVHaZ1xYLHctx/rBVDfE66uOk/oJ3OGtu9j/0+BKb3AtF+Ok= X-Gm-Gg: ATEYQzxh/FSwJx5Sf6OQpshU0MOlqlytuFpajUHcjPE3o+ecAYFG/1aKczZsQuNAqoK RBH/1Tc1WbIMp2Yh5XptjqHYh9nyCQjg+zq8g5Re0hmRS0ahakjvk++Z9dYLIZ0lwL6bikeC6j5 I2s9eFapsZ/aC8vscoaIn11zQtDByzCRp/yR7Zf9neUVK5j3xuamS51kxMBZsVM02beDjG/Xhcu O4enKqqIkdCrTMpoTW7rJV8So2KsqfIXXeEg8Le9bOrVdzMcyV0XYY0v93/LOffWgztobZl6k5s Yzomyp8pFyUNlq8v34IsufpAZzfCUxlz4DCfg9ChAuVnn4e6oqQhF9ZNfIZAiO+gnYN6j1fh+mq gWKDCpPbAGMsiqjkkn8onGEiXuPXCTT0naBrOnI1dnJGv7QnIoxEGrnGLfvFo7DFF1Ifarz4jyF 0xGjmhi2HL8CE335Jc9NM6aWpLmmZ/WYaQVFJiZ4m6Gfccmx1vG9RKXII1486Ru5NsmfmPF/D3v yd5iIFyt5rJ17ncHQ== X-Received: by 2002:a05:7300:5b95:b0:2be:b00c:d083 with SMTP id 5a478bee46e88-2c1097ecb5bmr849410eec.35.1773969911672; Thu, 19 Mar 2026 18:25:11 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b14c985sm1150838eec.2.2026.03.19.18.25.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:11 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 07/13] bnxt: convert to ndo_set_rx_mode_async Date: Thu, 19 Mar 2026 18:24:55 -0700 Message-ID: <20260320012501.2033548-8-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert bnxt from ndo_set_rx_mode to ndo_set_rx_mode_async. bnxt_set_rx_mode, bnxt_mc_list_updated and bnxt_uc_list_updated now take explicit uc/mc list parameters and iterate with netdev_hw_addr_list_for_each instead of netdev_for_each_{uc,mc}_addr. The bnxt_cfg_rx_mode internal caller passes the real lists under netif_addr_lock_bh. BNXT_RX_MASK_SP_EVENT is still used here, next patch converts to the direct call. Cc: Michael Chan Cc: Pavan Chebbi Reviewed-by: Aleksandr Loktionov Signed-off-by: Stanislav Fomichev Reviewed-by: Michael Chan --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 31 +++++++++++++---------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index c982aac714d1..225217b32e4b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -11040,7 +11040,8 @@ static int bnxt_setup_nitroa0_vnic(struct bnxt *bp) } =20 static int bnxt_cfg_rx_mode(struct bnxt *); -static bool bnxt_mc_list_updated(struct bnxt *, u32 *); +static bool bnxt_mc_list_updated(struct bnxt *, u32 *, + const struct netdev_hw_addr_list *); =20 static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init) { @@ -11130,7 +11131,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq= _re_init) } else if (bp->dev->flags & IFF_MULTICAST) { u32 mask =3D 0; =20 - bnxt_mc_list_updated(bp, &mask); + bnxt_mc_list_updated(bp, &mask, &bp->dev->mc); vnic->rx_mask |=3D mask; } =20 @@ -13519,17 +13520,17 @@ void bnxt_get_ring_drv_stats(struct bnxt *bp, bnxt_get_one_ring_drv_stats(bp, stats, &bp->bnapi[i]->cp_ring); } =20 -static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask) +static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask, + const struct netdev_hw_addr_list *mc) { struct bnxt_vnic_info *vnic =3D &bp->vnic_info[BNXT_VNIC_DEFAULT]; - struct net_device *dev =3D bp->dev; struct netdev_hw_addr *ha; u8 *haddr; int mc_count =3D 0; bool update =3D false; int off =3D 0; =20 - netdev_for_each_mc_addr(ha, dev) { + netdev_hw_addr_list_for_each(ha, mc) { if (mc_count >=3D BNXT_MAX_MC_ADDRS) { *rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; vnic->mc_list_count =3D 0; @@ -13553,17 +13554,17 @@ static bool bnxt_mc_list_updated(struct bnxt *bp,= u32 *rx_mask) return update; } =20 -static bool bnxt_uc_list_updated(struct bnxt *bp) +static bool bnxt_uc_list_updated(struct bnxt *bp, + const struct netdev_hw_addr_list *uc) { - struct net_device *dev =3D bp->dev; struct bnxt_vnic_info *vnic =3D &bp->vnic_info[BNXT_VNIC_DEFAULT]; struct netdev_hw_addr *ha; int off =3D 0; =20 - if (netdev_uc_count(dev) !=3D (vnic->uc_filter_count - 1)) + if (netdev_hw_addr_list_count(uc) !=3D (vnic->uc_filter_count - 1)) return true; =20 - netdev_for_each_uc_addr(ha, dev) { + netdev_hw_addr_list_for_each(ha, uc) { if (!ether_addr_equal(ha->addr, vnic->uc_list + off)) return true; =20 @@ -13572,7 +13573,9 @@ static bool bnxt_uc_list_updated(struct bnxt *bp) return false; } =20 -static void bnxt_set_rx_mode(struct net_device *dev) +static void bnxt_set_rx_mode(struct net_device *dev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct bnxt *bp =3D netdev_priv(dev); struct bnxt_vnic_info *vnic; @@ -13593,7 +13596,7 @@ static void bnxt_set_rx_mode(struct net_device *dev) if (dev->flags & IFF_PROMISC) mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; =20 - uc_update =3D bnxt_uc_list_updated(bp); + uc_update =3D bnxt_uc_list_updated(bp, uc); =20 if (dev->flags & IFF_BROADCAST) mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_BCAST; @@ -13601,7 +13604,7 @@ static void bnxt_set_rx_mode(struct net_device *dev) mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; vnic->mc_list_count =3D 0; } else if (dev->flags & IFF_MULTICAST) { - mc_update =3D bnxt_mc_list_updated(bp, &mask); + mc_update =3D bnxt_mc_list_updated(bp, &mask, mc); } =20 if (mask !=3D vnic->rx_mask || uc_update || mc_update) { @@ -13620,7 +13623,7 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) bool uc_update; =20 netif_addr_lock_bh(dev); - uc_update =3D bnxt_uc_list_updated(bp); + uc_update =3D bnxt_uc_list_updated(bp, &dev->uc); netif_addr_unlock_bh(dev); =20 if (!uc_update) @@ -15871,7 +15874,7 @@ static const struct net_device_ops bnxt_netdev_ops = =3D { .ndo_start_xmit =3D bnxt_start_xmit, .ndo_stop =3D bnxt_close, .ndo_get_stats64 =3D bnxt_get_stats64, - .ndo_set_rx_mode =3D bnxt_set_rx_mode, + .ndo_set_rx_mode_async =3D bnxt_set_rx_mode, .ndo_eth_ioctl =3D bnxt_ioctl, .ndo_validate_addr =3D eth_validate_addr, .ndo_set_mac_address =3D bnxt_change_mac_addr, --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f173.google.com (mail-dy1-f173.google.com [74.125.82.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49CD32F3C10 for ; Fri, 20 Mar 2026 01:25:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969916; cv=none; b=WgGXjAZdZmpIQIHnQPM4paw+fXUOg+cAFxeCw+Rvvf/apqzUevT10CPmyjYd0Awove9hHSNqAW7zUoCX23skJPyeGj6Km1h9YqCVL3VS6HMg4IzftAjPxOl5lq5ZCuicCpjZSDN2b7wY5MFhtKbnKY2Z0AVCgEd4dbEXSsgM6IE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969916; c=relaxed/simple; bh=xGyWKie5gSXUQg2y/Hf3EG3CM8UetOjX320TtPqkLhA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EmqJ6OfUlYDng/1a2o4zna+1kR9ti9iN52k2YJOfqcolkATVBt/lW2DvXmXuekp/oRVaJCc62sIHzSyKdLSsPD6kh01UZR23/QEkQAH3A+06dwDo1EpBcmZ4fmm5/gbA5EoK4knHaK/0bodIBKF5KLet24ypAwxu3eukBqKsH/w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f173.google.com with SMTP id 5a478bee46e88-2c10a2e2cd1so849814eec.0 for ; Thu, 19 Mar 2026 18:25:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969913; x=1774574713; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/QYC4SzEuyGRG+kJyCDzSpHDYzTJ7+UZHrEymifymEA=; b=pBl+jFpC7ngntcaTWk0ftMnRnmVD4T1cfClKncjH8ipNoh9DpE1yhcxP74qDUywPJr W4n3gtf04YKdPYlBvfkHZGwDTQE89y1RkXLVmvwF9vhgo88IgHCwvaGyHj7GnTc7CUtv yRkrlsPaMk9TBepv3KEgRvyh44J815WvjLLQjEnUO3V1ZZb6b8IuGXCzvaE8fWngFaNH GxWpjDAhC/RVDycXIB5Y7YJ77T7zAwxeyWQe+ZxiF+X6D46lzJlrsGyyrP7ELbfXVB9y p+XWV4OwgYKcBGisiRkqDM9ag5SOSsL3whPCjxwzfc1iB3USzKmsG7IZ6WhMToW06EB4 YawA== X-Forwarded-Encrypted: i=1; AJvYcCVdfwJyGfikTPX3+vVKHurYUTiI/tJw710CuxXehkZlPuUJBEX+ZBhoIukui6XqePECfMSeDT7mn6grzLU=@vger.kernel.org X-Gm-Message-State: AOJu0Yy73JD7VrYfx+vNqEq2xE44zV9xHVwt9layEOS1nKq3JTCMIbUw OZ5ZlwAi5j+xrIfgRHxxtQkQkepLK+T+wjgeTAdpQ2/ytPaRUQrxiXY= X-Gm-Gg: ATEYQzxwJNm4xYbmhNAV2mZpQYWQsnfHhRgprcGiGNpvIcF0qVyARu9INo66MpLtRnf tBUefiCWHEfUkbd/2xmbS+Ouu6Rp3ziFWxxpKyi59hh4ulPL3oeLljj8eYIFPmrVBBA97NtkG9L H+Oe8HdzJtxdk24eTVgBYeGDZrcvH984JIO472FQfGbLbTVrEwH+1FGCUMjuDPKWBCiLhg1fT1I cJ1eHxIE7IAAgBpnn/q39lmOizdbSqp78LYfbp4D5VE8DQNc58pRRH6+C+yrjIbCI0WpebvhEhv BaJXr6ciOli2JVkBYLRs/HkEQZiW+F3waiPxr1jh1Ih69VibNkPg7CuUFLWb/YMsm9dYhvvpfGF kg51Ll88JF9Y1vKw4U4qxPffrBN0nx7a/i97jzfd5EeaYLCqQb9QomK8Nk7oXGhiyGSQkDCnbXZ UdcUYyjnDK3lXq3lJPcNRs8ZZTPvCmEbqiEZHfCaa6FsfTtOLXWh0POt2PxdW5sfEw9LJyiy/bm 03dbmZHGfW37JSvvNAC9IkfnFNQ X-Received: by 2002:a05:7022:6893:b0:11b:ca88:c4f7 with SMTP id a92af1059eb24-12a726dd982mr607975c88.40.1773969912989; Thu, 19 Mar 2026 18:25:12 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12a733e794esm803266c88.6.2026.03.19.18.25.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:12 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 08/13] bnxt: use snapshot in bnxt_cfg_rx_mode Date: Thu, 19 Mar 2026 18:24:56 -0700 Message-ID: <20260320012501.2033548-9-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" With the introduction of ndo_set_rx_mode_async (as discussed in [0]) we can call bnxt_cfg_rx_mode directly. Convert bnxt_cfg_rx_mode to use uc/mc snapshots and move its call in bnxt_sp_task to the section that resets BNXT_STATE_IN_SP_TASK. Switch to direct call in bnxt_set_rx_mode. 0: https://lore.kernel.org/netdev/CACKFLi=3D5vj8hPqEUKDd8RTw3au5G+zRgQEqjF+= 6NZnyoNm90KA@mail.gmail.com/ Cc: Michael Chan Cc: Pavan Chebbi Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 225217b32e4b..12265bd7fda4 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -11039,7 +11039,8 @@ static int bnxt_setup_nitroa0_vnic(struct bnxt *bp) return rc; } =20 -static int bnxt_cfg_rx_mode(struct bnxt *); +static int bnxt_cfg_rx_mode(struct bnxt *, struct netdev_hw_addr_list *, + struct netdev_hw_addr_list *); static bool bnxt_mc_list_updated(struct bnxt *, u32 *, const struct netdev_hw_addr_list *); =20 @@ -11135,7 +11136,7 @@ static int bnxt_init_chip(struct bnxt *bp, bool irq= _re_init) vnic->rx_mask |=3D mask; } =20 - rc =3D bnxt_cfg_rx_mode(bp); + rc =3D bnxt_cfg_rx_mode(bp, &bp->dev->uc, &bp->dev->mc); if (rc) goto err_out; =20 @@ -13610,11 +13611,12 @@ static void bnxt_set_rx_mode(struct net_device *d= ev, if (mask !=3D vnic->rx_mask || uc_update || mc_update) { vnic->rx_mask =3D mask; =20 - bnxt_queue_sp_work(bp, BNXT_RX_MASK_SP_EVENT); + bnxt_cfg_rx_mode(bp, uc, mc); } } =20 -static int bnxt_cfg_rx_mode(struct bnxt *bp) +static int bnxt_cfg_rx_mode(struct bnxt *bp, struct netdev_hw_addr_list *u= c, + struct netdev_hw_addr_list *mc) { struct net_device *dev =3D bp->dev; struct bnxt_vnic_info *vnic =3D &bp->vnic_info[BNXT_VNIC_DEFAULT]; @@ -13623,7 +13625,7 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) bool uc_update; =20 netif_addr_lock_bh(dev); - uc_update =3D bnxt_uc_list_updated(bp, &dev->uc); + uc_update =3D bnxt_uc_list_updated(bp, uc); netif_addr_unlock_bh(dev); =20 if (!uc_update) @@ -13639,10 +13641,10 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) vnic->uc_filter_count =3D 1; =20 netif_addr_lock_bh(dev); - if (netdev_uc_count(dev) > (BNXT_MAX_UC_ADDRS - 1)) { + if (netdev_hw_addr_list_count(uc) > (BNXT_MAX_UC_ADDRS - 1)) { vnic->rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; } else { - netdev_for_each_uc_addr(ha, dev) { + netdev_hw_addr_list_for_each(ha, uc) { memcpy(vnic->uc_list + off, ha->addr, ETH_ALEN); off +=3D ETH_ALEN; vnic->uc_filter_count++; @@ -14600,6 +14602,7 @@ static void bnxt_ulp_restart(struct bnxt *bp) static void bnxt_sp_task(struct work_struct *work) { struct bnxt *bp =3D container_of(work, struct bnxt, sp_task); + struct net_device *dev =3D bp->dev; =20 set_bit(BNXT_STATE_IN_SP_TASK, &bp->state); smp_mb__after_atomic(); @@ -14613,9 +14616,6 @@ static void bnxt_sp_task(struct work_struct *work) bnxt_reenable_sriov(bp); } =20 - if (test_and_clear_bit(BNXT_RX_MASK_SP_EVENT, &bp->sp_event)) - bnxt_cfg_rx_mode(bp); - if (test_and_clear_bit(BNXT_RX_NTP_FLTR_SP_EVENT, &bp->sp_event)) bnxt_cfg_ntp_filters(bp); if (test_and_clear_bit(BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT, &bp->sp_event)) @@ -14680,6 +14680,12 @@ static void bnxt_sp_task(struct work_struct *work) /* These functions below will clear BNXT_STATE_IN_SP_TASK. They * must be the last functions to be called before exiting. */ + if (test_and_clear_bit(BNXT_RX_MASK_SP_EVENT, &bp->sp_event)) { + bnxt_lock_sp(bp); + bnxt_cfg_rx_mode(bp, &dev->uc, &dev->mc); + bnxt_unlock_sp(bp); + } + if (test_and_clear_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event)) bnxt_reset(bp, false); =20 --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dl1-f52.google.com (mail-dl1-f52.google.com [74.125.82.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 913092FF147 for ; Fri, 20 Mar 2026 01:25:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969918; cv=none; b=IZ1g5GdxxfU9lPhtlCW1eCuygGj1dQhEf5owoPvFmCI541A69KAQa+761R7Lf/w5Mp4j444KwGznsaNFL13m21nurWcaYhfqTpJJGefa9uZWQVdD5vSNWBB5Rc93IdR7MQ3L7hy/0cIiSWzD97pqNPq7gmAfI+UANi2720h97/4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969918; c=relaxed/simple; bh=tpq4CPEg4PF7xY4vX/qaHiEsjc2ICDqk3bHyi4H6/ME=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dEiS5FmhZXm95wFUHDaka/U7rrlyRzbAr7LV91ht0nJ4XWrwm1wN5pgnXJ10rI0MeBT9XjD1lDJ8KF+YPeNlmVXvynRrNbk5+NhpQUP2b00bv+eL2gEGccNViT9qNc9ZzhXcxZaF5rrOnS4lBLfdBVxLq5HH4CcbpUEvelgfKK8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dl1-f52.google.com with SMTP id a92af1059eb24-127380532eeso4102446c88.1 for ; Thu, 19 Mar 2026 18:25:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969914; x=1774574714; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ZI1/cLnyDnVOs4qvF1/y00bhWF98dmH7Q3P7jVrTCz8=; b=Bkcl38NcpOOUOsLuX7J3DsFrkTP+9CRjBQu07KBk/8BpGK/icKACVM/sNwzBMrI6Nq +K1LbSg+fWYoS9QpgYzjaJD859ZqnJ7yrbLH1nGeJyTdxvN7FgFzlZ+F9qd0MqyBUozm FRyCs9g/APrvEWXQaNoMcWp70HqbQJv5e3Bqy+s2nEhqFhDV89UzC8eHGzwA+C1kJWYb Myhy6ACelhf9km6nIfN5xdvzbHICUVRcZPmecgsJKvW8OAAKhO52KYE8J5SBTImIefaO hojhiQCRrYrKrj6tEe9qxo5NDnJSO0K4zmMK5bx5EJrhDjoGsiGIrVTbWYWJsqFZdkrc Elig== X-Forwarded-Encrypted: i=1; AJvYcCUjLQxg6umXKJCkz5ahrHITzI0A2/qlsc0ehZSYMUsCPO2vN7o3ttvxIAT3onWWhhBPnhEm1+Mvao5RKWc=@vger.kernel.org X-Gm-Message-State: AOJu0Yyh+Rh515FAxoP5xht1lRdtn4sqsKskk8L0Pr23//VvhlxWO2B3 6zVb8XYHQ4HFhWFd8JyYsbS3uFGy2Gj7vnhE/vEPe8GGFpltMMZWs28= X-Gm-Gg: ATEYQzzag4wlI4WOgqSlI1VBmlpKCHof3Jmr4BERXzSZ2x1M3jYjJ2bI6ISzHRSjR0W sAizpf+PdNOoavKF8ZT0qz5Etz0DhmeZHQ13NFl2f7vYfOvep6mgVfMY45EGEYJt/s0/qjWsTs7 kDUmf/gIHDaEN/iYUOqlvYx986oIoKTy1KjrFlckTxZm2mvY/lovGX4OSWKy5rHvMiT5GNF8l5s cdcxUecA215C9Y5zMJGPqLGq/ehwKD98zIcmrccR86XdQ7uxWmlhwCYwzAZTbk/St98XEjqoixJ eIu1RF6j6bY0lqMpT8AhGzdPW4Aygb9dzdM/0SeFm3osliafZb2hqgVMGCug1/OfycEDVqlVmi0 G/QLEkKwsKExkqx/qZXDsJNVMlev6JMKRew0eQcqH5TNUpjE9R+2xg0fCNgyCyq8AI5ZdGwtoXG sHjDkN/4PEP8KBrqC+fMh298/4ZsrKD2LTZXpWSmVhAT1+claD9JjaUUgrsavjZ6Jii3Pa4fhs+ 96DCPf9ziUX3/RlOjoEX01kV/24 X-Received: by 2002:a05:7022:2227:b0:128:ce44:be8f with SMTP id a92af1059eb24-12a726572c7mr659849c88.2.1773969914275; Thu, 19 Mar 2026 18:25:14 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12a733dd8c0sm761096c88.5.2026.03.19.18.25.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:13 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 09/13] iavf: convert to ndo_set_rx_mode_async Date: Thu, 19 Mar 2026 18:24:57 -0700 Message-ID: <20260320012501.2033548-10-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert iavf from ndo_set_rx_mode to ndo_set_rx_mode_async. iavf_set_rx_mode now takes explicit uc/mc list parameters and uses __hw_addr_sync_dev on the snapshots instead of __dev_uc_sync and __dev_mc_sync. The iavf_configure internal caller passes the real lists directly. Cc: Tony Nguyen Cc: Przemek Kitszel Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- drivers/net/ethernet/intel/iavf/iavf_main.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c b/drivers/net/ethe= rnet/intel/iavf/iavf_main.c index 7925ee152c76..6632d35ad0fe 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_main.c +++ b/drivers/net/ethernet/intel/iavf/iavf_main.c @@ -1147,14 +1147,18 @@ bool iavf_promiscuous_mode_changed(struct iavf_adap= ter *adapter) /** * iavf_set_rx_mode - NDO callback to set the netdev filters * @netdev: network interface device structure + * @uc: snapshot of uc address list + * @mc: snapshot of mc address list **/ -static void iavf_set_rx_mode(struct net_device *netdev) +static void iavf_set_rx_mode(struct net_device *netdev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { struct iavf_adapter *adapter =3D netdev_priv(netdev); =20 spin_lock_bh(&adapter->mac_vlan_list_lock); - __dev_uc_sync(netdev, iavf_addr_sync, iavf_addr_unsync); - __dev_mc_sync(netdev, iavf_addr_sync, iavf_addr_unsync); + __hw_addr_sync_dev(uc, netdev, iavf_addr_sync, iavf_addr_unsync); + __hw_addr_sync_dev(mc, netdev, iavf_addr_sync, iavf_addr_unsync); spin_unlock_bh(&adapter->mac_vlan_list_lock); =20 spin_lock_bh(&adapter->current_netdev_promisc_flags_lock); @@ -1207,7 +1211,7 @@ static void iavf_configure(struct iavf_adapter *adapt= er) struct net_device *netdev =3D adapter->netdev; int i; =20 - iavf_set_rx_mode(netdev); + iavf_set_rx_mode(netdev, &netdev->uc, &netdev->mc); =20 iavf_configure_tx(adapter); iavf_configure_rx(adapter); @@ -5150,7 +5154,7 @@ static const struct net_device_ops iavf_netdev_ops = =3D { .ndo_open =3D iavf_open, .ndo_stop =3D iavf_close, .ndo_start_xmit =3D iavf_xmit_frame, - .ndo_set_rx_mode =3D iavf_set_rx_mode, + .ndo_set_rx_mode_async =3D iavf_set_rx_mode, .ndo_validate_addr =3D eth_validate_addr, .ndo_set_mac_address =3D iavf_set_mac, .ndo_change_mtu =3D iavf_change_mtu, --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f171.google.com (mail-dy1-f171.google.com [74.125.82.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1F77C2E8B83 for ; Fri, 20 Mar 2026 01:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969919; cv=none; b=LgiQW9CPt5moHcCCthsQLAUH4eRrGzW5i8QlVNfZjLeiTiH39F/CraYBc9NWZ279MVKsv5XAA3yJYGryj0z7bv1hgVTfUOK5uIxBhNa0syvTq6fcI0du/1zJ8K7qLzKap0eD4R2vw/3mXbXvAcuRF/4DC3BejVYpgNLRCpU2wzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969919; c=relaxed/simple; bh=FkE3aEmYq3JFi5GpqJgM6OBmxi48BQXX3kwNVt8fzXo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=F3H/eHIznixNEiosj1NNXmAa4P6CKbvohW4cVKhpRgrikkzaXD7eAwuiq3cGw+mnREbH1D2csSxTCZIlDIvA7S3XLppMXCjenim2szqmIVqE4oLoXLOOD7kgJ2DLgD7Z+2H/e4YNmaRjhA8YS0dUS7J0uWVam1mxJFcFrxvX+14= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f171.google.com with SMTP id 5a478bee46e88-2c0bb213b16so2614322eec.0 for ; Thu, 19 Mar 2026 18:25:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969916; x=1774574716; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RnwqqwAxnRG8s2vaRYDrbUdfVznpcDcr1raRDlnvaSE=; b=iG1W0TzMHmw7J8Z56gIyY7yOg1jnOVHUcoRXbg9/iBH56KVhdDjNvAXhTAHjj78vDg LVbe1J5A6o4i+TxXbkbYpYjVQvq1A8LRMBVFi3j9KxIrIqUToKNau2VL85prx3FMYzQM fVbd/3IzFf6jCU8h6LYYZwQt88ZXrYyIL3QVOckSd1648x55A3xp+VefGkSlR+TMEjwj eMAtixVbiDm4jmjnGczZXdXSWNtZsG44hu+zb/FFpgZ2W5ej7eWx8nNvlbCoq/a6teEs G0s48EZwAFS7xLTss38WVDCFr9K/UrwMSaoOPidgIfEr3JCNIlpLoFbEKgy9z00hbSMi i5xA== X-Forwarded-Encrypted: i=1; AJvYcCXNuyMpfQKGycynZkEjpvbvSAL5xx3OrbMaET/Em8FLuz/VfuJp8uksdRHoQ4jzRCSo4Mlo9YSbb6r2NOQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywgz+/6k4Du5e78POFI2bP8lzjL4sirY673kLZDYICsbwIxdg6E xnSofisMU6osT1KY1G609Gbgs0sqANoQUVrnsQ1ILoon1UxgBr2xbjk= X-Gm-Gg: ATEYQzyRQb9NA1matBYtBjtemR+8nqpjQLGIYVFcQkLTfsfHZ8uXmocaWZrdQR36l5m j6CC3LnAn1gq6dlzd3khQ6X3o19w/UU9akf4h+GHHRMlAZz/1sTOcUFmsrMehMcfrzZegol+Nev NV+lHznFrGKTHKHNzLvcmbXT2UmCEYPJg7/Lf6Cc23A1V0+PovkH/Z/q1F77ccRwBZvbyuFu6LO S3kwd8RO/e94DHGJB/Lw8WLDFgW600mek3XkFWpAKaG5pyuw5p+kJQGn2ohx1a94fXOIVARsux+ v39gJE1rnpNULqVZL2n0BeaxgvPdg+85DB6G4QDTNttLloXG9yD+jXwFYEjC06oCzOiRzyJ77oU Ztvtwkx6ASrWicMnYiOFADSWnpJeGKFdPxo5JHfFCBmN/dEP/NMoZP09+rroWFGE21RHcWsQRW8 cF0FAzHKHT3xlmhKtLhhcJlG/QJozIROwnEhyzADwA3ongeq2j6SuIX40OoNL07MLmxIkxMBvFx pjZLu1seoL0qtPGbqWnhqrXn7Ae X-Received: by 2002:a05:7301:4083:b0:2c0:cc90:a71 with SMTP id 5a478bee46e88-2c1095c78d8mr746759eec.8.1773969915768; Thu, 19 Mar 2026 18:25:15 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b1a88e5sm1421784eec.13.2026.03.19.18.25.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:15 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 10/13] netdevsim: convert to ndo_set_rx_mode_async Date: Thu, 19 Mar 2026 18:24:58 -0700 Message-ID: <20260320012501.2033548-11-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert netdevsim from ndo_set_rx_mode to ndo_set_rx_mode_async. The callback is a no-op stub so just update the signature and ops struct wiring. Signed-off-by: Stanislav Fomichev --- drivers/net/netdevsim/netdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index 5ec028a00c62..9c9217792125 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -182,7 +182,9 @@ static netdev_tx_t nsim_start_xmit(struct sk_buff *skb,= struct net_device *dev) return NETDEV_TX_OK; } =20 -static void nsim_set_rx_mode(struct net_device *dev) +static void nsim_set_rx_mode(struct net_device *dev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { } =20 @@ -641,7 +643,7 @@ static const struct net_shaper_ops nsim_shaper_ops =3D { =20 static const struct net_device_ops nsim_netdev_ops =3D { .ndo_start_xmit =3D nsim_start_xmit, - .ndo_set_rx_mode =3D nsim_set_rx_mode, + .ndo_set_rx_mode_async =3D nsim_set_rx_mode, .ndo_set_mac_address =3D eth_mac_addr, .ndo_validate_addr =3D eth_validate_addr, .ndo_change_mtu =3D nsim_change_mtu, @@ -664,7 +666,7 @@ static const struct net_device_ops nsim_netdev_ops =3D { =20 static const struct net_device_ops nsim_vf_netdev_ops =3D { .ndo_start_xmit =3D nsim_start_xmit, - .ndo_set_rx_mode =3D nsim_set_rx_mode, + .ndo_set_rx_mode_async =3D nsim_set_rx_mode, .ndo_set_mac_address =3D eth_mac_addr, .ndo_validate_addr =3D eth_validate_addr, .ndo_change_mtu =3D nsim_change_mtu, --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f178.google.com (mail-dy1-f178.google.com [74.125.82.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F025030C361 for ; Fri, 20 Mar 2026 01:25:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969920; cv=none; b=VW1tacvscL1lgvDOzGSJ3OMom/PFfwAKDPSe3cel3JHTYhHbMHCWRRrObFnLDTba8vATBNaOdJl8EU8DoMw8oOYfl5ov59lGUbgl3UP/mBLOBmmdycBv6St2+yht2ithS9HxdoxAEiwWN9Vu8KfiNH4THMAsg3ccDFHkw3o0xeY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969920; c=relaxed/simple; bh=5NcsxaHVIQ2NmCj9OLQh+nSLlXz0JVUjSv0mBYVb1MM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bcC7xkPubcYfRFnzqpCInGQoXsPy/YET1bO+XVWyrCBAfM9q9qH+ZQY/GBfZe0aeIU6qF3mGfdfbtI5efKdusmHAzXx9MzWQDpChGtiK3htFa0Uwwsa2ei+At2yLME8huavH/J01JGx3CtjrQTFhB2aVf5kxra46BD12cIng8nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f178.google.com with SMTP id 5a478bee46e88-2c0f754e756so1326281eec.1 for ; Thu, 19 Mar 2026 18:25:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969917; x=1774574717; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=HbyBRqP1dM0VO6fEJ4blZH7JfwL0DV5fAiX12aFZ5no=; b=f0Wd7ynwoMU9Rt281MPyJWlvfBmzmbmmP84wqotn53qL+QJBkWAxAQRa85xN21++kD /GsPbrf87pX9gM8EpG+9BWu8Kze8cRztBuIL+KSkTSmsHa0oUCe2dfKisp9zOZ1WTYfJ 3L7UYtxgxCd3xWLTyaJ2qcxconvGUe17Em5DYyd7diWFeSz7ZZk7yfDJdK7GIpyMtwWZ pIvuhIdFH0W2IF+rODi5NtY4r9WOKZ4YD305kyZpy6fZc1DcsBrQcTSJXnx9iuWR060/ 5PoIc1xWgwZUGpfNi8NE72w7mDf3VehwxyOJIoexuCzgTO5OGZ4q+7jYR27Wnkv6LLCc JEOg== X-Forwarded-Encrypted: i=1; AJvYcCXg7vtnGM13xwAF0Sl1mgIOz5TyzgTcPjHW0nPz5FzDiE/W1NrH5Kv0nMsIUCQComYcjpBSLR48NDqaCGI=@vger.kernel.org X-Gm-Message-State: AOJu0YyHFrpiEf3Alicpi+PmjB5qqyGg4TIYBEUAmSw3/Sgu8fMnTzed Rzo2Ao0X7mo3IGKrnM/efBllrcNNAZOA77cvzB76lz9hZ8sE1BjZ7+8= X-Gm-Gg: ATEYQzxueWc1v7XKJM3SLEEs/62rdHp+6IDTUHhaWSdSsfyxqm+UJvN6uMOLDoAkPHc LqU6zD1WEQ8OlYsKhGyErOccIxHWatG6GLtJif5qG8AsdB1etGjFjQ044+jK2H2YntKRaDtuzvW Phm0SA1D65ImFKQZipExrZseLtlIZENXsoNMxHp/v5fAf/3BDGVhjOP1GWZwcqO/O7oqJphA18s Vm1jwrazLvZZsIFpKEwLwUUboyEU29+cEwHBFFHF/xvfCgADbefpzkM/w/0ZFRmRtiO7u8/TrPw VwqV+avo1qV14W7KL3Y/IxS639vpew7C+GJ3f2INQy1RM05ibsraA25FcDHOib4TW8l9IicccCL fVK/fWoHYLzq250N9qk7GZFJta2aRnkkRHxkPe2YtWYm+wwt49D6xKEljJPY0ERLM/AXf0v+rT3 wuO3vLwU5dpO6K3hlo2CDsx8WsBh5Ugz/7l/tbq60f2Ra6M5tq3jA0OliEm4vtvMzs63mDoCQB0 rMMyctfyf5SyeZyxQ== X-Received: by 2002:a05:7300:6da5:b0:2c0:eec6:279e with SMTP id 5a478bee46e88-2c10974fb69mr728307eec.22.1773969916878; Thu, 19 Mar 2026 18:25:16 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b29c74bsm1146865eec.17.2026.03.19.18.25.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:16 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 11/13] dummy: convert to ndo_set_rx_mode_async Date: Thu, 19 Mar 2026 18:24:59 -0700 Message-ID: <20260320012501.2033548-12-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Convert dummy driver from ndo_set_rx_mode to ndo_set_rx_mode_async. The dummy driver's set_multicast_list is a no-op, so the conversion is straightforward: update the signature and the ops assignment. Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- drivers/net/dummy.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c index d6bdad4baadd..f8a4eb365c3d 100644 --- a/drivers/net/dummy.c +++ b/drivers/net/dummy.c @@ -47,7 +47,9 @@ static int numdummies =3D 1; =20 /* fake multicast ability */ -static void set_multicast_list(struct net_device *dev) +static void set_multicast_list(struct net_device *dev, + struct netdev_hw_addr_list *uc, + struct netdev_hw_addr_list *mc) { } =20 @@ -87,7 +89,7 @@ static const struct net_device_ops dummy_netdev_ops =3D { .ndo_init =3D dummy_dev_init, .ndo_start_xmit =3D dummy_xmit, .ndo_validate_addr =3D eth_validate_addr, - .ndo_set_rx_mode =3D set_multicast_list, + .ndo_set_rx_mode_async =3D set_multicast_list, .ndo_set_mac_address =3D eth_mac_addr, .ndo_get_stats64 =3D dummy_get_stats64, .ndo_change_carrier =3D dummy_change_carrier, --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dl1-f50.google.com (mail-dl1-f50.google.com [74.125.82.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2AB132C3255 for ; Fri, 20 Mar 2026 01:25:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969921; cv=none; b=rOFuVrS7uYOY/JPfKZCesCiJ4ZNv1/H0hmKGa1LBs5Sc8+TW4ba1BGI3wcxQv26izhYe+ce9NW5V8J8qYw9ERWt3jQ3E/5A89Zu6sMhO1wHd4cLPAc+HnU+DOLtH16+ffbPa+IQ1Cs2tpam2egNb2+g0KmzFM65bgbK9Ocvacto= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969921; c=relaxed/simple; bh=VK90M3+EGSzjVfsemFKOmNIILll+ZAdpTFJtqe6Y2Mo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Xu33Xj9xTvy/nD32dVfSNDwrDM1jnKeJmYNvikgldCbbW8paBDxf5MbhBTb7FTZq7wiUQKHU1UMXEwJtHoyOYY5D6K/CJebIVGFsZHfmlT50RGzSk8IYwzrOxT+Zl8ihfWu8tS/P0DHEIQSx03VuDuAddy5gswEJlpLm+EddQQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dl1-f50.google.com with SMTP id a92af1059eb24-128b9b7e3edso2688606c88.0 for ; Thu, 19 Mar 2026 18:25:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969918; x=1774574718; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LWBQoO52uK1jdWWUCzjHOfQ7E5wdgkDdRoNSlPpZPUc=; b=IVSZdm9F+gqSNN3R18LDPRBJWYM3GJa2mrlgAyML5HKJpWouRytwb88XMDwnjJil2Q DDIaq5cEtuI+wIaNh0RpWsKIEna1wIiS+z3s31+8pkbxdBBQfPlvJEaXur40GvlhoSjx Hd/7y2iiyX7h0jFuhiU2+ECC7MEvcaIh/F3ZUbfpEcItSV0pE1LmABenobpInwRawBxY ZM6jRZA0izk8eabjEKDUwMnkd6PHsA4c23Cqx9xGCcAIA7qvXtWCI8nSGlceHbtSkbWD jDhHhpJbo0WOb0gz5cKIlHKDAJAvR1CY+hXQzEsg6FrtClL+bRHy3OJNARtJl89ISiIc SV0A== X-Forwarded-Encrypted: i=1; AJvYcCXZoilfbaYMAha31oLs9lRkyjLnJt3Ltj6kGUn1qQOAX0z1DR3EUlBt03o+JUbUc0KZgokvTQW9kScEHeY=@vger.kernel.org X-Gm-Message-State: AOJu0YzZIzbkqyb6x3JpDFwhgGIJYPrznyg7vAnTI2pm6SoBFmYqoeB9 1opCiMk1zNROAJjKNmD23uccBj9WGXZJExb/zfKpmD3qE8m7wTpS1fc= X-Gm-Gg: ATEYQzwgWRSSZMH6wuJHXX9zTM4+QKFQJUSHLt+Cm21BKzSxkOOavNzgGPyHD3lSZtO jBFV7QwNOk/3HZ2ikdTJbAG1NpwFIJz4cSntfUMdd1Qkpe+EMnEchKsPk1ppHxjrab0hJZUl3l9 L56M9H72c/gowOUoZQ0GrTIjZf6hs7448SVV04pQ2AduLj5Eiw6iEgDocolO7h8r6HoXBVgMc54 w2DtCD6+hzRmNw0va4XJmDxFir24h1lYhN5yauvblYPWMU3V2kw3gm7N4CpsgCDYXwoJkeUhl4y aoxXCR9Bl4h6kQI/+ZAxIm7jJi16P/TT/lbfw+WQeUrHkDYU+3XUwLHQV+7xWr3HBp8UvKneOVs wUZOcjnbH3gStvcDixmoRDRoIQ/J8W7UgRGFyoCMBpzpQ+loI4BWgqviSAPUSm3yrts1jJnK53V gRrhVIG/q1Ouncuhx1meTP+O+QPLuBzijc2H7bjed0dAhZNIqZS74nskwPoDRfgGObIGHFzQsjk owr6vr7V19oyMh9dg== X-Received: by 2002:a05:7022:e08:b0:128:d737:d7a6 with SMTP id a92af1059eb24-12a7266cdddmr651698c88.3.1773969917836; Thu, 19 Mar 2026 18:25:17 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12a734bbbc5sm747251c88.11.2026.03.19.18.25.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:17 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 12/13] net: warn ops-locked drivers still using ndo_set_rx_mode Date: Thu, 19 Mar 2026 18:25:00 -0700 Message-ID: <20260320012501.2033548-13-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now that all in-tree ops-locked drivers have been converted to ndo_set_rx_mode_async, add a warning in register_netdevice to catch any remaining or newly added drivers that use ndo_set_rx_mode with ops locking. This ensures future driver authors are guided toward the async path. Also route ops-locked devices through dev_rx_mode_work even if they lack rx_mode NDOs, to ensure netdev_ops_assert_locked() does not fire on the legacy path where only RTNL is held. Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- net/core/dev.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index fc5c9b14faa0..f38ab254708b 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9779,7 +9779,8 @@ void __dev_set_rx_mode(struct net_device *dev) if (!netif_up_and_present(dev)) return; =20 - if (ops->ndo_set_rx_mode_async || ops->ndo_change_rx_flags) { + if (ops->ndo_set_rx_mode_async || ops->ndo_change_rx_flags || + netdev_need_ops_lock(dev)) { queue_work(rx_mode_wq, &dev->rx_mode_work); return; } @@ -11471,6 +11472,11 @@ int register_netdevice(struct net_device *dev) goto err_uninit; } =20 + if (netdev_need_ops_lock(dev) && + dev->netdev_ops->ndo_set_rx_mode && + !dev->netdev_ops->ndo_set_rx_mode_async) + netdev_WARN(dev, "ops-locked drivers should use ndo_set_rx_mode_async\n"= ); + ret =3D netdev_do_alloc_pcpu_stats(dev); if (ret) goto err_uninit; --=20 2.53.0 From nobody Mon Apr 6 09:20:01 2026 Received: from mail-dy1-f172.google.com (mail-dy1-f172.google.com [74.125.82.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 274512C326F for ; Fri, 20 Mar 2026 01:25:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969922; cv=none; b=m8w8/DlFAKnIs83EGxUS43rpIfwDqGj2WrGMp2ZqqKhg4GB5urY1QvnXZDgKI0ezljnAsOWLvdqEpSWJmCDBb/NFZ8pykBcuqeZ47SGXIpYjrA0FGyLPwOkdBZMMtE++2RCLFcXWpRAZtvjz+i1alGt69308AGl2O0BDnZQadbE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773969922; c=relaxed/simple; bh=fFbx4L7c5RG8MsSh64xUKulTqmO1Wn4GpSHiz4YrwzM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oK78TpvDkfbpor54kJbjm2V3mf67GO4b6aLws6THKFVW8GtMjg6ydhJulwWo2U+eJ5BxBInPPKi1GkNUKYcgZvk3qRfp1u+KyTeRWfO0sPCtZ3UWqwJOuepE866O16tR2rvNVa6thXTsTHYsGepkijTTejeIeFrdYh39K9DKTJc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me; spf=pass smtp.mailfrom=gmail.com; arc=none smtp.client-ip=74.125.82.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=fomichev.me Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-dy1-f172.google.com with SMTP id 5a478bee46e88-2c0ea57fea7so1407680eec.0 for ; Thu, 19 Mar 2026 18:25:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773969919; x=1774574719; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LwI56IvSstpXQXaX8+DYC8cYl7ak5TMhpM2nnpgQBwA=; b=FG9ETRMdDSN7IUlANUrzmSugFjqOqtTHKjafDl2/M426rwOTGwVHl01B9NQwThF29d SWZR4wVyn+bQPWI5RDVd2yz7VI2rZovX9UN/Lssimbwfr1fFto1mROWRNNQ6CZSROe2Z lu0OXL4/gNCdTaXOiwP6rZbk18fVIAVUuMh5v9BPAD0pvd+d0vRUhaAb2cS946DPk5cZ eDQbTN+eCG2zNWryjyDMCNFPif0+9J4555jEI1+qE7ew9UBk6GNCpyCmF9+jM8tzxxR0 3uGENq00LybM1PT0IvBt+wDc1SYiBNQ9irNMBF9d0o8Nyk6/A4w2oX/N21iWsd6r9Xzo 3W3Q== X-Forwarded-Encrypted: i=1; AJvYcCVU4/jdlN/uAYp7jPVQ6bPoOuJuB4KYIphyPv2mVL9nlSQKvR0YBrU5eL4DUi4PZy6vu/BwjeM5rjRJ+I0=@vger.kernel.org X-Gm-Message-State: AOJu0YwynNVTCJY00wnWWul3YMqKmTqpa8Yj0btdlEx5DiB51ML2x2rH C7dqv3DCTVzg+NT19BcLTNr5PDlWMFFxeRjU4TT+tNzsqmFXaEzo3mM= X-Gm-Gg: ATEYQzzzoEGFAOfMbCfgrLNz8xfg3KlA5e/ewXN/tMfhdVC6RrDSSqBjAnLEpG91oJ8 raFhJd3BRj9eoTsS0EVZIYBTB10+V668cfsas5eYMFGmMNpn/yQ6xIj55+lhbGiILRDmcXKEbLQ RdihITAJrBtq0lTWi7kKdfUdCWjjUn2+Xqgd/zWGhugu3E7uXQANF4BrbW+DKnF53Ausku720Nz t+H1z6KnUkEyUvQ39V2Sii8ESJnUW3eRCDph+NEanroxAnXZ7zRVNfOkjvUvibLHXbshMwSBAgj fj917m4n9sUmyEnxliNwVW6qwO6XLS38pxI7shS6T3z1oqtINRp+UxITr+S81Bl3GusvzfIcrlb btC+3TYbK+plWGl6Ftp8Cx9Hh1pymixqOm58nFZwVHOn7piQtyZduvzCeHu3J/iCzAySO6FgngC XrbQAzSB33lOGaHDkwdHWjsAKRJHraJY95ECqFnYtkxGB4yYtpCFwycObyew6iwnICFPDzaAkp5 PAoAq7U4BJulQnHbw== X-Received: by 2002:a05:7301:4198:b0:2c0:c415:cfd0 with SMTP id 5a478bee46e88-2c109666ba0mr851744eec.15.1773969919058; Thu, 19 Mar 2026 18:25:19 -0700 (PDT) Received: from localhost (c-76-102-12-149.hsd1.ca.comcast.net. [76.102.12.149]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2c10b29d28csm1378065eec.19.2026.03.19.18.25.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 18:25:18 -0700 (PDT) From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, anthony.l.nguyen@intel.com, przemyslaw.kitszel@intel.com, saeedm@nvidia.com, tariqt@nvidia.com, mbloch@nvidia.com, alexanderduyck@fb.com, kernel-team@meta.com, johannes@sipsolutions.net, sd@queasysnail.net, jianbol@nvidia.com, dtatulea@nvidia.com, sdf@fomichev.me, mohsin.bashr@gmail.com, jacob.e.keller@intel.com, willemb@google.com, skhawaja@google.com, bestswngs@gmail.com, aleksandr.loktionov@intel.com, kees@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, intel-wired-lan@lists.osuosl.org, linux-rdma@vger.kernel.org, linux-wireless@vger.kernel.org, linux-kselftest@vger.kernel.org, leon@kernel.org Subject: [PATCH net-next v3 13/13] selftests: net: add team_bridge_macvlan rx_mode test Date: Thu, 19 Mar 2026 18:25:01 -0700 Message-ID: <20260320012501.2033548-14-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260320012501.2033548-1-sdf@fomichev.me> References: <20260320012501.2033548-1-sdf@fomichev.me> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a test that exercises the ndo_change_rx_flags path through a macvlan -> bridge -> team -> dummy stack. This triggers dev_uc_add under addr_list_lock which flips promiscuity on the lower device. With the new work queue approach, this must not deadlock. Link: https://lore.kernel.org/netdev/20260214033859.43857-1-jiayuan.chen@li= nux.dev/ Signed-off-by: Stanislav Fomichev --- tools/testing/selftests/net/config | 1 + tools/testing/selftests/net/rtnetlink.sh | 44 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/n= et/config index 2a390cae41bf..94d722770420 100644 --- a/tools/testing/selftests/net/config +++ b/tools/testing/selftests/net/config @@ -101,6 +101,7 @@ CONFIG_NET_SCH_HTB=3Dm CONFIG_NET_SCH_INGRESS=3Dm CONFIG_NET_SCH_NETEM=3Dy CONFIG_NET_SCH_PRIO=3Dm +CONFIG_NET_TEAM=3Dy CONFIG_NET_VRF=3Dy CONFIG_NF_CONNTRACK=3Dm CONFIG_NF_CONNTRACK_OVS=3Dy diff --git a/tools/testing/selftests/net/rtnetlink.sh b/tools/testing/selft= ests/net/rtnetlink.sh index 5a5ff88321d5..c499953d4885 100755 --- a/tools/testing/selftests/net/rtnetlink.sh +++ b/tools/testing/selftests/net/rtnetlink.sh @@ -23,6 +23,7 @@ ALL_TESTS=3D" kci_test_encap kci_test_macsec kci_test_macsec_vlan + kci_test_team_bridge_macvlan kci_test_ipsec kci_test_ipsec_offload kci_test_fdb_get @@ -636,6 +637,49 @@ kci_test_macsec_vlan() end_test "PASS: macsec_vlan" } =20 +# Test ndo_change_rx_flags call from dev_uc_add under addr_list_lock spinl= ock. +# When we are flipping the promisc, make sure it runs on the work queue. +# +# https://lore.kernel.org/netdev/20260214033859.43857-1-jiayuan.chen@linux= .dev/ +# With (more conventional) macvlan instead of macsec. +# macvlan -> bridge -> team -> dummy +kci_test_team_bridge_macvlan() +{ + local vlan=3D"test_macv1" + local bridge=3D"test_br1" + local team=3D"test_team1" + local dummy=3D"test_dummy1" + local ret=3D0 + + run_cmd ip link add $team type team + if [ $ret -ne 0 ]; then + end_test "SKIP: team_bridge_macvlan: can't add team interface" + return $ksft_skip + fi + + run_cmd ip link add $dummy type dummy + run_cmd ip link set $dummy master $team + run_cmd ip link set $team up + run_cmd ip link add $bridge type bridge vlan_filtering 1 + run_cmd ip link set $bridge up + run_cmd ip link set $team master $bridge + run_cmd ip link add link $bridge name $vlan \ + address 00:aa:bb:cc:dd:ee type macvlan mode bridge + run_cmd ip link set $vlan up + + run_cmd ip link del $vlan + run_cmd ip link del $bridge + run_cmd ip link del $team + run_cmd ip link del $dummy + + if [ $ret -ne 0 ]; then + end_test "FAIL: team_bridge_macvlan" + return 1 + fi + + end_test "PASS: team_bridge_macvlan" +} + #------------------------------------------------------------------- # Example commands # ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \ --=20 2.53.0