patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Kevin Traynor <ktraynor@redhat.com>
To: Yiding Zhou <yidingx.zhou@intel.com>
Cc: Qi Zhang <qi.z.zhang@intel.com>, dpdk stable <stable@dpdk.org>
Subject: patch 'net/iavf: add thread for event callbacks' has been queued to stable release 21.11.3
Date: Fri, 11 Nov 2022 10:33:18 +0000	[thread overview]
Message-ID: <20221111103337.307408-28-ktraynor@redhat.com> (raw)
In-Reply-To: <20221111103337.307408-1-ktraynor@redhat.com>

Hi,

FYI, your patch has been queued to stable release 21.11.3

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/14/22. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/c346009ca9686fabd300f8afe688239426b5eebd

Thanks.

Kevin

---
From c346009ca9686fabd300f8afe688239426b5eebd Mon Sep 17 00:00:00 2001
From: Yiding Zhou <yidingx.zhou@intel.com>
Date: Thu, 20 Oct 2022 13:00:22 +0800
Subject: [PATCH] net/iavf: add thread for event callbacks

[ upstream commit cb5c1b91f76f436724cd09f26c7432b2775b519c ]

All callbacks registered for ethdev events are called in
eal-intr-thread, and some of them execute virtchnl commands.
Because interrupts are disabled in the intr thread, no response
will be received for these commands. So all callbacks should
be called in a new context.

When the device is bonded, the bond pmd registers a callback for
the LSC event to execute virtchnl commands to reinitialize the
device, and it would also raise the above issue.

This commit adds a new thread to call all event callbacks.

Fixes: 48de41ca11f0 ("net/avf: enable link status update")
Fixes: 84108425054a ("net/iavf: support asynchronous virtual channel message")

Signed-off-by: Yiding Zhou <yidingx.zhou@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
---
 drivers/net/iavf/iavf.h        |   2 +
 drivers/net/iavf/iavf_ethdev.c |   5 ++
 drivers/net/iavf/iavf_vchnl.c  | 153 +++++++++++++++++++++++++++++++--
 3 files changed, 154 insertions(+), 6 deletions(-)

diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index 29692e3994..afffc1a13e 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -401,4 +401,6 @@ _atomic_set_async_response_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
 int iavf_check_api_version(struct iavf_adapter *adapter);
 int iavf_get_vf_resource(struct iavf_adapter *adapter);
+void iavf_dev_event_handler_fini(void);
+int iavf_dev_event_handler_init(void);
 void iavf_handle_virtchnl_msg(struct rte_eth_dev *dev);
 int iavf_enable_vlan_strip(struct iavf_adapter *adapter);
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index f835457e4f..11ddd6dc16 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -2562,4 +2562,7 @@ iavf_dev_init(struct rte_eth_dev *eth_dev)
 			&eth_dev->data->mac_addrs[0]);
 
+	if (iavf_dev_event_handler_init())
+		goto init_vf_err;
+
 	if (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_WB_ON_ITR) {
 		/* register callback func to eal lib */
@@ -2716,4 +2719,6 @@ iavf_dev_uninit(struct rte_eth_dev *dev)
 	iavf_dev_close(dev);
 
+	iavf_dev_event_handler_fini();
+
 	return 0;
 }
diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
index 1bd3559ec2..54c6e39e16 100644
--- a/drivers/net/iavf/iavf_vchnl.c
+++ b/drivers/net/iavf/iavf_vchnl.c
@@ -3,4 +3,5 @@
  */
 
+#include <fcntl.h>
 #include <stdio.h>
 #include <errno.h>
@@ -12,4 +13,5 @@
 #include <rte_byteorder.h>
 #include <rte_common.h>
+#include <rte_os_shim.h>
 
 #include <rte_debug.h>
@@ -28,4 +30,144 @@
 #define ASQ_DELAY_MS  1
 
