>On 8/21/19 11:47 PM, pbhagavat...@marvell.com wrote: >> From: Pavan Nikhilesh <pbhagavat...@marvell.com> >> >> Add `rte_eth_dev_set_supported_ptypes` function that will allow the >> application to inform the PMD the packet types it is interested in. >> Based on the ptypes set PMDs can optimize their Rx path. >> >> -If application doesn’t want any ptype information it can call >> `rte_eth_dev_set_supported_ptypes(ethdev_id, >RTE_PTYPE_UNKNOWN)` and PMD >> will set rte_mbuf::packet_type to 0. > >I would say that "... and PMD may skip packet type processing and just >set >rte_mbuf::packet_type to RTE_PTYPE_UNKNOWN." > >I.e. PMD is not obligated to skip packet type processing, it just has >permission to do it. > >> -If application doesn’t call `rte_eth_dev_set_supported_ptypes` PMD >can >> return `rte_mbuf::packet_type` with >`rte_eth_dev_get_supported_ptypes`. >> >> -If application is interested only in L2/L3 layer, it can inform the PMD >> to update `rte_mbuf::packet_type` with L2/L3 ptype by calling >> `rte_eth_dev_set_supported_ptypes(ethdev_id, >> RTE_PTYPE_L2_MASK | RTE_PTYPE_L3_MASK)`. >> >> Suggested-by: Konstantin Ananyev <konstantin.anan...@intel.com> >> Signed-off-by: Pavan Nikhilesh <pbhagavat...@marvell.com> >> --- >> doc/guides/nics/features.rst | 12 ++++++--- >> doc/guides/rel_notes/release_19_11.rst | 7 ++++++ >> lib/librte_ethdev/rte_ethdev.c | 32 >++++++++++++++++++++++++ >> lib/librte_ethdev/rte_ethdev.h | 16 ++++++++++++ >> lib/librte_ethdev/rte_ethdev_core.h | 6 +++++ >> lib/librte_ethdev/rte_ethdev_version.map | 3 +++ >> 6 files changed, 72 insertions(+), 4 deletions(-) >> >> diff --git a/doc/guides/nics/features.rst >b/doc/guides/nics/features.rst >> index c4e128d2f..d4d55f721 100644 >> --- a/doc/guides/nics/features.rst >> +++ b/doc/guides/nics/features.rst >> @@ -582,10 +582,14 @@ Supports inner packet L4 checksum. >> Packet type parsing >> ------------------- >> >> -Supports packet type parsing and returns a list of supported types. >> - >> -* **[implements] eth_dev_ops**: ``dev_supported_ptypes_get``. >> -* **[related] API**: ``rte_eth_dev_get_supported_ptypes()``. >> +Supports packet type parsing and returns a list of supported types. >Allows >> +application to set ptypes it is interested in. > >It is better to start new sentence from new line. It will keep the first >line >untouched.
Ack. > >> + >> +* **[implements] eth_dev_ops**: ``dev_supported_ptypes_get``, >> + ``dev_supported_ptypes_set``. >> +* **[related] API**: ``rte_eth_dev_get_supported_ptypes()``, >> + ``rte_eth_dev_set_supported_ptypes()``. >> +* **[provides] mbuf**: ``mbuf.packet_type``. >> >> >> .. _nic_features_timesync: >> diff --git a/doc/guides/rel_notes/release_19_11.rst >b/doc/guides/rel_notes/release_19_11.rst >> index 8490d897c..a7cec1fe8 100644 >> --- a/doc/guides/rel_notes/release_19_11.rst >> +++ b/doc/guides/rel_notes/release_19_11.rst >> @@ -56,6 +56,13 @@ New Features >> Also, make sure to start the actual text at the margin. >> >====================================================== >=== >> >> +* **Added API in ethdev to set supported packet types** > >May I suggest: >Added ethdev API to set supported packet types. Ack. > >> + >> + * Added new API ``rte_eth_dev_set_supported_ptypes`` that >allows an >> + application to request PMD to set specific ptypes defined >> + through ``rte_eth_dev_set_supported_ptypes`` in >``rte_mbuf::packet_type``. > >Consider: >Added new API ``rte_eth_dev_set_supported_ptypes`` that allows an >application to inform PMD about packet types classification the >application >is interested in. > Ack. >> + * This scheme will allow PMDs to avoid lookup to internal ptype >table on Rx >> + and thereby improve Rx performance if application wishes do so. >> >> Removed Items >> ------------- >> diff --git a/lib/librte_ethdev/rte_ethdev.c >b/lib/librte_ethdev/rte_ethdev.c >> index 17d183e1f..f529cbe9f 100644 >> --- a/lib/librte_ethdev/rte_ethdev.c >> +++ b/lib/librte_ethdev/rte_ethdev.c >> @@ -2602,6 +2602,38 @@ >rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t >ptype_mask, >> return j; >> } >> >> +uint32_t >> +rte_eth_dev_set_supported_ptypes(uint16_t port_id, uint32_t >ptype_mask) >> +{ >> + int i; >> + struct rte_eth_dev *dev; >> + const uint32_t *all_ptypes; >> + uint32_t all_ptype_mask = 0; >> + uint32_t supp_ptype_mask = 0; >> + >> + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); > >We should either return 0 or change prototype to return successfully >set ptypes in optional (may be NULL) output parameter. >I would change the prototype. Ack. I will change the prototype. > >> + dev = &rte_eth_devices[port_id]; >> + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops- >>dev_supported_ptypes_get, 0); > >Since API is not mandatory and provides just hits for optimizations, I >think >it should return error in really unexpected cases only. It looks like >invalid >port_id is the only case. Ack. > >> + if (ptype_mask == 0) { >> + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops- >>dev_supported_ptypes_set, >> + 0); >> + return (*dev->dev_ops- >>dev_supported_ptypes_set)(dev, >> + ptype_mask); >> + } >> + >> + all_ptypes = (*dev->dev_ops- >>dev_supported_ptypes_get)(dev); >> + if (all_ptypes == NULL) >> + return 0; >> + >> + for (i = 0; all_ptypes[i] != RTE_PTYPE_UNKNOWN; ++i) >> + all_ptype_mask |= all_ptypes[i]; >> + >> + supp_ptype_mask = all_ptype_mask & ptype_mask; > >I think it is not that useful to do here. Moreover, it is invalid in a >way how >it is implemented right now. E.g. if get returns: >RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP >RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_UDP >RTE_PTYPE_L2_ARP >and mask is RTE_PTYPE_L2_MASK | RTE_PTYPE_L3_MASK | >RTE_PTYPE_L4_MASK >the result will be: >RTE_PTYPE_L2_ARP | RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_FRAG > Ack. I will change the check. > >> + return (*dev->dev_ops->dev_supported_ptypes_set)(dev, >supp_ptype_mask); > >It is not checked that dev_supported_ptypes_set is not NULL. > >> +} >> + >> void >> rte_eth_macaddr_get(uint16_t port_id, struct rte_ether_addr >*mac_addr) >> { >> diff --git a/lib/librte_ethdev/rte_ethdev.h >b/lib/librte_ethdev/rte_ethdev.h >> index dc6596bc9..1ab0af4d8 100644 >> --- a/lib/librte_ethdev/rte_ethdev.h >> +++ b/lib/librte_ethdev/rte_ethdev.h >> @@ -2431,6 +2431,22 @@ int rte_eth_dev_fw_version_get(uint16_t >port_id, >> */ >> int rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t >ptype_mask, >> uint32_t *ptypes, int num); >> +/** > >Missing: > * @warning > * @b EXPERIMENTAL: this API may change without prior notice. > >> + * Request Ethernet device to set only specific packet types in the >packet. > >Request sounds mandatory. Consider: >Inform Ethernet device of the packet types classification in which >the recipient is interested. > >> + * >> + * Application can use this function to set only specific ptypes that it's >> + * interested. This information can be used by the PMD to optimize >Rx path. >> + * >> + * @param port_id >> + * The port identifier of the Ethernet device. >> + * @param ptype_mask >> + * The ptype family that application is interested in. > >It should be highligted that for each layer it should be either >full mask (e.g. RTE_PTYPE_L4_MASK) or only one specific type >(e.g. RTE_PTYPE_L4_TCP) since otherwise caller may try >RTE_PTYPE_L4_TCP|RTE_PTYPE_L4_UDP which is RTE_PTYPE_L4_FRAG >in fact. > >> + * @return >> + * - (>=0) Ptype mask that has been set successfully. > >uint32_t is always >=0, so I think (>=0) should be removed. >However, in fact I think it should be: >Negative errno value on error, 0 on success. > >I think that "Ptype mask that has been set successfully" could be >misleading since for each layer it is not a bit mark, but enum. >The output should be supported_ptype_get-slyle. I.e. an array >which is terminated by RTE_PTYPE_UNKNOWN entry. > I will make it ptype_get-style with mask in place. >> + */ >> +__rte_experimental >> +uint32_t rte_eth_dev_set_supported_ptypes(uint16_t port_id, >> + uint32_t ptype_mask); >> >> /** >> * Retrieve the MTU of an Ethernet device. >> diff --git a/lib/librte_ethdev/rte_ethdev_core.h >b/lib/librte_ethdev/rte_ethdev_core.h >> index 2922d5b7c..e65ae983d 100644 >> --- a/lib/librte_ethdev/rte_ethdev_core.h >> +++ b/lib/librte_ethdev/rte_ethdev_core.h >> @@ -110,6 +110,10 @@ typedef void (*eth_dev_infos_get_t)(struct >rte_eth_dev *dev, >> typedef const uint32_t >*(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev); >> /**< @internal Get supported ptypes of an Ethernet device. */ >> >> +typedef uint32_t (*eth_dev_supported_ptypes_set_t)(struct >rte_eth_dev *dev, >> + uint32_t ptype_mask); >> +/**< @internal Set required ptypes of an Ethernet device. */ > >Consider: >Inform device about packet types in which the recipient is interested. Ack. > >> + >> typedef int (*eth_queue_start_t)(struct rte_eth_dev *dev, >> uint16_t queue_id); >> /**< @internal Start rx and tx of a queue of an Ethernet device. */ >> @@ -421,6 +425,8 @@ struct eth_dev_ops { >> eth_fw_version_get_t fw_version_get; /**< Get firmware >version. */ >> eth_dev_supported_ptypes_get_t >dev_supported_ptypes_get; >> /**< Get packet types supported and identified by device. */ >> + eth_dev_supported_ptypes_set_t >dev_supported_ptypes_set; >> + /**< Inform device about the interested ptypes. */ > >Consider >Inform device about packet types in which the recipient is interested. Ack. > >> >> vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */ >> vlan_tpid_set_t vlan_tpid_set; /**< Outer/Inner VLAN >TPID Setup. */ > ><snip>