Re: [ovs-dev] [PATCH v4 1/3] netdev-dpdk: negotiate delivery of per-packet Rx metadata
On 2/21/23 01:41, Ivan Malov wrote: > This may be required by some PMDs in offload scenarios. > > Signed-off-by: Ivan Malov > --- > lib/netdev-dpdk.c | 40 > 1 file changed, 40 insertions(+) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index fb0dd43f7..2cebc3cca 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -1140,6 +1140,36 @@ dpdk_eth_flow_ctrl_setup(struct netdev_dpdk *dev) > OVS_REQUIRES(dev->mutex) > } > } > > +static void > +dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk *dev) > +{ > +uint64_t rx_metadata = 0; > +int ret; > + > +/* For the fallback offload (non-"transfer" rules) */ > +rx_metadata |= RTE_ETH_RX_METADATA_USER_MARK; > +/* For the full offload ("transfer" rules) */ > +rx_metadata |= RTE_ETH_RX_METADATA_TUNNEL_ID; > + > +ret = rte_eth_rx_metadata_negotiate(dev->port_id, _metadata); This call is triggering errors: 2023-02-21T01:55:42.586Z|00145|dpdk|ERR|The port (ID=0) is already configured Looks like we're not allowed to call this function after device was already configured. Any attempt to re-configure triggers an error. And that fails CI. Best regards, Ilya Maximets. ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev
[ovs-dev] [PATCH v4 1/3] netdev-dpdk: negotiate delivery of per-packet Rx metadata
This may be required by some PMDs in offload scenarios. Signed-off-by: Ivan Malov --- lib/netdev-dpdk.c | 40 1 file changed, 40 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index fb0dd43f7..2cebc3cca 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1140,6 +1140,36 @@ dpdk_eth_flow_ctrl_setup(struct netdev_dpdk *dev) OVS_REQUIRES(dev->mutex) } } +static void +dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk *dev) +{ +uint64_t rx_metadata = 0; +int ret; + +/* For the fallback offload (non-"transfer" rules) */ +rx_metadata |= RTE_ETH_RX_METADATA_USER_MARK; +/* For the full offload ("transfer" rules) */ +rx_metadata |= RTE_ETH_RX_METADATA_TUNNEL_ID; + +ret = rte_eth_rx_metadata_negotiate(dev->port_id, _metadata); +if (ret == 0) { +if (!(rx_metadata & RTE_ETH_RX_METADATA_USER_MARK)) { +VLOG_DBG("The NIC will not provide per-packet USER_MARK on port " + DPDK_PORT_ID_FMT, dev->port_id); +} +if (!(rx_metadata & RTE_ETH_RX_METADATA_TUNNEL_ID)) { +VLOG_DBG("The NIC will not provide per-packet TUNNEL_ID on port " + DPDK_PORT_ID_FMT, dev->port_id); +} +} else if (ret == -ENOTSUP) { +VLOG_DBG("Rx metadata negotiate procedure is not supported on port " + DPDK_PORT_ID_FMT, dev->port_id); +} else { +VLOG_WARN("Cannot negotiate Rx metadata on port " + DPDK_PORT_ID_FMT, dev->port_id); +} +} + static int dpdk_eth_dev_init(struct netdev_dpdk *dev) OVS_REQUIRES(dev->mutex) @@ -1154,6 +1184,16 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) RTE_ETH_RX_OFFLOAD_TCP_CKSUM | RTE_ETH_RX_OFFLOAD_IPV4_CKSUM; +/* + * Full tunnel offload requires that tunnel ID metadata be + * delivered with "miss" packets from the hardware to the + * PMD. The same goes for megaflow mark metadata which is + * used in MARK + RSS offload scenario. + * + * Request delivery of such metadata. + */ +dpdk_eth_dev_init_rx_metadata(dev); + rte_eth_dev_info_get(dev->port_id, ); if (strstr(info.driver_name, "vf") != NULL) { -- 2.20.1 ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev
[ovs-dev] [PATCH v4 1/3] netdev-dpdk: negotiate delivery of per-packet Rx metadata
This may be required by some PMDs in offload scenarios. Signed-off-by: Ivan Malov --- lib/netdev-dpdk.c | 40 1 file changed, 40 insertions(+) diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index fb0dd43f7..2cebc3cca 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1140,6 +1140,36 @@ dpdk_eth_flow_ctrl_setup(struct netdev_dpdk *dev) OVS_REQUIRES(dev->mutex) } } +static void +dpdk_eth_dev_init_rx_metadata(struct netdev_dpdk *dev) +{ +uint64_t rx_metadata = 0; +int ret; + +/* For the fallback offload (non-"transfer" rules) */ +rx_metadata |= RTE_ETH_RX_METADATA_USER_MARK; +/* For the full offload ("transfer" rules) */ +rx_metadata |= RTE_ETH_RX_METADATA_TUNNEL_ID; + +ret = rte_eth_rx_metadata_negotiate(dev->port_id, _metadata); +if (ret == 0) { +if (!(rx_metadata & RTE_ETH_RX_METADATA_USER_MARK)) { +VLOG_DBG("The NIC will not provide per-packet USER_MARK on port " + DPDK_PORT_ID_FMT, dev->port_id); +} +if (!(rx_metadata & RTE_ETH_RX_METADATA_TUNNEL_ID)) { +VLOG_DBG("The NIC will not provide per-packet TUNNEL_ID on port " + DPDK_PORT_ID_FMT, dev->port_id); +} +} else if (ret == -ENOTSUP) { +VLOG_DBG("Rx metadata negotiate procedure is not supported on port " + DPDK_PORT_ID_FMT, dev->port_id); +} else { +VLOG_WARN("Cannot negotiate Rx metadata on port " + DPDK_PORT_ID_FMT, dev->port_id); +} +} + static int dpdk_eth_dev_init(struct netdev_dpdk *dev) OVS_REQUIRES(dev->mutex) @@ -1154,6 +1184,16 @@ dpdk_eth_dev_init(struct netdev_dpdk *dev) RTE_ETH_RX_OFFLOAD_TCP_CKSUM | RTE_ETH_RX_OFFLOAD_IPV4_CKSUM; +/* + * Full tunnel offload requires that tunnel ID metadata be + * delivered with "miss" packets from the hardware to the + * PMD. The same goes for megaflow mark metadata which is + * used in MARK + RSS offload scenario. + * + * Request delivery of such metadata. + */ +dpdk_eth_dev_init_rx_metadata(dev); + rte_eth_dev_info_get(dev->port_id, ); if (strstr(info.driver_name, "vf") != NULL) { -- 2.20.1 ___ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev