aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony Camuso <tcamuso@redhat.com>2014-06-23 06:38:03 -0400
committerDavid S. Miller <davem@davemloft.net>2014-06-23 17:32:19 -0400
commit8e091340cfcd6f96ca0dddb078ce28c407a6d44c (patch)
tree8423186f4faf1236c4f2ed3bfc01b69008782aff
parenta145df23ef32c7b933875f334ba28791ee75766e (diff)
enic: fix lockdep around devcmd_lock
We were experiencing occasional "BUG: scheduling while atomic" splats in our testing. Enabling DEBUG_SPINLOCK and DEBUG_LOCKDEP in the kernel exposed a lockdep in the enic driver. enic 0000:0b:00.0 eth2: Link UP ====================================================== [ INFO: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected ] 3.12.0-rc1.x86_64-dbg+ #2 Tainted: GF W ------------------------------------------------------ NetworkManager/4209 [HC0[0]:SC0[2]:HE1:SE0] is trying to acquire: (&(&enic->devcmd_lock)->rlock){+.+...}, at: [<ffffffffa026b7e4>] enic_dev_packet_filter+0x44/0x90 [enic] The fix was to replace spin_lock with spin_lock_bh for the enic devcmd_lock, so that soft irqs would be disabled while the lock is held. Signed-off-by: Sujith Sankar <ssujith@cisco.com> Signed-off-by: Tony Camuso <tcamuso@redhat.com> Signed-off-by: Govindarajulu Varadarajan <_govind@gmx.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/cisco/enic/enic_api.c4
-rw-r--r--drivers/net/ethernet/cisco/enic/enic_dev.c80
-rw-r--r--drivers/net/ethernet/cisco/enic/enic_dev.h4
-rw-r--r--drivers/net/ethernet/cisco/enic/enic_main.c16
4 files changed, 52 insertions, 52 deletions
diff --git a/drivers/net/ethernet/cisco/enic/enic_api.c b/drivers/net/ethernet/cisco/enic/enic_api.c
index e13efbdaa2ed..b161f24522b8 100644
--- a/drivers/net/ethernet/cisco/enic/enic_api.c
+++ b/drivers/net/ethernet/cisco/enic/enic_api.c
@@ -34,13 +34,13 @@ int enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf,
34 struct vnic_dev *vdev = enic->vdev; 34 struct vnic_dev *vdev = enic->vdev;
35 35
36 spin_lock(&enic->enic_api_lock); 36 spin_lock(&enic->enic_api_lock);
37 spin_lock(&enic->devcmd_lock); 37 spin_lock_bh(&enic->devcmd_lock);
38 38
39 vnic_dev_cmd_proxy_by_index_start(vdev, vf); 39 vnic_dev_cmd_proxy_by_index_start(vdev, vf);
40 err = vnic_dev_cmd(vdev, cmd, a0, a1, wait); 40 err = vnic_dev_cmd(vdev, cmd, a0, a1, wait);
41 vnic_dev_cmd_proxy_end(vdev); 41 vnic_dev_cmd_proxy_end(vdev);
42 42
43 spin_unlock(&enic->devcmd_lock); 43 spin_unlock_bh(&enic->devcmd_lock);
44 spin_unlock(&enic->enic_api_lock); 44 spin_unlock(&enic->enic_api_lock);
45 45
46 return err; 46 return err;
diff --git a/drivers/net/ethernet/cisco/enic/enic_dev.c b/drivers/net/ethernet/cisco/enic/enic_dev.c
index 3e27df522847..87ddc44b590e 100644
--- a/drivers/net/ethernet/cisco/enic/enic_dev.c
+++ b/drivers/net/ethernet/cisco/enic/enic_dev.c
@@ -29,9 +29,9 @@ int enic_dev_fw_info(struct enic *enic, struct vnic_devcmd_fw_info **fw_info)
29{ 29{
30 int err; 30 int err;
31 31
32 spin_lock(&enic->devcmd_lock); 32 spin_lock_bh(&enic->devcmd_lock);
33 err = vnic_dev_fw_info(enic->vdev, fw_info); 33 err = vnic_dev_fw_info(enic->vdev, fw_info);
34 spin_unlock(&enic->devcmd_lock); 34 spin_unlock_bh(&enic->devcmd_lock);
35 35
36 return err; 36 return err;
37} 37}
@@ -40,9 +40,9 @@ int enic_dev_stats_dump(struct enic *enic, struct vnic_stats **vstats)
40{ 40{
41 int err; 41 int err;
42 42
43 spin_lock(&enic->devcmd_lock); 43 spin_lock_bh(&enic->devcmd_lock);
44 err = vnic_dev_stats_dump(enic->vdev, vstats); 44 err = vnic_dev_stats_dump(enic->vdev, vstats);
45 spin_unlock(&enic->devcmd_lock); 45 spin_unlock_bh(&enic->devcmd_lock);
46 46
47 return err; 47 return err;
48} 48}
@@ -54,9 +54,9 @@ int enic_dev_add_station_addr(struct enic *enic)
54 if (!is_valid_ether_addr(enic->netdev->dev_addr)) 54 if (!is_valid_ether_addr(enic->netdev->dev_addr))
55 return -EADDRNOTAVAIL; 55 return -EADDRNOTAVAIL;
56 56
57 spin_lock(&enic->devcmd_lock); 57 spin_lock_bh(&enic->devcmd_lock);
58 err = vnic_dev_add_addr(enic->vdev, enic->netdev->dev_addr); 58 err = vnic_dev_add_addr(enic->vdev, enic->netdev->dev_addr);
59 spin_unlock(&enic->devcmd_lock); 59 spin_unlock_bh(&enic->devcmd_lock);
60 60
61 return err; 61 return err;
62} 62}
@@ -68,9 +68,9 @@ int enic_dev_del_station_addr(struct enic *enic)
68 if (!is_valid_ether_addr(enic->netdev->dev_addr)) 68 if (!is_valid_ether_addr(enic->netdev->dev_addr))
69 return -EADDRNOTAVAIL; 69 return -EADDRNOTAVAIL;
70 70
71 spin_lock(&enic->devcmd_lock); 71 spin_lock_bh(&enic->devcmd_lock);
72 err = vnic_dev_del_addr(enic->vdev, enic->netdev->dev_addr); 72 err = vnic_dev_del_addr(enic->vdev, enic->netdev->dev_addr);
73 spin_unlock(&enic->devcmd_lock); 73 spin_unlock_bh(&enic->devcmd_lock);
74 74
75 return err; 75 return err;
76} 76}
@@ -80,10 +80,10 @@ int enic_dev_packet_filter(struct enic *enic, int directed, int multicast,
80{ 80{
81 int err; 81 int err;
82 82
83 spin_lock(&enic->devcmd_lock); 83 spin_lock_bh(&enic->devcmd_lock);
84 err = vnic_dev_packet_filter(enic->vdev, directed, 84 err = vnic_dev_packet_filter(enic->vdev, directed,
85 multicast, broadcast, promisc, allmulti); 85 multicast, broadcast, promisc, allmulti);
86 spin_unlock(&enic->devcmd_lock); 86 spin_unlock_bh(&enic->devcmd_lock);
87 87
88 return err; 88 return err;
89} 89}
@@ -92,9 +92,9 @@ int enic_dev_add_addr(struct enic *enic, const u8 *addr)
92{ 92{
93 int err; 93 int err;
94 94
95 spin_lock(&enic->devcmd_lock); 95 spin_lock_bh(&enic->devcmd_lock);
96 err = vnic_dev_add_addr(enic->vdev, addr); 96 err = vnic_dev_add_addr(enic->vdev, addr);
97 spin_unlock(&enic->devcmd_lock); 97 spin_unlock_bh(&enic->devcmd_lock);
98 98
99 return err; 99 return err;
100} 100}
@@ -103,9 +103,9 @@ int enic_dev_del_addr(struct enic *enic, const u8 *addr)
103{ 103{
104 int err; 104 int err;
105 105
106 spin_lock(&enic->devcmd_lock); 106 spin_lock_bh(&enic->devcmd_lock);
107 err = vnic_dev_del_addr(enic->vdev, addr); 107 err = vnic_dev_del_addr(enic->vdev, addr);
108 spin_unlock(&enic->devcmd_lock); 108 spin_unlock_bh(&enic->devcmd_lock);
109 109
110 return err; 110 return err;
111} 111}
@@ -114,9 +114,9 @@ int enic_dev_notify_unset(struct enic *enic)
114{ 114{
115 int err; 115 int err;
116 116
117 spin_lock(&enic->devcmd_lock); 117 spin_lock_bh(&enic->devcmd_lock);
118 err = vnic_dev_notify_unset(enic->vdev); 118 err = vnic_dev_notify_unset(enic->vdev);
119 spin_unlock(&enic->devcmd_lock); 119 spin_unlock_bh(&enic->devcmd_lock);
120 120
121 return err; 121 return err;
122} 122}
@@ -125,9 +125,9 @@ int enic_dev_hang_notify(struct enic *enic)
125{ 125{
126 int err; 126 int err;
127 127
128 spin_lock(&enic->devcmd_lock); 128 spin_lock_bh(&enic->devcmd_lock);
129 err = vnic_dev_hang_notify(enic->vdev); 129 err = vnic_dev_hang_notify(enic->vdev);
130 spin_unlock(&enic->devcmd_lock); 130 spin_unlock_bh(&enic->devcmd_lock);
131 131
132 return err; 132 return err;
133} 133}
@@ -136,10 +136,10 @@ int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic)
136{ 136{
137 int err; 137 int err;
138 138
139 spin_lock(&enic->devcmd_lock); 139 spin_lock_bh(&enic->devcmd_lock);
140 err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev, 140 err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev,
141 IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN); 141 IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN);
142 spin_unlock(&enic->devcmd_lock); 142 spin_unlock_bh(&enic->devcmd_lock);
143 143
144 return err; 144 return err;
145} 145}
@@ -148,9 +148,9 @@ int enic_dev_enable(struct enic *enic)
148{ 148{
149 int err; 149 int err;
150 150
151 spin_lock(&enic->devcmd_lock); 151 spin_lock_bh(&enic->devcmd_lock);
152 err = vnic_dev_enable_wait(enic->vdev); 152 err = vnic_dev_enable_wait(enic->vdev);
153 spin_unlock(&enic->devcmd_lock); 153 spin_unlock_bh(&enic->devcmd_lock);
154 154
155 return err; 155 return err;
156} 156}
@@ -159,9 +159,9 @@ int enic_dev_disable(struct enic *enic)
159{ 159{
160 int err; 160 int err;
161 161
162 spin_lock(&enic->devcmd_lock); 162 spin_lock_bh(&enic->devcmd_lock);
163 err = vnic_dev_disable(enic->vdev); 163 err = vnic_dev_disable(enic->vdev);
164 spin_unlock(&enic->devcmd_lock); 164 spin_unlock_bh(&enic->devcmd_lock);
165 165
166 return err; 166 return err;
167} 167}
@@ -170,9 +170,9 @@ int enic_dev_intr_coal_timer_info(struct enic *enic)
170{ 170{
171 int err; 171 int err;
172 172
173 spin_lock(&enic->devcmd_lock); 173 spin_lock_bh(&enic->devcmd_lock);
174 err = vnic_dev_intr_coal_timer_info(enic->vdev); 174 err = vnic_dev_intr_coal_timer_info(enic->vdev);
175 spin_unlock(&enic->devcmd_lock); 175 spin_unlock_bh(&enic->devcmd_lock);
176 176
177 return err; 177 return err;
178} 178}
@@ -181,9 +181,9 @@ int enic_vnic_dev_deinit(struct enic *enic)
181{ 181{
182 int err; 182 int err;
183 183
184 spin_lock(&enic->devcmd_lock); 184 spin_lock_bh(&enic->devcmd_lock);
185 err = vnic_dev_deinit(enic->vdev); 185 err = vnic_dev_deinit(enic->vdev);
186 spin_unlock(&enic->devcmd_lock); 186 spin_unlock_bh(&enic->devcmd_lock);
187 187
188 return err; 188 return err;
189} 189}
@@ -192,10 +192,10 @@ int enic_dev_init_prov2(struct enic *enic, struct vic_provinfo *vp)
192{ 192{
193 int err; 193 int err;
194 194
195 spin_lock(&enic->devcmd_lock); 195 spin_lock_bh(&enic->devcmd_lock);
196 err = vnic_dev_init_prov2(enic->vdev, 196 err = vnic_dev_init_prov2(enic->vdev,
197 (u8 *)vp, vic_provinfo_size(vp)); 197 (u8 *)vp, vic_provinfo_size(vp));
198 spin_unlock(&enic->devcmd_lock); 198 spin_unlock_bh(&enic->devcmd_lock);
199 199
200 return err; 200 return err;
201} 201}
@@ -204,9 +204,9 @@ int enic_dev_deinit_done(struct enic *enic, int *status)
204{ 204{
205 int err; 205 int err;
206 206
207 spin_lock(&enic->devcmd_lock); 207 spin_lock_bh(&enic->devcmd_lock);
208 err = vnic_dev_deinit_done(enic->vdev, status); 208 err = vnic_dev_deinit_done(enic->vdev, status);
209 spin_unlock(&enic->devcmd_lock); 209 spin_unlock_bh(&enic->devcmd_lock);
210 210
211 return err; 211 return err;
212} 212}
@@ -217,9 +217,9 @@ int enic_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid)
217 struct enic *enic = netdev_priv(netdev); 217 struct enic *enic = netdev_priv(netdev);
218 int err; 218 int err;
219 219
220 spin_lock(&enic->devcmd_lock); 220 spin_lock_bh(&enic->devcmd_lock);
221 err = enic_add_vlan(enic, vid); 221 err = enic_add_vlan(enic, vid);
222 spin_unlock(&enic->devcmd_lock); 222 spin_unlock_bh(&enic->devcmd_lock);
223 223
224 return err; 224 return err;
225} 225}
@@ -230,9 +230,9 @@ int enic_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid)
230 struct enic *enic = netdev_priv(netdev); 230 struct enic *enic = netdev_priv(netdev);
231 int err; 231 int err;
232 232
233 spin_lock(&enic->devcmd_lock); 233 spin_lock_bh(&enic->devcmd_lock);
234 err = enic_del_vlan(enic, vid); 234 err = enic_del_vlan(enic, vid);
235 spin_unlock(&enic->devcmd_lock); 235 spin_unlock_bh(&enic->devcmd_lock);
236 236
237 return err; 237 return err;
238} 238}
@@ -241,9 +241,9 @@ int enic_dev_enable2(struct enic *enic, int active)
241{ 241{
242 int err; 242 int err;
243 243
244 spin_lock(&enic->devcmd_lock); 244 spin_lock_bh(&enic->devcmd_lock);
245 err = vnic_dev_enable2(enic->vdev, active); 245 err = vnic_dev_enable2(enic->vdev, active);
246 spin_unlock(&enic->devcmd_lock); 246 spin_unlock_bh(&enic->devcmd_lock);
247 247
248 return err; 248 return err;
249} 249}
@@ -252,9 +252,9 @@ int enic_dev_enable2_done(struct enic *enic, int *status)
252{ 252{
253 int err; 253 int err;
254 254
255 spin_lock(&enic->devcmd_lock); 255 spin_lock_bh(&enic->devcmd_lock);
256 err = vnic_dev_enable2_done(enic->vdev, status); 256 err = vnic_dev_enable2_done(enic->vdev, status);
257 spin_unlock(&enic->devcmd_lock); 257 spin_unlock_bh(&enic->devcmd_lock);
258 258
259 return err; 259 return err;
260} 260}
diff --git a/drivers/net/ethernet/cisco/enic/enic_dev.h b/drivers/net/ethernet/cisco/enic/enic_dev.h
index 36ea1ab25f6a..10bb970b2f35 100644
--- a/drivers/net/ethernet/cisco/enic/enic_dev.h
+++ b/drivers/net/ethernet/cisco/enic/enic_dev.h
@@ -28,7 +28,7 @@
28 */ 28 */
29#define ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnicdevcmdfn, ...) \ 29#define ENIC_DEVCMD_PROXY_BY_INDEX(vf, err, enic, vnicdevcmdfn, ...) \
30 do { \ 30 do { \
31 spin_lock(&enic->devcmd_lock); \ 31 spin_lock_bh(&enic->devcmd_lock); \
32 if (enic_is_valid_vf(enic, vf)) { \ 32 if (enic_is_valid_vf(enic, vf)) { \
33 vnic_dev_cmd_proxy_by_index_start(enic->vdev, vf); \ 33 vnic_dev_cmd_proxy_by_index_start(enic->vdev, vf); \
34 err = vnicdevcmdfn(enic->vdev, ##__VA_ARGS__); \ 34 err = vnicdevcmdfn(enic->vdev, ##__VA_ARGS__); \
@@ -36,7 +36,7 @@
36 } else { \ 36 } else { \
37 err = vnicdevcmdfn(enic->vdev, ##__VA_ARGS__); \ 37 err = vnicdevcmdfn(enic->vdev, ##__VA_ARGS__); \
38 } \ 38 } \
39 spin_unlock(&enic->devcmd_lock); \ 39 spin_unlock_bh(&enic->devcmd_lock); \
40 } while (0) 40 } while (0)
41 41
42int enic_dev_fw_info(struct enic *enic, struct vnic_devcmd_fw_info **fw_info); 42int enic_dev_fw_info(struct enic *enic, struct vnic_devcmd_fw_info **fw_info);
diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c
index a302f1b3e8ff..5448df2d78c2 100644
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
@@ -1465,7 +1465,7 @@ static int enic_dev_notify_set(struct enic *enic)
1465{ 1465{
1466 int err; 1466 int err;
1467 1467
1468 spin_lock(&enic->devcmd_lock); 1468 spin_lock_bh(&enic->devcmd_lock);
1469 switch (vnic_dev_get_intr_mode(enic->vdev)) { 1469 switch (vnic_dev_get_intr_mode(enic->vdev)) {
1470 case VNIC_DEV_INTR_MODE_INTX: 1470 case VNIC_DEV_INTR_MODE_INTX:
1471 err = vnic_dev_notify_set(enic->vdev, 1471 err = vnic_dev_notify_set(enic->vdev,
@@ -1479,7 +1479,7 @@ static int enic_dev_notify_set(struct enic *enic)
1479 err = vnic_dev_notify_set(enic->vdev, -1 /* no intr */); 1479 err = vnic_dev_notify_set(enic->vdev, -1 /* no intr */);
1480 break; 1480 break;
1481 } 1481 }
1482 spin_unlock(&enic->devcmd_lock); 1482 spin_unlock_bh(&enic->devcmd_lock);
1483 1483
1484 return err; 1484 return err;
1485} 1485}
@@ -1804,11 +1804,11 @@ static int enic_set_rsskey(struct enic *enic)
1804 1804
1805 memcpy(rss_key_buf_va, &rss_key, sizeof(union vnic_rss_key)); 1805 memcpy(rss_key_buf_va, &rss_key, sizeof(union vnic_rss_key));
1806 1806
1807 spin_lock(&enic->devcmd_lock); 1807 spin_lock_bh(&enic->devcmd_lock);
1808 err = enic_set_rss_key(enic, 1808 err = enic_set_rss_key(enic,
1809 rss_key_buf_pa, 1809 rss_key_buf_pa,
1810 sizeof(union vnic_rss_key)); 1810 sizeof(union vnic_rss_key));
1811 spin_unlock(&enic->devcmd_lock); 1811 spin_unlock_bh(&enic->devcmd_lock);
1812 1812
1813 pci_free_consistent(enic->pdev, sizeof(union vnic_rss_key), 1813 pci_free_consistent(enic->pdev, sizeof(union vnic_rss_key),
1814 rss_key_buf_va, rss_key_buf_pa); 1814 rss_key_buf_va, rss_key_buf_pa);
@@ -1831,11 +1831,11 @@ static int enic_set_rsscpu(struct enic *enic, u8 rss_hash_bits)
1831 for (i = 0; i < (1 << rss_hash_bits); i++) 1831 for (i = 0; i < (1 << rss_hash_bits); i++)
1832 (*rss_cpu_buf_va).cpu[i/4].b[i%4] = i % enic->rq_count; 1832 (*rss_cpu_buf_va).cpu[i/4].b[i%4] = i % enic->rq_count;
1833 1833
1834 spin_lock(&enic->devcmd_lock); 1834 spin_lock_bh(&enic->devcmd_lock);
1835 err = enic_set_rss_cpu(enic, 1835 err = enic_set_rss_cpu(enic,
1836 rss_cpu_buf_pa, 1836 rss_cpu_buf_pa,
1837 sizeof(union vnic_rss_cpu)); 1837 sizeof(union vnic_rss_cpu));
1838 spin_unlock(&enic->devcmd_lock); 1838 spin_unlock_bh(&enic->devcmd_lock);
1839 1839
1840 pci_free_consistent(enic->pdev, sizeof(union vnic_rss_cpu), 1840 pci_free_consistent(enic->pdev, sizeof(union vnic_rss_cpu),
1841 rss_cpu_buf_va, rss_cpu_buf_pa); 1841 rss_cpu_buf_va, rss_cpu_buf_pa);
@@ -1853,13 +1853,13 @@ static int enic_set_niccfg(struct enic *enic, u8 rss_default_cpu,
1853 /* Enable VLAN tag stripping. 1853 /* Enable VLAN tag stripping.
1854 */ 1854 */
1855 1855
1856 spin_lock(&enic->devcmd_lock); 1856 spin_lock_bh(&enic->devcmd_lock);
1857 err = enic_set_nic_cfg(enic, 1857 err = enic_set_nic_cfg(enic,
1858 rss_default_cpu, rss_hash_type, 1858 rss_default_cpu, rss_hash_type,
1859 rss_hash_bits, rss_base_cpu, 1859 rss_hash_bits, rss_base_cpu,
1860 rss_enable, tso_ipid_split_en, 1860 rss_enable, tso_ipid_split_en,
1861 ig_vlan_strip_en); 1861 ig_vlan_strip_en);
1862 spin_unlock(&enic->devcmd_lock); 1862 spin_unlock_bh(&enic->devcmd_lock);
1863 1863
1864 return err; 1864 return err;
1865} 1865}