From patchwork Wed Aug 9 15:51:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xing, Beilei" X-Patchwork-Id: 130031 X-Patchwork-Delegate: qi.z.zhang@intel.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 7160B43016; Wed, 9 Aug 2023 09:35:25 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1F86243269; Wed, 9 Aug 2023 09:34:02 +0200 (CEST) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by mails.dpdk.org (Postfix) with ESMTP id B377740DDB for ; Wed, 9 Aug 2023 09:33:59 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1691566439; x=1723102439; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=DulP0gDklQUHiLs9jZuLSvCBG0/BdBh0dWzF4DSP1Uc=; b=Mti5kJCU4IkUXauUyma3oyZdXs65HileL/F293YqIm7xpzg54pAS1V4R iUqDnJi0VNhfJ61z5qnx+xpZmBWVjUVzl8c2YZTux3D88xQU/JeYXBGd6 To+gTv9gg+UC+SKA8H+5HkAaovfbhMXeF6aPDT+U7dyWWiaiw6Bpfs4oo TgL0c3gGX7m319jKW+FgRq+9WyqM1wBivHodOnPR5QHCHaC0lbtnYUfAd QJe9IZGDl5AqGDT+/H6QmZl33eY6uB7bJuaJ91MjEOpEPo/V8fteg6nGh QSC9dIGCAogb4uJHSM06oUGgcKtdg4LLQrInKmoT1BIHs3QOpZ8uAMX7S A==; X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="356014546" X-IronPort-AV: E=Sophos;i="6.01,158,1684825200"; d="scan'208";a="356014546" Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2023 00:33:39 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10795"; a="1062337473" X-IronPort-AV: E=Sophos;i="6.01,158,1684825200"; d="scan'208";a="1062337473" Received: from dpdk-beileix-icelake.sh.intel.com ([10.67.116.252]) by fmsmga005.fm.intel.com with ESMTP; 09 Aug 2023 00:33:37 -0700 From: beilei.xing@intel.com To: jingjing.wu@intel.com, mingxia.liu@intel.com Cc: dev@dpdk.org, Beilei Xing Subject: [PATCH 18/19] net/cpfl: add dispatch service Date: Wed, 9 Aug 2023 15:51:33 +0000 Message-Id: <20230809155134.539287-19-beilei.xing@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230809155134.539287-1-beilei.xing@intel.com> References: <20230809155134.539287-1-beilei.xing@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 From: Beilei Xing Add dispatch service for port representor. Signed-off-by: Beilei Xing --- drivers/net/cpfl/cpfl_ethdev.c | 129 +++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/drivers/net/cpfl/cpfl_ethdev.c b/drivers/net/cpfl/cpfl_ethdev.c index 8569a0b81d..8dbc175749 100644 --- a/drivers/net/cpfl/cpfl_ethdev.c +++ b/drivers/net/cpfl/cpfl_ethdev.c @@ -11,6 +11,7 @@ #include #include #include +#include #include "cpfl_ethdev.h" #include @@ -136,6 +137,107 @@ static const struct rte_mbuf_dynfield cpfl_source_metadata_param = { .flags = 0, }; +static int +cpfl_dispatch_service_register(struct rte_eth_dev *dev) +{ + struct cpfl_vport *vport = dev->data->dev_private; + struct rte_service_spec service_params; + uint32_t service_core_list[RTE_MAX_LCORE]; + uint32_t num_service_cores; + uint32_t service_core_id; + int ret; + + num_service_cores = rte_service_lcore_count(); + if (num_service_cores <= 0) { + PMD_DRV_LOG(ERR, "Fail to register dispatch service, no service core found."); + return -ENOTSUP; + } + + ret = rte_service_lcore_list(service_core_list, num_service_cores); + if (ret <= 0) { + PMD_DRV_LOG(ERR, "Fail to get service core list"); + return -ENOTSUP; + } + /* use the first lcore by default */ + service_core_id = service_core_list[0]; + + memset(&service_params, 0, sizeof(struct rte_service_spec)); + snprintf(service_params.name, sizeof(service_params.name), "Dispatch service"); + service_params.callback = cpfl_packets_dispatch; + service_params.callback_userdata = dev; + service_params.capabilities = 0; + service_params.socket_id = rte_lcore_to_socket_id(service_core_id); + + ret = rte_service_component_register(&service_params, &vport->dispatch_service_id); + if (ret) { + PMD_DRV_LOG(ERR, "Fail to register %s component", service_params.name); + return ret; + } + + ret = rte_service_map_lcore_set(vport->dispatch_service_id, service_core_id, 1); + if (ret) { + PMD_DRV_LOG(ERR, "Fail to map service %s to lcore %d", + service_params.name, service_core_id); + return ret; + } + + vport->dispatch_core_id = service_core_id; + + return 0; +} + +static void +cpfl_dispatch_service_unregister(struct rte_eth_dev *dev) +{ + struct cpfl_vport *vport = dev->data->dev_private; + + PMD_DRV_LOG(DEBUG, "Unregister service %s", + rte_service_get_name(vport->dispatch_service_id)); + rte_service_map_lcore_set(vport->dispatch_service_id, + vport->dispatch_core_id, 0); + rte_service_component_unregister(vport->dispatch_service_id); +} + +static int +cpfl_dispatch_service_start(struct rte_eth_dev *dev) +{ + struct cpfl_vport *vport = dev->data->dev_private; + int ret; + + ret = rte_service_component_runstate_set(vport->dispatch_service_id, 1); + if (ret) { + PMD_DRV_LOG(ERR, "Fail to start %s component", + rte_service_get_name(vport->dispatch_service_id)); + return ret; + } + ret = rte_service_runstate_set(vport->dispatch_service_id, 1); + if (ret) { + PMD_DRV_LOG(ERR, "Fail to start service %s", + rte_service_get_name(vport->dispatch_service_id)); + return ret; + } + return 0; +} + +static void +cpfl_dispatch_service_stop(struct rte_eth_dev *dev) +{ + struct cpfl_vport *vport = dev->data->dev_private; + int ret; + + /* Service core may be shared and don't stop it here*/ + + ret = rte_service_runstate_set(vport->dispatch_service_id, 0); + if (ret) + PMD_DRV_LOG(WARNING, "Fail to stop service %s", + rte_service_get_name(vport->dispatch_service_id)); + + ret = rte_service_component_runstate_set(vport->dispatch_service_id, 0); + if (ret) + PMD_DRV_LOG(WARNING, "Fail to stop %s component", + rte_service_get_name(vport->dispatch_service_id)); +} + static int cpfl_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete) @@ -1031,6 +1133,14 @@ cpfl_dev_start(struct rte_eth_dev *dev) } if (cpfl_vport->exceptional) { + /* No pkt_burst function setting on exceptional vport, + * start dispatch service instead + */ + if (cpfl_dispatch_service_start(dev)) { + PMD_DRV_LOG(ERR, "Fail to start Dispatch service on %s", + dev->device->name); + goto err_serv_start; + } dev->rx_pkt_burst = cpfl_dummy_recv_pkts; dev->tx_pkt_burst = cpfl_dummy_xmit_pkts; } else { @@ -1050,6 +1160,8 @@ cpfl_dev_start(struct rte_eth_dev *dev) return 0; err_vport: + cpfl_dispatch_service_stop(dev); +err_serv_start: cpfl_stop_queues(dev); err_startq: idpf_vport_irq_unmap_config(vport, dev->data->nb_rx_queues); @@ -1070,6 +1182,10 @@ cpfl_dev_stop(struct rte_eth_dev *dev) idpf_vc_vport_ena_dis(vport, false); + if (cpfl_vport->exceptional) + /* Stop dispatch service when dev stop */ + cpfl_dispatch_service_stop(dev); + cpfl_stop_queues(dev); idpf_vport_irq_unmap_config(vport, dev->data->nb_rx_queues); @@ -1114,6 +1230,10 @@ cpfl_dev_close(struct rte_eth_dev *dev) adapter->cur_vports &= ~RTE_BIT32(vport->devarg_id); adapter->cur_vport_nb--; adapter->vports[vport->sw_idx] = NULL; + } else { + /* unregister idpf dispatch service on exceptional vport */ + cpfl_dispatch_service_unregister(dev); + adapter->exceptional_vport = NULL; } idpf_vport_deinit(vport); @@ -2253,8 +2373,17 @@ cpfl_exceptional_vport_init(struct rte_eth_dev *dev, void *init_params) adapter->exceptional_vport = cpfl_vport; + /* register dispatch service on exceptional vport */ + ret = cpfl_dispatch_service_register(dev); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to register dispatch service."); + goto err_serv_reg; + } + return 0; +err_serv_reg: + rte_free(dev->data->mac_addrs); err_mac_addrs: idpf_vport_deinit(vport); err: