From: Ciara Loftus <ciara.loftus@intel.com>
To: dev@dpdk.org
Cc: Ciara Loftus <ciara.loftus@intel.com>,
Bruce Richardson <bruce.richardson@intel.com>
Subject: [PATCH v3 12/15] net/intel: introduce infrastructure for Rx path selection
Date: Mon, 18 Aug 2025 10:59:11 +0000 [thread overview]
Message-ID: <20250818105914.169732-13-ciara.loftus@intel.com> (raw)
In-Reply-To: <20250818105914.169732-1-ciara.loftus@intel.com>
The code for determining which Rx path to select during initialisation
has become complicated in many intel drivers due to the amount of
different paths and features available within each path. This commit
aims to simplify and genericize the path selection logic.
The following information about each Rx burst function is stored and
used by the new common function to select the appropriate Rx path:
- Rx Offloads
- SIMD bitwidth
- Flexible RXD usage
- Bulk alloc function
- Scattered function
Signed-off-by: Ciara Loftus <ciara.loftus@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
v3:
* remove unnecessary initialisation in the path select function
* remove defines for features
* define new sub structure within features structure
---
drivers/net/intel/common/rx.h | 98 +++++++++++++++++++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git a/drivers/net/intel/common/rx.h b/drivers/net/intel/common/rx.h
index 70b597e8dc..770284f7ab 100644
--- a/drivers/net/intel/common/rx.h
+++ b/drivers/net/intel/common/rx.h
@@ -10,6 +10,7 @@
#include <unistd.h>
#include <rte_mbuf.h>
#include <rte_ethdev.h>
+#include <rte_vect.h>
#include "desc.h"
@@ -125,6 +126,25 @@ struct ci_rx_queue {
};
};
+struct ci_rx_path_features_extra {
+ bool scattered;
+ bool flex_desc;
+ bool bulk_alloc;
+ bool disabled;
+};
+
+struct ci_rx_path_features {
+ uint32_t rx_offloads;
+ enum rte_vect_max_simd simd_width;
+ struct ci_rx_path_features_extra extra;
+};
+
+struct ci_rx_path_info {
+ eth_rx_burst_t pkt_burst;
+ const char *info;
+ struct ci_rx_path_features features;
+};
+
static inline uint16_t
ci_rx_reassemble_packets(struct rte_mbuf **rx_bufs, uint16_t nb_bufs, uint8_t *split_flags,
struct rte_mbuf **pkt_first_seg, struct rte_mbuf **pkt_last_seg,
@@ -222,4 +242,82 @@ ci_rxq_vec_capable(uint16_t nb_desc, uint16_t rx_free_thresh, uint64_t offloads)
return true;
}
+/**
+ * Select the best matching Rx path based on features
+ *
+ * @param req_features
+ * The requested features for the Rx path
+ * @param infos
+ * Array of information about the available Rx paths
+ * @param num_paths
+ * Number of available paths in the infos array
+ * @param default_path
+ * Index of the default path to use if no suitable path is found
+ *
+ * @return
+ * The packet burst function index that best matches the requested features,
+ * or default_path if no suitable path is found
+ */
+static inline int
+ci_rx_path_select(struct ci_rx_path_features req_features,
+ const struct ci_rx_path_info *infos,
+ int num_paths,
+ int default_path)
+{
+ int i, idx = default_path;
+ const struct ci_rx_path_features *current_features = NULL;
+
+ for (i = 0; i < num_paths; i++) {
+ const struct ci_rx_path_features *path_features = &infos[i].features;
+
+ /* Do not select a disabled rx path. */
+ if (path_features->extra.disabled)
+ continue;
+
+ /* If requested, ensure the path uses the flexible descriptor. */
+ if (path_features->extra.flex_desc != req_features.extra.flex_desc)
+ continue;
+
+ /* If requested, ensure the path supports scattered RX. */
+ if (path_features->extra.scattered != req_features.extra.scattered)
+ continue;
+
+ /* Do not use a bulk alloc path if not requested. */
+ if (path_features->extra.bulk_alloc && !req_features.extra.bulk_alloc)
+ continue;
+
+ /* Ensure the path supports the requested RX offloads. */
+ if ((path_features->rx_offloads & req_features.rx_offloads) !=
+ req_features.rx_offloads)
+ continue;
+
+ /* Ensure the path's SIMD width is compatible with the requested width. */
+ if (path_features->simd_width > req_features.simd_width)
+ continue;
+
+ /* Do not select the path if it is less suitable than the current path. */
+ if (current_features != NULL) {
+ /* Do not select paths with lower SIMD width than the current path. */
+ if (path_features->simd_width < current_features->simd_width)
+ continue;
+ /* Do not select paths with more offloads enabled than the current path. */
+ if (rte_popcount32(path_features->rx_offloads) >
+ rte_popcount32(current_features->rx_offloads))
+ continue;
+ /* Do not select paths without bulk alloc support if requested and the
+ * current path already meets this requirement.
+ */
+ if (!path_features->extra.bulk_alloc && req_features.extra.bulk_alloc &&
+ current_features->extra.bulk_alloc)
+ continue;
+ }
+
+ /* Finally, select the path since it has met all the requirements. */
+ idx = i;
+ current_features = &infos[idx].features;
+ }
+
+ return idx;
+}
+
#endif /* _COMMON_INTEL_RX_H_ */
--
2.34.1
next prev parent reply other threads:[~2025-08-18 11:00 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-18 10:58 [PATCH v3 00/15] net/intel: rx path selection simplification Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 01/15] net/ice: use the same Rx path across process types Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 02/15] net/iavf: rename Rx/Tx function type variables Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 03/15] net/iavf: use the same Rx path across process types Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 04/15] net/i40e: " Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 05/15] net/intel: introduce common vector capability function Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 06/15] net/ice: use the new " Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 07/15] net/iavf: " Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 08/15] net/i40e: " Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 09/15] net/iavf: remove redundant field from iavf adapter struct Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 10/15] net/ice: remove unsupported Rx offload Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 11/15] net/iavf: reorder enum of Rx function types Ciara Loftus
2025-08-18 10:59 ` Ciara Loftus [this message]
2025-08-18 10:59 ` [PATCH v3 13/15] net/ice: use the common Rx path selection infrastructure Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 14/15] net/iavf: " Ciara Loftus
2025-08-18 10:59 ` [PATCH v3 15/15] net/i40e: " Ciara Loftus
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250818105914.169732-13-ciara.loftus@intel.com \
--to=ciara.loftus@intel.com \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).