DPDK patches and discussions
 help / color / mirror / Atom feed
* Re: [dpdk-dev] [PATCH v3 1/7] ethdev: allocate max space for internal queue array
@ 2021-10-02  0:02 Pavan Nikhilesh Bhagavatula
  2021-10-03 21:05 ` Ananyev, Konstantin
  0 siblings, 1 reply; 4+ messages in thread
From: Pavan Nikhilesh Bhagavatula @ 2021-10-02  0:02 UTC (permalink / raw)
  To: Konstantin Ananyev, dev
  Cc: xiaoyun.li, Anoob Joseph, Jerin Jacob Kollanukkaran,
	Nithin Kumar Dabilpuram, Ankur Dwivedi, shepard.siegel, ed.czeck,
	john.miller, Igor Russkikh, ajit.khaparde, somnath.kotur,
	rahul.lakkireddy, hemant.agrawal, sachin.saxena, haiyue.wang,
	johndale, hyonkim, qi.z.zhang, xiao.w.wang, humin29,
	yisen.zhuang, oulijun, beilei.xing, jingjing.wu, qiming.yang,
	matan, viacheslavo, sthemmin, longli, heinrich.kuhn,
	Kiran Kumar Kokkilagadda, andrew.rybchenko, Maciej Czekaj [C],
	jiawenwu, jianwang, maxime.coquelin, chenbo.xia, thomas,
	ferruh.yigit, mdr, jay.jayatheerthan

>At queue configure stage always allocate space for maximum possible
>number (RTE_MAX_QUEUES_PER_PORT) of queue pointers.
>That will allow 'fast' inline functions (eth_rx_burst, etc.) to refer
>pointer to internal queue data without extra checking of current
>number
>of configured queues.
>That would help in future to hide rte_eth_dev and related structures.
>
>Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
>---
> lib/ethdev/rte_ethdev.c | 36 +++++++++---------------------------
> 1 file changed, 9 insertions(+), 27 deletions(-)
>
>diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
>index daf5ca9242..424bc260fa 100644
>--- a/lib/ethdev/rte_ethdev.c
>+++ b/lib/ethdev/rte_ethdev.c
>@@ -898,7 +898,8 @@ eth_dev_rx_queue_config(struct rte_eth_dev
>*dev, uint16_t nb_queues)
>
> 	if (dev->data->rx_queues == NULL && nb_queues != 0) { /*
>first time configuration */
> 		dev->data->rx_queues = rte_zmalloc("ethdev-
>>rx_queues",
>-				sizeof(dev->data->rx_queues[0]) *
>nb_queues,
>+				sizeof(dev->data->rx_queues[0]) *
>+				RTE_MAX_QUEUES_PER_PORT,
> 				RTE_CACHE_LINE_SIZE);
> 		if (dev->data->rx_queues == NULL) {
> 			dev->data->nb_rx_queues = 0;

We could get rid of this zmalloc by declaring rx_queues as array of 
pointers, it would make code much simpler.
I believe the original code dates back to "Initial" release.


>@@ -909,21 +910,11 @@ eth_dev_rx_queue_config(struct
>rte_eth_dev *dev, uint16_t nb_queues)
>
> 		rxq = dev->data->rx_queues;
>
>-		for (i = nb_queues; i < old_nb_queues; i++)
>+		for (i = nb_queues; i < old_nb_queues; i++) {
> 			(*dev->dev_ops->rx_queue_release)(rxq[i]);
>-		rxq = rte_realloc(rxq, sizeof(rxq[0]) * nb_queues,
>-				RTE_CACHE_LINE_SIZE);
>-		if (rxq == NULL)
>-			return -(ENOMEM);
>-		if (nb_queues > old_nb_queues) {
>-			uint16_t new_qs = nb_queues -
>old_nb_queues;
>-
>-			memset(rxq + old_nb_queues, 0,
>-				sizeof(rxq[0]) * new_qs);
>+			rxq[i] = NULL;
> 		}
>
>-		dev->data->rx_queues = rxq;
>-
> 	} else if (dev->data->rx_queues != NULL && nb_queues == 0) {
> 		RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops-
>>rx_queue_release, -ENOTSUP);
>
>@@ -1138,8 +1129,9 @@ eth_dev_tx_queue_config(struct
>rte_eth_dev *dev, uint16_t nb_queues)
>
> 	if (dev->data->tx_queues == NULL && nb_queues != 0) { /*
>first time configuration */
> 		dev->data->tx_queues = rte_zmalloc("ethdev-
>>tx_queues",
>-						   sizeof(dev->data-
>>tx_queues[0]) * nb_queues,
>-
>RTE_CACHE_LINE_SIZE);
>+				sizeof(dev->data->tx_queues[0]) *
>+				RTE_MAX_QUEUES_PER_PORT,
>+				RTE_CACHE_LINE_SIZE);
> 		if (dev->data->tx_queues == NULL) {
> 			dev->data->nb_tx_queues = 0;
> 			return -(ENOMEM);
>@@ -1149,21 +1141,11 @@ eth_dev_tx_queue_config(struct
>rte_eth_dev *dev, uint16_t nb_queues)
>
> 		txq = dev->data->tx_queues;
>
>-		for (i = nb_queues; i < old_nb_queues; i++)
>+		for (i = nb_queues; i < old_nb_queues; i++) {
> 			(*dev->dev_ops->tx_queue_release)(txq[i]);
>-		txq = rte_realloc(txq, sizeof(txq[0]) * nb_queues,
>-				  RTE_CACHE_LINE_SIZE);
>-		if (txq == NULL)
>-			return -ENOMEM;
>-		if (nb_queues > old_nb_queues) {
>-			uint16_t new_qs = nb_queues -
>old_nb_queues;
>-
>-			memset(txq + old_nb_queues, 0,
>-			       sizeof(txq[0]) * new_qs);
>+			txq[i] = NULL;
> 		}
>
>-		dev->data->tx_queues = txq;
>-
> 	} else if (dev->data->tx_queues != NULL && nb_queues == 0) {
> 		RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops-
>>tx_queue_release, -ENOTSUP);
>
>--
>2.26.3


^ permalink raw reply	[flat|nested] 4+ messages in thread
* [dpdk-dev] [RFC v2 0/5] hide eth dev related structures
@ 2021-09-22 14:09 Konstantin Ananyev
  2021-10-01 14:02 ` [dpdk-dev] [PATCH v3 0/7] " Konstantin Ananyev
  0 siblings, 1 reply; 4+ messages in thread
