]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sif: epsc: Fix keepalive timeouts
authorKnut Omang <knut.omang@oracle.com>
Thu, 2 Jun 2016 08:39:14 +0000 (10:39 +0200)
committerKnut Omang <knut.omang@oracle.com>
Sun, 3 Jul 2016 14:01:40 +0000 (16:01 +0200)
* 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 <knut.omang@oracle.com>
drivers/infiniband/hw/sif/sif_epsc.c

index c38e9122e7a07e5e31d92bc37b1f25d273a454de..deb72880c2f9963f9a7d72d5f17a790a9b89ede6 100644 (file)
@@ -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)