From nobody Mon Apr 6 17:27:45 2026 Received: from mail-dl1-f49.google.com (mail-dl1-f49.google.com [74.125.82.49]) (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 2749E3D6684 for ; Wed, 18 Mar 2026 15:03:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846193; cv=none; b=JMIaEpqqBsG1R58qFoAZpyUbAzZGMIze5MxjOB/W92KJQikIXts5cXmWGwRE1X3GLqBs4prp9+T2VTOlhSGVUYAQJpf8gOwJCKSQWyyYGe1+hmwsVVb7UmjsI9qOyx7YFX8naumML2Je6eKzVEInBq4ix0mv0fIdJlbHEMP2ol0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846193; c=relaxed/simple; bh=nbEjnELnb2hqy0EAoZwT8qSqrQrn0+k7RP2RquBA19Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hTeuQJh1/qjT1I8hbZ3ij5Dj01WnRmsKCV35wWQUlHPc5WqwK7A2cj45I2bOn09naDix84kGOv2HztV2Aspc4hkbCMs3IVWqR9cT49U4TUkM97dl80JwsP/xcCcpHnX4Nueq8MkXMhRb72fL0qFlQHmo2WIssr50lWWdC+r1wpQ= 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.49 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-f49.google.com with SMTP id a92af1059eb24-1274204434bso876472c88.1 for ; Wed, 18 Mar 2026 08:03:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846189; x=1774450989; 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=SOVH6BCcdrqqcaUlATmMNPFAiTRSvBo/9/72YEyvAT4=; b=bEcxXfnp4JIDJqCU6bmjzvaLJ2yRYdB9cw8KJ6jg3tx7w+bvvwCXkAT9WjbvV3j1cv Tch9T7zUv13Hq0fN2XqyJHUnIKyS3YlNCpsfaTqY8DhVuhgcphBb3lyIdBOTqepFZ3/D t6eolqe/wNjPlpJ+CKbK8BUZYkv6NoSR/qk5dkh4PjWsQm4pOHcoFJ2HlXLlXfIrUsqz dCj3pJk9jKxjCVQHg5nsccgbDyP5ahyYvkE6VjPYkXJCFGAHYVInwWUHPX7ADUHhOIg9 YvezM20hjZj9cKdDbuR1Bb8JdpwBEitLggtAdP2EgCsx0hKOq/M1W1y93UVqepYkJ93J WFfw== X-Forwarded-Encrypted: i=1; AJvYcCVi+m7UR0GCeB2jPcDNXUrwKwEo79vYtqt0CsDnwuZU2fUPpxfJNKdgZ4gWfzl1FFRyA4495fx6Zhq9cvo=@vger.kernel.org X-Gm-Message-State: AOJu0YwRPAzNpGPBHXA4rZQz+wPeIym5BeVJ10Ydh4QkSQSkavRmbbLK eezHJKevMmdEKY3f5cY6Sj2taJOV9gqTVJ40IrU/0r6EDmYNzR6oyUA= X-Gm-Gg: ATEYQzwvSZIBkGeH68YzfCrTXSTfAIGXp1Qe968yKF700fEKHVgNJRoCHKXteHJG1XE 5D1KqAwAdXikqr8yTcfMJq4DzZhBGIyJrlZ2aDHal0V4BKlxHnjm2soqpoC4AebUVYmAjamsIsT nahWKeW/BsV+hEFOaB7D/0zHi8FDGEvXqH89Iq9WRRhJDfRs02F9JpabI/CBl815e92urzODBgn roFLBqzzC6dhxbtT3GoEHeCToPPQc3AZ+6aebAWZ15732mGElGE6s9J6mFy+QsXJhtSFYuD1PNE wYqb2fC5x2xRMl9RND/KxZm50XooCZPZ/bJyZdH8sRLOFEXk1jfRz/a5WPhXkvfCq0mHRsPEcKu tuj9ZfBcgBfCKt9DbAfEhRRxxJKC0DTx11R63pgWTHqlNzOG8MRqdFh6U+ruGI6vA6p9SW5uM33 EIQ8MAzuAz/yf11zHVc2BSQInkVmK7Qv6BtbHIehgpZUZA0rFquhabOSx6P3RV/fMsXStyb/UeU Wz9auETWs8r7ESiKc6TmWcHlrM6 X-Received: by 2002:a05:7022:ba0:b0:128:cf85:a852 with SMTP id a92af1059eb24-12917299908mr3169813c88.22.1773846188277; Wed, 18 Mar 2026 08:03: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 a92af1059eb24-129a723f9d7sm3589987c88.2.2026.03.18.08.03.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03: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, 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 v2 01/13] net: add address list snapshot and reconciliation infrastructure Date: Wed, 18 Mar 2026 08:02:53 -0700 Message-ID: <20260318150305.123900-2-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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. Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- 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 17:27:45 2026 Received: from mail-dl1-f47.google.com (mail-dl1-f47.google.com [74.125.82.47]) (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 3EEF73D647C for ; Wed, 18 Mar 2026 15:03:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846193; cv=none; b=C9np5jh3dU/+nz6HLKqUQzDtN21ccUCD9TysI4un4dL1mZEZLH4AmKmAry0XxQOlrZcYjZ5BJlXecJf+wtz1MvDLqE7ueohpCh6g0EUkppyHNYYWN0v+0CesyIYXLdCjMGV9VPeNR1i3fbYPY664ihz3brrL1w7ZbdSUFlaF6Zo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846193; c=relaxed/simple; bh=h0p10z8eZpClUXYtUVukCJgrHGYSRkh1nSA6pgFkCig=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZxIfpjsrZokGbnZC+cgUntjSohZzc1Ah5GbflyroSAJ65sbFAXqYkUPzcG4zA1NZvV14+V3iIi8PbwcnJrD1y0lf1cMvklyzYYMZbItCV1h5zkP7qPT+A8oUjFURQ9Uh4Y+gLeqy3otlcPa8Hx/Ia+dk4ffSMmvO/lxl9hhyKVE= 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.47 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-f47.google.com with SMTP id a92af1059eb24-128d2e3082eso150473c88.0 for ; Wed, 18 Mar 2026 08:03:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846190; x=1774450990; 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=bCbPYXsJyjrslfVQf+TqWui1no/uksX6ojvJaHIhI9s=; b=BU2Ju+ayTtI++D+nUbN3c/gkld/npR9ohClh8TgDseD93thNVhO3PEzDq1jQyDCGmm Ji96YugnOs5FlYK4w6O7o7FWvaFCyKyuKRvtp6QwgFo7Ffi2k9RMqWKAN7/PqTrs2FxD tYUrX7QyopnSs7r2+OT5BQHGe0IV1yNybrjPAIIut7efBj0gSIKvxXqYJ+pAuXjnuxlQ kB0dTAc+1EycW9+8q5JCOTkAkYsaMG3md7nzbRKPQ1/xcKcpkT945V68nDDXUfOS3l+i XQzKBK1jpbXUHyC7o3wtuJ7pBs7FoYWOK1SFd3oVkOfEG+f0qxeaqjTdFKIJmbvXiXak iOjg== X-Forwarded-Encrypted: i=1; AJvYcCW/x8RLkyNUl230RhKr0OT77BoO1GgqfSArYsUKK8r0qoX1qWf4VCAIHUEABWoCjZm5SIANehzgmkU3QKY=@vger.kernel.org X-Gm-Message-State: AOJu0YzK4k9nAjm/gIuG/GkF579+kCRo0e/+miSAZFtH+ymf997uf9Yz s5ue6tz5cACKd6VmGO0erv7/3jkHqF+mm62ucgN44RdfGRqOdsv2d7w= X-Gm-Gg: ATEYQzzqf2VK5NpW2lJJhs0DvP4UuoUsHjogCqqTbRBYVNBcFPUassk0z0y4qoJK3xm C6LveIxxr0wdx82MkUac68U3KEriXnqD+K/5uFiE2FI+jwGuKSPo4N3VzuQmMvyo8n18Cxt2YDm 9+bXlRvKTeEA+9BIaOR7xYX8tqQEM56FyefahN9kqn+zi08KC70GdQG/KXbVRhc9WsH8k612FCU du+D1e82UGe5vDAqbqd+oSNQ9ntJU274vFUwsNGZbSpE0JUkDUSbMVPXvVN0LnNO739Ka7LzHLF ZOxjx+w7cpZoMWMZkal2YfM7veowPNO9gwq9t62Q++6U+rEg9KmgVkBu90ijVVUvVr3+7K182OO BwZFtIVMyD562o1mY8rulFazuUQZqZ7iaa5ehSfAJC+q8c6V4a/vgszry3JLthe4q85sipodU9o N4JXvHIJw/aQeLpqmT54pTHNY3Mh5e5zb7OzlHY6HogAp/5yHY23aD1i6ZBEzXscsq83rK8Kphl iPAJX4U7won+5CWOA== X-Received: by 2002:a05:7022:6a5:b0:122:153:d161 with SMTP id a92af1059eb24-1299ba3e35fmr1920293c88.17.1773846189957; Wed, 18 Mar 2026 08:03: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 a92af1059eb24-129b413930esm3529158c88.13.2026.03.18.08.03.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:09 -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, 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 v2 02/13] wifi: cfg80211: use __rtnl_unlock in nl80211_pre_doit Date: Wed, 18 Mar 2026 08:02:54 -0700 Message-ID: <20260318150305.123900-3-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 Reviewed-by: Aleksandr Loktionov --- net/wireless/nl80211.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 2225f5d0b124..ce5f25d4c87e 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -18192,7 +18192,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 17:27:45 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 362413DFC89 for ; Wed, 18 Mar 2026 15:03:13 +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=1773846198; cv=none; b=T2mUmkEBF0nXmcRcmXcx7dPYjUI2jcgTLmm4apfxvrdENllqnvmNaKc7X1LmHOlU1PSvJvJCEW5MHZkWQWrt1xqd9iInVZAurCoCRw/FPGqarnjwrNDcwlRprssyqj9uNZu7cvwCCrGEOURFuZHUWJRfboa2fAxct1dLjbOfXbs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846198; c=relaxed/simple; bh=WStRe1/0Wz+hf4gR4e3RW1oufmmkSS+wZ/H5+uXCgV4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MPiLdbu4NpmEy1fQq5jwpEpVuQqtnGszc6Wd6J9ABbvmkEfYlnN7xU0XhoNPDD9PlVrxlTh7hbsstMdOdzPfpALN09FjibO55jcBG4PI3/4ywzwvD8fRWR7Y9DfwEG53Ne9bUtP6I0rBgYix8DssXDBjTICH+VqURrAMo95DR0s= 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-1279eced0b9so9853416c88.0 for ; Wed, 18 Mar 2026 08:03:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846192; x=1774450992; 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=5iTqzBOwdX4uC4eD+hYEJXSIIw+hEOfHwxGCB1JltZQ=; b=Yn2TNKrOMG499hhU0+r9HetcXjbgwbPF2sCt43dPBsTMOEpk9nL8U1mPD7hQex7uRA m7nNNDh5gqrZxpYWLULtnrjB0sroGk+1xcrG0qsIYUCD2YV/evlXJnhdD7XN4k37iTwx 6SKsaMefUgMOXL4Bo4Sw6pL0EqP/2nymSKoqUIjikOCMQ3hHM9uN9Au2Vsyn2JRy38S1 TEK3eu68wtNevQrKIOMbPgBKZzZMoOktmkfJHQfE54XkeQfOeNMKVaQeOGieUVph5Dpz Ik1bz8iJWU4Bub4Vy5biVrCaZ/duSgGG5r6Aq84CzoXjL2SfuyumtAGF9J1oiJvv4SyA bGjQ== X-Forwarded-Encrypted: i=1; AJvYcCX/zWmim0/TsP8PsNo+0qmyzHsFLAtvelk2nqltfqWjpop8Kj9u2Dc7kyUKvBdNLZaIpOd0nNhCbayn2ig=@vger.kernel.org X-Gm-Message-State: AOJu0YziWxnxWdOsWpc/B5/HkxRfqu3+07rpKZNwbwGzJTMhFSi6TBcW lb8/OiRBDueBcHSJF2nAi+ErI9xya3Eo+FBbBcw7hjunK9YoGI1yZJk= X-Gm-Gg: ATEYQzyy+uDlQLUZjIEF9SODN1/oCjMguOaKXRhh+Qy6TCnXA4PfegnaZ3PGCZSasI8 Bt8BpeHy71XlZ0vMuvAv7VEL+LPqghqSkTCGcHrthshYvmRyJG2n/heH69dSZzxmYeCEJ+o9u0Z Q0wUWh8YI2rr4ghnFPRTKQpXLvFJEGuy9+DTus0wagBcKvrT1kJ8JrkfOwCbSfJ9AaQt7ba+bGa A1GCME32cf4+znhzGelUtU/WpJvKR+Hm13JEHc02W3xwrtK9YCQ8kJOovHfUINWWSy9Dkwov0UD 3sk9Oan1lBUqZUXd4CLlB6FRqcR9gGpLxQxPmhekIqCHnqEWIyd+d+Nngz5ujSP21biroFFSoyv oOt4x2n5aqqkeXlIRFPa7NmTzQ0clWBhY4xS67ha/f19u0HqzOyIwqe4EM00l8NtWURnZxXNjJr 29TD2fa4ifO8v+i9B/qe4xLrHxQ5NUhA9xJvtaXKRKuFUxLMWNLEfggQn2Zqn9Ri8NbpPXQ/UD3 76HgsxafdfKPKEg9w== X-Received: by 2002:a05:7022:30b:b0:123:345b:ba05 with SMTP id a92af1059eb24-129a7147911mr1815897c88.22.1773846191975; Wed, 18 Mar 2026 08:03: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 a92af1059eb24-129a723f9d7sm3590178c88.2.2026.03.18.08.03.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03: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, 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 v2 03/13] net: introduce ndo_set_rx_mode_async and dev_rx_mode_work Date: Wed, 18 Mar 2026 08:02:55 -0700 Message-ID: <20260318150305.123900-4-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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. Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- Documentation/networking/netdevices.rst | 8 +++ include/linux/netdevice.h | 20 ++++++ net/core/dev.c | 94 +++++++++++++++++++++++-- 3 files changed, 115 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..7ede1f56bd70 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..77fdbe836754 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,83 @@ 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) { + __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 +11771,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 +12172,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 +12277,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 +13372,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 17:27:45 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (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 2C53C3E123D for ; Wed, 18 Mar 2026 15:03:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846199; cv=none; b=hteCBTkMrSKFxU8M20I8xgtqEDSPBQVAp5gtys9R2Ym2d3EpOiXXK+coElVjO7gBBxAWiDnjd+efACaS2RNNjdgk6SNgE/Pfgr/gKSNLyonotoMuCEKHWUFSJxSAOAsi5OjQlH0aCWQIiY5kWGUG2QHM3Lnwohc82zuVP7zUCGk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846199; c=relaxed/simple; bh=4NH5F9UrZZRv67H096Ecg+wmusilA5EZ4o5TxZuzEHw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a0wWyH9LVNxu5VTECU89AQ1pOjDRQZqtCS12ziIJ6UNqIVh7apSq2sCzSZO+Nctp7QXO5YM5jbEX38Cy9ev3lCGFjbwogV/0+SNM2MjxdchEhNTATr8IVhNnHFW4n9mohWZJ1QXr5xAt+Gfu3q5IzUhltNcwF0kks/K7n7veUyc= 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.175 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-f175.google.com with SMTP id 5a478bee46e88-2c0bb213b16so12101eec.0 for ; Wed, 18 Mar 2026 08:03:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846194; x=1774450994; 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=N5GGovMWPDFF8AAhYqWq6WCuZYPSvbfMRDbyACSGUuM=; b=f9Vk/G1k9iZ4KuXqai4cAdZH/Q8N9tIOWJKeO6nEK0PSau5clajLKA2/0GdTGOsdYF g8ePtKm/ETW1qXFBfdaaqoqZXVT7oU6hUCc3SvwUBJ71pNf5dvLBvVItYiMKUvwHnDf9 gkC21f5KdsqsEm+Eq6aj8VEWkmaYYcbbjpAuEFaFYNykXP9YEVOHYR9OH+VshnoIQ+mn yJHNrvikUgHSxVRwD5/1pBRKZd+/okL8Ia+SZWU2Jjyxuxv4h4nKD3aO91WzxCY/LbTk wUsLK9FBuuU5c3HgnrEzUUa/MR1cEFQ64KY0GW/XxcH11E63sU3kIZnYYyKzUeCeW9u3 Q54A== X-Forwarded-Encrypted: i=1; AJvYcCWgIrobYV926RsVhRQEBhhiELOg91HN+FjaFQ2nGxpbjZK1+cS+ewFvyoujIIDrN2gdhj6Wdd8SbFWiax0=@vger.kernel.org X-Gm-Message-State: AOJu0YxwSqwwbTW9TVDWqZRpZHUAD//AHoQLf4VN8klRfjGNBdDF0K9+ Vrr+OX5c/UCjzFeTLVyqZCabDanaePBuUBWwNjwh3M8C3qtTX3WPzMU= X-Gm-Gg: ATEYQzz1lUuka6wpH+Xh5U/4RoxVl3wUFoG2T9m52WAv8Abd+ZnTdMrqRSqhPLhqoBG MQrOPP8JbcV1vdMUwPXup4ZgV/21RllThrz4NR6zCVSyg+tzqrIiG5Q0++djAa1Er5aAR6puUQx JgsMJYS+t6bcjBCSRkFQRPX56dAACpHUpjuoZsjeN1NZIGhOSlIC1lUqu+e3LkvfMIdzlGNnXup yuypBxdSjUsQ9T38/4FZrKfbjAhilXUJPPlmezUmOI9BhKb33IsMNK7T/JEW6PCZEPJbwyAQFWA crq6StLeaBJVa9qhFOIW0RUCW3f7EEsjXJ7xo1UMM+sM66bCMxT10ykcbGh2rwdxqgNvMIFPwCK ZNdaYDqz4iM5x1JJYNK4IWobBNJsG1zUT1eWmFVVLXao8xkIVjm5tmr0OHV15hB4tk2z9ECGCcQ IEd3BXXLIYXh1MbaE+7ghOfcCba+QUNoZ8x9ocY0CFyNWx8D3hWZzvIAMWuqM9FQY2CszcJ3P5A c6Xp4RAPH6HtmN1NkI7OnzYMJ5f X-Received: by 2002:a05:7301:1691:b0:2bd:d3f3:b0be with SMTP id 5a478bee46e88-2c0e503eb7bmr2177414eec.20.1773846193273; Wed, 18 Mar 2026 08:03:13 -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-2c0e5582dd5sm4001338eec.15.2026.03.18.08.03.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03: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, 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 v2 04/13] net: move promiscuity handling into dev_rx_mode_work Date: Wed, 18 Mar 2026 08:02:56 -0700 Message-ID: <20260318150305.123900-5-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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. Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- 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 77fdbe836754..d50d6dc6ac1f 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,15 +9720,28 @@ 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) { __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); @@ -9721,6 +9750,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: @@ -9739,28 +9772,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); @@ -9810,7 +9837,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 17:27:45 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 9140B3DF00E for ; Wed, 18 Mar 2026 15:03:16 +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=1773846200; cv=none; b=pS2BWPAawzHj1h9ol5/KVXSBYGnfuygDEp/2FscF1Aj+5/yk6FlXbSSUZgkQWRlVCk51BRyYRi+Jg50wWquEb+RPdUD80qe+1tK9Kf8yCWQCez0cFh67xZTXLi3vgaFLelHiByOi80tuIXw2U4gYlaeuZY4JgkrbOtUuQghZgw8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846200; c=relaxed/simple; bh=M5gnEc11KDkqZuchks/Py1C6vXEkiKaFsRsBBNVZ/Xo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YD8+KFke074/LWHr7sLBBnTNTpHO/7d+wisY8YcnMA5NCSaEigId7rnxZnGmiyXyogaNlgDN+X6Ex+8UywTTEscC2uvjplZxz/j/8uJBxzOd55esoVjI+8If0HRIhEMqUQlv9sFl35Gb/3ShEWMPaBkqniIKCiW7YfJ6AFwaGvI= 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-1271195d2a7so56250c88.0 for ; Wed, 18 Mar 2026 08:03:16 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846195; x=1774450995; 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=T/N6mOi7xkb0zTWJlZWJy0zhM/WcNTYapi3I3y4p9TY=; b=ou28HVba59SNnj9HQiQyb0LpenK3xg/qyoL0EqPLDBWuI03BhgwbhKj8UlzzBNuws2 7keyw9E693J2biZtOJNmsNLvkZZirgXu5hAJbJLLEDw6BqbmS7Zolo8lDli7AwHr8R/T UrH7RoLo/IdB4N/6dMlOBJNlxHD3/Iw6pohbx/ZnLNDagEEq+9j9mBGfsx9j1QMl8Cln +Mmy8clSaJLbywxEz5ui0+tPdg6q+2jl3iV1hSrGdSBoR6dLh2cbIuRlUNwDJ8NW8rLz 43b5/WAT9u47P7eNBulHWNPeE0mRrqObDxkhj2/YOdFmoA94QKs4hSs31ZESl+DASFzJ FbpQ== X-Forwarded-Encrypted: i=1; AJvYcCXAXtotiyUOrhLMC4H+cJbjWsXfX9CoiwP4JgW7P9va3FnRv0niBhyXfx3Mq8kOrtd9lIhQTg3xxr8ekPo=@vger.kernel.org X-Gm-Message-State: AOJu0Yyxc2iyAT4iaGzltocJ77yajBZ/g1s7evP9JPvqetVEcwqU+pxe gen2f1pA3KpRKNXEbJh3f8hSTviR7nsfpWhGk4pRCiIjK40pAizxXLE= X-Gm-Gg: ATEYQzzsyIhEz5oi+W7aANtp6RmAC92XYZz3jnjAuZqPFc16OG93/DSFf6r4Guo1wq1 k4o6elRXBjhBPMaTvS6uIdWl7FQVcsY+UDcmJK80FCuV0Zr6GxzGSAZx8eTmYg9fEcrxdizyv5r mQitSM+3UBQ7NGebE7zLMIptGFs0st1UrcxOj12Uh3SFVpuBBsq93QT10TThGYfcJbNlxehG9B4 +OKYRgJVJAeoGeHY3gAoJMR0y37pxb2eGDEHqPVE9POyFHbHI/gxkrZTMGIrmhpc4DIjRZX7/5S FODtp0hKk47dJDpxPxdhMTGVKdGfetofENhVrnq1rHf9fEVrTjFOTkBARpZjXKlw3aw0LugAhKE Mqq9kFs9NivHnd08UpQa5eWfOliC2pmQf/PSsVXtFMseYs5fnK1VJujqvb7mPW3kUYZOkfbwpCh 72PGPUcDjn6H6w7Dw54ZteU3xfmXP1MXdUbEY251sCd03BAk4aB9jaBgm4JrnOIYMTjpq3lnBpg 5kvRjF83T/gg8opPw== X-Received: by 2002:a05:7022:f102:b0:128:d455:8501 with SMTP id a92af1059eb24-129a71abbfbmr2013611c88.37.1773846194778; Wed, 18 Mar 2026 08:03: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-129b41289e7sm3349629c88.10.2026.03.18.08.03.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:14 -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, 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 v2 05/13] fbnic: convert to ndo_set_rx_mode_async Date: Wed, 18 Mar 2026 08:02:57 -0700 Message-ID: <20260318150305.123900-6-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- .../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 17:27:45 2026 Received: from mail-dy1-f179.google.com (mail-dy1-f179.google.com [74.125.82.179]) (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 D1F583E4C80 for ; Wed, 18 Mar 2026 15:03:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846202; cv=none; b=TbAViFkx+cUMxWxkOPYoML2LLIymPXlvcNvsjcy3MijLZutGsA88/wJP/itJLehtWCaFtmXItYYFdVrhq21XJ7P4cWTzeSazmbQ7FuQwQ7F96BO6vtj8OQrf2huGweJB4NxbMvLXyHxMs22J9/N9AAn6AlZTE3WxjxADWYFGL6o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846202; c=relaxed/simple; bh=Ij7TGfORAQUP2IphsTU6e3s0rP33QZOjwA4GqRA7oq8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o2XOZ0oBeXLn3I9e6M5WIgLDrDXJt39wtykUVgJd6vZGcIabZQ5DhhcqigjyedfuIm9ek2T/+exrFPhuCgWnrOCNt/96gSxH7cKuSITT/Z7PMhbZmvuQL9xvMMN9f1zR7ILmyF+MhSeVw4dyHUZJ9kGIrJ3raaSRuQdO5KVtZEQ= 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.179 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-f179.google.com with SMTP id 5a478bee46e88-2b6b0500e06so8345912eec.1 for ; Wed, 18 Mar 2026 08:03:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846199; x=1774450999; 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=Ca+gBPWdaS3D9IVR2rmhybZb8dy4jn4+7E3W6do17GA=; b=H8o24Mj+JmDWdbVcIUNFNHgpLl9S2OoGApt5W2Bi9EtcOq9G3nIulHpSMckeMwk3D3 R4t12wDzLCUyfwFIbRt6Y258P3g0RcEId9jb/j588zO9O5UXKvbbN0fC4UsDIrEFZrZh uD+zIKNDxbUvtcz5tJuqgAT2t8D6rBe+Lvg21Kn7YYGiE//F1XmE3SrF6UUGYLm2Err+ Xv9GW7cOD6iq/MTa1u+GXJjol/crRF0kZimp5NmUD48OKSHdTou8DiPU3GMOZ0ibMdzg hdy8u0TaKNxnfVOGS5DDKlbvBtNAdty/GhQGzmuz2isQ7wGR6X09otGWTQ8JsaEsTorm e2/w== X-Forwarded-Encrypted: i=1; AJvYcCW9w3pI2hG2S5RpV6vxskNpyt46qmIYhPY5mH5LkKuA5G6ORSVgHvxwUTYaSYEoI2rU8NANksEHlgXbj+o=@vger.kernel.org X-Gm-Message-State: AOJu0YwtBrGoPvg+osX5M3bnPMBrfRc+m+anhAQ2ZMgvFj+IOMJdA8Fp pus2TloAs8YIQTOzyedKpIV/bfESVqy1/Qd0/7zKn5wCuQvwuvE+Eeo= X-Gm-Gg: ATEYQzxSKjT78zSs4Zxvw8IsWXll31Mcw+oECLfVVfGTNzc7IoX+bxwbBtmAzzYmrqv dgU4H8BpgHcIUQeG9jV58ZVGcn3E62raSn3+SE4XrRNzWXJwITs7OBla57gD90Yz65VGNAj2tGf wjKPPWWssMLoe3KWALhH8PCmB4k8I0Ag6FtU6TdKAtDLsciRflC4JhqXG1o+LpMak3BGBGAiqja HM72t0mM0pfuss6kAmytNKA59+k5C+U3TJKIu3kXUXav1Exh6jmu9fHlF0YDuKmfWeQi9IYiZeD Q+LejhBZ8rxJ0/0CdmgmBYyvzWthTB9itNsM8GgUk9DcY2GEmNMtXGSUSj6Trd2J3r/FyfxrFEP yLWbNHeXv3l8zjFVvVRuQmBonBa7/PHJEyq7CwZI1Qqu35Df8rFgVGRjRLDn7AgbMAQygYhQzSN VUO2MDfLGAKKQvU6qi2N8UxYkuzymNDDLnfLO46vACU7yExjYHfV+5G2ER2wp0m0vKb1P78tF+2 FEM9rr3Cdr8D/5Ipw== X-Received: by 2002:a05:7301:658a:b0:2ba:6978:2b4 with SMTP id 5a478bee46e88-2c0e519749fmr1615494eec.20.1773846195984; Wed, 18 Mar 2026 08:03: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-2c0e55ee672sm5054384eec.28.2026.03.18.08.03.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03: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, 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 v2 06/13] mlx5: convert to ndo_set_rx_mode_async Date: Wed, 18 Mar 2026 08:02:58 -0700 Message-ID: <20260318150305.123900-7-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- .../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 9352e2183312..b6c6779f131c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_fs.c @@ -610,20 +610,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, @@ -725,7 +731,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; @@ -737,7 +745,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); } @@ -821,7 +829,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 @@ -851,7 +861,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 17:27:45 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 B1D643E5583 for ; Wed, 18 Mar 2026 15:03:21 +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=1773846204; cv=none; b=iNMp9mUJoB+/VPf7Qv7zVNmmI+ZVe4ec7gKGwyzV8xH4T12pZRI4ykWREWQ6ViGfaIpM1Ku/4Um8c3vj37Z04NRGfe3suz2InAJpu1sF/kzwQs2pi3MsBzl2cbfh1pImVA35BkJM+GLax/7RtDq29/bmLhYanE1FcHaq5p/C3d0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846204; c=relaxed/simple; bh=D5MJp9QfPCqdxbijMd08bf6IesS8CtRPNVD77gyALRk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bKiRazZ3BdhM8p3WmO3hIntiH7RPGGbN5O/hs2iV6Sn74uSrtgRd1bLjL+lacAYnVc+0D1rBUmsIOFKCnC57YIHUdDo30+2q6huK/DVD/Mgj2RJLjuEpWujRX1KPRh5wRPRLrMPmf4n6fgjDzjozV0FzXhjB8VZ1yh9lGMlwe4w= 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-2beab594d8eso18370eec.0 for ; Wed, 18 Mar 2026 08:03:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846201; x=1774451001; 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=4k+owXpgYHddeJNnypZucTVOUuVNXL7iUBaXVHuuV44=; b=JhRBybbeehydfRopatG30b3ycJw4nc5e8ouTyvkuENxsuzLVLwzvYxcjucsmFU/25d KsKQRDwHSz9/KUxgFJQyh8OM0cLrNn68YtkU24TwHBJAwWe9IASPPyKE8rSOB/h2hoDL EcNxHv7/IafJNZqSr+H7Ja7BPalesbZ4oXM01PQc6wreDPei1cyiD9bpjKoI1t14Pr9X oVDfuC+dRzECphvGhdhI7TZWfZzHPH/lEppHzhjfj1x4y/4kxe/+8kORwA8N45hAFPG8 nAbH+qYmVPPcTSSdbeDUN4/XMb3gGjZU0d7s4uoS2V56KRdVVFzKtsKRpQw3vsjJ5epf jd1Q== X-Forwarded-Encrypted: i=1; AJvYcCU+JGZTJ0AFd71rrJKHgnhgQbYJk1kC/tzRl5wsNteLpVk400CeJ//eZe0bJ/kc1+uEzRaDNjUlB1AsaDs=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5nHh1GCCuQVmdCRPJnAS7R508iL2DOxqpt5Qd7C8q9YSQ0gPU E5/hoH4UdWxdwFy6MUq4NWSFhDRUpinR5NzD29TehvU+peqydm1jNiY= X-Gm-Gg: ATEYQzzT4tQPij6oHq9sfZkTBk5TNqWoZ/qJA9o5R5cFggr9knLrqoyUw3cGEDOt05D bOmY8Jlo1vFLV5NvMugvhEtWOJgsBPzfJV3glsSrAuRRgQQRK+pz2YlocCqcHo6coZAkFG77M5D lATFFxppCtHKKaK2g6Lh6Scmozjfojl73kxRP/STLG5NY+CogNWkTIA5IEhNFsFIotDot2r2bL1 gKcZkP+NWmoSj0ics5+2TS14mvxO2HiA7Ix+ek5fKy8OSBJ2kN+EJsRGq4jH1SfDOQFBxnrf3lh Ljr3pPKyUaPlEz8fwpvTu2+X4AmxurdWlY+UdisM1aEyM+84He5ITWLp0CQbR1Gd9TMS+rbZOtB XyegdYN6j9tJ3fitmfqaF7RZXBHzYFHPvN3dYS7biPZ6nDIcDEtYtHA3FINxMwVXas0EnDniEVl qx0GCw2+hRzqh+xZwEFo9XOusp2XaSGTGOZAvZpETGynSqRqaLdVuhndYFFHDlvYaXQTs+rg4bc MvhzHQE9oYWVrLOZz9xf1LnRpRU X-Received: by 2002:a05:7301:1004:b0:2c0:e31b:1814 with SMTP id 5a478bee46e88-2c0e4f77bbemr1902433eec.10.1773846200088; Wed, 18 Mar 2026 08:03:20 -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-2c0e55834a0sm4171479eec.14.2026.03.18.08.03.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:19 -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, 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 v2 07/13] bnxt: convert to ndo_set_rx_mode_async Date: Wed, 18 Mar 2026 08:02:59 -0700 Message-ID: <20260318150305.123900-8-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 Signed-off-by: Stanislav Fomichev Reviewed-by: Aleksandr Loktionov --- 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 17:27:45 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 D38013E5ECA for ; Wed, 18 Mar 2026 15:03:22 +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=1773846205; cv=none; b=SdaTvtQkBBLlCcCUpskHof5eU4mh9CFliIyL7TiWm41ScR7JDSUA4SMgWJtBUaYjRKzcXS7z6QnOmAnNy7639HjC8N9fqrA6/CR/cY5rl0Ot1QWhn9il/hSMbB03dOdhp6cNtTlckubV9HtOvSUcodDdTHDE5cG88Z+/Gm8QNzw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846205; c=relaxed/simple; bh=kmwCimBJS+SWU8B61KoU5L9nhpuZjJHve7vQIDv7gNY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aRgd+2/lXjLXT6b68rRw+O3W5mT0L/g0U/MnefCSlNgfDB2tTYJZRyY+vNaYKheYmELppLaG07uHrGEgPZ0qAi+0jaZtffpUSYyAS83zkKYSJFHZ4hVo8hTaky76BWa5iBmSbaYO0+WomyS3R57evhedKT2eoNwk4KSi2fNy14k= 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-2bd9a485bd6so2419993eec.1 for ; Wed, 18 Mar 2026 08:03:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846202; x=1774451002; 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=yuVySmXB1N20uvWlkE4WXWJqrOPMyoG70opz84fOKRg=; b=ZOG37LA2pBFtCFbU6BPe9SEtzyWoBWCGQ+QxTg8VeXh7hxCFpQbeWxeL0ao5+A2soB GifdODoPVSBd4tsWRvI80kjbYsnNQrT2gQiqp0N469vGGv7cW+P6R4dUlxKdH9Z0B4dr qRjR0NoLsnW0jMOpXfUwvrlfXAvEWB7Cl5yNwVUVE3Bb5L6W7v0sJYXLdcvitIKZQYEV BuPRTro1F8Fk/qaHukTxfeu2frEk8qixasgtsyR23iAYvYi1heEqqMJ6cQaMWO7nBn1R RtEtCP44bLG+4atLDS0b3Gf5+tjBVVCuLyQVcxahcMH00MMtAXlsg5TkGSVpbMZZixb7 Idiw== X-Forwarded-Encrypted: i=1; AJvYcCUkGKUGY2nHDU+ktJuCuNr6NrcP5JL7z+xNARiccKIXhPrhO+4cK9qw0q3Ux4c8KTAjGSiv8zGWMH3LhYI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9SwcVKN70jnYgxDjgYl+xKYBQFRxlnsGnCZY6SkPwqcLL8iPB voBDUIXZGscL/XJNOOD0baVaHwBiscQHAgI5io5ATUtKLYl+e4Jb32I= X-Gm-Gg: ATEYQzwdi+SWkS1FVBvks0G9tN6RXt/YVRQV3G6IaC5ngMSj0XW23eIq2cje8WO+NDo 8d1wNmxfLPWjWcMT7/M3YzPfuDp4JI41n0/ShLIvhR3n8B1mnNB4MIkWlTLKsIPWd9gBHbteKiz EcfL6nQoWcPvFn+ut3NlV0ln57Lnj9j52mt6izjda0HLe8Hx/a/RKJrBU9iRPgiQxnHBdD1KhuY yLPfLcuPHanp6n245X+n2jvD6+Lx5zRiDQ4zXLGNLOddWBjOmXgjwWMCXkGzWbvNlsmQan7QkuK IRWgl4tRZR8VXnvuWs5t+N53hl3JZDIJN0aMRjtTN/Wgk0gDJ7GZgd6F+Kcs9mI6H6UV7v+t7mn h0uvfXvc/YRqik+7Wx7qgNNA3PD6dOopJ/2Sel2ZoGqokL8RWPc+k1hzXjBA2FXb2ZAzkDGXmCm WFNQ6IIrVcwLM2MtWxivLiTCi1bN6f/zjl18xHrVQ92/fk0/7SZQmPuZu8DXJZoquhq1BTCb5Nz OuYiJGnU+8MpwIdVg== X-Received: by 2002:a05:7300:ec11:b0:2c0:c96a:a4db with SMTP id 5a478bee46e88-2c0e4f5b6b3mr1808937eec.4.1773846201496; Wed, 18 Mar 2026 08:03:21 -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-2c0e55ca0f6sm4007492eec.25.2026.03.18.08.03.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:20 -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, 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 v2 08/13] bnxt: use snapshot in bnxt_cfg_rx_mode Date: Wed, 18 Mar 2026 08:03:00 -0700 Message-ID: <20260318150305.123900-9-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 24 ++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 225217b32e4b..ce430690efb5 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) @@ -13642,7 +13644,7 @@ static int bnxt_cfg_rx_mode(struct bnxt *bp) if (netdev_uc_count(dev) > (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 17:27:45 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (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 E63DE3E1D0F for ; Wed, 18 Mar 2026 15:03:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846207; cv=none; b=o5P+iUBUxx7lrTMXuVltnNj1ihyTfVqCnPNQhT1QqEFWghkWNMub/M/p/sXWwizRsoTJrlOBv8Z0pj9lMqW7AkNUgsXrjZW1DwmW5CBHd78xd+6ruOVo7UKWlG2hNawltzr/RIYy+s8emPP8gIMmh7xWhK2W73GEeZ0DxsLupF8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846207; c=relaxed/simple; bh=tpq4CPEg4PF7xY4vX/qaHiEsjc2ICDqk3bHyi4H6/ME=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q8l3a3AuSIjDsx8bRKGrhoMNbTB0e+XcMPlx9PdfE5ldJGF2HaD49xuT19wJ/QxNqZ9tCNvCVwJOiSON2kjha7IaHZTiBEIqQ1wyNNQMBmoWmghBGR9m4bw3k2yUXV9ipraosUt93xJf9DDOdhcW2x34bjERY+TKtnhnOVxQQkY= 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.175 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-f175.google.com with SMTP id 5a478bee46e88-2c0e3a2605fso12442eec.0 for ; Wed, 18 Mar 2026 08:03:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846204; x=1774451004; 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=XSaYBPUHoClTmC020++gv7ny9u/bJnn5mvE5P5J3mrm0uDXyxeEzntZsK6FX99uS3n GE5/VAiSzt47hJhy8EFo1cee9EKy7k2rn4xRBscgUiKVn9Dq/scwmpvyLoxk4ZVgpCN6 rFup5wp/MHT2kj8kJuRVMMv1ADDeHWAiHCXIt5yj8hzzCacUwjYBaCYz5kjZqcVm9qKk BhMng9cxmIbZi8Pa7rr5rqRwcupew1OncU7jxfB2B/wVQtO+CVvfPgz5LxqPAIyI4PpM RNpZmAec4sgpgScR+pZrJXMb/z0MBkImB/PElyE2yD09DC15C+z9bl+NBbpgxLA7ECO6 XvyA== X-Forwarded-Encrypted: i=1; AJvYcCUzmsJy7AZo/eP/WlrchQW4TUy9hMPGfkRfJQf7/FOelpOIvqXqlfwDedprc7g/9nzF405kklUt5zawnfw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+KUZ7PTJcWJl3ytMJJq/tk04l5VyvaICiduCQh80pM+0yE/Jg JrVIHmQgIIiAvpF2CJtnAYAKN7ZTou+qLZ1ZyD765SudfKwfeGD7Z9A= X-Gm-Gg: ATEYQzzlMGBr6HVpUrdeIFlIM51tKziX45TXskBnpDtevF6rIZqGIfTLCY2JD3myIYR X97TYskRz7j/dCqy1ItoOJwEPMf0gCclGeMl1SQgON6Zjc9n5SR5OwVN0Qw+QwhB8Uhfj9rPPFM 2kdGISeiEBxdM52fJOdDGnmdiw62mJRHp23akc0s6HB0lyg9Y+fe8yJBrjFrbwI6S3h9kE+JfLW ak1tA0cwgRuNI1exvYs7kUkVRbnJSDoJQoMhXlQNaSMYhlr8RWpI/DDKR9n+aZvrJAtD9uKhaQI RSm2dA4yX7D2wCGKUIbI8BiIwBm6rWK9HhYahRq86Ou/lXZXVXABBGKAL2c6Y8yPxYThw7xWiGB r0cQ16uUyfU+JzE7bXeqDsVO88l569RFpZyhfBDm/OYh1WbwRfcW+u9gM2I23THjLeAqvdnp6fN l+jQslvMBbXuhkArDkne+MgGUHs0BFblDEsxHJpO/s4xgL5p6NDPNgpGL7Lzf244E4FKZvezFQ5 x79DABQE8xpBWHZzw== X-Received: by 2002:a05:7300:3724:b0:2be:126c:e335 with SMTP id 5a478bee46e88-2c0e5011ac8mr1873924eec.10.1773846202672; Wed, 18 Mar 2026 08:03:22 -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-2c0e56062e4sm4123423eec.30.2026.03.18.08.03.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:22 -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, 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 v2 09/13] iavf: convert to ndo_set_rx_mode_async Date: Wed, 18 Mar 2026 08:03:01 -0700 Message-ID: <20260318150305.123900-10-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 --- 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 17:27:45 2026 Received: from mail-dl1-f45.google.com (mail-dl1-f45.google.com [74.125.82.45]) (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 E07D33E958E for ; Wed, 18 Mar 2026 15:03:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846209; cv=none; b=sswDj8wMqe0Y8Y5Xs9WUfb348yTqP1Tuu8oWwqGSKTVmu5z/FwJdq2nnwNU2kozxDwkOiWH4gBn6jBuyURtRmpmYChFJw8PQchQEmCeoGGttlota7cBjLSBkzEoGpyLBsfwcB8mqvdMty24/ev41Z8vZ1cN/SI96jbIgUwrxqfU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846209; c=relaxed/simple; bh=FkE3aEmYq3JFi5GpqJgM6OBmxi48BQXX3kwNVt8fzXo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JFv5Bt3TpndmueABMsiiei3t8/gTN1fmmtRU+NTjtyxXkKm8/o9iRXex8St5+cwt7BhDCOYtsQA23Qt9fEgsdBv7sFnR/1S/zgY3vXoAMu7pKvLjG5o2C6BRyPFjBbDJMaeJqwM038qZq6fFpHPUkpX/7GNn+wGZdFt5vYajWSM= 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.45 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-f45.google.com with SMTP id a92af1059eb24-126ea4e9694so2428515c88.1 for ; Wed, 18 Mar 2026 08:03:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846205; x=1774451005; 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=AdazbT3vAsIrR/BsLr1jkfvzpAXlKnv5GiK0LRxGPZhVGXEhEobrMpSiky/ovj9PWZ JLkaxIm4sBeFSOugtK8wL+I3ps3t8kHTf04NhqlHPU54Eg9xSxg+IdIbAvRAurM1Vgcx ZXKiv7RZ5paQiv2WU3X9gG06u5xRZxc4uiyp+Td9y/tUuwajFMdtni559bi5Mv2maFjC k2soy+gRlq27X9tx8qxoPycCUUoUjKoKjeuywd7DgeMEdktBX3u6VqAT6R0L/6R3ZHf5 KhnziJto0rran9Vv9qikhR6NpDS3GcAaFUy5iGVK9B69PiFYFw01fWEbPPiFDem3UE8a 7fHQ== X-Forwarded-Encrypted: i=1; AJvYcCWQ7YnCRaxqv7sd76XGzfjoI7k1cmqy8CWc4uPMD5LNLdjdB5vdYo66BoYJYM1taZF0c4AW6/nMaDqKk3M=@vger.kernel.org X-Gm-Message-State: AOJu0YwPWa0JUPommo8ZF4yemXMSJVEaTonnSwOrGqPlwRMf0EXemkxk a0oYQx4FluQ4ZkCYz025aT4k+pk1Nt8ANJVrdgOwrC0bi1xEaTghuvo= X-Gm-Gg: ATEYQzykJuTJ85vbATJ5ZmPdwgLPHux1xzvAfd8ECFgYuDJnfpSAN+l7njHrab/7l1o p6X9NgLDvxmknfOrMBSxsTi0V6wli7f63OAKMYWdZUWXo8GxxWIJekPNA93aZPz+V4dEMPdkCAL cE1Xs2790cDJoX5n/iz5NfU5eDXcRvGWAlES+NXDb5HoZSpNFLYgpyXyof4ci0TJ20nJLYLImGw 9iTVG4JA8edetjrvKHUSHZYwGekCfb9SDzZQkf7u4R+C4By4T7L5WB3CuoXEFqQSTJbIQ591V2l 03o/VNXPSIBw6bJ3xbeyYnUxstDzgu9fuFJm31JRkFlPpCsywTG/aU0ZB8rkPLUYiJwQXKWs6Bl jyEaO+0l2jRPwfB01tq6zzO31y4h7qRm6HYgdq/N58DaiP1A/jAxR9VTThP+pvyHH3/7WNo8jEi bSRPLKsRKmFy1bBCdJt4h+v22P8sjuSZl2IMVwy6DpZHKPABRUM+OlaIEOSgUIUR5qP0VQEouXC TEfIfYSXMr0nDMd6fdH4Y2vuvJ6 X-Received: by 2002:a05:7022:61a:b0:128:cf5c:5362 with SMTP id a92af1059eb24-129a70e0ccbmr2203458c88.12.1773846204437; Wed, 18 Mar 2026 08:03:24 -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-129b3e8d34dsm3689514c88.7.2026.03.18.08.03.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:24 -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, 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 v2 10/13] netdevsim: convert to ndo_set_rx_mode_async Date: Wed, 18 Mar 2026 08:03:02 -0700 Message-ID: <20260318150305.123900-11-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 17:27:45 2026 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (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 EDF813EB7FB for ; Wed, 18 Mar 2026 15:03:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846209; cv=none; b=D3ilfN0+bwZ/Y0eGXbyI97T7K7RP4NHxBv0xpDiXkY+tcOyDph9RMGA4+9lZEUD+wCFXgWNGIZxcM8U8yxiItvTdmCkrEC4/vp7v/u1ToEl+3FkmwYyJovQEzJhLdaYLt4DJ2nDfbgdLS3J8JaP5zrZ2Am0dg7REjKsmnb211tQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846209; c=relaxed/simple; bh=5NcsxaHVIQ2NmCj9OLQh+nSLlXz0JVUjSv0mBYVb1MM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m+YJosUXXQ2WMnT7UCEE2dWBGKe/AcmaRJtKJG8eybydD5JPJiSxdSO14HgZo/2J3cd12RrYosGJLQv07QN+MVHS/Q0IzPXSxYHpfJ+aKjY72p5gRoyLPx5LORDR/4KoNoDDhQhPHLL4tBHkwUJCvQpXE8/7i8Jbrt15lH/YZHw= 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.44 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-f44.google.com with SMTP id a92af1059eb24-126ea4e9694so2428609c88.1 for ; Wed, 18 Mar 2026 08:03:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846206; x=1774451006; 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=hy7lQtxteWcSOZujlIDRgmCviUN1tn938EHwAAHmJWSKdr6BBZGDExbdHUTcISWKtS kV3NRK7U0WNY/4nR6wsdT77CHClHu/MUUdSuOhgtwHyndMJ//qC5rHZ3URbpAk+JVdEo TUEgyzSLbHBhYdScWaf2fYOAUSETy2CUDWDGe8dz2ggULZn6qKxbtrOIt4zo3sbp/py0 rO9ZbTv42NU744q5qfUxbZuzmRa8lJ0rtCJGIgie9gism0ArGj9lrmW3x8ZtWUR5CFv2 0SokPnWG8Uk63U1UBwhwC9SLDpOViARPqDp9FI9BNj+RAHL5cfKZ7sRh+prF/SZrj0S/ y9Wg== X-Forwarded-Encrypted: i=1; AJvYcCXjnX4XjFuk/luD+ZqQNUdcMDEmeslE53qxep0C4avZaQ+wk8I/hB137+NCuNzyOUnr1FMMTR/xTY+Y5Xc=@vger.kernel.org X-Gm-Message-State: AOJu0YxC6NqfE4TdrJ3QXojzw7it2bTpqdszGLqP52+l8VGQ+6jSnZkZ Z92HqJ/B2qzUBDWsshjn0vDPQa27kilDmp99GW9fJqWjYBoFGPLP4YY= X-Gm-Gg: ATEYQzzPbfWsA5lPAmhG+qnBjWGduCIMwvPxVPmbPEjuXZP9OhH9TOOBOY07o0N8G3G e3qYu7fnYagF+tPajQxZtlP3CML/hUjlZL6HPTEc+sY/hFn+6voaafpDPAv0mV7hvDNNjOl+msj RUt3JiAJmYZu8PjaRYjaPBB1Hpx+si/HjnzKIVSP5Yo+j+oz45pNAOh4AC0r3281qlrqPLebAov sdUcrfeHmX8CY8CEyOq7LUzpacKHm9OCxNvp2ubQFfHPMjhBfGymUS/Nig2Ae7KtL+fPPTWgjR4 xqk87Eew/Fopwh0kMTv14rvXI9phJdq92q0CQuADSF+03bcTf37f7Mjav89AikeW2IUGRTNPG22 w+nEx4B6+ryKgdug7UlADttUqjEcJ5JX961DT5K9IVs8TANMXEonkno1gTNz56LZj9+MXGjFUVe EXZBEcXewmes4wKSF2GO0CnSNj3sePHFszML2hDG1uOFOb4VA4BYIOddysR2pB6C2SjI/vl7h6K qWO9EdF0phavTU3bQ== X-Received: by 2002:a05:7022:b9f:b0:128:d51a:5161 with SMTP id a92af1059eb24-129a715e828mr2027441c88.27.1773846205882; Wed, 18 Mar 2026 08:03:25 -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-129b41271aasm3384562c88.11.2026.03.18.08.03.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:25 -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, 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 v2 11/13] dummy: convert to ndo_set_rx_mode_async Date: Wed, 18 Mar 2026 08:03:03 -0700 Message-ID: <20260318150305.123900-12-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 --- 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 17:27:45 2026 Received: from mail-dy1-f175.google.com (mail-dy1-f175.google.com [74.125.82.175]) (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 93A733EC2EE for ; Wed, 18 Mar 2026 15:03:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846212; cv=none; b=PRnYj/IpKIFgo1c50r0Lcn5Q1QYrwoPJCXm2Fk/hzMt+j+n5kF6d2XwIWYAfhju1fFwrcJTjqr4jsHfWUhMpyKKMrS9Nit0NThRylNAcShxgaAaRFVYL3gNxaFRVZHvwMwW5Pg7xXRUxx2i2DABuRcbVXXJSPHqx2mPS6vu4q9Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846212; c=relaxed/simple; bh=sVd8LTVEHoLKFD1aY4N3BnWCDAMnZxFR8UMGpqAS4sw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BIOa/zbu1PertoERrynet22y+gae6B8ppOSkibnxDaHljT4MQQ7ncgVumgSrcnTS5rwitB4m0y9MSe6edQe0hglvfyZStjNKIRBEDTTWhkukAm9P2ry8X6XOjiMIXW7qnatPhexulgKJzXJVtMbZ+V8OOWs/OVDmJsPq1fMOLWc= 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.175 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-f175.google.com with SMTP id 5a478bee46e88-2c0bcd8f194so5425483eec.1 for ; Wed, 18 Mar 2026 08:03:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846207; x=1774451007; 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=S2Eshwmt0Yi5gowTBPApYQhLiCclUhxDbq8BJfNjYyM=; b=CcMnWOc6qxJR8sr++WQE/bLxpwzVs6h64mIOkpMzWyQeOivcy63F4XpVaS84doHHUf kAXo80sT33SF/tEZuIqX4bgZYoDzZ/EnAt979dtPMiU+C5kFf3vQe/MrATn2EAG3al1+ 7rxYJh/YkFGEygk4ZlRPrnC+N8OHfMVgaBnWMkJhvCfohcDMzCiGx+ZSN4qvFb6OEZpL 9owLZR04RSMiKCdyDabcp23lGQwkmC/XqBDEJktFvU6UpAhq3CT1JpAl2gXaFAxkhEoa nUsjBrnpafaT3DdyE/lkxo604Ug96B2PKgrA5p9S8hfdCzKP5Ke6FZptKcJGwd3tBl8/ Ameg== X-Forwarded-Encrypted: i=1; AJvYcCULWC623fqyYxMMbKiAjty7Mx5Gw3YQGpDVMml3+CjwIDvPYePTyigvobn/gikBr9PQI2XzjdyGJRmiRsY=@vger.kernel.org X-Gm-Message-State: AOJu0YwejVXwKhUDBae7KRuKkRN7PlolGd0Am0xFF69lR2ehrhhC9caf rs1lDEa+dDhwUpEL2KsbXJLW15w0UA4kZlEenB76XA+E2DR/01pX/W8= X-Gm-Gg: ATEYQzy2V5ELxfV0XyhfLpm8jLKRziymMpFnZndSi5Zh2hmH2VudYxZjt+43bsMG5yT EejKIo1SCfjZZ8BlWJrzHr4tEcQDRfzGd5d5I2H5Ixc/670wRwQPtlTKhCosk+Z0wdzsNOf4dbA 2G0FsqpeVeBVq0jt63y2eJKT8Iwzbhcz16sypY0L3Kpl6+uWFJF0SHbP91aJInX84lc1f8isdGh kvpH9CDKR3kaAjzJztnNVq9pDYTZEHb/+0FMYsH9EVu+LBS2st6P6RubIYAudUGc4MNnA8Ys0SL 6YcXvU3npjIwkg9d+rR8GvRAWl+CxydcMoFBmv3WA8IcWbPTbi9eXdNJpOV2A7oQqI2NTbJ5JPu DJc6lJSbXV7Pb2qvqrxwB23lCKjoYHa/OrmKvIfsDXbtuKRbxGEDeM2gmCFy4GPTUl6RY8HtdLK +Klr17xkqapuVDK1KiWuHZtIp3x+I+RDS+CRSjoM1Avii8g+ALaZimEWUeiBB8yYUKHjJa8qDJt hwYHA4BK4Gev2oY/g== X-Received: by 2002:a05:7300:fb97:b0:2ba:a3f2:958c with SMTP id 5a478bee46e88-2c0e4dc3156mr1648308eec.0.1773846207075; Wed, 18 Mar 2026 08:03:27 -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-2c0e55cd9cfsm3997754eec.26.2026.03.18.08.03.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:26 -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, 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 v2 12/13] net: warn ops-locked drivers still using ndo_set_rx_mode Date: Wed, 18 Mar 2026 08:03:04 -0700 Message-ID: <20260318150305.123900-13-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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 --- 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 d50d6dc6ac1f..187cd7b5074f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -9778,7 +9778,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; } @@ -11470,6 +11471,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 17:27:45 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (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 13BB93ECBFD for ; Wed, 18 Mar 2026 15:03:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846213; cv=none; b=A07vlwTj0gk965/DW8meUWp+1nwNnElbUJNbEu7yJH3cSlFF5Mjh+ZFCDRljEKn56/lijHlG74GKz5z9XrunedLn6S2u9+H92l9IrgkYcNX9JMQf/97djXnBm/bSa483oQEx2a7Ici/tLTSghlp+58v62fA3qaHPvb+qycc2Yhg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773846213; c=relaxed/simple; bh=fFbx4L7c5RG8MsSh64xUKulTqmO1Wn4GpSHiz4YrwzM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PBaHlyQdsVsSZ7jqgjyd0ivbkNHzOOJzbogbFZ4t0Q/wtgb+BXYvihh2sY1Yz07MlWAtow6ZM41VNEt9pN6P7BbSKuquHICuRNJSI3KeXx66WmI2dFpSlR8CDd6JHkugRyIe+KXzlABpRhZw7Avf8uNp+hLXuvteSNFq0vfcDjE= 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.46 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-f46.google.com with SMTP id a92af1059eb24-128d2e3082eso151277c88.0 for ; Wed, 18 Mar 2026 08:03:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773846209; x=1774451009; 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=DEpDXLRg7yceKAWJm6Ij3mKpdDG2ViwFzvbbuusPjHZsHc58yQQKyVLDiaXDVh8gvT LHdpRPGzkjRXqFlqVT4zo1fnYU5OQZm2UAQe9iY2rCoMYdJ427a9WoiWqyKEP9YCyZmK 1oenXKXX/fVZSnv/OwMkacPL49MvlZ7G9PtnD2Ip+JRx1r6z6UJ4vwNbqjRKiN6TZIl+ 8llUVeZYNf9YzxS+nkzZC6pstVbBSKKG520IhGiE3j5401Ahg1vpjYq+MsygS/Vo6/Ub 1Ldw7LShbLxcNJoBBHRCtI7iGruftfDMr8BX9TM0m92Z6RPVyJxOO5wJbD9IoGqpQWd8 9HkA== X-Forwarded-Encrypted: i=1; AJvYcCUiMWnB7+R1Q+7d65SZmLsbC0TGxFURPmREXjUyHmOu6zdNuDC8eOyPCxr6AAmZ8UmD6WqVA4rKRh9Ko3k=@vger.kernel.org X-Gm-Message-State: AOJu0Yw9hLSX1nP6AHAcQPzh56GYyYPNa5Zmme8AzQfvSD+s2nLj2hB4 yFnBO9Cj1IvH9KuSQV8XNfWXP7OyknQg79zMV71/3jwNQVdqb13Eloc= X-Gm-Gg: ATEYQzzgv4IDdbPzT1XIsB+yqdX+PrItp1ZU9mSJ0PyZ25q2r3ra8kiHuah0JrYXANW V+BscS6PURW2QU1sC887ZcxWENFAQblKbOk4moNkNGvPQOr5s9TKmyQs4EmeBcKEdKNKEzf1Vgt bMhOVxSfOom+T1L7Jdci26k9N0aC/l9ust0sb2ff72lJyku4En/ys9aVgc7YSW96B6Q8PhHwMT3 VeJHlLbAOb5tSYhonn/NplEairfdJgqjsPhTtv+EByO+O8dRL6FdNSLsZY/5hJMZcCkf2WZl/GR BWoC7CDYGpGgwNQ9dT7v7Y0bx9UqczojgkO7qeuvYLEHcQHEgsw39M3924nt/XaWdofZiygpoQz ltTegVM+pVjvzYuHChMQaS9vtZJUz8kMcVOPGhtRZpmZZWgnHx09QVX/OMliTZvpuiaLfxbEeIt GOI7rHV7Lv83+p2ImKs7GdEp21cBAJlisqtoi0de8mR3I+QnPG7EZJ4CKUST21XvHx/nRl943Rc 20gWBzZki+D+4y3oQ== X-Received: by 2002:a05:7022:43aa:b0:11b:c1ab:bdd4 with SMTP id a92af1059eb24-129a70eab62mr1700585c88.38.1773846208379; Wed, 18 Mar 2026 08:03:28 -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-129a7256263sm3541023c88.4.2026.03.18.08.03.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Mar 2026 08:03:27 -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, 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 v2 13/13] selftests: net: add team_bridge_macvlan rx_mode test Date: Wed, 18 Mar 2026 08:03:05 -0700 Message-ID: <20260318150305.123900-14-sdf@fomichev.me> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260318150305.123900-1-sdf@fomichev.me> References: <20260318150305.123900-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