[1/2] net/sfc: advertise offload caps directly by Rx datapaths

Message ID 1559378564-14636-1-git-send-email-arybchenko@solarflare.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers
Series [1/2] net/sfc: advertise offload caps directly by Rx datapaths |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation fail Compilation issues
ci/intel-Performance-Testing success Performance Testing PASS
ci/mellanox-Performance-Testing success Performance Testing PASS

Commit Message

Andrew Rybchenko June 1, 2019, 8:42 a.m. UTC
  Rx datapath feature bits were useful on migration from the old offload API
to the new one. However, right now it just adds indirection which
complicates code reading and understanding. Also addition of a new
offloads requires addition of a new feature bits and makes patches longer
and harder to understand. So, remove feature bits which correspond to Rx
offloads and simply advertise device and per-queue offloads directly.
Generic code could still mask some offloads if running HW or FW does not
support it.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
---
 drivers/net/sfc/sfc_dp_rx.h        | 25 +++++++++++++++++------
 drivers/net/sfc/sfc_ef10_essb_rx.c |  5 +++--
 drivers/net/sfc/sfc_ef10_rx.c      |  8 ++++----
 drivers/net/sfc/sfc_rx.c           | 42 ++++++++++++++++++--------------------
 4 files changed, 46 insertions(+), 34 deletions(-)
  

Comments

Ferruh Yigit June 6, 2019, 4:54 p.m. UTC | #1
On 6/1/2019 9:42 AM, Andrew Rybchenko wrote:
> Rx datapath feature bits were useful on migration from the old offload API
> to the new one. However, right now it just adds indirection which
> complicates code reading and understanding. Also addition of a new
> offloads requires addition of a new feature bits and makes patches longer
> and harder to understand. So, remove feature bits which correspond to Rx
> offloads and simply advertise device and per-queue offloads directly.
> Generic code could still mask some offloads if running HW or FW does not
> support it.
> 
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> Reviewed-by: Igor Romanov <igor.romanov@oktetlabs.ru>
> Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>

Series applied to dpdk-next-net/master, thanks.
  

Patch

