diff options
author | stephen hemminger <stephen@networkplumber.org> | 2017-07-28 11:59:42 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-07-29 18:25:43 -0400 |
commit | 867047c4512aa65fb4cf66b253b51b830c7fa172 (patch) | |
tree | 61fe0635f7c2eaae5d6591d5df61f05c18a3ff11 /drivers/net/hyperv/netvsc_drv.c | |
parent | d6aac1f218873f2266de23280bffb909b4a98fbf (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.c | 15 |
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 | ||
924 | static int netvsc_set_mac_addr(struct net_device *ndev, void *p) | 924 | static 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, | |||
1019 | static void netvsc_get_strings(struct net_device *dev, u32 stringset, u8 *data) | 1024 | static 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 | ||