]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sif: query_device: Return correct #SGEs for EoIB
authorHakon Bugge <Haakon.Bugge@oracle.com>
Tue, 1 Nov 2016 13:16:30 +0000 (14:16 +0100)
committerKnut Omang <knut.omang@oracle.com>
Fri, 11 Nov 2016 16:36:56 +0000 (17:36 +0100)
ULPs that use LSO, can only create QPs with #SGE entries being one
less than what is supported in HW. This because PSIF uses one entry
for the LSO stencil. The driver attempts to detect the ULP and from
that derive if LSO will be used.

This commit adds support for XVE (Xsigo Virtual Ethernet), and a
query_device() from the XVE driver (not the connected mode part), will
return one less #SGEs.

Further, since the XVE ULP is detected, we amend the sysfs listing of
QPs with EoIB (for XVE datagram mode QPs) and EoIB_CM (for XVE
connected mode QPs).

Orabug: 25027106

Signed-off-by: Hakon Bugge <Haakon.Bugge@oracle.com>
Reviewed-by: HÃ¥kon Bugge <haakon.bugge@oracle.com>
drivers/infiniband/hw/sif/sif_defs.c
drivers/infiniband/hw/sif/sif_qp.c
drivers/infiniband/hw/sif/sif_qp.h
drivers/infiniband/hw/sif/sif_query.c

index b38949487d29b627e25a4148b6f21e181b6bb3e6..33f1f93bdba5aa0544a22ddebbfd1d4bbb3663b2 100644 (file)
@@ -540,6 +540,10 @@ static inline enum kernel_ulp_type find_ulp_type_from_address(void *ptr)
                        return IPOIB_CM_ULP;
                else if (strstr(symbol_name, "ipoib_"))
                        return IPOIB_ULP;
+               else if (strstr(symbol_name, "xve_cm_"))
+                       return XVE_CM_ULP;
+               else if (strstr(symbol_name, "xve_"))
+                       return XVE_ULP;
 #endif
        }
        return OTHER_ULP;
index 8bdd0c149733738aa0a76aee2991afa45d909c00..93e36d91adbeb1dd4f265f41059c068e2db866e5 100644 (file)
@@ -2499,12 +2499,14 @@ void sif_dfs_print_qp(struct seq_file *s, struct sif_dev *sdev,
                seq_puts(s, "\t[EPSA tunneling]\n");
        else if (qp->ulp_type == RDS_ULP)
                seq_puts(s, "\t[RDS]\n");
+       else if (qp->flags & SIF_QPF_IPOIB)
+               seq_puts(s, "\t[IPoIB]\n");
        else if (qp->ulp_type == IPOIB_CM_ULP)
                seq_puts(s, "\t[IPOIB_CM]\n");
        else if (qp->flags & SIF_QPF_EOIB)
                seq_puts(s, "\t[EoIB]\n");
-       else if (qp->flags & SIF_QPF_IPOIB)
-               seq_puts(s, "\t[IPoIB]\n");
+       else if (qp->ulp_type == XVE_CM_ULP)
+               seq_puts(s, "\t[EoIB_CM]\n");
        else if (qp->flags & SIF_QPF_NO_EVICT)
                seq_puts(s, "\t[no_evict]\n");
        else if (qp->flags & SIF_QPF_FLUSH_RETRY)
index b6c631c79cf2f899f3834a2e9e32243c654a4e85..8985867d633c7fc6766ae67ed111fd906881abab 100644 (file)
@@ -69,6 +69,8 @@ enum kernel_ulp_type {
        RDS_ULP      = 1,
        IPOIB_CM_ULP = 2,
        IPOIB_ULP    = 3,
+       XVE_CM_ULP   = 4,
+       XVE_ULP      = 5,
 };
 
 struct sif_qp_init_attr {
index 22549cb5a9b57439fbafa9c1af704d9e85e792bf..3e2c1d296e39e473a6c1ce3aa5cbeda8a9c6819a 100644 (file)
@@ -75,10 +75,14 @@ int sif_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
                IB_DEVICE_XRC |
                IB_DEVICE_BLOCK_MULTICAST_LOOPBACK;
 
-       /* returns max_sge SIF_HW_MAX_SEND_SGE -1 for IPoIB datagram mode */
-       /* TBD: Add test for uvnic */
-       props->max_sge = SIF_HW_MAX_SEND_SGE -
-                        (sif_find_kernel_ulp_caller() == IPOIB_ULP);
+       /*
+        * LSO requires one SGE entry, hence subtract one if IPoIB,
+        * EoIB, or if we are unable to determine the ULP
+        */
+       props->max_sge = SIF_HW_MAX_SEND_SGE - (
+               sif_find_kernel_ulp_caller() == IPOIB_ULP ||
+               sif_find_kernel_ulp_caller() == XVE_ULP ||
+               STACK_UNWIND_LEVEL == 0);
 
        props->max_sge_rd = ldev.max_sge_rd;
        props->max_cq = sdev->ba[cq_sw].entry_cnt;