Skip to content

Commit a379d69

Browse files
nvishwa1dledford
authored andcommitted
IB/opa_vnic: Use spinlock instead of mutex for stats_lock
Stats can be read from atomic context, hence make stats_lock as a spinlock. Fix the following trace with debug kernel. BUG: sleeping function called from invalid context at kernel/locking/mutex.c:238 in_atomic(): 1, irqs_disabled(): 0, pid: 6487, name: sadc Call Trace: dump_stack+0x63/0x90 ___might_sleep+0xda/0x130 __might_sleep+0x4a/0x90 mutex_lock+0x20/0x50 opa_vnic_get_stats64+0x56/0x140 [opa_vnic] dev_get_stats+0x74/0x130 dev_seq_printf_stats+0x37/0x120 dev_seq_show+0x14/0x30 seq_read+0x26d/0x3d0 Reviewed-by: Mike Marciniszyn <[email protected]> Reviewed-by: Dennis Dalessandro <[email protected]> Signed-off-by: Niranjana Vishwanathapura <[email protected]> Signed-off-by: Doug Ledford <[email protected]>
1 parent 0568c46 commit a379d69

File tree

4 files changed

+10
-12
lines changed

4 files changed

+10
-12
lines changed

drivers/infiniband/ulp/opa_vnic/opa_vnic_ethtool.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,15 +146,15 @@ static void vnic_get_ethtool_stats(struct net_device *netdev,
146146
int i;
147147

148148
memset(&vstats, 0, sizeof(vstats));
149-
mutex_lock(&adapter->stats_lock);
149+
spin_lock(&adapter->stats_lock);
150150
adapter->rn_ops->ndo_get_stats64(netdev, &vstats.netstats);
151+
spin_unlock(&adapter->stats_lock);
151152
for (i = 0; i < VNIC_STATS_LEN; i++) {
152153
char *p = (char *)&vstats + vnic_gstrings_stats[i].stat_offset;
153154

154155
data[i] = (vnic_gstrings_stats[i].sizeof_stat ==
155156
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
156157
}
157-
mutex_unlock(&adapter->stats_lock);
158158
}
159159

160160
/* vnic_get_strings - get strings */

drivers/infiniband/ulp/opa_vnic/opa_vnic_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ struct opa_vnic_adapter {
214214
struct mutex mactbl_lock;
215215

216216
/* Lock used to protect access to vnic counters */
217-
struct mutex stats_lock;
217+
spinlock_t stats_lock;
218218

219219
u8 flow_tbl[OPA_VNIC_FLOW_TBL_SIZE];
220220

drivers/infiniband/ulp/opa_vnic/opa_vnic_netdev.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ static void opa_vnic_get_stats64(struct net_device *netdev,
6969
struct opa_vnic_stats vstats;
7070

7171
memset(&vstats, 0, sizeof(vstats));
72-
mutex_lock(&adapter->stats_lock);
72+
spin_lock(&adapter->stats_lock);
7373
adapter->rn_ops->ndo_get_stats64(netdev, &vstats.netstats);
74-
mutex_unlock(&adapter->stats_lock);
74+
spin_unlock(&adapter->stats_lock);
7575
memcpy(stats, &vstats.netstats, sizeof(*stats));
7676
}
7777

@@ -344,7 +344,7 @@ struct opa_vnic_adapter *opa_vnic_add_netdev(struct ib_device *ibdev,
344344
netdev->hard_header_len += OPA_VNIC_SKB_HEADROOM;
345345
mutex_init(&adapter->lock);
346346
mutex_init(&adapter->mactbl_lock);
347-
mutex_init(&adapter->stats_lock);
347+
spin_lock_init(&adapter->stats_lock);
348348

349349
SET_NETDEV_DEV(netdev, ibdev->dev.parent);
350350

@@ -364,7 +364,6 @@ struct opa_vnic_adapter *opa_vnic_add_netdev(struct ib_device *ibdev,
364364
netdev_err:
365365
mutex_destroy(&adapter->lock);
366366
mutex_destroy(&adapter->mactbl_lock);
367-
mutex_destroy(&adapter->stats_lock);
368367
kfree(adapter);
369368
adapter_err:
370369
ibdev->free_rdma_netdev(netdev);
@@ -383,7 +382,6 @@ void opa_vnic_rem_netdev(struct opa_vnic_adapter *adapter)
383382
opa_vnic_release_mac_tbl(adapter);
384383
mutex_destroy(&adapter->lock);
385384
mutex_destroy(&adapter->mactbl_lock);
386-
mutex_destroy(&adapter->stats_lock);
387385
kfree(adapter);
388386
ibdev->free_rdma_netdev(netdev);
389387
}

drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ void opa_vnic_get_summary_counters(struct opa_vnic_adapter *adapter,
8989
u64 *src;
9090

9191
memset(&vstats, 0, sizeof(vstats));
92-
mutex_lock(&adapter->stats_lock);
92+
spin_lock(&adapter->stats_lock);
9393
adapter->rn_ops->ndo_get_stats64(adapter->netdev, &vstats.netstats);
94-
mutex_unlock(&adapter->stats_lock);
94+
spin_unlock(&adapter->stats_lock);
9595

9696
cntrs->vp_instance = cpu_to_be16(adapter->vport_num);
9797
cntrs->vesw_id = cpu_to_be16(adapter->info.vesw.vesw_id);
@@ -128,9 +128,9 @@ void opa_vnic_get_error_counters(struct opa_vnic_adapter *adapter,
128128
struct opa_vnic_stats vstats;
129129

130130
memset(&vstats, 0, sizeof(vstats));
131-
mutex_lock(&adapter->stats_lock);
131+
spin_lock(&adapter->stats_lock);
132132
adapter->rn_ops->ndo_get_stats64(adapter->netdev, &vstats.netstats);
133-
mutex_unlock(&adapter->stats_lock);
133+
spin_unlock(&adapter->stats_lock);
134134

135135
cntrs->vp_instance = cpu_to_be16(adapter->vport_num);
136136
cntrs->vesw_id = cpu_to_be16(adapter->info.vesw.vesw_id);

0 commit comments

Comments
 (0)