Prioritize security for external emails:
Confirm sender and content safety before clicking links or opening attachments
> -----Original Message----- > From: sk...@marvell.com <sk...@marvell.com> > Sent: Tuesday, April 29, 2025 11:42 PM > To: Thomas Monjalon <tho...@monjalon.net>; Ferruh Yigit > <ferruh.yi...@amd.com>; Andrew Rybchenko > <andrew.rybche...@oktetlabs.ru> > Cc: dev@dpdk.org; Sunil Kumar Kori <sk...@marvell.com> > Subject: [EXTERNAL] [PATCH] ethdev: remove callback checks from fast path > > From: Sunil Kumar Kori <skori@ marvell. com> rte_eth_fp_ops contains ops for > fast path APIs. Each API validates availability of callback and then invoke it. > Removing these NULL checks instead using dummy callbacks. Signed-off-by: > Sunil Kumar ZjQcmQRYFpfptBannerStart Prioritize security for external emails: > Confirm sender and content safety before clicking links or opening attachments > <https://us-phishalarm- > ewt.proofpoint.com/EWT/v1/CRVmXkqW!ta3Z1f8UAnVatS- > duf16Ds5hp4nuuus0UNv0GRLoKGk6KzbJ62cMLHhvd3kJIBAKh3RoWS1_8sxE- > fhkSRumJQAQ4NQ$> > Report Suspicious > > ZjQcmQRYFpfptBannerEnd > From: Sunil Kumar Kori <sk...@marvell.com> > > rte_eth_fp_ops contains ops for fast path APIs. Each API validates availability of > callback and then invoke it. > > Removing these NULL checks instead using dummy callbacks. > > Signed-off-by: Sunil Kumar Kori <sk...@marvell.com> Please check the CI issues. https://patches.dpdk.org/project/dpdk/patch/20250512150732.65743-2-sk...@marvell.com/ > --- > lib/ethdev/ethdev_driver.c | 47 ++++++++++++++++++++++ > lib/ethdev/ethdev_driver.h | 82 > ++++++++++++++++++++++++++++++++++++++ > lib/ethdev/ethdev_pci.h | 19 +++++++++ > lib/ethdev/rte_ethdev.h | 20 +--------- > 4 files changed, 150 insertions(+), 18 deletions(-) > > diff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c index > ec0c1e1176..75073f98cf 100644 > --- a/lib/ethdev/ethdev_driver.c > +++ b/lib/ethdev/ethdev_driver.c > @@ -847,6 +847,53 @@ rte_eth_pkt_burst_dummy(void *queue > __rte_unused, > return 0; > } > > +RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_tx_pkt_prepare_dummy) > +uint16_t > +rte_eth_tx_pkt_prepare_dummy(void *queue __rte_unused, > + struct rte_mbuf **pkts __rte_unused, > + uint16_t nb_pkts) > +{ > + return nb_pkts; > +} > + > +RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_rx_queue_count_dummy) > +uint32_t > +rte_eth_rx_queue_count_dummy(void *queue __rte_unused) { > + return -ENOTSUP; > +} > + > +RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_tx_queue_count_dummy) > +int > +rte_eth_tx_queue_count_dummy(void *queue __rte_unused) { > + return -ENOTSUP; > +} > + > +RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_descriptor_status_dummy) > +int > +rte_eth_descriptor_status_dummy(void *queue __rte_unused, > + uint16_t offset __rte_unused) > +{ > + return -ENOTSUP; > +} > + > +RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_recycle_tx_mbufs_reuse_dummy) > +uint16_t > +rte_eth_recycle_tx_mbufs_reuse_dummy(void *queue __rte_unused, > + struct rte_eth_recycle_rxq_info *recycle_rxq_info > __rte_unused) { > + return 0; > +} > + > +RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_recycle_rx_descriptors_refill_dumm > y) > +void > +rte_eth_recycle_rx_descriptors_refill_dummy(void *queue __rte_unused, > + uint16_t nb __rte_unused) > +{ > + > +} > + > RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_representor_id_get) > int > rte_eth_representor_id_get(uint16_t port_id, diff --git > a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h index > 2b4d2ae9c3..ec00f16ed3 100644 > --- a/lib/ethdev/ethdev_driver.h > +++ b/lib/ethdev/ethdev_driver.h > @@ -1874,6 +1874,88 @@ rte_eth_pkt_burst_dummy(void *queue > __rte_unused, > struct rte_mbuf **pkts __rte_unused, > uint16_t nb_pkts __rte_unused); > > +/** > + * @internal > + * Dummy DPDK callback for Tx packet prepare. > + * > + * @param queue > + * Pointer to Tx queue > + * @param pkts > + * Packet array > + * @param nb_pkts > + * Number of packets in packet array > + */ > +__rte_internal > +uint16_t > +rte_eth_tx_pkt_prepare_dummy(void *queue __rte_unused, > + struct rte_mbuf **pkts __rte_unused, > + uint16_t nb_pkts __rte_unused); > + > +/** > + * @internal > + * Dummy DPDK callback for Rx queue count. > + * > + * @param queue > + * Pointer to Rx queue > + */ > +__rte_internal > +uint32_t > +rte_eth_rx_queue_count_dummy(void *queue __rte_unused); > + > +/** > + * @internal > + * Dummy DPDK callback for Tx queue count. > + * > + * @param queue > + * Pointer to Tx queue > + */ > +__rte_internal > +int > +rte_eth_tx_queue_count_dummy(void *queue __rte_unused); > + > +/** > + * @internal > + * Dummy DPDK callback for descriptor status. > + * > + * @param queue > + * Pointer to Rx/Tx queue > + * @param offset > + * The offset of the descriptor starting from tail (0 is the next > + * packet to be received by the driver). > + */ > +__rte_internal > +int > +rte_eth_descriptor_status_dummy(void *queue __rte_unused, > + uint16_t offset __rte_unused); > + > +/** > + * @internal > + * Dummy DPDK callback for recycle Tx mbufs reuse. > + * > + * @param queue > + * Pointer to Tx queue > + * @param recycle_rxq_info > + * Pointer to recycle Rx queue info > + */ > +__rte_internal > +uint16_t > +rte_eth_recycle_tx_mbufs_reuse_dummy(void *queue __rte_unused, > + struct rte_eth_recycle_rxq_info *recycle_rxq_info > __rte_unused); > + > +/** > + * @internal > + * Dummy DPDK callback Rx descriptor refill. > + * > + * @param queue > + * Pointer Rx queue > + * @param offset > + * number of descriptors to refill > + */ > +__rte_internal > +void > +rte_eth_recycle_rx_descriptors_refill_dummy(void *queue __rte_unused, > + uint16_t nb __rte_unused); > + > /** > * Allocate an unique switch domain identifier. > * > diff --git a/lib/ethdev/ethdev_pci.h b/lib/ethdev/ethdev_pci.h index > 2229ffa252..1bd49ab822 100644 > --- a/lib/ethdev/ethdev_pci.h > +++ b/lib/ethdev/ethdev_pci.h > @@ -16,6 +16,20 @@ > extern "C" { > #endif > > +static inline void > +rte_eth_set_dummy_fops(struct rte_eth_dev *eth_dev) { > + eth_dev->rx_pkt_burst = rte_eth_pkt_burst_dummy; > + eth_dev->tx_pkt_burst = rte_eth_pkt_burst_dummy; > + eth_dev->tx_pkt_prepare = rte_eth_tx_pkt_prepare_dummy; > + eth_dev->rx_queue_count = rte_eth_rx_queue_count_dummy; > + eth_dev->tx_queue_count = rte_eth_tx_queue_count_dummy; > + eth_dev->rx_descriptor_status = rte_eth_descriptor_status_dummy; > + eth_dev->tx_descriptor_status = rte_eth_descriptor_status_dummy; > + eth_dev->recycle_tx_mbufs_reuse = > rte_eth_recycle_tx_mbufs_reuse_dummy; > + eth_dev->recycle_rx_descriptors_refill = > +rte_eth_recycle_rx_descriptors_refill_dummy; > +} > + > /** > * Copy pci device info to the Ethernet device data. > * Shared memory (eth_dev->data) only updated by primary process, so it is > safe @@ -147,6 +161,11 @@ rte_eth_dev_pci_generic_probe(struct > rte_pci_device *pci_dev, > if (!eth_dev) > return -ENOMEM; > > + /* Update fast path ops with dummy callbacks. Driver will update > + * them with required callbacks in the init function. > + */ > + rte_eth_set_dummy_fops(eth_dev); > + > ret = dev_init(eth_dev); > if (ret) > rte_eth_dev_release_port(eth_dev); > diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h index > ea7f8c4a1a..aa67b69134 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -6399,8 +6399,6 @@ rte_eth_rx_queue_count(uint16_t port_id, uint16_t > queue_id) > return -EINVAL; > #endif > > - if (p->rx_queue_count == NULL) > - return -ENOTSUP; > return (int)p->rx_queue_count(qd); > } > > @@ -6471,8 +6469,6 @@ rte_eth_rx_descriptor_status(uint16_t port_id, > uint16_t queue_id, > if (qd == NULL) > return -ENODEV; > #endif > - if (p->rx_descriptor_status == NULL) > - return -ENOTSUP; > return p->rx_descriptor_status(qd, offset); } > > @@ -6542,8 +6538,6 @@ static inline int > rte_eth_tx_descriptor_status(uint16_t port_id, > if (qd == NULL) > return -ENODEV; > #endif > - if (p->tx_descriptor_status == NULL) > - return -ENOTSUP; > return p->tx_descriptor_status(qd, offset); } > > @@ -6786,9 +6780,6 @@ rte_eth_tx_prepare(uint16_t port_id, uint16_t > queue_id, > } > #endif > > - if (!p->tx_pkt_prepare) > - return nb_pkts; > - > return p->tx_pkt_prepare(qd, tx_pkts, nb_pkts); } > > @@ -6985,8 +6976,6 @@ rte_eth_recycle_mbufs(uint16_t rx_port_id, > uint16_t rx_queue_id, > return 0; > } > #endif > - if (p1->recycle_tx_mbufs_reuse == NULL) > - return 0; > > #ifdef RTE_ETHDEV_DEBUG_RX > if (rx_port_id >= RTE_MAX_ETHPORTS || > @@ -7010,8 +6999,6 @@ rte_eth_recycle_mbufs(uint16_t rx_port_id, > uint16_t rx_queue_id, > return 0; > } > #endif > - if (p2->recycle_rx_descriptors_refill == NULL) > - return 0; > > /* Copy used *rte_mbuf* buffer pointers from Tx mbuf ring > * into Rx mbuf ring. > @@ -7131,14 +7118,11 @@ rte_eth_tx_queue_count(uint16_t port_id, > uint16_t queue_id) > goto out; > } > #endif > - if (fops->tx_queue_count == NULL) { > - rc = -ENOTSUP; > - goto out; > - } > - > rc = fops->tx_queue_count(qd); > > +#ifdef RTE_ETHDEV_DEBUG_TX > out: > +#endif > rte_eth_trace_tx_queue_count(port_id, queue_id, rc); > return rc; > } > -- > 2.43.0