From nobody Tue Apr 7 09:18:08 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5229B22332E for ; Sat, 14 Mar 2026 18:29:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773512980; cv=none; b=kkeIkDjaAhWG6bVTHL8NP1excLg155ze42REOr3yDQiTlJRihujM+f0YRdw4KiyuhQhi1o1o5PkAly5fxfDDnNyMeyKcnl0wrTOpjHOHBkW9sjy6uL0Kw3u1sR1cwFGgPC/CQHcB5NV2iHd7fjqj1rZBnjFvPlT+FL0FMfZkIS4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773512980; c=relaxed/simple; bh=U3vvmkXelI8LTz8QU0K42inS4TOguEVJt/CLkeFByIg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j0KZQJLSylCFsrmnPkZvUh2H/+gKTDF0Gms7ZFfvb33l+pWaIWDU0JFNuNHicTDUtTu14XFjQ4LicjGqlXljRkBMlTSd2e0P54g+AvYhwCKdT0AQL2296lhjW5x2zk/LFXk0Uvn5u8Gm1MoVBnb7wzd5IeQJ4JFsTI+8mjj1jGs= 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=anuh+vZ5; arc=none smtp.client-ip=209.85.214.177 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="anuh+vZ5" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2aaed195901so15543285ad.0 for ; Sat, 14 Mar 2026 11:29:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773512979; x=1774117779; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7uJuhFREF46e+3OIYgkRDThTE1W9t/zG8t/Q5Vop1iU=; b=anuh+vZ5uzPU1sQInuK1t48Un7PhYhCzvpHWZj9A2u50KnpzOg00hwXaj15+EB5OiS OCKeXixRh1k7lgkliojup1kFRiFd3lkMXLgJIzip/mrV404pHctA3fbngJeBvteyWNIn zhLAAkbBDAgBJJQZtNJC816mwZwA7WUpHYY7BusUsx63tlXJBxACLY1B+A4JiVeSZsZo 5DN6W6VMGdCAge4Pv4js+6oaVqUfgUkPf7PtbRj5T1cK7/hGEPqD+uSjXrlzS4hwl78g qySxAG3nAQW2bAB+mf0pqDP3nwyfKQMb4kdiFQWxoQaqjsmV61GnFpP15sBQHemNd1Sb k96g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773512979; x=1774117779; 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=7uJuhFREF46e+3OIYgkRDThTE1W9t/zG8t/Q5Vop1iU=; b=P3SbM0uKGdxbJYK5/9CQrGcMiDaTcdpZK90uOAn5hnWYRnz6MGHeSh6BRCzKp1wBHD wYSjapswQgC97povEWDIGekEj0F7fQq5bDbE8KYxHax65nZuqDdONx2Z6QI5oaJabkaQ rVsRNuUTpBC+BQu4jlih2v3xFlituby6oTuDMY8AIs2H7Hg07yuZNRur/q+obtCtVtFm qgI4IJZ2X5Fm1T9khw9mZHWg5Xcu+JLgQVrz0zrh+bE0Tx3RRbDY1+Lbn3ENFm74nxCF a0efbPkXnTmtQfMwNot3UtIVuwYxozLtinEkUxUyyn1WnxcwL5Gu+3obagZZOjMo0Dbr EuEA== X-Forwarded-Encrypted: i=1; AJvYcCWPQYnSj0pRq65TPPqOkuE8UH9p0xwXS/s2vZwdiRWfi40fNSmR+zDgsmUAO2bqQVL+mpolhZ5WuSc164s=@vger.kernel.org X-Gm-Message-State: AOJu0YwfKKxyZCBvvpQt46XX1YtvQa+Q0cwmBVWXA3z7BVet28KK+5N4 p/8cAqf2UC0dUN/0oBqA3Bu1p3X0fRKIrA9Hv2m6X5AnSI8YzRDmk0Uj X-Gm-Gg: ATEYQzz91JNklHyOgEjDCoVHY8et1/ePYdlWv1r6pT0bUtTnXiGg/D4tpKjRHYw6DYd iNg75c1ollXecUbFS7Iv1IiWhVZUoZWFDK3Ot4ZYBY9cI0bCiyxWf863fvVuUnx6g2Cf2BtuXyp be6ieF6jlXCvzuUbvp8bws8Z29fryQjP9vLxgt1yjhY/sLTQGTKZDyLKP7qCQ5RiqUUGRsJoFno YrRfeoFnmWoRl+jkog5k/F2hZO+MioObMqCHweB/wvtxaF/fOYkC+heWDv3g0CGM2+7vKOoLgSN vpgLM6bR69L/Hods7x+yeZ0w0nNLBueDDuS8/DV4TKmlV7ss+ZlgTY/UXmvvTY6HmwvKKG0Ac9L xwDyptpWYmcAUG305Gr5xSdXujw6c3yIYNqbcYmKbtAoucDYoOFb//gZI0XjlBTuTLp0mZPO0rf 8Wp47tQxQz2eEKb5aHWLQ6DV9X6xlc9u88t2utSuZw2eP1+p6AlX39mhWT2aD/k4v2x6DR8Sa5L jwBsA== X-Received: by 2002:a17:902:f70a:b0:2ae:5044:8dd4 with SMTP id d9443c01a7336-2aeca960929mr72806085ad.19.1773512978654; Sat, 14 Mar 2026 11:29:38 -0700 (PDT) Received: from localhost.localdomain ([122.168.66.151]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece62c581sm77673525ad.33.2026.03.14.11.29.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Mar 2026 11:29:38 -0700 (PDT) From: I Viswanath To: stfomichev@gmail.com, horms@kernel.org, edumazet@google.com, pabeni@redhat.com, andrew+netdev@lunn.ch, kuba@kernel.org, davem@davemloft.net, eperezma@redhat.com, xuanzhuo@linux.alibaba.com, jasowang@redhat.com, mst@redhat.com, przemyslaw.kitszel@intel.com, anthony.l.nguyen@intel.com, jacob.e.keller@intel.com, ronak.doshi@broadcom.com, pcnet32@frontier.com Cc: bcm-kernel-feedback-list@broadcom.com, netdev@vger.kernel.org, virtualization@lists.linux.dev, intel-wired-lan@lists.osuosl.org, linux-kernel@vger.kernel.org, I Viswanath Subject: [PATCH net-next v9 6/7] vmxnet3: Implement ndo_set_rx_mode_async callback Date: Sat, 14 Mar 2026 23:58:08 +0530 Message-ID: <20260314182809.362808-7-viswanathiyyappan@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260314182809.362808-1-viswanathiyyappan@gmail.com> References: <20260314182809.362808-1-viswanathiyyappan@gmail.com> 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" Implement the ndo_set_rx_mode_async callback and update the driver to use the snapshot/commit model for RX mode update. Signed-off-by: I Viswanath Reviewed-by: Aleksandr Loktionov --- =20 Call paths involving netif_set_rx_mode in vmxnet3 netif_set_rx_mode `-- vmxnet3_activate_dev |-- vmxnet3_open (ndo_open, takes lock) |-- vmxnet3_change_mtu (ndo_change_mtu, takes lock) |-- vmxnet3_reset_work (takes lock) |-- vmxnet3_resume (lock added) |-- vmxnet3_set_ringparam (ethtool callback, takes lock) `-- vmxnet3_xdp_set `-- vmxnet3_xdp (ndo_bpf, takes lock) drivers/net/vmxnet3/vmxnet3_drv.c | 46 +++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet= 3_drv.c index 40522afc0532..350e44286c00 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -2775,18 +2775,18 @@ static u8 * vmxnet3_copy_mc(struct net_device *netdev) { u8 *buf =3D NULL; - u32 sz =3D netdev_mc_count(netdev) * ETH_ALEN; + u32 sz =3D netif_rx_mode_mc_count(netdev) * ETH_ALEN; + char *ha_addr; + int ni; =20 /* struct Vmxnet3_RxFilterConf.mfTableLen is u16. */ if (sz <=3D 0xffff) { /* We may be called with BH disabled */ buf =3D kmalloc(sz, GFP_ATOMIC); if (buf) { - struct netdev_hw_addr *ha; int i =3D 0; - - netdev_for_each_mc_addr(ha, netdev) - memcpy(buf + i++ * ETH_ALEN, ha->addr, + netif_rx_mode_for_each_mc_addr(ha_addr, netdev, ni) + memcpy(buf + i++ * ETH_ALEN, ha_addr, ETH_ALEN); } } @@ -2796,8 +2796,23 @@ vmxnet3_copy_mc(struct net_device *netdev) =20 static void vmxnet3_set_mc(struct net_device *netdev) +{ + bool allmulti =3D !!(netdev->flags & IFF_ALLMULTI); + bool promisc =3D !!(netdev->flags & IFF_PROMISC); + bool broadcast =3D !!(netdev->flags & IFF_BROADCAST); + + netif_set_rx_mode_flag(netdev, NETIF_RX_MODE_UC_SKIP, true); + netif_set_rx_mode_flag(netdev, NETIF_RX_MODE_MC_SKIP, allmulti); + + netif_set_rx_mode_cfg(netdev, NETIF_RX_MODE_CFG_ALLMULTI, allmulti); + netif_set_rx_mode_cfg(netdev, NETIF_RX_MODE_CFG_PROMISC, promisc); + netif_set_rx_mode_cfg(netdev, NETIF_RX_MODE_CFG_BROADCAST, broadcast); +} + +static void vmxnet3_set_mc_async(struct net_device *netdev) { struct vmxnet3_adapter *adapter =3D netdev_priv(netdev); + int mc_count =3D netif_rx_mode_mc_count(netdev); unsigned long flags; struct Vmxnet3_RxFilterConf *rxConf =3D &adapter->shared->devRead.rxFilterConf; @@ -2806,7 +2821,7 @@ vmxnet3_set_mc(struct net_device *netdev) bool new_table_pa_valid =3D false; u32 new_mode =3D VMXNET3_RXM_UCAST; =20 - if (netdev->flags & IFF_PROMISC) { + if (netif_get_rx_mode_cfg(netdev, NETIF_RX_MODE_CFG_PROMISC)) { u32 *vfTable =3D adapter->shared->devRead.rxFilterConf.vfTable; memset(vfTable, 0, VMXNET3_VFT_SIZE * sizeof(*vfTable)); =20 @@ -2815,16 +2830,16 @@ vmxnet3_set_mc(struct net_device *netdev) vmxnet3_restore_vlan(adapter); } =20 - if (netdev->flags & IFF_BROADCAST) + if (netif_get_rx_mode_cfg(netdev, NETIF_RX_MODE_CFG_BROADCAST)) new_mode |=3D VMXNET3_RXM_BCAST; =20 - if (netdev->flags & IFF_ALLMULTI) + if (netif_get_rx_mode_cfg(netdev, NETIF_RX_MODE_CFG_ALLMULTI)) new_mode |=3D VMXNET3_RXM_ALL_MULTI; else - if (!netdev_mc_empty(netdev)) { + if (mc_count) { new_table =3D vmxnet3_copy_mc(netdev); if (new_table) { - size_t sz =3D netdev_mc_count(netdev) * ETH_ALEN; + size_t sz =3D mc_count * ETH_ALEN; =20 rxConf->mfTableLen =3D cpu_to_le16(sz); new_table_pa =3D dma_map_single( @@ -3213,7 +3228,7 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter) } =20 /* Apply the rx filter settins last. */ - vmxnet3_set_mc(adapter->netdev); + netif_set_rx_mode(adapter->netdev); =20 /* * Check link state when first activating device. It will start the @@ -3977,6 +3992,7 @@ vmxnet3_probe_device(struct pci_dev *pdev, .ndo_get_stats64 =3D vmxnet3_get_stats64, .ndo_tx_timeout =3D vmxnet3_tx_timeout, .ndo_set_rx_mode =3D vmxnet3_set_mc, + .ndo_set_rx_mode_async =3D vmxnet3_set_mc_async, .ndo_vlan_rx_add_vid =3D vmxnet3_vlan_rx_add_vid, .ndo_vlan_rx_kill_vid =3D vmxnet3_vlan_rx_kill_vid, #ifdef CONFIG_NET_POLL_CONTROLLER @@ -4400,6 +4416,7 @@ static void vmxnet3_shutdown_device(struct pci_dev *p= dev) vmxnet3_disable_all_intrs(adapter); =20 clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state); + netif_disable_async_ops(netdev); } =20 =20 @@ -4518,6 +4535,7 @@ vmxnet3_suspend(struct device *device) pci_disable_device(pdev); pci_set_power_state(pdev, pci_choose_state(pdev, PMSG_SUSPEND)); =20 + netif_disable_async_ops(netdev); return 0; } =20 @@ -4531,6 +4549,8 @@ vmxnet3_resume(struct device *device) struct net_device *netdev =3D pci_get_drvdata(pdev); struct vmxnet3_adapter *adapter =3D netdev_priv(netdev); =20 + netif_enable_async_ops(netdev); + if (!netif_running(netdev)) return 0; =20 @@ -4559,7 +4579,11 @@ vmxnet3_resume(struct device *device) vmxnet3_rq_cleanup_all(adapter); =20 vmxnet3_reset_dev(adapter); + + rtnl_lock(); err =3D vmxnet3_activate_dev(adapter); + rtnl_unlock(); + if (err !=3D 0) { netdev_err(netdev, "failed to re-activate on resume, error: %d", err); --=20 2.47.3