* [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.