diff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h
index 042c014..a374311 100644
--- a/drivers/net/sfc/sfc_dp_rx.h
+++ b/drivers/net/sfc/sfc_dp_rx.h
@@ -199,12 +199,19 @@  struct sfc_dp_rx {
 	struct sfc_dp				dp;
 
 	unsigned int				features;
-#define SFC_DP_RX_FEAT_SCATTER			0x1
-#define SFC_DP_RX_FEAT_MULTI_PROCESS		0x2
-#define SFC_DP_RX_FEAT_TUNNELS			0x4
-#define SFC_DP_RX_FEAT_FLOW_FLAG		0x8
-#define SFC_DP_RX_FEAT_FLOW_MARK		0x10
-#define SFC_DP_RX_FEAT_CHECKSUM			0x20
+#define SFC_DP_RX_FEAT_MULTI_PROCESS		0x1
+#define SFC_DP_RX_FEAT_FLOW_FLAG		0x2
+#define SFC_DP_RX_FEAT_FLOW_MARK		0x4
+	/**
+	 * Rx offload capabilities supported by the datapath on device
+	 * level only if HW/FW supports it.
+	 */
+	uint64_t				dev_offload_capa;
+	/**
+	 * Rx offload capabilities supported by the datapath per-queue
+	 * if HW/FW supports it.
+	 */
+	uint64_t				queue_offload_capa;
 	sfc_dp_rx_get_dev_info_t		*get_dev_info;
 	sfc_dp_rx_pool_ops_supported_t		*pool_ops_supported;
 	sfc_dp_rx_qsize_up_rings_t		*qsize_up_rings;
@@ -237,6 +244,12 @@  struct sfc_dp_rx {
 	return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
 }
 
+static inline uint64_t
+sfc_dp_rx_offload_capa(const struct sfc_dp_rx *dp_rx)
+{
+	return dp_rx->dev_offload_capa | dp_rx->queue_offload_capa;
+}
+
 /** Get Rx datapath ops by the datapath RxQ handle */
 const struct sfc_dp_rx *sfc_dp_rx_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
 
diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c
index ccb6aea..63da807 100644
--- a/drivers/net/sfc/sfc_ef10_essb_rx.c
+++ b/drivers/net/sfc/sfc_ef10_essb_rx.c
@@ -714,8 +714,9 @@  struct sfc_dp_rx sfc_ef10_essb_rx = {
 				  SFC_DP_HW_FW_CAP_RX_ES_SUPER_BUFFER,
 	},
 	.features		= SFC_DP_RX_FEAT_FLOW_FLAG |
-				  SFC_DP_RX_FEAT_FLOW_MARK |
-				  SFC_DP_RX_FEAT_CHECKSUM,
+				  SFC_DP_RX_FEAT_FLOW_MARK,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
+	.queue_offload_capa	= 0,
 	.get_dev_info		= sfc_ef10_essb_rx_get_dev_info,
 	.pool_ops_supported	= sfc_ef10_essb_rx_pool_ops_supported,
 	.qsize_up_rings		= sfc_ef10_essb_rx_qsize_up_rings,
diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c
index 49e32fa..b294b43 100644
--- a/drivers/net/sfc/sfc_ef10_rx.c
+++ b/drivers/net/sfc/sfc_ef10_rx.c
@@ -750,10 +750,10 @@  struct sfc_dp_rx sfc_ef10_rx = {
 		.type		= SFC_DP_RX,
 		.hw_fw_caps	= SFC_DP_HW_FW_CAP_EF10,
 	},
-	.features		= SFC_DP_RX_FEAT_SCATTER |
-				  SFC_DP_RX_FEAT_MULTI_PROCESS |
-				  SFC_DP_RX_FEAT_TUNNELS |
-				  SFC_DP_RX_FEAT_CHECKSUM,
+	.features		= SFC_DP_RX_FEAT_MULTI_PROCESS,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM |
+				  DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM,
+	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
 	.get_dev_info		= sfc_ef10_rx_get_dev_info,
 	.qsize_up_rings		= sfc_ef10_rx_qsize_up_rings,
 	.qcreate		= sfc_ef10_rx_qcreate,
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index f222111..70e7614 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -557,8 +557,9 @@  struct sfc_dp_rx sfc_efx_rx = {
 		.type		= SFC_DP_RX,
 		.hw_fw_caps	= 0,
 	},
-	.features		= SFC_DP_RX_FEAT_SCATTER |
-				  SFC_DP_RX_FEAT_CHECKSUM,
+	.features		= 0,
+	.dev_offload_capa	= DEV_RX_OFFLOAD_CHECKSUM,
+	.queue_offload_capa	= DEV_RX_OFFLOAD_SCATTER,
 	.qsize_up_rings		= sfc_efx_rx_qsize_up_rings,
 	.qcreate		= sfc_efx_rx_qcreate,
 	.qdestroy		= sfc_efx_rx_qdestroy,
@@ -806,36 +807,32 @@  struct sfc_dp_rx sfc_efx_rx = {
 	sfc_ev_qstop(rxq->evq);
 }
 
-uint64_t
-sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa)
+static uint64_t
+sfc_rx_get_offload_mask(struct sfc_adapter *sa)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
-	uint64_t caps = 0;
+	uint64_t no_caps = 0;
 
-	caps |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+	if (encp->enc_tunnel_encapsulations_supported == 0)
+		no_caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
 
-	if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_CHECKSUM) {
-		caps |= DEV_RX_OFFLOAD_IPV4_CKSUM;
-		caps |= DEV_RX_OFFLOAD_UDP_CKSUM;
-		caps |= DEV_RX_OFFLOAD_TCP_CKSUM;
-	}
+	return ~no_caps;
+}
 
-	if (encp->enc_tunnel_encapsulations_supported &&
-	    (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
-		caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
+uint64_t
+sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa)
+{
+	uint64_t caps = sa->priv.dp_rx->dev_offload_capa;
+
+	caps |= DEV_RX_OFFLOAD_JUMBO_FRAME;
 
-	return caps;
+	return caps & sfc_rx_get_offload_mask(sa);
 }
 
 uint64_t
 sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa)
 {
-	uint64_t caps = 0;
-
-	if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_SCATTER)
-		caps |= DEV_RX_OFFLOAD_SCATTER;
-
-	return caps;
+	return sa->priv.dp_rx->queue_offload_capa & sfc_rx_get_offload_mask(sa);
 }
 
 static int
@@ -1047,7 +1044,8 @@  struct sfc_dp_rx sfc_efx_rx = {
 		EFX_RXQ_FLAG_SCATTER : EFX_RXQ_FLAG_NONE;
 
 	if ((encp->enc_tunnel_encapsulations_supported != 0) &&
-	    (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
+	    (sfc_dp_rx_offload_capa(sa->priv.dp_rx) &
+	     DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) != 0)
 		rxq_info->type_flags |= EFX_RXQ_FLAG_INNER_CLASSES;
 
 	rc = sfc_ev_qinit(sa, SFC_EVQ_TYPE_RX, sw_index,