+#define MAX_EVENT_PENDING 16
+
+struct iavf_event_element {
+	TAILQ_ENTRY(iavf_event_element) next;
+	struct rte_eth_dev *dev;
+	enum rte_eth_event_type event;
+	void *param;
+	size_t param_alloc_size;
+	uint8_t param_alloc_data[0];
+};
+
+struct iavf_event_handler {
+	uint32_t ndev;
+	pthread_t tid;
+	int fd[2];
+	pthread_mutex_t lock;
+	TAILQ_HEAD(event_list, iavf_event_element) pending;
+};
+
+static struct iavf_event_handler event_handler = {
+	.fd = {-1, -1},
+};
+
+#ifndef TAILQ_FOREACH_SAFE
+#define TAILQ_FOREACH_SAFE(var, head, field, tvar) \
+	for ((var) = TAILQ_FIRST((head)); \
+		(var) && ((tvar) = TAILQ_NEXT((var), field), 1); \
+	(var) = (tvar))
+#endif
+
+static void *
+iavf_dev_event_handle(void *param __rte_unused)
+{
+	struct iavf_event_handler *handler = &event_handler;
+	TAILQ_HEAD(event_list, iavf_event_element) pending;
+
+	while (true) {
+		char unused[MAX_EVENT_PENDING];
+		ssize_t nr = read(handler->fd[0], &unused, sizeof(unused));
+		if (nr <= 0)
+			break;
+
+		TAILQ_INIT(&pending);
+		pthread_mutex_lock(&handler->lock);
+		TAILQ_CONCAT(&pending, &handler->pending, next);
+		pthread_mutex_unlock(&handler->lock);
+
+		struct iavf_event_element *pos, *save_next;
+		TAILQ_FOREACH_SAFE(pos, &pending, next, save_next) {
+			TAILQ_REMOVE(&pending, pos, next);
+			rte_eth_dev_callback_process(pos->dev, pos->event, pos->param);
+			rte_free(pos);
+		}
+	}
+
+	return NULL;
+}
+
+static void
+iavf_dev_event_post(struct rte_eth_dev *dev,
+		enum rte_eth_event_type event,
+		void *param, size_t param_alloc_size)
+{
+	struct iavf_event_handler *handler = &event_handler;
+	char notify_byte;
+	struct iavf_event_element *elem = rte_malloc(NULL, sizeof(*elem) + param_alloc_size, 0);
+	if (!elem)
+		return;
+
+	elem->dev = dev;
+	elem->event = event;
+	elem->param = param;
+	elem->param_alloc_size = param_alloc_size;
+	if (param && param_alloc_size) {
+		rte_memcpy(elem->param_alloc_data, param, param_alloc_size);
+		elem->param = elem->param_alloc_data;
+	}
+
+	pthread_mutex_lock(&handler->lock);
+	TAILQ_INSERT_TAIL(&handler->pending, elem, next);
+	pthread_mutex_unlock(&handler->lock);
+
+	ssize_t nw = write(handler->fd[1], &notify_byte, 1);
+	RTE_SET_USED(nw);
+}
+
+int
+iavf_dev_event_handler_init(void)
+{
+	struct iavf_event_handler *handler = &event_handler;
+
+	if (__atomic_add_fetch(&handler->ndev, 1, __ATOMIC_RELAXED) != 1)
+		return 0;
+#if defined(RTE_EXEC_ENV_IS_WINDOWS) && RTE_EXEC_ENV_IS_WINDOWS != 0
+	int err = _pipe(handler->fd, MAX_EVENT_PENDING, O_BINARY);
+#else
+	int err = pipe(handler->fd);
+#endif
+	if (err != 0) {
+		__atomic_sub_fetch(&handler->ndev, 1, __ATOMIC_RELAXED);
+		return -1;
+	}
+
+	TAILQ_INIT(&handler->pending);
+	pthread_mutex_init(&handler->lock, NULL);
+
+	if (rte_ctrl_thread_create(&handler->tid, "iavf-event-thread",
+				NULL, iavf_dev_event_handle, NULL)) {
+		__atomic_sub_fetch(&handler->ndev, 1, __ATOMIC_RELAXED);
+		return -1;
+	}
+
+	return 0;
+}
+
+void
+iavf_dev_event_handler_fini(void)
+{
+	struct iavf_event_handler *handler = &event_handler;
+
+	if (__atomic_sub_fetch(&handler->ndev, 1, __ATOMIC_RELAXED) != 0)
+		return;
+
+	int unused = pthread_cancel(handler->tid);
+	RTE_SET_USED(unused);
+	close(handler->fd[0]);
+	close(handler->fd[1]);
+	handler->fd[0] = -1;
+	handler->fd[1] = -1;
+
+	pthread_join(handler->tid, NULL);
+	pthread_mutex_destroy(&handler->lock);
+
+	struct iavf_event_element *pos, *save_next;
+	TAILQ_FOREACH_SAFE(pos, &handler->pending, next, save_next) {
+		TAILQ_REMOVE(&handler->pending, pos, next);
+		rte_free(pos);
+	}
+}
+
 static uint32_t
 iavf_convert_link_speed(enum virtchnl_link_speed virt_link_speed)
