From patchwork Fri Feb 10 17:37:42 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Naga Harish K, S V" X-Patchwork-Id: 123696 X-Patchwork-Delegate: jerinj@marvell.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A16C841C50; Fri, 10 Feb 2023 18:38:39 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 90259410EA; Fri, 10 Feb 2023 18:38:39 +0100 (CET) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id CCDD0410D3 for ; Fri, 10 Feb 2023 18:38:37 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1676050718; x=1707586718; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=q790kVFXuYfCSPP2zVfFap3GEL8g8dGUvlupzgqSW/0=; b=AOaQ84dLDr5bcGnEHkNkiouID8v1Shx6zdQOw56fACby6ZqU3Kc+hg3u wN2CA1wZTpbM9NTHk0pP+3L1Srolt9P9J0OxHsuaTxidfHzaqmnxQ87r6 kJyUorZpPwXfC8uqDxkUa7wW95UX13OUcrStIt3pfGgmDP6FULGteAiNz d0dKZkcdY9ksfEFEAiRTLFDz0awwK03DAmoH7KoRkxfljhnxNSIX6kgl9 HVqxceJ8/Ofm+g4iYPgOIonfCPgeNytDZ3c9NEcf0CXEYtApFucuTNy3O bRn0Wa1CYudpNUOPNpw+FhYNSgkhhu0Qa8ffHtEQgS7P5xDYe2L4vsFJQ A==; X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="329108977" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="329108977" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2023 09:37:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="756857411" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="756857411" Received: from txandevlnx322.an.intel.com ([10.123.117.44]) by FMSMGA003.fm.intel.com with ESMTP; 10 Feb 2023 09:37:48 -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 v6 1/3] eventdev/eth_rx: add params set/get APIs Date: Fri, 10 Feb 2023 11:37:42 -0600 Message-Id: <20230210173744.3597666-1-s.v.naga.harish.k@intel.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20230210134646.3407253-1-s.v.naga.harish.k@intel.com> References: <20230210134646.3407253-1-s.v.naga.harish.k@intel.com> MIME-Version: 1.0 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 runtime configuration parameters defined in the struct rte_event_eth_rx_adapter_runtime_params can be configured and retrieved using rte_event_eth_rx_adapter_runtime_params_set() and rte_event_eth_tx_adapter_runtime_params_get() respectively. Signed-off-by: Naga Harish K S V --- v6: * updated doxygen comments as per review comments --- --- app/test/test_event_eth_rx_adapter.c | 113 ++++++++++++++++++ .../prog_guide/event_ethernet_rx_adapter.rst | 8 ++ lib/eventdev/rte_event_eth_rx_adapter.c | 101 +++++++++++++++- lib/eventdev/rte_event_eth_rx_adapter.h | 88 +++++++++++++- lib/eventdev/version.map | 3 + 5 files changed, 311 insertions(+), 2 deletions(-) diff --git a/app/test/test_event_eth_rx_adapter.c b/app/test/test_event_eth_rx_adapter.c index 1da7782560..cfe6052d7e 100644 --- a/app/test/test_event_eth_rx_adapter.c +++ b/app/test/test_event_eth_rx_adapter.c @@ -1198,6 +1198,117 @@ adapter_intrq_instance_get(void) return TEST_SUCCESS; } +static int +adapter_get_set_params(void) +{ + int err; + struct rte_event_eth_rx_adapter_runtime_params in_params; + struct rte_event_eth_rx_adapter_runtime_params out_params; + struct rte_event_eth_rx_adapter_queue_conf queue_config = {0}; + struct rte_event ev; + + ev.queue_id = 0; + ev.sched_type = RTE_SCHED_TYPE_ATOMIC; + ev.priority = 0; + ev.flow_id = 1; + + queue_config.rx_queue_flags = + RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID; + queue_config.ev = ev; + queue_config.servicing_weight = 1; + + err = rte_event_eth_rx_adapter_queue_add(TEST_INST_ID, + TEST_ETHDEV_ID, 0, + &queue_config); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_rx_adapter_runtime_params_init(&in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + err = rte_event_eth_rx_adapter_runtime_params_init(&out_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + /* Case 1: Get the default value of mbufs processed by Rx adapter */ + err = rte_event_eth_rx_adapter_runtime_params_get(TEST_INST_ID, + &out_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + /* Case 2: Set max_nb_rx = 32 (=BATCH_SEIZE) */ + in_params.max_nb_rx = 32; + + err = rte_event_eth_rx_adapter_runtime_params_set(TEST_INST_ID, + &in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_rx_adapter_runtime_params_get(TEST_INST_ID, + &out_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + TEST_ASSERT(in_params.max_nb_rx == out_params.max_nb_rx, + "Expected %u got %u", + in_params.max_nb_rx, out_params.max_nb_rx); + + /* Case 3: Set max_nb_rx = 192 */ + in_params.max_nb_rx = 192; + + err = rte_event_eth_rx_adapter_runtime_params_set(TEST_INST_ID, + &in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_rx_adapter_runtime_params_get(TEST_INST_ID, + &out_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + TEST_ASSERT(in_params.max_nb_rx == out_params.max_nb_rx, + "Expected %u got %u", + in_params.max_nb_rx, out_params.max_nb_rx); + + /* Case 4: Set max_nb_rx = 256 */ + in_params.max_nb_rx = 256; + + err = rte_event_eth_rx_adapter_runtime_params_set(TEST_INST_ID, + &in_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + + err = rte_event_eth_rx_adapter_runtime_params_get(TEST_INST_ID, + &out_params); + TEST_ASSERT(err == 0, "Expected 0 got %d", err); + TEST_ASSERT(in_params.max_nb_rx == out_params.max_nb_rx, + "Expected %u got %u", + in_params.max_nb_rx, out_params.max_nb_rx); + + /* Case 5: Set max_nb_rx = 30(event_port_id = port_id; - conf->max_nb_rx = 128; + conf->max_nb_rx = RXA_NB_RX_WORK_DEFAULT; if (started) ret = rte_event_dev_start(dev_id); rx_adapter->default_cb_arg = 1; @@ -3461,6 +3463,103 @@ rte_event_eth_rx_adapter_instance_get(uint16_t eth_dev_id, return -EINVAL; } +static int +rxa_caps_check(struct event_eth_rx_adapter *rxa) +{ + uint16_t eth_dev_id; + uint32_t caps = 0; + int ret; + + if (!rxa->nb_queues) + return -EINVAL; + + /* The eth_dev used is always of same type. + * Hence eth_dev_id is taken from first entry of poll array. + */ + eth_dev_id = rxa->eth_rx_poll[0].eth_dev_id; + ret = rte_event_eth_rx_adapter_caps_get(rxa->eventdev_id, + eth_dev_id, + &caps); + if (ret) { + RTE_EDEV_LOG_ERR("Failed to get adapter caps edev %" PRIu8 + "eth port %" PRIu16, rxa->eventdev_id, eth_dev_id); + return ret; + } + + if (caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) + return -ENOTSUP; + + return 0; +} + +int +rte_event_eth_rx_adapter_runtime_params_init( + struct rte_event_eth_rx_adapter_runtime_params *params) +{ + if (params == NULL) + return -EINVAL; + + memset(params, 0, sizeof(struct rte_event_eth_rx_adapter_runtime_params)); + params->max_nb_rx = RXA_NB_RX_WORK_DEFAULT; + + return 0; +} + +int +rte_event_eth_rx_adapter_runtime_params_set(uint8_t id, + struct rte_event_eth_rx_adapter_runtime_params *params) +{ + struct event_eth_rx_adapter *rxa; + int ret; + + if (params == NULL) + return -EINVAL; + + if (rxa_memzone_lookup()) + return -ENOMEM; + + rxa = rxa_id_to_adapter(id); + if (rxa == NULL) + return -EINVAL; + + ret = rxa_caps_check(rxa); + if (ret) + return ret; + + rte_spinlock_lock(&rxa->rx_lock); + rxa->max_nb_rx = params->max_nb_rx; + rte_spinlock_unlock(&rxa->rx_lock); + + return 0; +} + +int +rte_event_eth_rx_adapter_runtime_params_get(uint8_t id, + struct rte_event_eth_rx_adapter_runtime_params *params) +{ + struct event_eth_rx_adapter *rxa; + int ret; + + if (params == NULL) + return -EINVAL; + + if (rxa_memzone_lookup()) + return -ENOMEM; + + rxa = rxa_id_to_adapter(id); + if (rxa == NULL) + return -EINVAL; + + ret = rxa_caps_check(rxa); + if (ret) + return ret; + + params->max_nb_rx = rxa->max_nb_rx; + + return 0; +} + +/* RX-adapter telemetry callbacks */ #define RXA_ADD_DICT(stats, s) rte_tel_data_add_dict_uint(d, #s, stats.s) static int diff --git a/lib/eventdev/rte_event_eth_rx_adapter.h b/lib/eventdev/rte_event_eth_rx_adapter.h index f4652f40e8..fe2a6bdd2c 100644 --- a/lib/eventdev/rte_event_eth_rx_adapter.h +++ b/lib/eventdev/rte_event_eth_rx_adapter.h @@ -39,10 +39,14 @@ * - rte_event_eth_rx_adapter_queue_stats_reset() * - rte_event_eth_rx_adapter_event_port_get() * - rte_event_eth_rx_adapter_instance_get() + * - rte_event_eth_rx_adapter_runtime_params_get() + * - rte_event_eth_rx_adapter_runtime_params_init() + * - rte_event_eth_rx_adapter_runtime_params_set() * * The application creates an ethernet to event adapter using * rte_event_eth_rx_adapter_create_ext() or rte_event_eth_rx_adapter_create() * or rte_event_eth_rx_adapter_create_with_params() functions. + * * The adapter needs to know which ethernet rx queues to poll for mbufs as well * as event device parameters such as the event queue identifier, event * priority and scheduling type that the adapter should use when constructing @@ -299,6 +303,31 @@ struct rte_event_eth_rx_adapter_params { /**< flag to indicate that event buffer is separate for each queue */ }; +/** + * Adapter runtime configuration parameters + */ +struct rte_event_eth_rx_adapter_runtime_params { + uint32_t max_nb_rx; + /**< The adapter can return early if it has processed at least + * max_nb_rx mbufs. This isn't treated as a requirement; batching may + * cause the adapter to process more than max_nb_rx mbufs. + * + * rte_event_eth_rx_adapter_create() or + * rte_event_eth_adapter_create_with_params() configures the + * adapter with default value of max_nb_rx. + * rte_event_eth_rx_adapter_create_ext() configures the adapter with + * user provided value of max_nb_rx through + * rte_event_eth_rx_adapter_conf::max_nb_rx parameter. + * rte_event_eth_rx_adapter_runtime_params_set() allows to re-configure + * max_nb_rx during runtime (after adding at least one queue) + * + * This is valid for the devices without + * RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT capability. + */ + uint32_t rsvd[15]; + /**< Reserved fields for future use */ +}; + /** * * Callback function invoked by the SW adapter before it continues @@ -377,7 +406,7 @@ int rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, * Create a new ethernet Rx event adapter with the specified identifier. * This function uses an internal configuration function that creates an event * port. This default function reconfigures the event device with an - * additional event port and setups up the event port using the port_config + * additional event port and setup the event port using the port_config * parameter passed into this function. In case the application needs more * control in configuration of the service, it should use the * rte_event_eth_rx_adapter_create_ext() version. @@ -743,6 +772,63 @@ rte_event_eth_rx_adapter_instance_get(uint16_t eth_dev_id, uint16_t rx_queue_id, uint8_t *rxa_inst_id); +/** + * Initialize the adapter runtime configuration parameters with default values + * + * @param params + * A pointer to structure of type struct rte_event_eth_rx_adapter_runtime_params + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +__rte_experimental +int +rte_event_eth_rx_adapter_runtime_params_init( + struct rte_event_eth_rx_adapter_runtime_params *params); + +/** + * Set the adapter runtime configuration parameters + * + * @param id + * Adapter identifier + * + * @param params + * A pointer to structure of type struct rte_event_eth_rx_adapter_runtime_params + * with configuration parameter values. The reserved fields of the structure + * must be initialized to zero and the valid fields need to be set appropriately. + * This structure can be initialized using + * rte_event_eth_rx_adapter_runtime_params_init() to default values or + * application may reset this structure and update the required fields. + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +__rte_experimental +int +rte_event_eth_rx_adapter_runtime_params_set(uint8_t id, + struct rte_event_eth_rx_adapter_runtime_params *params); + +/** + * Get the adapter runtime configuration parameters + * + * @param id + * Adapter identifier + * + * @param[out] params + * A pointer to structure of type struct rte_event_eth_rx_adapter_runtime_params + * containing valid adapter parameters when return value is 0. + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +__rte_experimental +int +rte_event_eth_rx_adapter_runtime_params_get(uint8_t id, + struct rte_event_eth_rx_adapter_runtime_params *params); + #ifdef __cplusplus } #endif diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map index 3add5e3088..ef9c3b86b2 100644 --- a/lib/eventdev/version.map +++ b/lib/eventdev/version.map @@ -121,6 +121,9 @@ EXPERIMENTAL { rte_event_eth_tx_adapter_queue_stop; # added in 23.03 + rte_event_eth_rx_adapter_runtime_params_get; + rte_event_eth_rx_adapter_runtime_params_init; + rte_event_eth_rx_adapter_runtime_params_set; rte_event_timer_remaining_ticks_get; };