DPDK patches and discussions
 help / color / mirror / Atom feed
From: Huisong Li <lihuisong@huawei.com>
To: <thomas@monjalon.net>, <stephen@networkplumber.org>,
	Aman Singh <aman.deep.singh@intel.com>
Cc: <dev@dpdk.org>, <ferruh.yigit@amd.com>, <fengchengwen@huawei.com>,
	<liuyonglong@huawei.com>, <lihuisong@huawei.com>
Subject: [PATCH v8] app/testpmd: add attach and detach port for multiple process
Date: Mon, 20 Jan 2025 14:42:18 +0800	[thread overview]
Message-ID: <20250120064218.32733-1-lihuisong@huawei.com> (raw)
In-Reply-To: <20220825024425.10534-1-lihuisong@huawei.com>

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 <lihuisong@huawei.com>
Signed-off-by: Dongdong Liu <liudongdong3@huawei.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
---
 -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


      parent reply	other threads:[~2025-01-20  6:54 UTC|newest]

Thread overview: 102+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20220825024425.10534-1-lihuisong@huawei.com>
2022-09-15 12:45 ` [PATCH V2 0/6] [PATCH 0/6] app/testpmd: support attach and detach port for MP Huisong Li
2022-09-15 12:45   ` [PATCH V2 1/6] bus/pci: fix a segfault when call callback Huisong Li
2022-10-10 19:49     ` Thomas Monjalon
2022-10-25  3:25       ` lihuisong (C)
2022-09-15 12:45   ` [PATCH V2 2/6] bus/vdev: " Huisong Li
2022-09-15 12:45   ` [PATCH V2 3/6] ethdev: fix push new event Huisong Li
2022-09-27 10:49     ` Thomas Monjalon
2022-10-08  4:09       ` lihuisong (C)
2022-10-25  3:26         ` lihuisong (C)
2022-09-15 12:45   ` [PATCH V2 4/6] app/testpmd: check the validity of the port Huisong Li
2022-09-22  5:07     ` Singh, Aman Deep
2022-09-15 12:45   ` [PATCH V2 5/6] app/testpmd: support attach and detach port for MP Huisong Li
2022-09-15 12:45   ` [PATCH V2 6/6] app/testpmd: stop packet forwarding in new and destroy event Huisong Li
2022-12-06  6:45 ` [PATCH V3 0/5] app/testpmd: support mulitple process attach and detach port Huisong Li
2022-12-06  6:45   ` [PATCH V3 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2022-12-06  6:45   ` [PATCH V3 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2022-12-06  6:45   ` [PATCH V3 3/5] app/testpmd: check the validity of the port Huisong Li
2022-12-06  6:45   ` [PATCH V3 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2022-12-06  6:45   ` [PATCH V3 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2022-12-06  9:26 ` [PATCH V4 0/5] app/testpmd: support mulitple process attach and detach port Huisong Li
2022-12-06  9:26   ` [PATCH V4 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2023-01-11 12:51     ` Ferruh Yigit
2023-01-12  2:44       ` lihuisong (C)
2023-02-15 16:09         ` Ferruh Yigit
2023-02-28  2:21           ` lihuisong (C)
2023-06-06 16:12             ` Ferruh Yigit
2023-06-07 10:11               ` lihuisong (C)
2023-06-15  2:21                 ` lihuisong (C)
2022-12-06  9:26   ` [PATCH V4 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2023-01-11 12:51     ` Ferruh Yigit
2023-01-12  4:12       ` lihuisong (C)
2022-12-06  9:26   ` [PATCH V4 3/5] app/testpmd: check the validity of the port Huisong Li
2022-12-06  9:26   ` [PATCH V4 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2023-01-11 12:51     ` Ferruh Yigit
2023-01-12  4:14       ` lihuisong (C)
2022-12-06  9:26   ` [PATCH V4 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2023-01-11 12:52     ` Ferruh Yigit
2023-01-12  4:16       ` lihuisong (C)
2023-01-09 12:38   ` [PATCH V4 0/5] app/testpmd: support mulitple process attach and detach port lihuisong (C)
2023-01-10 16:51   ` Ferruh Yigit
2023-01-11  0:53     ` lihuisong (C)
2023-01-11 10:27       ` Ferruh Yigit
2023-01-11 10:46         ` Ferruh Yigit
2023-01-12  2:26           ` lihuisong (C)
2023-01-18 14:12           ` Thomas Monjalon
2023-01-19 10:31             ` lihuisong (C)
2023-01-19 14:35               ` Thomas Monjalon
2023-01-28  1:39                 ` lihuisong (C)
2023-01-31  3:33 ` [PATCH V5 0/5] app/testpmd: support multiple " Huisong Li
2023-01-31  3:33   ` [PATCH V5 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2023-01-31  3:33   ` [PATCH V5 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2023-05-22 11:04     ` fengchengwen
2023-05-27  1:58       ` lihuisong (C)
2023-01-31  3:33   ` [PATCH V5 3/5] app/testpmd: check the validity of the port Huisong Li
2023-01-31  3:33   ` [PATCH V5 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2023-01-31  3:33   ` [PATCH V5 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2023-05-16 11:27   ` [PATCH V5 0/5] app/testpmd: support multiple process attach and detach port lihuisong (C)
2023-05-23  0:46   ` fengchengwen
2023-05-27  2:11 ` [PATCH V6 " Huisong Li
2023-05-27  2:11   ` [PATCH V6 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2023-05-27  2:11   ` [PATCH V6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2023-05-27  2:11   ` [PATCH V6 3/5] app/testpmd: check the validity of the port Huisong Li
2023-05-27  2:11   ` [PATCH V6 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2023-05-27  2:11   ` [PATCH V6 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2023-06-06 16:26   ` [PATCH V6 0/5] app/testpmd: support multiple process attach and detach port Ferruh Yigit
2023-06-07 10:14     ` lihuisong (C)
2023-07-14  7:21   ` lihuisong (C)
2023-08-02  3:15 ` [PATCH RESEND v6 " Huisong Li
2023-08-02  3:15   ` [PATCH RESEND v6 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2023-08-02  3:15   ` [PATCH RESEND v6 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2023-08-02  3:15   ` [PATCH RESEND v6 3/5] app/testpmd: check the validity of the port Huisong Li
2023-08-02  3:15   ` [PATCH RESEND v6 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2023-08-02  3:16   ` [PATCH RESEND v6 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2023-10-09 10:34   ` [PATCH RESEND v6 0/5] app/testpmd: support multiple process attach and detach port lihuisong (C)
2023-10-30 12:17     ` lihuisong (C)
2023-12-08  2:25       ` lihuisong (C)
2024-01-30  6:36 ` [PATCH v7 " Huisong Li
2024-01-30  6:36   ` [PATCH v7 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2024-01-30  6:36   ` [PATCH v7 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2024-01-30  6:36   ` [PATCH v7 3/5] app/testpmd: check the validity of the port Huisong Li
2024-01-30  6:36   ` [PATCH v7 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2024-01-30  6:36   ` [PATCH v7 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2024-03-08 10:38   ` [PATCH v7 0/5] app/testpmd: support multiple process attach and detach port lihuisong (C)
2024-04-23 11:17   ` lihuisong (C)
2024-09-29  5:52 ` [PATCH RESEND " Huisong Li
2024-09-29  5:52   ` [PATCH RESEND v7 1/5] drivers/bus: restore driver assignment at front of probing Huisong Li
2024-09-29  5:52   ` [PATCH RESEND v7 2/5] ethdev: fix skip valid port in probing callback Huisong Li
2024-12-10  1:50     ` lihuisong (C)
2025-01-10  3:21       ` lihuisong (C)
2025-01-10 17:54         ` Stephen Hemminger
2025-01-13  2:32           ` lihuisong (C)
2024-09-29  5:52   ` [PATCH RESEND v7 3/5] app/testpmd: check the validity of the port Huisong Li
2024-09-29  5:52   ` [PATCH RESEND v7 4/5] app/testpmd: add attach and detach port for multiple process Huisong Li
2024-09-29  5:52   ` [PATCH RESEND v7 5/5] app/testpmd: stop forwarding in new or destroy event Huisong Li
2024-10-08  2:32   ` [PATCH RESEND v7 0/5] app/testpmd: support multiple process attach and detach port lihuisong (C)
2024-10-18  1:04     ` Ferruh Yigit
2024-10-18  2:48       ` lihuisong (C)
2024-10-26  4:11         ` lihuisong (C)
2024-10-29 22:12         ` Ferruh Yigit
2024-10-30  4:06           ` lihuisong (C)
2024-11-12  3:14         ` lihuisong (C)
2025-01-20  6:42 ` Huisong Li [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250120064218.32733-1-lihuisong@huawei.com \
    --to=lihuisong@huawei.com \
    --cc=aman.deep.singh@intel.com \
    --cc=dev@dpdk.org \
    --cc=fengchengwen@huawei.com \
    --cc=ferruh.yigit@amd.com \
    --cc=liuyonglong@huawei.com \
    --cc=stephen@networkplumber.org \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).