@@ -279,6 +421,6 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg,
 		PMD_DRV_LOG(DEBUG, "VIRTCHNL_EVENT_RESET_IMPENDING event");
 		vf->vf_reset = true;
-		rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,
-					      NULL);
+		iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_RESET,
+					      NULL, 0);
 		break;
 	case VIRTCHNL_EVENT_LINK_CHANGE:
@@ -294,5 +436,5 @@ iavf_handle_pf_event_msg(struct rte_eth_dev *dev, uint8_t *msg,
 		}
 		iavf_dev_link_update(dev, 0);
-		rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_LSC, NULL);
+		iavf_dev_event_post(dev, RTE_ETH_EVENT_INTR_LSC, NULL, 0);
 		break;
 	case VIRTCHNL_EVENT_PF_DRIVER_CLOSE:
@@ -360,7 +502,6 @@ iavf_handle_virtchnl_msg(struct rte_eth_dev *dev)
 						RTE_ETH_EVENT_IPSEC_UNKNOWN;
 					desc.metadata = ev->ipsec_event_data;
-					rte_eth_dev_callback_process(dev,
-							RTE_ETH_EVENT_IPSEC,
-							&desc);
+					iavf_dev_event_post(dev, RTE_ETH_EVENT_IPSEC,
+							&desc, sizeof(desc));
 					return;
 				}
