Skip to content

Commit 05c03df

Browse files
drmiller-cnijgunthorpe
authored andcommitted
RDMA/hfi1: Prevent use of lock before it is initialized
If there is a failure during probe of hfi1 before the sdma_map_lock is initialized, the call to hfi1_free_devdata() will attempt to use a lock that has not been initialized. If the locking correctness validator is on then an INFO message and stack trace resembling the following may be seen: INFO: trying to register non-static key. The code is fine but needs lockdep annotation, or maybe you didn't initialize this object before use? turning off the locking correctness validator. Call Trace: register_lock_class+0x11b/0x880 __lock_acquire+0xf3/0x7930 lock_acquire+0xff/0x2d0 _raw_spin_lock_irq+0x46/0x60 sdma_clean+0x42a/0x660 [hfi1] hfi1_free_devdata+0x3a7/0x420 [hfi1] init_one+0x867/0x11a0 [hfi1] pci_device_probe+0x40e/0x8d0 The use of sdma_map_lock in sdma_clean() is for freeing the sdma_map memory, and sdma_map is not allocated/initialized until after sdma_map_lock has been initialized. This code only needs to be run if sdma_map is not NULL, and so checking for that condition will avoid trying to use the lock before it is initialized. Fixes: 473291b ("IB/hfi1: Fix for early release of sdma context") Fixes: 7724105 ("IB/hfi1: add driver files") Link: https://lore.kernel.org/r/[email protected] Reported-by: Zheyu Ma <[email protected]> Signed-off-by: Douglas Miller <[email protected]> Signed-off-by: Dennis Dalessandro <[email protected]> Signed-off-by: Jason Gunthorpe <[email protected]>
1 parent 7f60951 commit 05c03df

File tree

1 file changed

+7
-5
lines changed
  • drivers/infiniband/hw/hfi1

1 file changed

+7
-5
lines changed

drivers/infiniband/hw/hfi1/sdma.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,11 +1288,13 @@ void sdma_clean(struct hfi1_devdata *dd, size_t num_engines)
12881288
kvfree(sde->tx_ring);
12891289
sde->tx_ring = NULL;
12901290
}
1291-
spin_lock_irq(&dd->sde_map_lock);
1292-
sdma_map_free(rcu_access_pointer(dd->sdma_map));
1293-
RCU_INIT_POINTER(dd->sdma_map, NULL);
1294-
spin_unlock_irq(&dd->sde_map_lock);
1295-
synchronize_rcu();
1291+
if (rcu_access_pointer(dd->sdma_map)) {
1292+
spin_lock_irq(&dd->sde_map_lock);
1293+
sdma_map_free(rcu_access_pointer(dd->sdma_map));
1294+
RCU_INIT_POINTER(dd->sdma_map, NULL);
1295+
spin_unlock_irq(&dd->sde_map_lock);
1296+
synchronize_rcu();
1297+
}
12961298
kfree(dd->per_sdma);
12971299
dd->per_sdma = NULL;
12981300

0 commit comments

Comments
 (0)