IB/mthca: fix posting of send lists of length >= 255 on mem-free HCAs

On mem-free HCAs, when posting a long list of send requests, a
doorbell must be rung every 255 requests. Add code to handle this.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by Michael S. Tsirkin and committed by Roland Dreier e0ae9ecf 267ee88e

+31 -3
+29 -2
drivers/infiniband/hw/mthca/mthca_qp.c
··· 1822 { 1823 struct mthca_dev *dev = to_mdev(ibqp->device); 1824 struct mthca_qp *qp = to_mqp(ibqp); 1825 void *wqe; 1826 void *prev_wqe; 1827 unsigned long flags; ··· 1842 ind = qp->sq.head & (qp->sq.max - 1); 1843 1844 for (nreq = 0; wr; ++nreq, wr = wr->next) { 1845 if (mthca_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { 1846 mthca_err(dev, "SQ %06x full (%u head, %u tail," 1847 " %d max, %d nreq)\n", qp->qpn, ··· 2046 2047 out: 2048 if (likely(nreq)) { 2049 - __be32 doorbell[2]; 2050 - 2051 doorbell[0] = cpu_to_be32((nreq << 24) | 2052 ((qp->sq.head & 0xffff) << 8) | 2053 f0 | op0);
··· 1822 { 1823 struct mthca_dev *dev = to_mdev(ibqp->device); 1824 struct mthca_qp *qp = to_mqp(ibqp); 1825 + __be32 doorbell[2]; 1826 void *wqe; 1827 void *prev_wqe; 1828 unsigned long flags; ··· 1841 ind = qp->sq.head & (qp->sq.max - 1); 1842 1843 for (nreq = 0; wr; ++nreq, wr = wr->next) { 1844 + if (unlikely(nreq == MTHCA_ARBEL_MAX_WQES_PER_SEND_DB)) { 1845 + nreq = 0; 1846 + 1847 + doorbell[0] = cpu_to_be32((MTHCA_ARBEL_MAX_WQES_PER_SEND_DB << 24) | 1848 + ((qp->sq.head & 0xffff) << 8) | 1849 + f0 | op0); 1850 + doorbell[1] = cpu_to_be32((qp->qpn << 8) | size0); 1851 + 1852 + qp->sq.head += MTHCA_ARBEL_MAX_WQES_PER_SEND_DB; 1853 + size0 = 0; 1854 + 1855 + /* 1856 + * Make sure that descriptors are written before 1857 + * doorbell record. 1858 + */ 1859 + wmb(); 1860 + *qp->sq.db = cpu_to_be32(qp->sq.head & 0xffff); 1861 + 1862 + /* 1863 + * Make sure doorbell record is written before we 1864 + * write MMIO send doorbell. 1865 + */ 1866 + wmb(); 1867 + mthca_write64(doorbell, 1868 + dev->kar + MTHCA_SEND_DOORBELL, 1869 + MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock)); 1870 + } 1871 + 1872 if (mthca_wq_overflow(&qp->sq, nreq, qp->ibqp.send_cq)) { 1873 mthca_err(dev, "SQ %06x full (%u head, %u tail," 1874 " %d max, %d nreq)\n", qp->qpn, ··· 2017 2018 out: 2019 if (likely(nreq)) { 2020 doorbell[0] = cpu_to_be32((nreq << 24) | 2021 ((qp->sq.head & 0xffff) << 8) | 2022 f0 | op0);
+2 -1
drivers/infiniband/hw/mthca/mthca_wqe.h
··· 50 51 enum { 52 MTHCA_INVAL_LKEY = 0x100, 53 - MTHCA_TAVOR_MAX_WQES_PER_RECV_DB = 256 54 }; 55 56 struct mthca_next_seg {
··· 50 51 enum { 52 MTHCA_INVAL_LKEY = 0x100, 53 + MTHCA_TAVOR_MAX_WQES_PER_RECV_DB = 256, 54 + MTHCA_ARBEL_MAX_WQES_PER_SEND_DB = 255 55 }; 56 57 struct mthca_next_seg {