From d72ce66556be6c3f5eee00aa7957e53b8ddfd72c Mon Sep 17 00:00:00 2001 From: Liron Himi Date: Mon, 1 Jul 2019 11:00:24 +0300 Subject: [PATCH] net/mvneta: optimize checksum generation offload For tx checksum offload it is not mandatory to provide a valid packet_type in addition to a valid ol_flags. This patch only use ol_flags information for this feature as a performance improvement. Signed-off-by: Liron Himi Reviewed-by: Yuri Chipchev Tested-by: Liron Himi --- drivers/net/mvneta/mvneta_ethdev.c | 9 ----- drivers/net/mvneta/mvneta_ethdev.h | 14 +++++++ drivers/net/mvneta/mvneta_rxtx.c | 62 +++++++++++------------------- 3 files changed, 36 insertions(+), 49 deletions(-) diff --git a/drivers/net/mvneta/mvneta_ethdev.c b/drivers/net/mvneta/mvneta_ethdev.c index f324d93fcd..d46a13b669 100644 --- a/drivers/net/mvneta/mvneta_ethdev.c +++ b/drivers/net/mvneta/mvneta_ethdev.c @@ -27,15 +27,6 @@ #define MVNETA_IFACE_NAME_ARG "iface" -#define MVNETA_RX_OFFLOADS (DEV_RX_OFFLOAD_JUMBO_FRAME | \ - DEV_RX_OFFLOAD_CHECKSUM) - -/** Port Tx offloads capabilities */ -#define MVNETA_TX_OFFLOADS (DEV_TX_OFFLOAD_IPV4_CKSUM | \ - DEV_TX_OFFLOAD_UDP_CKSUM | \ - DEV_TX_OFFLOAD_TCP_CKSUM | \ - DEV_TX_OFFLOAD_MULTI_SEGS) - #define MVNETA_PKT_SIZE_MAX (16382 - MV_MH_SIZE) /* 9700B */ #define MVNETA_DEFAULT_MTU 1500 diff --git a/drivers/net/mvneta/mvneta_ethdev.h b/drivers/net/mvneta/mvneta_ethdev.h index d892d6c674..ef8067790f 100644 --- a/drivers/net/mvneta/mvneta_ethdev.h +++ b/drivers/net/mvneta/mvneta_ethdev.h @@ -53,6 +53,20 @@ #define MRVL_NETA_MTU_TO_MRU(mtu) ((mtu) + MRVL_NETA_HDRS_LEN) #define MRVL_NETA_MRU_TO_MTU(mru) ((mru) - MRVL_NETA_HDRS_LEN) +/** Rx offloads capabilities */ +#define MVNETA_RX_OFFLOADS (DEV_RX_OFFLOAD_JUMBO_FRAME | \ + DEV_RX_OFFLOAD_CHECKSUM) + +/** Tx offloads capabilities */ +#define MVNETA_TX_OFFLOAD_CHECKSUM (DEV_TX_OFFLOAD_IPV4_CKSUM | \ + DEV_TX_OFFLOAD_UDP_CKSUM | \ + DEV_TX_OFFLOAD_TCP_CKSUM) +#define MVNETA_TX_OFFLOADS (MVNETA_TX_OFFLOAD_CHECKSUM | \ + DEV_TX_OFFLOAD_MULTI_SEGS) + +#define MVNETA_TX_PKT_OFFLOADS (PKT_TX_IP_CKSUM | \ + PKT_TX_TCP_CKSUM | \ + PKT_TX_UDP_CKSUM) struct mvneta_priv { /* Hot fields, used in fast path. */ diff --git a/drivers/net/mvneta/mvneta_rxtx.c b/drivers/net/mvneta/mvneta_rxtx.c index 62caa68446..10b6f57584 100644 --- a/drivers/net/mvneta/mvneta_rxtx.c +++ b/drivers/net/mvneta/mvneta_rxtx.c @@ -280,8 +280,6 @@ mvneta_desc_to_packet_type_and_offset(struct neta_ppio_desc *desc, * * @param ol_flags * Offload flags. - * @param packet_type - * Packet type bitfield. * @param l3_type * Pointer to the neta_ouq_l3_type structure. * @param l4_type @@ -290,41 +288,34 @@ mvneta_desc_to_packet_type_and_offset(struct neta_ppio_desc *desc, * Will be set to 1 in case l3 checksum is computed. * @param l4_cksum * Will be set to 1 in case l4 checksum is computed. - * - * @return - * 0 on success, negative error value otherwise. */ -static inline int -mvneta_prepare_proto_info(uint64_t ol_flags, uint32_t packet_type, - enum neta_outq_l3_type *l3_type, - enum neta_outq_l4_type *l4_type, - int *gen_l3_cksum, - int *gen_l4_cksum) +static inline void +mvneta_prepare_proto_info(uint64_t ol_flags, + enum neta_outq_l3_type *l3_type, + enum neta_outq_l4_type *l4_type, + int *gen_l3_cksum, + int *gen_l4_cksum) { /* * Based on ol_flags prepare information * for neta_ppio_outq_desc_set_proto_info() which setups descriptor * for offloading. + * in most of the checksum cases ipv4 must be set, so this is the + * default value */ - if (ol_flags & PKT_TX_IPV4) { - *l3_type = NETA_OUTQ_L3_TYPE_IPV4; - *gen_l3_cksum = ol_flags & PKT_TX_IP_CKSUM ? 1 : 0; - } else if (ol_flags & PKT_TX_IPV6) { + *l3_type = NETA_OUTQ_L3_TYPE_IPV4; + *gen_l3_cksum = ol_flags & PKT_TX_IP_CKSUM ? 1 : 0; + + if (ol_flags & PKT_TX_IPV6) { *l3_type = NETA_OUTQ_L3_TYPE_IPV6; /* no checksum for ipv6 header */ *gen_l3_cksum = 0; - } else { - /* if something different then stop processing */ - return -1; } - ol_flags &= PKT_TX_L4_MASK; - if ((packet_type & RTE_PTYPE_L4_TCP) && - ol_flags == PKT_TX_TCP_CKSUM) { + if (ol_flags & PKT_TX_TCP_CKSUM) { *l4_type = NETA_OUTQ_L4_TYPE_TCP; *gen_l4_cksum = 1; - } else if ((packet_type & RTE_PTYPE_L4_UDP) && - ol_flags == PKT_TX_UDP_CKSUM) { + } else if (ol_flags & PKT_TX_UDP_CKSUM) { *l4_type = NETA_OUTQ_L4_TYPE_UDP; *gen_l4_cksum = 1; } else { @@ -332,8 +323,6 @@ mvneta_prepare_proto_info(uint64_t ol_flags, uint32_t packet_type, /* no checksum for other type */ *gen_l4_cksum = 0; } - - return 0; } /** @@ -385,8 +374,7 @@ mvneta_tx_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) struct mvneta_txq *q = txq; struct mvneta_shadow_txq *sq; struct neta_ppio_desc descs[nb_pkts]; - - int i, ret, bytes_sent = 0; + int i, bytes_sent = 0; uint16_t num, sq_free_size; uint64_t addr; @@ -419,13 +407,10 @@ mvneta_tx_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) bytes_sent += rte_pktmbuf_pkt_len(mbuf); - ret = mvneta_prepare_proto_info(mbuf->ol_flags, - mbuf->packet_type, - &l3_type, &l4_type, - &gen_l3_cksum, - &gen_l4_cksum); - if (unlikely(ret)) + if (!(mbuf->ol_flags & MVNETA_TX_PKT_OFFLOADS)) continue; + mvneta_prepare_proto_info(mbuf->ol_flags, &l3_type, &l4_type, + &gen_l3_cksum, &gen_l4_cksum); neta_ppio_outq_desc_set_proto_info(&descs[i], l3_type, l4_type, mbuf->l2_len, @@ -473,7 +458,7 @@ mvneta_tx_sg_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) struct neta_ppio_desc descs[nb_pkts * NETA_PPIO_DESC_NUM_FRAGS]; struct neta_ppio_sg_pkts pkts; uint8_t frags[nb_pkts]; - int i, j, ret, bytes_sent = 0; + int i, j, bytes_sent = 0; int tail, tail_first; uint16_t num, sq_free_size; uint16_t nb_segs, total_descs = 0; @@ -549,13 +534,10 @@ mvneta_tx_sg_pkt_burst(void *txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) bytes_sent += rte_pktmbuf_pkt_len(mbuf); - ret = mvneta_prepare_proto_info(mbuf->ol_flags, - mbuf->packet_type, - &l3_type, &l4_type, - &gen_l3_cksum, - &gen_l4_cksum); - if (unlikely(ret)) + if (!(mbuf->ol_flags & MVNETA_TX_PKT_OFFLOADS)) continue; + mvneta_prepare_proto_info(mbuf->ol_flags, &l3_type, &l4_type, + &gen_l3_cksum, &gen_l4_cksum); neta_ppio_outq_desc_set_proto_info(&descs[tail_first], l3_type, l4_type, -- 2.20.1