From: Knut Omang Date: Thu, 2 Jun 2016 08:39:14 +0000 (+0200) Subject: sif: epsc: Fix keepalive timeouts X-Git-Tag: v4.1.12-92~129^2~33 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=104ab9e48e7f009e514ecdb7223a18fc2f1c5c40;p=users%2Fjedix%2Flinux-maple.git sif: epsc: Fix keepalive timeouts * If a keepalive is posted, do not reset the general timeout interval. This effectively caused EPSC requests not ever to time out. * Remove a superfluous timeout reset in sif_eps_poll_cqe The timeout was already set correctly during post. * Also avoid sending keepalives if the sender has given up. Signed-off-by: Knut Omang --- diff --git a/drivers/infiniband/hw/sif/sif_epsc.c b/drivers/infiniband/hw/sif/sif_epsc.c index c38e9122e7a0..deb72880c2f9 100644 --- a/drivers/infiniband/hw/sif/sif_epsc.c +++ b/drivers/infiniband/hw/sif/sif_epsc.c @@ -1071,15 +1071,17 @@ static inline int __eps_process_cqe(struct sif_dev *sdev, enum psif_mbox_type ep es->first_seq = (es->first_seq + 1) & ~CSR_ONLINE_MASK; ret++; } - if (ret < 0) + if (ret < 0) { sif_log(sdev, SIF_INFO, "failed with status %d", ret); - else if (ret > 0) { + return ret; + } + + if (ret > 0) { sif_log(sdev, SIF_EPS, "processed %d (%d with resp) requests - first_seq 0x%x, oustanding %d", ret, rsp_cnt, es->first_seq, atomic_read(&es->cur_reqs)); mb(); } - __sif_eps_send_keep_alive(sdev, eps_num, false); return ret; @@ -1137,7 +1139,8 @@ static int __sif_post_eps_wr(struct sif_dev *sdev, enum psif_mbox_type eps_num, int ret = 0; bool waiting = false; - es->timeout = jiffies + timeout; + if (unlikely(lreq->opcode != EPSC_KEEP_ALIVE)) + es->timeout = jiffies + timeout; restart: if (atomic_read(&es->cur_reqs)) { @@ -1279,7 +1282,6 @@ int sif_eps_poll_cqe(struct sif_dev *sdev, enum psif_mbox_type eps_num, ulong timeout = sdev->min_resp_ticks * 8; int npolled = 0; - es->timeout = jiffies + timeout; while (seq_num != get_eps_mailbox_seq_num(lcqe->rsp)) { ret = eps_process_cqe(sdev, eps_num); if (ret < 0)