All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync
@ 2018-03-07 21:49 Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 1/4] hv_netvsc: fix filter flags Stephen Hemminger
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Stephen Hemminger @ 2018-03-07 21:49 UTC (permalink / raw)
  To: kys, haiyangz, sthemmin; +Cc: devel, netdev

This set of patches deals with the handling of multicast flags
and addresses in transparent VF mode. The recent set of patches
(in linux-net) had a couple of bugs.

Stephen Hemminger (4):
  hv_netvsc: fix filter flags
  hv_netvsc: avoid repeated updates of packet filter
  hv_netvsc: fix locking for rx_mode
  hv_netvsc: fix locking during VF setup

 drivers/net/hyperv/hyperv_net.h   |  1 +
 drivers/net/hyperv/netvsc_drv.c   | 15 ++++++++++++---
 drivers/net/hyperv/rndis_filter.c | 12 ++++++++----
 3 files changed, 21 insertions(+), 7 deletions(-)

-- 
2.16.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH PATCH net v2 1/4] hv_netvsc: fix filter flags
  2018-03-07 21:49 [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync Stephen Hemminger
@ 2018-03-07 21:49 ` Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 2/4] hv_netvsc: avoid repeated updates of packet filter Stephen Hemminger
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2018-03-07 21:49 UTC (permalink / raw)
  To: kys, haiyangz, sthemmin; +Cc: devel, netdev

The recent change to nto always enable all multicast and broadcast
was broken; meant to set filter, not change flags.

Fixes: 009f766ca238 ("hv_netvsc: filter multicast/broadcast")
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 drivers/net/hyperv/rndis_filter.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index 8927c483c217..411a3aee39b2 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -861,9 +861,9 @@ static void rndis_set_multicast(struct work_struct *w)
 		filter = NDIS_PACKET_TYPE_PROMISCUOUS;
 	} else {
 		if (flags & IFF_ALLMULTI)
-			flags |= NDIS_PACKET_TYPE_ALL_MULTICAST;
+			filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
 		if (flags & IFF_BROADCAST)
-			flags |= NDIS_PACKET_TYPE_BROADCAST;
+			filter |= NDIS_PACKET_TYPE_BROADCAST;
 	}
 
 	rndis_filter_set_packet_filter(rdev, filter);
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH PATCH net v2 2/4] hv_netvsc: avoid repeated updates of packet filter
  2018-03-07 21:49 [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 1/4] hv_netvsc: fix filter flags Stephen Hemminger
@ 2018-03-07 21:49 ` Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 3/4] hv_netvsc: fix locking for rx_mode Stephen Hemminger
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2018-03-07 21:49 UTC (permalink / raw)
  To: kys, haiyangz, sthemmin; +Cc: devel, netdev

The netvsc driver can get repeated calls to netvsc_rx_mode during
network setup; each of these calls ends up scheduling the lower
layers to update tha packet filter. This update requires an
request/response to the host. So avoid doing this if we already
know that the correct packet filter value is set.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 drivers/net/hyperv/hyperv_net.h   | 1 +
 drivers/net/hyperv/rndis_filter.c | 8 ++++++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index 0db3bd1ea06f..cd538d5a7986 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -173,6 +173,7 @@ struct rndis_device {
 	struct list_head req_list;
 
 	struct work_struct mcast_work;
+	u32 filter;
 
 	bool link_state;        /* 0 - link up, 1 - link down */
 
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index 411a3aee39b2..00ec80c23fe5 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -825,13 +825,15 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
 	struct rndis_set_request *set;
 	int ret;
 
+	if (dev->filter == new_filter)
+		return 0;
+
 	request = get_rndis_request(dev, RNDIS_MSG_SET,
 			RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
 			sizeof(u32));
 	if (!request)
 		return -ENOMEM;
 
-
 	/* Setup the rndis set */
 	set = &request->request_msg.msg.set_req;
 	set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
@@ -842,8 +844,10 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
 	       &new_filter, sizeof(u32));
 
 	ret = rndis_filter_send_request(dev, request);
-	if (ret == 0)
+	if (ret == 0) {
 		wait_for_completion(&request->wait_event);
+		dev->filter = new_filter;
+	}
 
 	put_rndis_request(dev, request);
 
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH PATCH net v2 3/4] hv_netvsc: fix locking for rx_mode
  2018-03-07 21:49 [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 1/4] hv_netvsc: fix filter flags Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 2/4] hv_netvsc: avoid repeated updates of packet filter Stephen Hemminger
@ 2018-03-07 21:49 ` Stephen Hemminger
  2018-03-07 21:49 ` [PATCH PATCH net v2 4/4] hv_netvsc: fix locking during VF setup Stephen Hemminger
  2018-03-08 17:49 ` [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2018-03-07 21:49 UTC (permalink / raw)
  To: kys, haiyangz, sthemmin; +Cc: devel, netdev

The rx_mode operation handler is different than other callbacks
in that is not always called with rtnl held. Therefore use
RCU to ensure that references are valid.

Fixes: bee9d41b37ea ("hv_netvsc: propagate rx filters to VF")
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 drivers/net/hyperv/netvsc_drv.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index cdb78eefab67..48d9fa7a66c2 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -89,15 +89,20 @@ static void netvsc_change_rx_flags(struct net_device *net, int change)
 static void netvsc_set_rx_mode(struct net_device *net)
 {
 	struct net_device_context *ndev_ctx = netdev_priv(net);
-	struct net_device *vf_netdev = rtnl_dereference(ndev_ctx->vf_netdev);
-	struct netvsc_device *nvdev = rtnl_dereference(ndev_ctx->nvdev);
+	struct net_device *vf_netdev;
+	struct netvsc_device *nvdev;
 
+	rcu_read_lock();
+	vf_netdev = rcu_dereference(ndev_ctx->vf_netdev);
 	if (vf_netdev) {
 		dev_uc_sync(vf_netdev, net);
 		dev_mc_sync(vf_netdev, net);
 	}
 
-	rndis_filter_update(nvdev);
+	nvdev = rcu_dereference(ndev_ctx->nvdev);
+	if (nvdev)
+		rndis_filter_update(nvdev);
+	rcu_read_unlock();
 }
 
 static int netvsc_open(struct net_device *net)
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH PATCH net v2 4/4] hv_netvsc: fix locking during VF setup
  2018-03-07 21:49 [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync Stephen Hemminger
                   ` (2 preceding siblings ...)
  2018-03-07 21:49 ` [PATCH PATCH net v2 3/4] hv_netvsc: fix locking for rx_mode Stephen Hemminger
@ 2018-03-07 21:49 ` Stephen Hemminger
  2018-03-08 17:49 ` [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Stephen Hemminger @ 2018-03-07 21:49 UTC (permalink / raw)
  To: kys, haiyangz, sthemmin; +Cc: devel, netdev

The dev_uc/mc_sync calls need to have the device address list
locked. This was spotted by running with lockdep enabled.

Fixes: bee9d41b37ea ("hv_netvsc: propagate rx filters to VF")
Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 drivers/net/hyperv/netvsc_drv.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 48d9fa7a66c2..faea0be18924 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -1851,8 +1851,12 @@ static void __netvsc_vf_setup(struct net_device *ndev,
 
 	/* set multicast etc flags on VF */
 	dev_change_flags(vf_netdev, ndev->flags | IFF_SLAVE);
+
+	/* sync address list from ndev to VF */
+	netif_addr_lock_bh(ndev);
 	dev_uc_sync(vf_netdev, ndev);
 	dev_mc_sync(vf_netdev, ndev);
+	netif_addr_unlock_bh(ndev);
 
 	if (netif_running(ndev)) {
 		ret = dev_open(vf_netdev);
-- 
2.16.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync
  2018-03-07 21:49 [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync Stephen Hemminger
                   ` (3 preceding siblings ...)
  2018-03-07 21:49 ` [PATCH PATCH net v2 4/4] hv_netvsc: fix locking during VF setup Stephen Hemminger
@ 2018-03-08 17:49 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2018-03-08 17:49 UTC (permalink / raw)
  To: stephen; +Cc: devel, haiyangz, sthemmin, netdev

From: Stephen Hemminger <stephen@networkplumber.org>
Date: Wed,  7 Mar 2018 13:49:08 -0800

> This set of patches deals with the handling of multicast flags
> and addresses in transparent VF mode. The recent set of patches
> (in linux-net) had a couple of bugs.

Series applied, thanks Stephen.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-03-08 17:49 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-07 21:49 [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync Stephen Hemminger
2018-03-07 21:49 ` [PATCH PATCH net v2 1/4] hv_netvsc: fix filter flags Stephen Hemminger
2018-03-07 21:49 ` [PATCH PATCH net v2 2/4] hv_netvsc: avoid repeated updates of packet filter Stephen Hemminger
2018-03-07 21:49 ` [PATCH PATCH net v2 3/4] hv_netvsc: fix locking for rx_mode Stephen Hemminger
2018-03-07 21:49 ` [PATCH PATCH net v2 4/4] hv_netvsc: fix locking during VF setup Stephen Hemminger
2018-03-08 17:49 ` [PATCH PATCH net v2 0/4] hv_netvsc: fix multicast flags and sync David Miller

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.