On Fri, Oct 25, 2024 at 09:46:19AM +0200, Wenjia Zhang wrote: > From: Halil Pasic <pasic@xxxxxxxxxxxxx> > > The current value of SMC_WR_BUF_CNT is 16 which leads to heavy > contention on the wr_tx_wait workqueue of the SMC-R linkgroup and its > spinlock when many connections are competing for the buffer. Currently > up to 256 connections per linkgroup are supported. > > To make things worse when finally a buffer becomes available and > smc_wr_tx_put_slot() signals the linkgroup's wr_tx_wait wq, because > WQ_FLAG_EXCLUSIVE is not used all the waiters get woken up, most of the > time a single one can proceed, and the rest is contending on the > spinlock of the wq to go to sleep again. > > For some reason include/linux/wait.h does not offer a top level wrapper > macro for wait_event with interruptible, exclusive and timeout. I did > not spend too many cycles on thinking if that is even a combination that > makes sense (on the quick I don't see why not) and conversely I > refrained from making an attempt to accomplish the interruptible, > exclusive and timeout combo by using the abstraction-wise lower > level __wait_event interface. > > To alleviate the tx performance bottleneck and the CPU overhead due to > the spinlock contention, let us increase SMC_WR_BUF_CNT to 256. > > Signed-off-by: Halil Pasic <pasic@xxxxxxxxxxxxx> > Reported-by: Nils Hoppmann <niho@xxxxxxxxxxxxx> > Reviewed-by: Wenjia Zhang <wenjia@xxxxxxxxxxxxx> > Signed-off-by: Wenjia Zhang <wenjia@xxxxxxxxxxxxx> Reviewed-by: Simon Horman <horms@xxxxxxxxxx>