diff options
author | Ursula Braun <ubraun@linux.ibm.com> | 2019-11-14 13:02:44 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-11-15 12:28:28 -0800 |
commit | 15e1b99aadfb2766f9379a23a0fc1d4336c8cd8e (patch) | |
tree | 014c2503b27169475f41adb43989cdff0782a594 /net/smc/smc_wr.c | |
parent | 5edd6b9cb8d7c6c346c93c52a53735591127e879 (diff) | |
download | linux-15e1b99aadfb2766f9379a23a0fc1d4336c8cd8e.tar.gz |
net/smc: no WR buffer wait for terminating link group
Avoid waiting for a free work request buffer, if the link group
is already terminating.
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/smc/smc_wr.c')
-rw-r--r-- | net/smc/smc_wr.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/smc/smc_wr.c b/net/smc/smc_wr.c index 50743dc56c86..619dd89fbac0 100644 --- a/net/smc/smc_wr.c +++ b/net/smc/smc_wr.c @@ -75,7 +75,7 @@ static inline void smc_wr_tx_process_cqe(struct ib_wc *wc) link->wr_reg_state = FAILED; else link->wr_reg_state = CONFIRMED; - wake_up(&link->wr_reg_wait); + smc_wr_wakeup_reg_wait(link); return; } @@ -171,6 +171,7 @@ int smc_wr_tx_get_free_slot(struct smc_link *link, struct smc_rdma_wr **wr_rdma_buf, struct smc_wr_tx_pend_priv **wr_pend_priv) { + struct smc_link_group *lgr = smc_get_lgr(link); struct smc_wr_tx_pend *wr_pend; u32 idx = link->wr_tx_cnt; struct ib_send_wr *wr_ib; @@ -179,19 +180,20 @@ int smc_wr_tx_get_free_slot(struct smc_link *link, *wr_buf = NULL; *wr_pend_priv = NULL; - if (in_softirq()) { + if (in_softirq() || lgr->terminating) { rc = smc_wr_tx_get_free_slot_index(link, &idx); if (rc) return rc; } else { - rc = wait_event_timeout( + rc = wait_event_interruptible_timeout( link->wr_tx_wait, link->state == SMC_LNK_INACTIVE || + lgr->terminating || (smc_wr_tx_get_free_slot_index(link, &idx) != -EBUSY), SMC_WR_TX_WAIT_FREE_SLOT_TIME); if (!rc) { /* timeout - terminate connections */ - smc_lgr_terminate_sched(smc_get_lgr(link)); + smc_lgr_terminate_sched(lgr); return -EPIPE; } if (idx == link->wr_tx_cnt) |