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 B2C9346080; Mon, 20 Jan 2025 07:54:23 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8CDAF40280; Mon, 20 Jan 2025 07:54:23 +0100 (CET) Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mails.dpdk.org (Postfix) with ESMTP id E1AAA4027A for ; Mon, 20 Jan 2025 07:54:20 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.105]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Yc1Fp6QC2zbnq3; Mon, 20 Jan 2025 14:51:10 +0800 (CST) Received: from dggemv703-chm.china.huawei.com (unknown [10.3.19.46]) by mail.maildlp.com (Postfix) with ESMTPS id 7994B1401F1; Mon, 20 Jan 2025 14:54:18 +0800 (CST) Received: from kwepemn100009.china.huawei.com (7.202.194.112) by dggemv703-chm.china.huawei.com (10.3.19.46) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Mon, 20 Jan 2025 14:54:18 +0800 Received: from localhost.localdomain (10.28.79.22) by kwepemn100009.china.huawei.com (7.202.194.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Mon, 20 Jan 2025 14:54:17 +0800 From: Huisong Li To: , , Aman Singh CC: , , , , Subject: [PATCH v8] app/testpmd: add attach and detach port for multiple process Date: Mon, 20 Jan 2025 14:42:18 +0800 Message-ID: <20250120064218.32733-1-lihuisong@huawei.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20220825024425.10534-1-lihuisong@huawei.com> References: <20220825024425.10534-1-lihuisong@huawei.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.28.79.22] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To kwepemn100009.china.huawei.com (7.202.194.112) 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 port information needs to be updated due to attaching and detaching port. Currently, it is done in the same thread as removing or probing device, which doesn't satisfy the operation of attaching and detaching device in multiple process. If this operation is performed in one process, the other process can receive 'new' or 'destroy' event. So we can move updating port information to event callback to support attaching and detaching port in primary and secondary process. Note: the reason for adding an alarm callback in 'destroy' event is that the ethdev state is changed from 'ATTACHED' to 'UNUSED' only after the event callback finished. But the remove_invalid_ports() function removes invalid port only if ethdev state is 'UNUSED'. If we don't add alarm callback, this detached port information can not be removed. Signed-off-by: Huisong Li Signed-off-by: Dongdong Liu Acked-by: Chengwen Feng --- -v8: #1 remove other patches because they have been clarified in another patchset[1][2]. #2 move the configuring and querying the port to start_port() because they are not approprate in new event callback. -v7: fix conflicts -v6: adjust rte_eth_dev_is_used position based on alphabetical order in version.map -v5: move 'ALLOCATED' state to the back of 'REMOVED' to avoid abi break. -v4: fix a misspelling. -v3: #1 merge patch 1/6 and patch 2/6 into patch 1/5, and add modification for other bus type. #2 add a RTE_ETH_DEV_ALLOCATED state in rte_eth_dev_state to resolve the probelm in patch 2/5. -v2: resend due to CI unexplained failure. [1] https://patches.dpdk.org/project/dpdk/cover/20250113025521.32703-1-lihuisong@huawei.com/ [2] https://patches.dpdk.org/project/dpdk/cover/20250116114034.9858-1-lihuisong@huawei.com/ --- app/test-pmd/testpmd.c | 68 +++++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 17 deletions(-) diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index ac654048df..e47d480205 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -2895,6 +2895,9 @@ start_port(portid_t pid) at_least_one_port_exist = true; port = &ports[pi]; + if (port->need_setup) + setup_attached_port(pi); + if (port->port_status == RTE_PORT_STOPPED) { port->port_status = RTE_PORT_HANDLING; all_ports_already_started = false; @@ -3242,6 +3245,7 @@ remove_invalid_ports(void) remove_invalid_ports_in(ports_ids, &nb_ports); remove_invalid_ports_in(fwd_ports_ids, &nb_fwd_ports); nb_cfg_ports = nb_fwd_ports; + printf("Now total ports is %d\n", nb_ports); } static void @@ -3414,14 +3418,11 @@ attach_port(char *identifier) return; } - /* first attach mode: event */ + /* First attach mode: event + * New port flag is updated on RTE_ETH_EVENT_NEW event + */ if (setup_on_probe_event) { - /* new ports are detected on RTE_ETH_EVENT_NEW event */ - for (pi = 0; pi < RTE_MAX_ETHPORTS; pi++) - if (ports[pi].port_status == RTE_PORT_HANDLING && - ports[pi].need_setup != 0) - setup_attached_port(pi); - return; + goto out; } /* second attach mode: iterator */ @@ -3431,6 +3432,9 @@ attach_port(char *identifier) continue; /* port was already attached before */ setup_attached_port(pi); } +out: + printf("Port %s is attached.\n", identifier); + printf("Done\n"); } static void @@ -3450,14 +3454,8 @@ setup_attached_port(portid_t pi) "Error during enabling promiscuous mode for port %u: %s - ignore\n", pi, rte_strerror(-ret)); - ports_ids[nb_ports++] = pi; - fwd_ports_ids[nb_fwd_ports++] = pi; - nb_cfg_ports = nb_fwd_ports; ports[pi].need_setup = 0; ports[pi].port_status = RTE_PORT_STOPPED; - - printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports); - printf("Done\n"); } static void @@ -3487,10 +3485,8 @@ detach_device(struct rte_device *dev) TESTPMD_LOG(ERR, "Failed to detach device %s\n", rte_dev_name(dev)); return; } - remove_invalid_ports(); printf("Device is detached\n"); - printf("Now total ports is %d\n", nb_ports); printf("Done\n"); return; } @@ -3722,7 +3718,25 @@ rmv_port_callback(void *arg) struct rte_device *device = dev_info.device; close_port(port_id); detach_device(device); /* might be already removed or have more ports */ + remove_invalid_ports(); + } + if (need_to_start) + start_packet_forwarding(0); +} + +static void +remove_invalid_ports_callback(void *arg) +{ + portid_t port_id = (intptr_t)arg; + int need_to_start = 0; + + if (!test_done && port_is_forwarding(port_id)) { + need_to_start = 1; + stop_packet_forwarding(); } + + remove_invalid_ports(); + if (need_to_start) start_packet_forwarding(0); } @@ -3748,8 +3762,19 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, switch (type) { case RTE_ETH_EVENT_NEW: - ports[port_id].need_setup = 1; - ports[port_id].port_status = RTE_PORT_HANDLING; + /* The port in ports_id and fwd_ports_ids is always valid + * from index 0 ~ (nb_ports - 1) due to updating their + * position when one port is detached or removed. + */ + ports_ids[nb_ports++] = port_id; + fwd_ports_ids[nb_fwd_ports++] = port_id; + nb_cfg_ports = nb_fwd_ports; + printf("Port %d is probed. Now total ports is %d\n", port_id, nb_ports); + + if (setup_on_probe_event) { + ports[port_id].need_setup = 1; + ports[port_id].port_status = RTE_PORT_HANDLING; + } break; case RTE_ETH_EVENT_INTR_RMV: if (port_id_is_invalid(port_id, DISABLED_WARN)) @@ -3762,6 +3787,15 @@ eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param, case RTE_ETH_EVENT_DESTROY: ports[port_id].port_status = RTE_PORT_CLOSED; printf("Port %u is closed\n", port_id); + /* + * Defer to remove port id due to the reason that the ethdev + * state is changed from 'ATTACHED' to 'UNUSED' only after the + * event callback finished. Otherwise this port id can not be + * removed. + */ + if (rte_eal_alarm_set(100000, remove_invalid_ports_callback, + (void *)(intptr_t)port_id)) + fprintf(stderr, "Could not set up deferred task to remove this port id.\n"); break; case RTE_ETH_EVENT_RX_AVAIL_THRESH: { uint16_t rxq_id; -- 2.22.0