net/sfc: advertise offload capabilities by Tx datapaths
Tx 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 Tx 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>
This commit is contained in:
parent
f08d113d55
commit
9aa0afd1e9
@ -744,13 +744,16 @@ sfc_attach(struct sfc_adapter *sa)
|
||||
sa->priv.shared->tunnel_encaps =
|
||||
encp->enc_tunnel_encapsulations_supported;
|
||||
|
||||
if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_TSO) {
|
||||
if (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & DEV_TX_OFFLOAD_TCP_TSO) {
|
||||
sa->tso = encp->enc_fw_assisted_tso_v2_enabled;
|
||||
if (!sa->tso)
|
||||
sfc_info(sa, "TSO support isn't available on this adapter");
|
||||
}
|
||||
|
||||
if (sa->tso && sa->priv.dp_tx->features & SFC_DP_TX_FEAT_TSO_ENCAP) {
|
||||
if (sa->tso &&
|
||||
(sfc_dp_tx_offload_capa(sa->priv.dp_tx) &
|
||||
(DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
|
||||
DEV_TX_OFFLOAD_GENEVE_TNL_TSO)) != 0) {
|
||||
sa->tso_encap = encp->enc_fw_assisted_tso_v2_encap_enabled;
|
||||
if (!sa->tso_encap)
|
||||
sfc_info(sa, "Encapsulated TSO support isn't available on this adapter");
|
||||
|
@ -157,13 +157,17 @@ struct sfc_dp_tx {
|
||||
struct sfc_dp dp;
|
||||
|
||||
unsigned int features;
|
||||
#define SFC_DP_TX_FEAT_VLAN_INSERT 0x1
|
||||
#define SFC_DP_TX_FEAT_TSO 0x2
|
||||
#define SFC_DP_TX_FEAT_MULTI_SEG 0x4
|
||||
#define SFC_DP_TX_FEAT_MULTI_PROCESS 0x8
|
||||
#define SFC_DP_TX_FEAT_MULTI_POOL 0x10
|
||||
#define SFC_DP_TX_FEAT_REFCNT 0x20
|
||||
#define SFC_DP_TX_FEAT_TSO_ENCAP 0x40
|
||||
#define SFC_DP_TX_FEAT_MULTI_PROCESS 0x1
|
||||
/**
|
||||
* Tx offload capabilities supported by the datapath on device
|
||||
* level only if HW/FW supports it.
|
||||
*/
|
||||
uint64_t dev_offload_capa;
|
||||
/**
|
||||
* Tx offload capabilities supported by the datapath per-queue
|
||||
* if HW/FW supports it.
|
||||
*/
|
||||
uint64_t queue_offload_capa;
|
||||
sfc_dp_tx_get_dev_info_t *get_dev_info;
|
||||
sfc_dp_tx_qsize_up_rings_t *qsize_up_rings;
|
||||
sfc_dp_tx_qcreate_t *qcreate;
|
||||
@ -196,6 +200,12 @@ sfc_dp_find_tx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps)
|
||||
/** Get Tx datapath ops by the datapath TxQ handle */
|
||||
const struct sfc_dp_tx *sfc_dp_tx_by_dp_txq(const struct sfc_dp_txq *dp_txq);
|
||||
|
||||
static inline uint64_t
|
||||
sfc_dp_tx_offload_capa(const struct sfc_dp_tx *dp_tx)
|
||||
{
|
||||
return dp_tx->dev_offload_capa | dp_tx->queue_offload_capa;
|
||||
}
|
||||
|
||||
static inline int
|
||||
sfc_dp_tx_prepare_pkt(struct rte_mbuf *m,
|
||||
uint32_t tso_tcp_header_offset_limit,
|
||||
|
@ -1098,12 +1098,15 @@ struct sfc_dp_tx sfc_ef10_tx = {
|
||||
.type = SFC_DP_TX,
|
||||
.hw_fw_caps = SFC_DP_HW_FW_CAP_EF10,
|
||||
},
|
||||
.features = SFC_DP_TX_FEAT_TSO |
|
||||
SFC_DP_TX_FEAT_TSO_ENCAP |
|
||||
SFC_DP_TX_FEAT_MULTI_SEG |
|
||||
SFC_DP_TX_FEAT_MULTI_POOL |
|
||||
SFC_DP_TX_FEAT_REFCNT |
|
||||
SFC_DP_TX_FEAT_MULTI_PROCESS,
|
||||
.features = SFC_DP_TX_FEAT_MULTI_PROCESS,
|
||||
.dev_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS,
|
||||
.queue_offload_capa = DEV_TX_OFFLOAD_IPV4_CKSUM |
|
||||
DEV_TX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_TX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
|
||||
DEV_TX_OFFLOAD_TCP_TSO |
|
||||
DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
|
||||
DEV_TX_OFFLOAD_GENEVE_TNL_TSO,
|
||||
.get_dev_info = sfc_ef10_get_dev_info,
|
||||
.qsize_up_rings = sfc_ef10_tx_qsize_up_rings,
|
||||
.qcreate = sfc_ef10_tx_qcreate,
|
||||
@ -1123,6 +1126,11 @@ struct sfc_dp_tx sfc_ef10_simple_tx = {
|
||||
.type = SFC_DP_TX,
|
||||
},
|
||||
.features = SFC_DP_TX_FEAT_MULTI_PROCESS,
|
||||
.dev_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE,
|
||||
.queue_offload_capa = DEV_TX_OFFLOAD_IPV4_CKSUM |
|
||||
DEV_TX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_TX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM,
|
||||
.get_dev_info = sfc_ef10_get_dev_info,
|
||||
.qsize_up_rings = sfc_ef10_tx_qsize_up_rings,
|
||||
.qcreate = sfc_ef10_tx_qcreate,
|
||||
|
@ -34,47 +34,38 @@
|
||||
*/
|
||||
#define SFC_TX_QFLUSH_POLL_ATTEMPTS (2000)
|
||||
|
||||
static uint64_t
|
||||
sfc_tx_get_offload_mask(struct sfc_adapter *sa)
|
||||
{
|
||||
const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
|
||||
uint64_t no_caps = 0;
|
||||
|
||||
if (!encp->enc_hw_tx_insert_vlan_enabled)
|
||||
no_caps |= DEV_TX_OFFLOAD_VLAN_INSERT;
|
||||
|
||||
if (!encp->enc_tunnel_encapsulations_supported)
|
||||
no_caps |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
|
||||
|
||||
if (!sa->tso)
|
||||
no_caps |= DEV_TX_OFFLOAD_TCP_TSO;
|
||||
|
||||
if (!sa->tso_encap)
|
||||
no_caps |= (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
|
||||
DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
|
||||
|
||||
return ~no_caps;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
sfc_tx_get_dev_offload_caps(struct sfc_adapter *sa)
|
||||
{
|
||||
const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
|
||||
uint64_t caps = 0;
|
||||
|
||||
if ((sa->priv.dp_tx->features & SFC_DP_TX_FEAT_VLAN_INSERT) &&
|
||||
encp->enc_hw_tx_insert_vlan_enabled)
|
||||
caps |= DEV_TX_OFFLOAD_VLAN_INSERT;
|
||||
|
||||
if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_MULTI_SEG)
|
||||
caps |= DEV_TX_OFFLOAD_MULTI_SEGS;
|
||||
|
||||
if ((~sa->priv.dp_tx->features & SFC_DP_TX_FEAT_MULTI_POOL) &&
|
||||
(~sa->priv.dp_tx->features & SFC_DP_TX_FEAT_REFCNT))
|
||||
caps |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;
|
||||
|
||||
return caps;
|
||||
return sa->priv.dp_tx->dev_offload_capa & sfc_tx_get_offload_mask(sa);
|
||||
}
|
||||
|
||||
uint64_t
|
||||
sfc_tx_get_queue_offload_caps(struct sfc_adapter *sa)
|
||||
{
|
||||
const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
|
||||
uint64_t caps = 0;
|
||||
|
||||
caps |= DEV_TX_OFFLOAD_IPV4_CKSUM;
|
||||
caps |= DEV_TX_OFFLOAD_UDP_CKSUM;
|
||||
caps |= DEV_TX_OFFLOAD_TCP_CKSUM;
|
||||
|
||||
if (encp->enc_tunnel_encapsulations_supported)
|
||||
caps |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
|
||||
|
||||
if (sa->tso)
|
||||
caps |= DEV_TX_OFFLOAD_TCP_TSO;
|
||||
|
||||
if (sa->tso_encap)
|
||||
caps |= (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
|
||||
DEV_TX_OFFLOAD_GENEVE_TNL_TSO);
|
||||
|
||||
return caps;
|
||||
return sa->priv.dp_tx->queue_offload_capa & sfc_tx_get_offload_mask(sa);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -1149,11 +1140,14 @@ struct sfc_dp_tx sfc_efx_tx = {
|
||||
.type = SFC_DP_TX,
|
||||
.hw_fw_caps = 0,
|
||||
},
|
||||
.features = SFC_DP_TX_FEAT_VLAN_INSERT |
|
||||
SFC_DP_TX_FEAT_TSO |
|
||||
SFC_DP_TX_FEAT_MULTI_POOL |
|
||||
SFC_DP_TX_FEAT_REFCNT |
|
||||
SFC_DP_TX_FEAT_MULTI_SEG,
|
||||
.features = 0,
|
||||
.dev_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT |
|
||||
DEV_TX_OFFLOAD_MULTI_SEGS,
|
||||
.queue_offload_capa = DEV_TX_OFFLOAD_IPV4_CKSUM |
|
||||
DEV_TX_OFFLOAD_UDP_CKSUM |
|
||||
DEV_TX_OFFLOAD_TCP_CKSUM |
|
||||
DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
|
||||
DEV_TX_OFFLOAD_TCP_TSO,
|
||||
.qsize_up_rings = sfc_efx_tx_qsize_up_rings,
|
||||
.qcreate = sfc_efx_tx_qcreate,
|
||||
.qdestroy = sfc_efx_tx_qdestroy,
|
||||
|
Loading…
x
Reference in New Issue
Block a user