@@ -40,6 +40,8 @@ test_event_eth_tx_adapter_common(void)
#define PORT(p) default_params.port[(p)]
#define TEST_ETHDEV_ID PORT(0)
#define TEST_ETHDEV_PAIR_ID PORT(PAIR_PORT_INDEX(0))
+#define DEFAULT_FLUSH_THRESHOLD 1024
+#define TXA_NB_TX_WORK_DEFAULT 128
#define EDEV_RETRY 0xffff
@@ -795,6 +797,102 @@ tx_adapter_queue_start_stop(void)
return TEST_SUCCESS;
}
+static int
+tx_adapter_set_get_params(void)
+{
+ int err;
+ struct rte_event_eth_tx_adapter_params in_params;
+ struct rte_event_eth_tx_adapter_params out_params;
+
+ err = rte_event_eth_tx_adapter_queue_add(TEST_INST_ID,
+ TEST_ETHDEV_ID,
+ 0);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ /* Case 1: Get the default values of adapter */
+ err = rte_event_eth_tx_adapter_get_params(TEST_INST_ID, &out_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+ TEST_ASSERT(out_params.flush_threshold == DEFAULT_FLUSH_THRESHOLD,
+ "Expected %u got %u",
+ DEFAULT_FLUSH_THRESHOLD, out_params.flush_threshold);
+ TEST_ASSERT(out_params.max_nb_tx == TXA_NB_TX_WORK_DEFAULT,
+ "Expected %u got %u",
+ TXA_NB_TX_WORK_DEFAULT, out_params.max_nb_tx);
+
+ /* Case 2: Set max_nb_tx = 32 (=TXA_BATCH_SEIZE) */
+ in_params.max_nb_tx = 32;
+ in_params.flush_threshold = DEFAULT_FLUSH_THRESHOLD;
+
+ err = rte_event_eth_tx_adapter_set_params(TEST_INST_ID, &in_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ err = rte_event_eth_tx_adapter_get_params(TEST_INST_ID, &out_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+ TEST_ASSERT(in_params.max_nb_tx == out_params.max_nb_tx,
+ "Expected %u got %u",
+ in_params.max_nb_tx, out_params.max_nb_tx);
+ TEST_ASSERT(in_params.flush_threshold == out_params.flush_threshold,
+ "Expected %u got %u",
+ in_params.flush_threshold, out_params.flush_threshold);
+
+ /* Case 3: Set max_nb_tx = 192 */
+ in_params.max_nb_tx = 192;
+
+ err = rte_event_eth_tx_adapter_set_params(TEST_INST_ID, &in_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ err = rte_event_eth_tx_adapter_get_params(TEST_INST_ID, &out_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+ TEST_ASSERT(in_params.max_nb_tx == out_params.max_nb_tx, "Expected %u got %u",
+ in_params.max_nb_tx, out_params.max_nb_tx);
+
+ /* Case 4: Set max_nb_tx = 256 */
+ in_params.max_nb_tx = 256;
+
+ err = rte_event_eth_tx_adapter_set_params(TEST_INST_ID, &in_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ err = rte_event_eth_tx_adapter_get_params(TEST_INST_ID, &out_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+ TEST_ASSERT(in_params.max_nb_tx == out_params.max_nb_tx, "Expected %u got %u",
+ in_params.max_nb_tx, out_params.max_nb_tx);
+
+ /* Case 5: Set max_nb_tx = 30(<TXA_BATCH_SIZE) */
+ in_params.max_nb_tx = 30;
+
+ err = rte_event_eth_tx_adapter_set_params(TEST_INST_ID, &in_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ /* Case 6: Set max_nb_tx = 512 */
+ in_params.max_nb_tx = 512;
+
+ err = rte_event_eth_tx_adapter_set_params(TEST_INST_ID, &in_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ /* Case 7: Set flush_threshold = 10 */
+ in_params.max_nb_tx = 128;
+ in_params.flush_threshold = 10;
+
+ err = rte_event_eth_tx_adapter_set_params(TEST_INST_ID, &in_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ err = rte_event_eth_tx_adapter_get_params(TEST_INST_ID, &out_params);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+ TEST_ASSERT(in_params.max_nb_tx == out_params.max_nb_tx,
+ "Expected %u got %u",
+ in_params.max_nb_tx, out_params.max_nb_tx);
+ TEST_ASSERT(in_params.flush_threshold == out_params.flush_threshold,
+ "Expected %u got %u",
+ in_params.flush_threshold, out_params.flush_threshold);
+
+ err = rte_event_eth_tx_adapter_queue_del(TEST_INST_ID,
+ TEST_ETHDEV_ID,
+ 0);
+ TEST_ASSERT(err == 0, "Expected 0 got %d", err);
+
+ return TEST_SUCCESS;
+}
+
static int
tx_adapter_dynamic_device(void)
{
@@ -856,6 +954,8 @@ static struct unit_test_suite event_eth_tx_tests = {
tx_adapter_instance_get),
TEST_CASE_ST(tx_adapter_create, tx_adapter_free,
tx_adapter_queue_start_stop),
+ TEST_CASE_ST(tx_adapter_create, tx_adapter_free,
+ tx_adapter_set_get_params),
TEST_CASE_ST(NULL, NULL, tx_adapter_dynamic_device),
TEST_CASES_END() /**< NULL terminate unit test array */
}
@@ -207,3 +207,25 @@ Stop function stops the adapter runtime function from enqueueing any
packets to the associated Tx queue. This API also frees any packets that
may have been buffered for this queue. All inflight packets destined to the
queue are freed by the adapter runtime until the queue is started again.
+
+Set/Get adapter configuration parameters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The configuration parameters of adapter can be set/read using
+``rte_event_eth_tx_adapter_set_params()`` and
+``rte_event_eth_tx_adapter_get_params()`` respectively. The parameters that
+can be set/read are defined in ``struct rte_event_eth_tx_adapter_params``.
+
+``rte_event_eth_tx_adapter_create()`` configures the adapter with
+default value of maximum packets processed per request to 128.
+``rte_event_eth_tx_adapter_set_params()`` function allows to reconfigure maximum
+number of packets processed by adapter per service request.
+This is alternative to configuring the maximum packets processed per request by
+adapter by using ``rte_event_eth_tx_adapter_create_ext()`` with parameter
+rte_event_eth_tx_adapter_conf::max_nb_tx
+
+The adapter flush threshold also can be configured using
+``rte_event_eth_tx_adapter_set_params()``.
+
+``rte_event_eth_tx_adapter_get_params()`` function retrieves the adapter params
+that are defined in ``struct rte_event_eth_tx_adapter_params``.
@@ -124,6 +124,8 @@ struct txa_service_data {
uint16_t dev_count;
/* Loop count to flush Tx buffers */
int loop_cnt;
+ /* Loop count threshold to flush Tx buffers */
+ uint16_t flush_threshold;
/* Per ethernet device structure */
struct txa_service_ethdev *txa_ethdev;
/* Statistics */
@@ -663,13 +665,14 @@ txa_service_func(void *args)
ret = 0;
}
- if ((txa->loop_cnt++ & (TXA_FLUSH_THRESHOLD - 1)) == 0) {
+ if (txa->loop_cnt++ == txa->flush_threshold) {
struct txa_service_ethdev *tdi;
struct txa_service_queue_info *tqi;
struct rte_eth_dev *dev;
uint16_t i;
+ txa->loop_cnt = 0;
tdi = txa->txa_ethdev;
nb_tx = 0;
@@ -767,6 +770,7 @@ txa_service_adapter_create_ext(uint8_t id, struct rte_eventdev *dev,
txa->service_id = TXA_INVALID_SERVICE_ID;
rte_spinlock_init(&txa->tx_lock);
txa_service_data_array[id] = txa;
+ txa->flush_threshold = TXA_FLUSH_THRESHOLD;
return 0;
}
@@ -1279,6 +1283,50 @@ rte_event_eth_tx_adapter_stats_reset(uint8_t id)
return ret;
}
+int
+rte_event_eth_tx_adapter_set_params(uint8_t id,
+ struct rte_event_eth_tx_adapter_params *txa_params)
+{
+ struct txa_service_data *txa;
+ if (txa_lookup())
+ return -ENOMEM;
+
+ TXA_CHECK_OR_ERR_RET(id);
+
+ if (txa_params == NULL)
+ return -EINVAL;
+
+ txa = txa_service_id_to_data(id);
+ rte_spinlock_lock(&txa->tx_lock);
+ txa->flush_threshold = txa_params->flush_threshold;
+ txa->max_nb_tx = txa_params->max_nb_tx;
+ rte_spinlock_unlock(&txa->tx_lock);
+
+ return 0;
+}
+
+int
+rte_event_eth_tx_adapter_get_params(uint8_t id,
+ struct rte_event_eth_tx_adapter_params *txa_params)
+{
+ struct txa_service_data *txa;
+ if (txa_lookup())
+ return -ENOMEM;
+
+ TXA_CHECK_OR_ERR_RET(id);
+
+ if (txa_params == NULL)
+ return -EINVAL;
+
+ txa = txa_service_id_to_data(id);
+ rte_spinlock_lock(&txa->tx_lock);
+ txa_params->flush_threshold = txa->flush_threshold;
+ txa_params->max_nb_tx = txa->max_nb_tx;
+ rte_spinlock_unlock(&txa->tx_lock);
+
+ return 0;
+}
+
int
rte_event_eth_tx_adapter_stop(uint8_t id)
{
@@ -103,6 +103,21 @@ struct rte_event_eth_tx_adapter_conf {
*/
};
+/**
+ * Adapter configuration parameters
+ */
+struct rte_event_eth_tx_adapter_params {
+ uint32_t max_nb_tx;
+ /**< The adapter can return early if it has processed at least
+ * max_nb_tx mbufs. This isn't treated as a requirement; batching may
+ * cause the adapter to process more than max_nb_tx mbufs.
+ */
+ uint16_t flush_threshold;
+ /**< the number of service function iteration count to
+ * flush buffered packets.
+ */
+};
+
/**
* Function type used for adapter configuration callback. The callback is
* used to fill in members of the struct rte_event_eth_tx_adapter_conf, this
@@ -502,6 +517,49 @@ __rte_experimental
int
rte_event_eth_tx_adapter_queue_stop(uint16_t eth_dev_id, uint16_t tx_queue_id);
+/**
+ * Set the configuration parameters for adapter.
+ *
+ * In case not all fields are to be updated, the suggested way to use this
+ * api is read the current values using rte_event_eth_tx_adapter_get_params()
+ * and modify the required parameters and then call
+ * rte_event_eth_tx_adapter_set_params().
+ *
+ * This API is to be used after adding at least one queue to the adapter.
+ *
+ * @param id
+ * Adapter identifier
+ * @param params
+ * A pointer to structure of type struct rte_event_eth_tx_adapter_params
+ * with configuration parameter values.
+ *
+ * @return
+ * - 0: Success
+ * - <0: Error code on failure
+ */
+__rte_experimental
+int
+rte_event_eth_tx_adapter_set_params(uint8_t id,
+ struct rte_event_eth_tx_adapter_params *params);
+
+/**
+ * Get the configuration parameters of adapter.
+ *
+ * @param id
+ * Adapter identifier
+ * @param[out] params
+ * A pointer to structure of type struct rte_event_eth_tx_adapter_params
+ * containing valid Tx adapter parameters when return value is 0
+ *
+ * @return
+ * - 0: Success
+ * - <0: Error code on failure
+ */
+__rte_experimental
+int
+rte_event_eth_tx_adapter_get_params(uint8_t id,
+ struct rte_event_eth_tx_adapter_params *params);
+
#ifdef __cplusplus
}
#endif
@@ -122,6 +122,8 @@ EXPERIMENTAL {
# added in 23.03
rte_event_eth_rx_adapter_get_params;
rte_event_eth_rx_adapter_set_params;
+ rte_event_eth_tx_adapter_get_params;
+ rte_event_eth_tx_adapter_set_params;
};
INTERNAL {