From: Konstantin Ananyev @ 2021-09-22 14:09 UTC (permalink / raw)
  To: dev
  Cc: xiaoyun.li, anoobj, jerinj, ndabilpuram, adwivedi,
	shepard.siegel, ed.czeck, john.miller, irusskikh, ajit.khaparde,
	somnath.kotur, rahul.lakkireddy, hemant.agrawal, sachin.saxena,
	haiyue.wang, johndale, hyonkim, qi.z.zhang, xiao.w.wang, humin29,
	yisen.zhuang, oulijun, beilei.xing, jingjing.wu, qiming.yang,
	matan, viacheslavo, sthemmin, longli, heinrich.kuhn, kirankumark,
	andrew.rybchenko, mczekaj, jiawenwu, jianwang, maxime.coquelin,
	chenbo.xia, thomas, ferruh.yigit, mdr, jay.jayatheerthan,
	Konstantin Ananyev

The aim of these patch series is to make rte_ethdev core data structures
(rte_eth_dev, rte_eth_dev_data, rte_eth_rxtx_callback, etc.) internal to
DPDK and not visible to the user.
That should allow future possible changes to core ethdev related structures
to be transparent to the user and help to improve ABI/API stability.
Note that current ethdev API is preserved, but it is a formal ABI break.

The work is based on previous discussions at:
https://www.mail-archive.com/dev@dpdk.org/msg211405.html
https://www.mail-archive.com/dev@dpdk.org/msg216685.html
and consists of the following main points:
1. Copy public 'fast' function pointers (rx_pkt_burst(), etc.) and
   related data pointer from rte_eth_dev into a separate flat array.
   We keep it public to still be able to use inline functions for these
   'fast' calls (like rte_eth_rx_burst(), etc.) to avoid/minimize slowdown.
   Note that apart from function pointers itself, each element of this
   flat array also contains two opaque pointers for each ethdev:
   1) a pointer to an array of internal queue data pointers
   2)  points to array of queue callback data pointers.
   Note that exposing this extra information allows us to avoid extra
   changes inside PMD level, plus should help to avoid possible
   performance degradation.
2. Change implementation of 'fast' inline ethdev functions
   (rte_eth_rx_burst(), etc.) to use new public flat array.
   While it is an ABI breakage, this change is intended to be transparent
   for both users (no changes in user app is required) and PMD developers
   (no changes in PMD is required).
   One extra note - with new implementation RX/TX callback invocation
   will cost one extra function call with this changes. That might cause
   some slowdown for code-path with RX/TX callbacks heavily involved.
   Hope such tradeoff is acceptable for the community.
3. Move rte_eth_dev, rte_eth_dev_data, rte_eth_rxtx_callback and related
   things into internal header: <ethdev_driver.h>.

That approach was selected to:
  - Avoid(/minimize) possible performance losses.
  - Minimize required changes inside PMDs.
 
Performance testing results (ICX 2.0GHz):
 - testpmd macswap fwd mode, plus
   a) no RX/TX callbacks:
      performance numbers remains the same before and after the patch
   b) bpf-load rx 0 0 JM ./dpdk.org/examples/bpf/t3.o:
      ~2% slowdown

Would like to thank Ferruh and Jerrin for reviewing and testing previous
version of this RFC.
All interested parties please provide your feedback for v2.
If there would be no major objections, I plan to submit a proper v3
patch in next few days.

Konstantin Ananyev (5):
  ethdev: allocate max space for internal queue array
  ethdev: change input parameters for rx_queue_count
  ethdev: copy ethdev 'burst' API into separate structure
  ethdev: make burst functions to use new flat array
  ethdev: hide eth dev related structures

 app/test-pmd/config.c                         |  23 +-
 drivers/common/octeontx2/otx2_sec_idev.c      |   2 +-
 drivers/crypto/octeontx2/otx2_cryptodev_ops.c |   2 +-
 drivers/net/ark/ark_ethdev_rx.c               |   4 +-
 drivers/net/ark/ark_ethdev_rx.h               |   3 +-
 drivers/net/atlantic/atl_ethdev.h             |   2 +-
 drivers/net/atlantic/atl_rxtx.c               |   9 +-
 drivers/net/bnxt/bnxt_ethdev.c                |   8 +-
 drivers/net/cxgbe/base/adapter.h              |   2 +-
 drivers/net/dpaa/dpaa_ethdev.c                |   9 +-
 drivers/net/dpaa2/dpaa2_ethdev.c              |   9 +-
 drivers/net/dpaa2/dpaa2_ptp.c                 |   2 +-
 drivers/net/e1000/e1000_ethdev.h              |   6 +-
 drivers/net/e1000/em_rxtx.c                   |   4 +-
 drivers/net/e1000/igb_rxtx.c                  |   4 +-
 drivers/net/enic/enic_ethdev.c                |  12 +-
 drivers/net/fm10k/fm10k.h                     |   2 +-
 drivers/net/fm10k/fm10k_rxtx.c                |   4 +-
 drivers/net/hns3/hns3_rxtx.c                  |   7 +-
 drivers/net/hns3/hns3_rxtx.h                  |   2 +-
 drivers/net/i40e/i40e_rxtx.c                  |   4 +-
 drivers/net/i40e/i40e_rxtx.h                  |   3 +-
 drivers/net/iavf/iavf_rxtx.c                  |   4 +-
 drivers/net/iavf/iavf_rxtx.h                  |   2 +-
 drivers/net/ice/ice_rxtx.c                    |   4 +-
 drivers/net/ice/ice_rxtx.h                    |   2 +-
 drivers/net/igc/igc_txrx.c                    |   5 +-
 drivers/net/igc/igc_txrx.h                    |   3 +-
 drivers/net/ixgbe/ixgbe_ethdev.h              |   3 +-
 drivers/net/ixgbe/ixgbe_rxtx.c                |   4 +-
 drivers/net/mlx5/mlx5_rx.c                    |  26 +-
 drivers/net/mlx5/mlx5_rx.h                    |   2 +-
 drivers/net/netvsc/hn_rxtx.c                  |   4 +-
 drivers/net/netvsc/hn_var.h                   |   3 +-
 drivers/net/nfp/nfp_rxtx.c                    |   4 +-
 drivers/net/nfp/nfp_rxtx.h                    |   3 +-
 drivers/net/octeontx2/otx2_ethdev.h           |   2 +-
 drivers/net/octeontx2/otx2_ethdev_ops.c       |   8 +-
 drivers/net/sfc/sfc_ethdev.c                  |  12 +-
 drivers/net/thunderx/nicvf_ethdev.c           |   3 +-
 drivers/net/thunderx/nicvf_rxtx.c             |   4 +-
 drivers/net/thunderx/nicvf_rxtx.h             |   2 +-
 drivers/net/txgbe/txgbe_ethdev.h              |   3 +-
 drivers/net/txgbe/txgbe_rxtx.c                |   4 +-
 drivers/net/vhost/rte_eth_vhost.c             |   4 +-
 lib/ethdev/ethdev_driver.h                    | 152 +++++++++
 lib/ethdev/ethdev_private.c                   |  84 +++++
 lib/ethdev/ethdev_private.h                   |   7 +
 lib/ethdev/rte_ethdev.c                       |  78 +++--
 lib/ethdev/rte_ethdev.h                       | 288 ++++++++++++------
 lib/ethdev/rte_ethdev_core.h                  | 168 +++-------
 lib/ethdev/version.map                        |   6 +
 lib/eventdev/rte_event_eth_rx_adapter.c       |   2 +-
 lib/eventdev/rte_event_eth_tx_adapter.c       |   2 +-
 lib/eventdev/rte_eventdev.c                   |   2 +-
 55 files changed, 643 insertions(+), 380 deletions(-)

-- 
2.26.3


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-10-03 21:05 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-02  0:02 [dpdk-dev] [PATCH v3 1/7] ethdev: allocate max space for internal queue array Pavan Nikhilesh Bhagavatula
2021-10-03 21:05 ` Ananyev, Konstantin
  -- strict thread matches above, loose matches on Subject: below --
2021-09-22 14:09 [dpdk-dev] [RFC v2 0/5] hide eth dev related structures Konstantin Ananyev
2021-10-01 14:02 ` [dpdk-dev] [PATCH v3 0/7] " Konstantin Ananyev
2021-10-01 14:02   ` [dpdk-dev] [PATCH v3 1/7] ethdev: allocate max space for internal queue array Konstantin Ananyev
2021-10-01 16:48     ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).