From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pz2-f37.google.com (mail-pz2-f37.google.com [74.125.228.37]) (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 ABB374C77B4 for ; Wed, 30 Sep 2026 11:29:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.37 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790767748; cv=none; b=rH24nXyR3bC7daeM8o5L7lxNysaTcCkPAYfbp+VqgzeStq22P2m6tEjpR3OhqGz9JWMyT1HEZfC5w2sXnRUtaXVT+ZzzW6lpaU2Khg3SYntiWvyV8MQ9FmbM/z3JBwKsgVELA9bHjccknVqQvHhFh04O6d9u5kKvqnp0xe+QAts= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790767748; c=relaxed/simple; bh=o78ciCpXDfIYH1oy8QPsys44CTqq8XorYBGAwxuHHz4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bGzX34Fux5RzYZZQerbzRl518kogSDpxIOwcXj0bQk1CO2iFSYLJQeXetGBuS+5vtRXAgF60lXmqZdTjOF1+aqJHnLAlL5+DH5AXFrB9BqlKyDihL0uhIW7VbXYX+7oMI8bzEOj9/qL5VNKEWiEzwIu82/qaiww4lfUIfT0efSc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KdeSzfcb; arc=none smtp.client-ip=74.125.228.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KdeSzfcb" Received: by mail-pz2-f37.google.com with SMTP id 41be03b00d2f7-cc7d7111700so244332a12.1 for ; Wed, 30 Sep 2026 04:29:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790767746; x=1791372546; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to:content-type; bh=NfOhX7KR77R3ls7z6JBoXar6xAjR5an9iT+KISorDCo=; b=KdeSzfcb4Mar/WV0Sb9KggQPGMvpWkkfpE/yA6eZjryTSMKA58M0fqR39tqb4/j8aS 4kFlgQz/pf6zdM2LnCJ3fubYEjD9+cDDb9ymM5oM9yn8Lx+HyJb7nNcM+Sf0QqzKEJ/A rK6xFKf2xJsHpN5HyxHytj18DF5lfkuIvxAgR/8PCOml/75/vli0rfeYQmyENT8ikDgN P269DV/dke2z8aF+3O5v/yeLcxWI1GgM3tsaEW7EIFjpEZgIiSPk/YJQF3FgD0REHQ+0 nV+1zXM8F5lxG1kFDxTr53O0lTPELGXvVhw9CAITsIvpEAcDi/IfDWatJy4sUJFjQq/b JpOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790767746; x=1791372546; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=NfOhX7KR77R3ls7z6JBoXar6xAjR5an9iT+KISorDCo=; b=rqsQFfkHlCYBH3u2enKs3ORljfpGJ7MPIRjNHfTypjd5bWvZqmb4GbUewjHswCP1eY hqALmUNJqrPpJK2OgTJpPCeqF7/5ULIJmC3gvIxmzAA6+FM0JPjgWWxYk16HY4/RpoO5 P5TSlRysqjEe5610Gt/iZbS4JAlK/2gyGIHnwefah8mm10vtq0F2oPFzFl0XsXL7pZ5K zD/1gPAu/oSzI4KirmOmiUAnDDENG2WVFyb3cLxHorFVE5SjMDToHsaniK3pOgnCcRen nWNHTqc7wb4Gu1WQFEmV1OYtIyC6vIf/ChtaZpzsBPWzebwLdAEn3k+7DZ9EE/8bEZKu 6D+A== X-Forwarded-Encrypted: i=1; AKwUvBz6XNTG3toBkRsqwzM0GAcLRweBxbrWxgeLcgKKe/X7/5DWbnjpGzD/q4ks4iYZuEiUCnXRRSPm+GNVRC0Jai8=@vger.kernel.org X-Gm-Message-State: AFuF++lPE/zOytJQBuZNB+2jjsc0LhPeGkrna9aBPc2uVGv2DFA77bn2 j5Mkm5re1vFDwqu4n/mVLRiHc9EhTVKUmq2sviSFh8mfdkq50LSN3MtQ X-Gm-Gg: AYBFou2D3mCu/bJdErwQyeUPRKH4dFFX2kgoUqCSqQIj9b6Q05hM0u2a2rW4RgzEFV4 XkozEt6PHJQAWhsfT8ohFHaZM/SXVj1rbpK4S7ARvB8VEXHtGoTQe4RGRtDOu2KajqgfMWgG1/X xomQP7Br1Z0v9zAnaqMRGbCMbNSkoA6HerzXhDjqlJnqiWgBKggglvSIMaL2WQEKGM2ogHeKUGI 21xXDSeKJniB9+T9w/nFVwPWnaOD8H6fM2dwu20G9QDIWCJo85E9OP3XKVxYsbGJV5NGAOPHfPA As7cske+kCXa0tZ1qdFpa9E9Fz9WstOkdaBePNYmOe5L5eoBFP7GLce4Lwf8ibJ/lZ4xO/pGOez 553RQj8mmrhzA1uUIM+WMTCvJ2Sq7eeIZE/kqknwsQE+xp9p9z4VmXCijQDWLb/Ftq+3G/0hx1M MoLlgS34w1TMJeNHf9lF3+KvD60mwUNgvjKCKJwTU/2qstlDsWrXfgYRUeFFXPP9Kt05ujCNP8i 9BEhLop0hNhogxQaaJYS4n+hzX6w2lthhp3FZ5tvc5Q4rKPB+UNMok= X-Received: by 2002:a05:6a20:244a:b0:3de:20c:e8e with SMTP id adf61e73a8af0-3de9e7b41d2mr1089860637.40.1790767745662; Wed, 30 Sep 2026 04:29:05 -0700 (PDT) Received: from m-upc-A520M-HDV.lan ([2400:2410:3f60:500:3fb:270c:7df4:18f]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-cc7dab46db6sm712637a12.31.2026.09.30.04.28.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Sep 2026 04:29:05 -0700 (PDT) Sender: Yuyang Huang From: Yuyang Huang To: Yuyang Huang Cc: Ajay Singh , Aleksandr Loktionov , Andrew Lunn , Claudiu Beznea , "David S. Miller" , David Ahern , Donald Hunter , Eric Dumazet , Ido Schimmel , Jacob Keller , Jakub Kicinski , Johannes Berg , Kees Cook , Kory Maincent , Kuniyuki Iwashima , Nicolas Dichtel , Nikolaos Gkarlis , Paolo Abeni , Sabrina Dubroca , Shuah Khan , Simon Horman , Stanislav Fomichev , Vadim Fedorenko , Willem de Bruijn , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-wireless@vger.kernel.org, netdev@vger.kernel.org Subject: [PATCH net-next v9 2/6] net: change netdev_hw_addr_list count through helpers Date: Wed, 30 Sep 2026 20:28:38 +0900 Message-ID: <20260930112842.21323-3-sigefriedhyy@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260930112842.21323-1-sigefriedhyy@gmail.com> References: <20260930112842.21323-1-sigefriedhyy@gmail.com> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The count of a netdev_hw_addr_list is changed in several places of dev_addr_lists.c and a few drivers read it directly. The next patch needs to account every change of the count of dev->mc. Add __hw_addr_count_add(), __hw_addr_count_inc(), __hw_addr_count_dec() and __hw_addr_count_reset(), use them for every change of the count and rename the field to _count so that a direct write stands out. Readers keep using netdev_hw_addr_list_count() and the netdev_uc_count() and netdev_mc_count() helpers, the few that read the field directly are converted. No functional change. Signed-off-by: Yuyang Huang --- .../net/ethernet/cavium/octeon/octeon_mgmt.c | 4 +- .../net/wireless/microchip/wilc1000/netdev.c | 8 ++-- include/linux/netdevice.h | 5 ++- net/core/dev_addr_lists.c | 44 ++++++++++++++----- net/core/dev_addr_lists_test.c | 18 ++++---- net/mac80211/driver-ops.h | 2 +- 6 files changed, 51 insertions(+), 30 deletions(-) diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c index c190fc6538d4c..5e3c379b24234 100644 --- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c +++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c @@ -573,14 +573,14 @@ static void octeon_mgmt_set_rx_filtering(struct net_device *netdev) memset(&cam_state, 0, sizeof(cam_state)); - if ((netdev->flags & IFF_PROMISC) || netdev->uc.count > 7) { + if ((netdev->flags & IFF_PROMISC) || netdev_uc_count(netdev) > 7) { cam_mode = 0; available_cam_entries = 8; } else { /* One CAM entry for the primary address, leaves seven * for the secondary addresses. */ - available_cam_entries = 7 - netdev->uc.count; + available_cam_entries = 7 - netdev_uc_count(netdev); } if (netdev->flags & IFF_MULTICAST) { diff --git a/drivers/net/wireless/microchip/wilc1000/netdev.c b/drivers/net/wireless/microchip/wilc1000/netdev.c index 956cb578bf37c..d3343113cea50 100644 --- a/drivers/net/wireless/microchip/wilc1000/netdev.c +++ b/drivers/net/wireless/microchip/wilc1000/netdev.c @@ -704,17 +704,17 @@ static void wilc_set_multicast_list(struct net_device *dev) return; if (dev->flags & IFF_ALLMULTI || - dev->mc.count > WILC_MULTICAST_TABLE_SIZE) { + netdev_mc_count(dev) > WILC_MULTICAST_TABLE_SIZE) { wilc_setup_multicast_filter(vif, 0, 0, NULL); return; } - if (dev->mc.count == 0) { + if (netdev_mc_empty(dev)) { wilc_setup_multicast_filter(vif, 1, 0, NULL); return; } - mc_list = kmalloc_array(dev->mc.count, ETH_ALEN, GFP_ATOMIC); + mc_list = kmalloc_array(netdev_mc_count(dev), ETH_ALEN, GFP_ATOMIC); if (!mc_list) return; @@ -727,7 +727,7 @@ static void wilc_set_multicast_list(struct net_device *dev) cur_mc += ETH_ALEN; } - if (wilc_setup_multicast_filter(vif, 1, dev->mc.count, mc_list)) + if (wilc_setup_multicast_filter(vif, 1, netdev_mc_count(dev), mc_list)) kfree(mc_list); } diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index d037faff7c44b..97dc053f234cc 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -252,13 +252,14 @@ struct netdev_hw_addr { struct netdev_hw_addr_list { struct list_head list; - int count; + /* Only changed through the __hw_addr_count_* helpers */ + int _count; /* Auxiliary tree for faster lookup on addition and deletion */ struct rb_root tree; }; -#define netdev_hw_addr_list_count(l) ((l)->count) +#define netdev_hw_addr_list_count(l) ((l)->_count) #define netdev_hw_addr_list_empty(l) (netdev_hw_addr_list_count(l) == 0) #define netdev_hw_addr_list_for_each(ha, l) \ list_for_each_entry(ha, &(l)->list, list) diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index 08528ca0a8b31..23f5db99a702d 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -16,6 +16,26 @@ #include "dev.h" +static void __hw_addr_count_add(struct netdev_hw_addr_list *list, int value) +{ + list->_count += value; +} + +static void __hw_addr_count_inc(struct netdev_hw_addr_list *list) +{ + __hw_addr_count_add(list, 1); +} + +static void __hw_addr_count_dec(struct netdev_hw_addr_list *list) +{ + __hw_addr_count_add(list, -1); +} + +static void __hw_addr_count_reset(struct netdev_hw_addr_list *list) +{ + list->_count = 0; +} + /* * General list handling functions */ @@ -125,7 +145,7 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list, rb_insert_color(&ha->node, &list->tree); list_add_tail_rcu(&ha->list, &list->list); - list->count++; + __hw_addr_count_inc(list); return 0; } @@ -161,7 +181,7 @@ static int __hw_addr_del_entry(struct netdev_hw_addr_list *list, list_del_rcu(&ha->list); kfree_rcu(ha, rcu_head); - list->count--; + __hw_addr_count_dec(list); return 0; } @@ -492,14 +512,14 @@ void __hw_addr_flush(struct netdev_hw_addr_list *list) list_del_rcu(&ha->list); kfree_rcu(ha, rcu_head); } - list->count = 0; + __hw_addr_count_reset(list); } EXPORT_SYMBOL_IF_KUNIT(__hw_addr_flush); void __hw_addr_init(struct netdev_hw_addr_list *list) { INIT_LIST_HEAD(&list->list); - list->count = 0; + list->_count = 0; list->tree = RB_ROOT; } EXPORT_SYMBOL(__hw_addr_init); @@ -509,8 +529,8 @@ static void __hw_addr_splice(struct netdev_hw_addr_list *dst, { src->tree = RB_ROOT; list_splice_init(&src->list, &dst->list); - dst->count += src->count; - src->count = 0; + __hw_addr_count_add(dst, src->_count); + __hw_addr_count_reset(src); } /** @@ -532,11 +552,11 @@ int __hw_addr_list_snapshot(struct netdev_hw_addr_list *snap, struct netdev_hw_addr *ha, *entry; list_for_each_entry(ha, &list->list, list) { - if (cache->count) { + if (cache->_count) { entry = list_first_entry(&cache->list, struct netdev_hw_addr, list); list_del(&entry->list); - cache->count--; + __hw_addr_count_dec(cache); memcpy(entry->addr, ha->addr, addr_len); entry->type = ha->type; entry->global_use = false; @@ -554,7 +574,7 @@ int __hw_addr_list_snapshot(struct netdev_hw_addr_list *snap, list_add_tail(&entry->list, &snap->list); __hw_addr_insert(snap, entry, addr_len); - snap->count++; + __hw_addr_count_inc(snap); } return 0; @@ -604,14 +624,14 @@ void __hw_addr_list_reconcile(struct netdev_hw_addr_list *real_list, if (delta > 0) { rb_erase(&ref_ha->node, &ref->tree); list_del(&ref_ha->list); - ref->count--; + __hw_addr_count_dec(ref); ref_ha->sync_cnt = delta; ref_ha->refcount = delta; list_add_tail_rcu(&ref_ha->list, &real_list->list); __hw_addr_insert(real_list, ref_ha, addr_len); - real_list->count++; + __hw_addr_count_inc(real_list); } continue; } @@ -622,7 +642,7 @@ void __hw_addr_list_reconcile(struct netdev_hw_addr_list *real_list, 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_count_dec(real_list); } } diff --git a/net/core/dev_addr_lists_test.c b/net/core/dev_addr_lists_test.c index 260e71a2399f3..07c35a0af2b4d 100644 --- a/net/core/dev_addr_lists_test.c +++ b/net/core/dev_addr_lists_test.c @@ -291,7 +291,7 @@ static void dev_addr_test_snapshot_sync(struct kunit *test) netif_addr_unlock_bh(netdev); /* Real entry should now reflect the sync: sync_cnt=1, refcount=2 */ - KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + KUNIT_EXPECT_EQ(test, 1, netdev_uc_count(netdev)); ha = 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); @@ -303,7 +303,7 @@ static void dev_addr_test_snapshot_sync(struct kunit *test) 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); + KUNIT_EXPECT_EQ(test, 1, netdev_uc_count(netdev)); __hw_addr_flush(&cache); rtnl_unlock(); @@ -351,7 +351,7 @@ static void dev_addr_test_snapshot_remove_during_sync(struct kunit *test) /* 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); + KUNIT_EXPECT_EQ(test, 0, netdev_uc_count(netdev)); /* Reconcile: ADDR_A gone from real list but driver synced it, * so it gets re-inserted as stale (sync_cnt=1, refcount=1). @@ -361,7 +361,7 @@ static void dev_addr_test_snapshot_remove_during_sync(struct kunit *test) &cache); netif_addr_unlock_bh(netdev); - KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + KUNIT_EXPECT_EQ(test, 1, netdev_uc_count(netdev)); ha = 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); @@ -373,7 +373,7 @@ static void dev_addr_test_snapshot_remove_during_sync(struct kunit *test) 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); + KUNIT_EXPECT_EQ(test, 0, netdev_uc_count(netdev)); __hw_addr_flush(&cache); rtnl_unlock(); @@ -433,7 +433,7 @@ static void dev_addr_test_snapshot_readd_during_unsync(struct kunit *test) * 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); + KUNIT_EXPECT_EQ(test, 1, netdev_uc_count(netdev)); /* Reconcile: ref sync_cnt=1 matches real sync_cnt=1, delta=-1 * applied. Result: sync_cnt=0, refcount=1 (fresh). @@ -444,7 +444,7 @@ static void dev_addr_test_snapshot_readd_during_unsync(struct kunit *test) netif_addr_unlock_bh(netdev); /* Entry survives as fresh: needs re-sync to HW */ - KUNIT_EXPECT_EQ(test, 1, netdev->uc.count); + KUNIT_EXPECT_EQ(test, 1, netdev_uc_count(netdev)); ha = 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); @@ -528,7 +528,7 @@ static void dev_addr_test_snapshot_add_and_remove(struct kunit *test) * ADDR_B: refcount went from 2->1 via dev_uc_del (still present, stale) * ADDR_C: sync propagated (sync_cnt=1, refcount=2) */ - KUNIT_EXPECT_EQ(test, 3, netdev->uc.count); + KUNIT_EXPECT_EQ(test, 3, netdev_uc_count(netdev)); netdev_hw_addr_list_for_each(ha, &netdev->uc) { u8 id = ha->addr[0]; @@ -553,7 +553,7 @@ static void dev_addr_test_snapshot_add_and_remove(struct kunit *test) 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); + KUNIT_EXPECT_EQ(test, 2, netdev_uc_count(netdev)); __hw_addr_flush(&cache); rtnl_unlock(); diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index f1c0b87fddd5f..e80731c59ef50 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -187,7 +187,7 @@ static inline u64 drv_prepare_multicast(struct ieee80211_local *local, { u64 ret = 0; - trace_drv_prepare_multicast(local, mc_list->count); + trace_drv_prepare_multicast(local, netdev_hw_addr_list_count(mc_list)); if (local->ops->prepare_multicast) ret = local->ops->prepare_multicast(&local->hw, mc_list); -- 2.43.0