-- 
2.38.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-11-11 10:32:17.749691045 +0000
+++ 0028-net-iavf-add-thread-for-event-callbacks.patch	2022-11-11 10:32:17.085300813 +0000
@@ -1 +1 @@
-From cb5c1b91f76f436724cd09f26c7432b2775b519c Mon Sep 17 00:00:00 2001
+From c346009ca9686fabd300f8afe688239426b5eebd Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit cb5c1b91f76f436724cd09f26c7432b2775b519c ]
+
@@ -20 +21,0 @@
-Cc: stable@dpdk.org
@@ -31 +32 @@
-index 26b858f6f0..1edebab8dc 100644
+index 29692e3994..afffc1a13e 100644
@@ -34 +35 @@
-@@ -425,4 +425,6 @@ _atomic_set_async_response_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
+@@ -401,4 +401,6 @@ _atomic_set_async_response_cmd(struct iavf_info *vf, enum virtchnl_ops ops)
@@ -42 +43 @@
-index b1958e0474..8d9f3a6d3d 100644
+index f835457e4f..11ddd6dc16 100644
@@ -45 +46 @@
-@@ -2634,4 +2634,7 @@ iavf_dev_init(struct rte_eth_dev *eth_dev)
+@@ -2562,4 +2562,7 @@ iavf_dev_init(struct rte_eth_dev *eth_dev)
@@ -53 +54 @@
-@@ -2788,4 +2791,6 @@ iavf_dev_uninit(struct rte_eth_dev *dev)
+@@ -2716,4 +2719,6 @@ iavf_dev_uninit(struct rte_eth_dev *dev)
@@ -61 +62 @@
-index 729400cb91..654bc7edb6 100644
+index 1bd3559ec2..54c6e39e16 100644


  parent reply	other threads:[~2022-11-11 10:34 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-11 10:32 patch 'event/sw: fix flow ID init in self test' " Kevin Traynor
2022-11-11 10:32 ` patch 'event/sw: fix log " Kevin Traynor
2022-11-11 10:32 ` patch 'eventdev/crypto: fix multi-process' " Kevin Traynor
2022-11-11 10:32 ` patch 'eventdev/eth_tx: fix queue delete' " Kevin Traynor
2022-11-11 10:32 ` patch 'gro: check payload length after trim' " Kevin Traynor
2022-11-11 10:32 ` patch 'doc: fix support table for Ethernet/VLAN flow items' " Kevin Traynor
2022-11-11 10:32 ` patch 'app/testpmd: skip port reset in secondary process' " Kevin Traynor
2022-11-11 10:32 ` patch 'net/bonding: fix descriptor limit reporting' " Kevin Traynor
2022-11-11 10:32 ` patch 'net/ionic: fix endianness for Rx and Tx' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ionic: fix endianness for RSS' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ionic: fix adapter name for logging' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ionic: fix Rx filter save' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ionic: fix reported error stats' " Kevin Traynor
2022-11-11 10:33 ` patch 'app/testpmd: remove jumbo offload' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/nfp: fix internal buffer size and MTU check' " Kevin Traynor
2022-11-11 10:33 ` patch 'vhost: add non-blocking API for posting interrupt' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/mlx5: fix thread workspace memory leak' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/mlx5: fix RSS expansion buffer size' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/mlx5: fix tunnel header with IPIP offload' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/mlx5: fix null check in devargs parsing' " Kevin Traynor
2022-11-11 10:33 ` patch 'sched: fix subport profile configuration' " Kevin Traynor
2022-11-11 10:33 ` patch 'examples/qos_sched: fix number of subport profiles' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ixgbe: fix broadcast Rx on VF after promisc removal' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ixgbe: fix unexpected VLAN Rx in promisc mode on VF' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ice: fix null function pointer call' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/iavf: fix IPsec flow create error check' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/iavf: fix SPI " Kevin Traynor
2022-11-11 10:33 ` Kevin Traynor [this message]
2022-11-18 12:32   ` patch 'net/iavf: add thread for event callbacks' " Kevin Traynor
2022-11-21  4:48     ` Zhou, YidingX
2022-11-11 10:33 ` patch 'net/iavf: fix queue stop for large VF' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/ice: support VXLAN-GPE tunnel offload' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/iavf: fix handling of IPsec events' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/cnxk: fix later skip to include mbuf private data' " Kevin Traynor
2022-11-11 10:33 ` patch 'common/cnxk: fix schedule weight update' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/mlx5: fix thread termination check on Windows' " Kevin Traynor
2022-11-11 10:33 ` patch 'examples/l2fwd-crypto: fix typo in error message' " Kevin Traynor
2022-11-11 10:33 ` patch 'test/crypto: fix wireless auth digest segment' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: fix memory leak' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: check turbo dec/enc input' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: add null checks' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: fix input length for CRC24B' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: fix clearing PF IR outside handler' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: fix device minimum alignment' " Kevin Traynor
2022-11-11 10:33 ` patch 'baseband/acc100: fix close cleanup' " Kevin Traynor
2022-11-11 10:33 ` patch 'test/crypto: fix PDCP vectors' " Kevin Traynor
2022-11-11 10:33 ` patch 'examples/ipsec-secgw: fix Tx checksum offload flag' " Kevin Traynor
2022-11-11 10:33 ` patch 'crypto/qat: fix null hash algorithm digest size' " Kevin Traynor
2022-11-11 10:33 ` patch 'net/mlx5: fix build with recent compilers' " Kevin Traynor

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=20221111103337.307408-28-ktraynor@redhat.com \
    --to=ktraynor@redhat.com \
    --cc=qi.z.zhang@intel.com \
    --cc=stable@dpdk.org \
    --cc=yidingx.zhou@intel.com \
    /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).