From patchwork Wed Jun 22 16:53:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ganapati Kundapura X-Patchwork-Id: 113257 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 EE608A034C; Wed, 22 Jun 2022 18:54:14 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id C69FB40A87; Wed, 22 Jun 2022 18:54:14 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id 6D6214069F for ; Wed, 22 Jun 2022 18:54:13 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1655916853; x=1687452853; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=iipshIv1GXDtU5IPIjtgwG5M+CnI4lYokgnqZkZdA9I=; b=lsfFztNydfk6HDpT0qo+94SQnoTTgHIhC2LcvWJ/YSDX/Gec+x8fIcET Wf6LKA/E3F/d6bydLt6g1l9qUKmE5WI6+w2//UFyxhGQOjX1kmRT72EVn 42aqM6mB9fJW+TdZAMiUMf+JQJXO99rffa1v/3+TJOCu4255/Jemwhi3S KT4DG79qaAHXZtIFR2H0adHenWWM22ZF9xtbJaMcNrtSkFJNUFzbJT2pz UQ5vpsTscRORLdkPh0rAGdfoBxlL6VT2UP0iYLE4UsaAhxk9+aZrDDz4R Go/Su2Y63N0fUO2zA8QYkdQnfphjbiYoGAJsR0cElri/vmM/HoybhnHo3 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10386"; a="281549246" X-IronPort-AV: E=Sophos;i="5.92,212,1650956400"; d="scan'208";a="281549246" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jun 2022 09:54:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.92,212,1650956400"; d="scan'208";a="677645866" Received: from txandevlnx322.an.intel.com ([10.123.117.44]) by FMSMGA003.fm.intel.com with ESMTP; 22 Jun 2022 09:54:10 -0700 From: Ganapati Kundapura To: dev@dpdk.org, jerinj@marvell.com, jay.jayatheerthan@intel.com, s.v.naga.harish.k@intel.com Subject: [PATCH v8 1/7] eventdev/eth_rx: add adapter instance get API Date: Wed, 22 Jun 2022 11:53:59 -0500 Message-Id: <20220622165405.533042-1-ganapati.kundapura@intel.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20220622103756.421869-1-ganapati.kundapura@intel.com> References: <20220622103756.421869-1-ganapati.kundapura@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 Added rte_event_eth_rx_adapter_instance_get() to get adapter instance id for specified ethernet device id and rx queue index. Signed-off-by: Ganapati Kundapura Reviewed-by: Naga Harish K S V --- v8: * Removed limits.h inclusion v7: * Remove allocation of instance array and storage of instnace id * in instance array * Use Rx adapter instance data to query instance id for specified * eth_dev_id and rx_queue_id v6: * rx adapter changes removed from patch4 and moved to patch1 v5: * patch is split into saperate patches v4: * Moved instance array allocation and instance id storage before adapter's nb_queue updation for handling the error case properly v3: * Fixed checkpatch error v2: * Fixed build issues * Added telemetry support for rte_event_eth_rx_adapter_instance_get * arranged functions in alphabetical order in version.map --- lib/eventdev/eventdev_pmd.h | 22 +++++ lib/eventdev/rte_event_eth_rx_adapter.c | 140 +++++++++++++++++++++++++++++--- lib/eventdev/rte_event_eth_rx_adapter.h | 24 ++++++ lib/eventdev/version.map | 1 + 4 files changed, 177 insertions(+), 10 deletions(-) diff --git a/lib/eventdev/eventdev_pmd.h b/lib/eventdev/eventdev_pmd.h index 6940266..c58ba05 100644 --- a/lib/eventdev/eventdev_pmd.h +++ b/lib/eventdev/eventdev_pmd.h @@ -888,6 +888,26 @@ typedef int (*eventdev_eth_rx_adapter_vector_limits_get_t)( const struct rte_eventdev *dev, const struct rte_eth_dev *eth_dev, struct rte_event_eth_rx_adapter_vector_limits *limits); +/** + * Get Rx adapter instance id for Rx queue + * + * @param eth_dev_id + * Port identifier of ethernet device + * + * @param rx_queue_id + * Ethernet device Rx queue index + * + * @param[out] rxa_inst_id + * Pointer to Rx adapter instance identifier. + * Contains valid Rx adapter instance id when return value is 0 + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +typedef int (*eventdev_eth_rx_adapter_instance_get_t) + (uint16_t eth_dev_id, uint16_t rx_queue_id, uint8_t *rxa_inst_id); + typedef uint32_t rte_event_pmd_selftest_seqn_t; extern int rte_event_pmd_selftest_seqn_dynfield_offset; @@ -1321,6 +1341,8 @@ struct eventdev_ops { eventdev_eth_rx_adapter_vector_limits_get_t eth_rx_adapter_vector_limits_get; /**< Get event vector limits for the Rx adapter */ + eventdev_eth_rx_adapter_instance_get_t eth_rx_adapter_instance_get; + /**< Get Rx adapter instance id for Rx queue */ eventdev_timer_adapter_caps_get_t timer_adapter_caps_get; /**< Get timer adapter capabilities */ diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c index bf8741d..ababe13 100644 --- a/lib/eventdev/rte_event_eth_rx_adapter.c +++ b/lib/eventdev/rte_event_eth_rx_adapter.c @@ -1415,15 +1415,13 @@ rxa_service_func(void *args) return 0; } -static int -rte_event_eth_rx_adapter_init(void) +static void * +rxa_memzone_array_get(const char *name, unsigned int elt_size, int nb_elems) { - const char *name = RXA_ADAPTER_ARRAY; const struct rte_memzone *mz; unsigned int sz; - sz = sizeof(*event_eth_rx_adapter) * - RTE_EVENT_ETH_RX_ADAPTER_MAX_INSTANCE; + sz = elt_size * nb_elems; sz = RTE_ALIGN(sz, RTE_CACHE_LINE_SIZE); mz = rte_memzone_lookup(name); @@ -1431,13 +1429,34 @@ rte_event_eth_rx_adapter_init(void) mz = rte_memzone_reserve_aligned(name, sz, rte_socket_id(), 0, RTE_CACHE_LINE_SIZE); if (mz == NULL) { - RTE_EDEV_LOG_ERR("failed to reserve memzone err = %" - PRId32, rte_errno); - return -rte_errno; + RTE_EDEV_LOG_ERR("failed to reserve memzone" + " name = %s, err = %" + PRId32, name, rte_errno); + return NULL; } } - event_eth_rx_adapter = mz->addr; + return mz->addr; +} + +static int +rte_event_eth_rx_adapter_init(void) +{ + uint8_t i; + + if (event_eth_rx_adapter == NULL) { + event_eth_rx_adapter = + rxa_memzone_array_get(RXA_ADAPTER_ARRAY, + sizeof(*event_eth_rx_adapter), + RTE_EVENT_ETH_RX_ADAPTER_MAX_INSTANCE); + if (event_eth_rx_adapter == NULL) + return -ENOMEM; + + for (i = 0; i < RTE_EVENT_ETH_RX_ADAPTER_MAX_INSTANCE; i++) + event_eth_rx_adapter[i] = NULL; + + } + return 0; } @@ -1450,6 +1469,7 @@ rxa_memzone_lookup(void) mz = rte_memzone_lookup(RXA_ADAPTER_ARRAY); if (mz == NULL) return -ENOMEM; + event_eth_rx_adapter = mz->addr; } @@ -1951,7 +1971,6 @@ rxa_sw_del(struct event_eth_rx_adapter *rx_adapter, int intrq; int sintrq; - if (rx_adapter->nb_queues == 0) return; @@ -2524,6 +2543,9 @@ rte_event_eth_rx_adapter_free(uint8_t id) { struct event_eth_rx_adapter *rx_adapter; + if (rxa_memzone_lookup()) + return -ENOMEM; + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL); rx_adapter = rxa_id_to_adapter(id); @@ -2561,6 +2583,9 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id, struct eth_device_info *dev_info; struct rte_event_eth_rx_adapter_vector_limits limits; + if (rxa_memzone_lookup()) + return -ENOMEM; + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL); RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL); @@ -2726,6 +2751,9 @@ rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id, uint32_t *rx_wrr = NULL; int num_intr_vec; + if (rxa_memzone_lookup()) + return -ENOMEM; + RTE_EVENT_ETH_RX_ADAPTER_ID_VALID_OR_ERR_RET(id, -EINVAL); RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_dev_id, -EINVAL); @@ -2832,6 +2860,7 @@ rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id, rte_eventdev_trace_eth_rx_adapter_queue_del(id, eth_dev_id, rx_queue_id, ret); + return ret; } @@ -3286,6 +3315,97 @@ rte_event_eth_rx_adapter_queue_conf_get(uint8_t id, return 0; } +static int +rxa_is_queue_added(struct event_eth_rx_adapter *rx_adapter, + uint16_t eth_dev_id, + uint16_t rx_queue_id) +{ + struct eth_device_info *dev_info; + struct eth_rx_queue_info *queue_info; + + if (!rx_adapter->eth_devices) + return 0; + + dev_info = &rx_adapter->eth_devices[eth_dev_id]; + if (!dev_info || !dev_info->rx_queue) + return 0; + + queue_info = &dev_info->rx_queue[rx_queue_id]; + + return queue_info && queue_info->queue_enabled; +} + +#define rxa_evdev(rx_adapter) (&rte_eventdevs[(rx_adapter)->eventdev_id]) + +#define rxa_dev_instance_get(rx_adapter) \ + rxa_evdev((rx_adapter))->dev_ops->eth_rx_adapter_instance_get + +int +rte_event_eth_rx_adapter_instance_get(uint16_t eth_dev_id, + uint16_t rx_queue_id, + uint8_t *rxa_inst_id) +{ + uint8_t id; + int ret = -EINVAL; + uint32_t caps; + struct event_eth_rx_adapter *rx_adapter; + + if (rxa_memzone_lookup()) + return -ENOMEM; + + if (eth_dev_id >= rte_eth_dev_count_avail()) { + RTE_EDEV_LOG_ERR("Invalid ethernet port id %u", eth_dev_id); + return -EINVAL; + } + + if (rx_queue_id >= rte_eth_devices[eth_dev_id].data->nb_rx_queues) { + RTE_EDEV_LOG_ERR("Invalid Rx queue %u", rx_queue_id); + return -EINVAL; + } + + if (rxa_inst_id == NULL) { + RTE_EDEV_LOG_ERR("rxa_inst_id cannot be NULL"); + return -EINVAL; + } + + /* Iterate through all adapter instances */ + for (id = 0; id < RTE_EVENT_ETH_RX_ADAPTER_MAX_INSTANCE; id++) { + rx_adapter = rxa_id_to_adapter(id); + if (!rx_adapter) + continue; + + if (rxa_is_queue_added(rx_adapter, eth_dev_id, rx_queue_id)) { + *rxa_inst_id = rx_adapter->id; + ret = 0; + } + + /* Rx adapter internally mainatains queue information + * for both internal port and DPDK service port. + * Eventdev PMD callback is called for future proof only and + * overrides the above return value if defined. + */ + caps = 0; + if (!rte_event_eth_rx_adapter_caps_get(rx_adapter->eventdev_id, + eth_dev_id, + &caps)) { + if (caps & RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT) { + ret = rxa_dev_instance_get(rx_adapter) ? + rxa_dev_instance_get(rx_adapter) + (eth_dev_id, + rx_queue_id, + rxa_inst_id) + : -EINVAL; + } + } + + /* return if entry found */ + if (ret == 0) + return ret; + } + + return -EINVAL; +} + #define RXA_ADD_DICT(stats, s) rte_tel_data_add_dict_u64(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 3608a7b..a3313c8 100644 --- a/lib/eventdev/rte_event_eth_rx_adapter.h +++ b/lib/eventdev/rte_event_eth_rx_adapter.h @@ -38,6 +38,7 @@ * - rte_event_eth_rx_adapter_queue_stats_get() * - rte_event_eth_rx_adapter_queue_stats_reset() * - rte_event_eth_rx_adapter_event_port_get() + * - rte_event_eth_rx_adapter_instance_get() * * The application creates an ethernet to event adapter using * rte_event_eth_rx_adapter_create_ext() or rte_event_eth_rx_adapter_create() @@ -704,6 +705,29 @@ __rte_experimental int rte_event_eth_rx_adapter_event_port_get(uint8_t id, uint8_t *event_port_id); +/** + * Get RX adapter instance ID for a RX queue + * + * @param eth_dev_id + * Port identifier of Ethernet device. + * + * @param rx_queue_id + * Ethernet device receive queue index. + * + * @param[out] rxa_inst_id + * Pointer to store RX adapter instance identifier. + * Contains valid Rx adapter instance id when return value is 0 + * + * @return + * - 0: Success + * - <0: Error code on failure + */ +__rte_experimental +int +rte_event_eth_rx_adapter_instance_get(uint16_t eth_dev_id, + uint16_t rx_queue_id, + uint8_t *rxa_inst_id); + #ifdef __cplusplus } #endif diff --git a/lib/eventdev/version.map b/lib/eventdev/version.map index 886e2ec..d1ecda4 100644 --- a/lib/eventdev/version.map +++ b/lib/eventdev/version.map @@ -110,6 +110,7 @@ EXPERIMENTAL { rte_event_eth_rx_adapter_event_port_get; # added in 22.07 + rte_event_eth_rx_adapter_instance_get; rte_event_port_quiesce; rte_event_queue_attr_set; };