IB/hfi1: Reduce lock contention on iowait_lock for sdma and pio
Commit4e045572e2
("IB/hfi1: Add unique txwait_lock for txreq events") laid the ground work to support per resource waiting locking. This patch adds that with a lock unique to each sdma engine and pio sendcontext and makes necessary changes for verbs, PSM, and vnic to use the new locks. This is particularly beneficial for smaller messages that will exhaust resources at a faster rate. Fixes:7724105686
("IB/hfi1: add driver files") Reviewed-by: Gary Leshner <Gary.S.Leshner@intel.com> Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Bu işleme şunda yer alıyor:

işlemeyi yapan:
Jason Gunthorpe

ebeveyn
18912c4524
işleme
9aefcabe57
@@ -1424,6 +1424,7 @@ int sdma_init(struct hfi1_devdata *dd, u8 port)
|
||||
seqlock_init(&sde->head_lock);
|
||||
spin_lock_init(&sde->senddmactrl_lock);
|
||||
spin_lock_init(&sde->flushlist_lock);
|
||||
seqlock_init(&sde->waitlock);
|
||||
/* insure there is always a zero bit */
|
||||
sde->ahg_bits = 0xfffffffe00000000ULL;
|
||||
|
||||
@@ -1758,7 +1759,6 @@ static void sdma_desc_avail(struct sdma_engine *sde, uint avail)
|
||||
struct iowait *wait, *nw;
|
||||
struct iowait *waits[SDMA_WAIT_BATCH_SIZE];
|
||||
uint i, n = 0, seq, max_idx = 0;
|
||||
struct hfi1_ibdev *dev = &sde->dd->verbs_dev;
|
||||
u8 max_starved_cnt = 0;
|
||||
|
||||
#ifdef CONFIG_SDMA_VERBOSITY
|
||||
@@ -1768,10 +1768,10 @@ static void sdma_desc_avail(struct sdma_engine *sde, uint avail)
|
||||
#endif
|
||||
|
||||
do {
|
||||
seq = read_seqbegin(&dev->iowait_lock);
|
||||
seq = read_seqbegin(&sde->waitlock);
|
||||
if (!list_empty(&sde->dmawait)) {
|
||||
/* at least one item */
|
||||
write_seqlock(&dev->iowait_lock);
|
||||
write_seqlock(&sde->waitlock);
|
||||
/* Harvest waiters wanting DMA descriptors */
|
||||
list_for_each_entry_safe(
|
||||
wait,
|
||||
@@ -1794,10 +1794,10 @@ static void sdma_desc_avail(struct sdma_engine *sde, uint avail)
|
||||
list_del_init(&wait->list);
|
||||
waits[n++] = wait;
|
||||
}
|
||||
write_sequnlock(&dev->iowait_lock);
|
||||
write_sequnlock(&sde->waitlock);
|
||||
break;
|
||||
}
|
||||
} while (read_seqretry(&dev->iowait_lock, seq));
|
||||
} while (read_seqretry(&sde->waitlock, seq));
|
||||
|
||||
/* Schedule the most starved one first */
|
||||
if (n)
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle