aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/hyperv/netvsc_drv.c
diff options
context:
space:
mode:
authorstephen hemminger <stephen@networkplumber.org>2017-07-28 11:59:42 -0400
committerDavid S. Miller <davem@davemloft.net>2017-07-29 18:25:43 -0400
commit867047c4512aa65fb4cf66b253b51b830c7fa172 (patch)
tree61fe0635f7c2eaae5d6591d5df61f05c18a3ff11 /drivers/net/hyperv/netvsc_drv.c
parentd6aac1f218873f2266de23280bffb909b4a98fbf (diff)
netvsc: fix warnings reported by lockdep
This includes a bunch of fixups for issues reported by lockdep. * ethtool routines can assume RTNL * send is done with RCU lock (and BH disable) * avoid refetching internal device struct (netvsc) instead pass it as a parameter. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/hyperv/netvsc_drv.c')
-rw-r--r--drivers/net/hyperv/netvsc_drv.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index f1eaf675d2e9..a04f2efbbc25 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -923,6 +923,8 @@ static void netvsc_get_stats64(struct net_device *net,
923 923
924static int netvsc_set_mac_addr(struct net_device *ndev, void *p) 924static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
925{ 925{
926 struct net_device_context *ndc = netdev_priv(ndev);
927 struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
926 struct sockaddr *addr = p; 928 struct sockaddr *addr = p;
927 char save_adr[ETH_ALEN]; 929 char save_adr[ETH_ALEN];
928 unsigned char save_aatype; 930 unsigned char save_aatype;
@@ -935,7 +937,10 @@ static int netvsc_set_mac_addr(struct net_device *ndev, void *p)
935 if (err != 0) 937 if (err != 0)
936 return err; 938 return err;
937 939
938 err = rndis_filter_set_device_mac(ndev, addr->sa_data); 940 if (!nvdev)
941 return -ENODEV;
942
943 err = rndis_filter_set_device_mac(nvdev, addr->sa_data);
939 if (err != 0) { 944 if (err != 0) {
940 /* roll back to saved MAC */ 945 /* roll back to saved MAC */
941 memcpy(ndev->dev_addr, save_adr, ETH_ALEN); 946 memcpy(ndev->dev_addr, save_adr, ETH_ALEN);
@@ -981,7 +986,7 @@ static void netvsc_get_ethtool_stats(struct net_device *dev,
981 struct ethtool_stats *stats, u64 *data) 986 struct ethtool_stats *stats, u64 *data)
982{ 987{
983 struct net_device_context *ndc = netdev_priv(dev); 988 struct net_device_context *ndc = netdev_priv(dev);
984 struct netvsc_device *nvdev = rcu_dereference(ndc->nvdev); 989 struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
985 const void *nds = &ndc->eth_stats; 990 const void *nds = &ndc->eth_stats;
986 const struct netvsc_stats *qstats; 991 const struct netvsc_stats *qstats;
987 unsigned int start; 992 unsigned int start;
@@ -1019,7 +1024,7 @@ static void netvsc_get_ethtool_stats(struct net_device *dev,
1019static void netvsc_get_strings(struct net_device *dev, u32 stringset, u8 *data) 1024static void netvsc_get_strings(struct net_device *dev, u32 stringset, u8 *data)
1020{ 1025{
1021 struct net_device_context *ndc = netdev_priv(dev); 1026 struct net_device_context *ndc = netdev_priv(dev);
1022 struct netvsc_device *nvdev = rcu_dereference(ndc->nvdev); 1027 struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
1023 u8 *p = data; 1028 u8 *p = data;
1024 int i; 1029 int i;
1025 1030
@@ -1077,7 +1082,7 @@ netvsc_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info,
1077 u32 *rules) 1082 u32 *rules)
1078{ 1083{
1079 struct net_device_context *ndc = netdev_priv(dev); 1084 struct net_device_context *ndc = netdev_priv(dev);
1080 struct netvsc_device *nvdev = rcu_dereference(ndc->nvdev); 1085 struct netvsc_device *nvdev = rtnl_dereference(ndc->nvdev);
1081 1086
1082 if (!nvdev) 1087 if (!nvdev)
1083 return -ENODEV; 1088 return -ENODEV;
@@ -1127,7 +1132,7 @@ static int netvsc_get_rxfh(struct net_device *dev, u32 *indir, u8 *key,
1127 u8 *hfunc) 1132 u8 *hfunc)
1128{ 1133{
1129 struct net_device_context *ndc = netdev_priv(dev); 1134 struct net_device_context *ndc = netdev_priv(dev);
1130 struct netvsc_device *ndev = rcu_dereference(ndc->nvdev); 1135 struct netvsc_device *ndev = rtnl_dereference(ndc->nvdev);
1131 struct rndis_device *rndis_dev; 1136 struct rndis_device *rndis_dev;
1132 int i; 1137 int i;
1133 1138