]> git.ipfire.org Git - people/ms/linux.git/commitdiff
IB/hfi1: Add running average for adaptive pio
authorMike Marciniszyn <mike.marciniszyn@intel.com>
Tue, 26 Feb 2019 16:46:16 +0000 (08:46 -0800)
committerJason Gunthorpe <jgg@mellanox.com>
Tue, 26 Mar 2019 12:33:21 +0000 (09:33 -0300)
The adaptive PIO implementation only considers the current packet size
when deciding between SDMA and pio for a packet.

This causes credit return forces if small and large packets are
interleaved.

Add a running average to avoid costly credit forces so that a large
sequence of small packets is required to go below the threshold that
chooses pio.

Reviewed-by: Michael J. Ruhl <michael.j.ruhl@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>
drivers/infiniband/hw/hfi1/qp.c
drivers/infiniband/hw/hfi1/verbs.c
drivers/infiniband/hw/hfi1/verbs.h

index 9b643c2409cf8bee5c28084b104c2839bc5768aa..1390172b488e20ad1aa1958651f39a9fd98df2c3 100644 (file)
@@ -742,6 +742,8 @@ void *qp_priv_alloc(struct rvt_dev_info *rdi, struct rvt_qp *qp)
                iowait_wakeup,
                iowait_sdma_drained,
                hfi1_init_priority);
+       /* Init to a value to start the running average correctly */
+       priv->s_running_pkt_size = piothreshold / 2;
        return priv;
 }
 
index 55a56b3d7f83a14f584bdf5b6015b1888394d6ca..b73ab7c64d91e1ce46a861f200065017c8d71995 100644 (file)
@@ -1223,15 +1223,16 @@ static inline send_routine get_send_routine(struct rvt_qp *qp,
        case IB_QPT_UD:
                break;
        case IB_QPT_UC:
-       case IB_QPT_RC: {
+       case IB_QPT_RC:
+               priv->s_running_pkt_size =
+                       (tx->s_cur_size + priv->s_running_pkt_size) / 2;
                if (piothreshold &&
-                   tx->s_cur_size <= min(piothreshold, qp->pmtu) &&
+                   priv->s_running_pkt_size <= min(piothreshold, qp->pmtu) &&
                    (BIT(ps->opcode & OPMASK) & pio_opmask[ps->opcode >> 5]) &&
                    iowait_sdma_pending(&priv->s_iowait) == 0 &&
                    !sdma_txreq_built(&tx->txreq))
                        return dd->process_pio_send;
                break;
-       }
        default:
                break;
        }
index 62ace0b2d17af5f680192ef9808d5bb6e0c83741..7ecb8ed4a1d9d0170ec71cbbd64797b00b2152ab 100644 (file)
@@ -170,6 +170,7 @@ struct hfi1_qp_priv {
        struct tid_flow_state flow_state;
        struct tid_rdma_qp_params tid_rdma;
        struct rvt_qp *owner;
+       u16 s_running_pkt_size;
        u8 hdr_type; /* 9B or 16B */
        struct rvt_sge_state tid_ss;       /* SGE state pointer for 2nd leg */
        atomic_t n_requests;               /* # of TID RDMA requests in the */