From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 83E064246D; Mon, 23 Jan 2023 19:05:10 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6D35B40E5A; Mon, 23 Jan 2023 19:05:09 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 7863240150 for ; Mon, 23 Jan 2023 19:05:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1674497105; x=1706033105; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gFHa5u+Esu/HXxSwbD4LposPpIi57ESYDB7uFtBGmEg=; b=A8ijVfuZ7k9KkozlAEqQ1/PFX6S7HlFI5nWd91YB8Nf7u841rkmAp1sV rZP4jXplzngFCsoCvtd2Tol24cHTpq8JEFk1h+Flf8JCDvcKhAeCN/luD SRosTNW5S6EM5wqzCH4AGgIz2lwioM+N30H28j57EJoeq+Qy6jp5lNJVK hQQAj+FlPH06jyN51/qN3J3szV/RM74D2Ucdl7mbKWyVLE4VPi8qxoIZy 55YtwN9l9AFBXr2gvSOajtVzCa7NAMylcQygrJWo0SLR9pZzEaCBHYbKS /siRPnbiIHtXSfTYmgSrJ+HFn6HWvcHbE4DP8P762oT1TfaDre7XhnI8P w==; X-IronPort-AV: E=McAfee;i="6500,9779,10599"; a="390608248" X-IronPort-AV: E=Sophos;i="5.97,240,1669104000"; d="scan'208";a="390608248" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Jan 2023 10:05:04 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10599"; a="611713880" X-IronPort-AV: E=Sophos;i="5.97,240,1669104000"; d="scan'208";a="611713880" Received: from txandevlnx322.an.intel.com ([10.123.117.44]) by orsmga003.jf.intel.com with ESMTP; 23 Jan 2023 10:05:03 -0800 From: Naga Harish K S V To: jerinj@marvell.com, erik.g.carrillo@intel.com, abhinandan.gujjar@intel.com Cc: dev@dpdk.org, jay.jayatheerthan@intel.com Subject: [PATCH v2 2/3] eventdev/eth_tx: add params set/get APIs Date: Mon, 23 Jan 2023 12:04:57 -0600 Message-Id: <20230123180458.486189-2-s.v.naga.harish.k@intel.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20230123180458.486189-1-s.v.naga.harish.k@intel.com> References: <20230107161852.3708690-1-s.v.naga.harish.k@intel.com> <20230123180458.486189-1-s.v.naga.harish.k@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The adapter configuration parameters defined in the ``struct rte_event_eth_tx_adapter_runtime_params`` can be configured and retrieved using ``rte_event_eth_tx_adapter_runtime_params_set`` and ``rte_event_eth_tx_adapter_runtime_params_get`` respectively. Signed-off-by: Naga Harish K S V --- app/test/test_event_eth_tx_adapter.c | 110 ++++++++++++++++++ .../prog_guide/event_ethernet_tx_adapter.rst | 23 ++++ lib/eventdev/rte_event_eth_tx_adapter.c | 90 +++++++++++++- lib/eventdev/rte_event_eth_tx_adapter.h | 66 +++++++++++ lib/eventdev/version.map | 2 + 5 files changed, 290 insertions(+), 1 deletion(-) diff --git a/app/test/test_event_eth_tx_adapter.c b/app/test/test_event_eth_tx_adapter.c index c19a87a86a..437f09bef7 100644 --- a/app/test/test_event_eth_tx_adapter.c +++ b/app/test/test_event_eth_tx_adapter.c @@ -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,112 @@ 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_runtime_params in_params; + struct rte_event_eth_tx_adapter_runtime_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_runtime_params_get(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_runtime_params_set(TEST_INST_ID, &in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_tx_adapter_runtime_params_get(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_runtime_params_set(TEST_INST_ID, &in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_tx_adapter_runtime_params_get(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_runtime_params_set(TEST_INST_ID, &in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_tx_adapter_runtime_params_get(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(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; @@ -769,6 +772,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; } @@ -1281,6 +1285,90 @@ rte_event_eth_tx_adapter_stats_reset(uint8_t id) return ret; } +static int +txa_caps_check(uint8_t id, struct txa_service_data *txa) +{ + uint32_t caps = 0; + struct rte_eth_dev *eth_dev; + + if (!txa->dev_count) + return -EINVAL; + + /* The eth_dev used is always the same type. + * Hence first valid eth_dev is taken. + */ + eth_dev = txa->txa_ethdev[0].dev; + if (txa_dev_caps_get(id)) + txa_dev_caps_get(id)(txa_evdev(id), eth_dev, &caps); + + if (caps & RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT) + return -ENOTSUP; + + return 0; +} + +int +rte_event_eth_tx_adapter_runtime_params_set(uint8_t id, + struct rte_event_eth_tx_adapter_runtime_params *txa_params) +{ + struct txa_service_data *txa; + int ret; + + if (txa_lookup()) + return -ENOMEM; + + TXA_CHECK_OR_ERR_RET(id); + + if (txa_params == NULL) + return -EINVAL; + + txa = txa_service_id_to_data(id); + if (txa == NULL) + return -EINVAL; + + ret = txa_caps_check(id, txa); + if (ret) + return ret; + + 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_runtime_params_get(uint8_t id, + struct rte_event_eth_tx_adapter_runtime_params *txa_params) +{ + struct txa_service_data *txa; + int ret; + + if (txa_lookup()) + return -ENOMEM; + + TXA_CHECK_OR_ERR_RET(id); + + if (txa_params == NULL) + return -EINVAL; + + txa = txa_service_id_to_data(id); + if (txa == NULL) + return -EINVAL; + + ret = txa_caps_check(id, txa); + if (ret) + return ret; + + 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) { diff --git a/lib/eventdev/rte_event_eth_tx_adapter.h b/lib/eventdev/rte_event_eth_tx_adapter.h index cd539af7ef..cb5db6781c 100644 --- a/lib/eventdev/rte_event_eth_tx_adapter.h +++ b/lib/eventdev/rte_event_eth_tx_adapter.h @@ -37,6 +37,8 @@ * - rte_event_eth_tx_adapter_instance_get() * - rte_event_eth_tx_adapter_queue_start() * - rte_event_eth_tx_adapter_queue_stop() + * - rte_event_eth_tx_adapter_runtime_params_get() + * - rte_event_eth_tx_adapter_runtime_params_set() * * The application creates the adapter using * rte_event_eth_tx_adapter_create() or rte_event_eth_tx_adapter_create_ext(). @@ -103,6 +105,23 @@ struct rte_event_eth_tx_adapter_conf { */ }; +/** + * Adapter configuration parameters + */ +struct rte_event_eth_tx_adapter_runtime_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. + */ + uint16_t rsvd[29]; + /**< Reserved fields for future expansion */ +}; + /** * 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 @@ -516,6 +535,53 @@ __rte_experimental int rte_event_eth_tx_adapter_queue_stop(uint16_t eth_dev_id, uint16_t tx_queue_id); +/** + * Set the runtime 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 + * and is supported only for service based adapter. + * + * @param id + * Adapter identifier + * @param params + * A pointer to structure of type struct rte_event_eth_tx_adapter_runtime_params + * with configuration parameter values. + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +__rte_experimental +int +rte_event_eth_tx_adapter_runtime_params_set(uint8_t id, + struct rte_event_eth_tx_adapter_runtime_params *params); + +/** + * Get the runtime configuration parameters of adapter. + * + * This API is to be used after adding at least one queue to the adapter + * and is supported only for service based adapter. + * + * @param id + * Adapter identifier + * @param[out] params + * A pointer to structure of type struct rte_event_eth_tx_adapter_runtime_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_runtime_params_get(uint8_t id, + struct rte_event_eth_tx_adapter_runtime_params *params); + #ifdef __cplusplus } #endif diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map index da97db794f..38dfbb1f41 100644 --- a/lib/eventdev/version.map +++ b/lib/eventdev/version.map @@ -123,6 +123,8 @@ EXPERIMENTAL { # added in 23.03 rte_event_eth_rx_adapter_runtime_params_get; rte_event_eth_rx_adapter_runtime_params_set; + rte_event_eth_tx_adapter_runtime_params_get; + rte_event_eth_tx_adapter_runtime_params_set; rte_event_timer_remaining_ticks_get; }; -- 2.25.1