From: Hakon Bugge Date: Tue, 1 Nov 2016 13:16:30 +0000 (+0100) Subject: sif: query_device: Return correct #SGEs for EoIB X-Git-Tag: v4.1.12-92~36^2~14 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=92123828c8fce308f01205eb37847f65b0b94c31;p=users%2Fjedix%2Flinux-maple.git sif: query_device: Return correct #SGEs for EoIB 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 Reviewed-by: HÃ¥kon Bugge --- diff --git a/drivers/infiniband/hw/sif/sif_defs.c b/drivers/infiniband/hw/sif/sif_defs.c index b38949487d29b..33f1f93bdba5a 100644 --- a/drivers/infiniband/hw/sif/sif_defs.c +++ b/drivers/infiniband/hw/sif/sif_defs.c @@ -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; diff --git a/drivers/infiniband/hw/sif/sif_qp.c b/drivers/infiniband/hw/sif/sif_qp.c index 8bdd0c1497337..93e36d91adbeb 100644 --- a/drivers/infiniband/hw/sif/sif_qp.c +++ b/drivers/infiniband/hw/sif/sif_qp.c @@ -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) diff --git a/drivers/infiniband/hw/sif/sif_qp.h b/drivers/infiniband/hw/sif/sif_qp.h index b6c631c79cf2f..8985867d633c7 100644 --- a/drivers/infiniband/hw/sif/sif_qp.h +++ b/drivers/infiniband/hw/sif/sif_qp.h @@ -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 { diff --git a/drivers/infiniband/hw/sif/sif_query.c b/drivers/infiniband/hw/sif/sif_query.c index 22549cb5a9b57..3e2c1d296e39e 100644 --- a/drivers/infiniband/hw/sif/sif_query.c +++ b/drivers/infiniband/hw/sif/sif_query.c @@ -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;