patch 'raw/ifpga: fix monitor thread' has been queued to stable release 21.11.1

Kevin Traynor ktraynor at redhat.com
Tue Mar 8 15:14:54 CET 2022


Hi,

FYI, your patch has been queued to stable release 21.11.1

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/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/415ad41107c755841c92221bde4fecf696c92b5e

Thanks.

Kevin

---
>From 415ad41107c755841c92221bde4fecf696c92b5e Mon Sep 17 00:00:00 2001
From: Wei Huang <wei.huang at intel.com>
Date: Tue, 1 Mar 2022 03:47:03 -0500
Subject: [PATCH] raw/ifpga: fix monitor thread

[ upstream commit 2479a1e9a8886c93ba4c8a7aa2a35a04302f1aae ]

Monitor thread handles graceful shutdown according to the value of
specific sensors in device, two issues are found below.
1. Thread is not created when card is probed.
2. Thread is canceled without checking presence of other cards.
To fix them, thread is created in pci device probe function, a reference
count is checked before canceling the thread.

Fixes: 9c006c45 ("raw/ifpga: scan PCIe BDF device tree")

Signed-off-by: Wei Huang <wei.huang at intel.com>
Acked-by: Tianfei Zhang <tianfei.zhang at intel.com>
---
 drivers/raw/ifpga/ifpga_rawdev.c | 62 +++++++++++++++++++++-----------
 drivers/raw/ifpga/ifpga_rawdev.h |  2 ++
 2 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/drivers/raw/ifpga/ifpga_rawdev.c b/drivers/raw/ifpga/ifpga_rawdev.c
index c2e74518aa..2d3c4fd229 100644
--- a/drivers/raw/ifpga/ifpga_rawdev.c
+++ b/drivers/raw/ifpga/ifpga_rawdev.c
@@ -69,5 +69,5 @@ static const struct rte_pci_id pci_ifpga_map[] = {
 static struct ifpga_rawdev ifpga_rawdevices[IFPGA_RAWDEV_NUM];
 
-static int ifpga_monitor_start;
+static int ifpga_monitor_refcnt;
 static pthread_t ifpga_monitor_start_thread;
 
@@ -134,4 +134,5 @@ ifpga_rawdev_allocate(struct rte_rawdev *rawdev)
 	for (i = 0; i < IFPGA_MAX_IRQ; i++)
 		dev->intr_handle[i] = NULL;
+	dev->poll_enabled = 0;
 
 	return dev;
@@ -208,8 +209,9 @@ static int ifpga_get_dev_vendor_id(const char *bdf,
 	return 0;
 }
-static int ifpga_rawdev_fill_info(struct ifpga_rawdev *ifpga_dev,
-	const char *bdf)
+
+static int ifpga_rawdev_fill_info(struct ifpga_rawdev *ifpga_dev)
 {
-	char path[1024] = "/sys/bus/pci/devices/0000:";
+	struct opae_adapter *adapter = NULL;
+	char path[1024] = "/sys/bus/pci/devices/";
 	char link[1024], link1[1024];
 	char dir[1024] = "/sys/devices/";
@@ -226,5 +228,9 @@ static int ifpga_rawdev_fill_info(struct ifpga_rawdev *ifpga_dev,
 	uint32_t dev_id, vendor_id;
 
-	strlcat(path, bdf, sizeof(path));
+	adapter = ifpga_dev ? ifpga_rawdev_get_priv(ifpga_dev->rawdev) : NULL;
+	if (!adapter)
+		return -ENODEV;
+
+	strlcat(path, adapter->name, sizeof(path));
 	memset(link, 0, sizeof(link));
 	memset(link1, 0, sizeof(link1));
@@ -376,5 +382,5 @@ ifpga_monitor_sensor(struct rte_rawdev *raw_dev,
 		if (!strcmp(sensor->name, "Board Temperature") ||
 				!strcmp(sensor->name, "FPGA Die Temperature")) {
-			IFPGA_RAWDEV_PMD_INFO("read sensor %s %d %d %d\n",
+			IFPGA_RAWDEV_PMD_DEBUG("read sensor %s %d %d %d\n",
 					sensor->name, value, sensor->high_warn,
 					sensor->high_fatal);
@@ -418,5 +424,5 @@ static int set_surprise_link_check_aer(
 	uint32_t aer_new0, aer_new1;
 
-	if (!ifpga_rdev) {
+	if (!ifpga_rdev || !ifpga_rdev->rawdev) {
 		printf("\n device does not exist\n");
 		return -EFAULT;
@@ -497,9 +503,9 @@ ifpga_rawdev_gsd_handle(__rte_unused void *param)
 #define MS 1000
 
-	while (__atomic_load_n(&ifpga_monitor_start, __ATOMIC_RELAXED)) {
+	while (__atomic_load_n(&ifpga_monitor_refcnt, __ATOMIC_RELAXED)) {
 		gsd_enable = 0;
 		for (i = 0; i < IFPGA_RAWDEV_NUM; i++) {
 			ifpga_rdev = &ifpga_rawdevices[i];
-			if (ifpga_rdev->rawdev) {
+			if (ifpga_rdev->poll_enabled) {
 				ret = set_surprise_link_check_aer(ifpga_rdev,
 					gsd_enable);
@@ -521,30 +527,44 @@ ifpga_rawdev_gsd_handle(__rte_unused void *param)
 
 static int
-ifpga_monitor_start_func(void)
+ifpga_monitor_start_func(struct ifpga_rawdev *dev)
 {
 	int ret;
 
-	if (!__atomic_load_n(&ifpga_monitor_start, __ATOMIC_RELAXED)) {
+	if (!dev)
+		return -ENODEV;
+
+	ret = ifpga_rawdev_fill_info(dev);
+	if (ret)
+		return ret;
+
+	dev->poll_enabled = 1;
+
+	if (!__atomic_fetch_add(&ifpga_monitor_refcnt, 1, __ATOMIC_RELAXED)) {
 		ret = rte_ctrl_thread_create(&ifpga_monitor_start_thread,
 					     "ifpga-monitor", NULL,
 					     ifpga_rawdev_gsd_handle, NULL);
 		if (ret != 0) {
+			ifpga_monitor_start_thread = 0;
 			IFPGA_RAWDEV_PMD_ERR(
 				"Fail to create ifpga monitor thread");
 			return -1;
 		}
-		__atomic_store_n(&ifpga_monitor_start, 1, __ATOMIC_RELAXED);
 	}
 
 	return 0;
 }
+
 static int
-ifpga_monitor_stop_func(void)
+ifpga_monitor_stop_func(struct ifpga_rawdev *dev)
 {
 	int ret;
 
-	if (__atomic_load_n(&ifpga_monitor_start, __ATOMIC_RELAXED)) {
-		__atomic_store_n(&ifpga_monitor_start, 0, __ATOMIC_RELAXED);
+	if (!dev || !dev->poll_enabled)
+		return 0;
 
+	dev->poll_enabled = 0;
+
+	if (!__atomic_sub_fetch(&ifpga_monitor_refcnt, 1, __ATOMIC_RELAXED) &&
+		ifpga_monitor_start_thread) {
 		ret = pthread_cancel(ifpga_monitor_start_thread);
 		if (ret)
@@ -719,4 +739,5 @@ ifpga_rawdev_close(struct rte_rawdev *dev)
 
 	if (dev) {
+		ifpga_monitor_stop_func(ifpga_rawdev_get(dev));
 		adapter = ifpga_rawdev_get_priv(dev);
 		if (adapter) {
@@ -1573,4 +1594,8 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev,
 		goto free_adapter_data;
 
+	ret = ifpga_monitor_start_func(dev);
+	if (ret)
+		goto free_adapter_data;
+
 	return ret;
 
@@ -1648,5 +1673,5 @@ static int
 ifpga_rawdev_pci_remove(struct rte_pci_device *pci_dev)
 {
-	ifpga_monitor_stop_func();
+	IFPGA_RAWDEV_PMD_INFO("remove pci_dev %s", pci_dev->device.name);
 	return ifpga_rawdev_destroy(pci_dev);
 }
@@ -1699,5 +1724,4 @@ ifpga_cfg_probe(struct rte_vdev_device *dev)
 	int port;
 	char *name = NULL;
-	const char *bdf;
 	char dev_name[RTE_RAWDEV_NAME_MAX_LEN];
 	int ret = -1;
@@ -1748,8 +1772,4 @@ ifpga_cfg_probe(struct rte_vdev_device *dev)
 	if (!ifpga_dev)
 		goto end;
-	bdf = name;
-	ifpga_rawdev_fill_info(ifpga_dev, bdf);
-
-	ifpga_monitor_start_func();
 
 	memset(dev_name, 0, sizeof(dev_name));
diff --git a/drivers/raw/ifpga/ifpga_rawdev.h b/drivers/raw/ifpga/ifpga_rawdev.h
index 6e09afead3..857b73463d 100644
--- a/drivers/raw/ifpga/ifpga_rawdev.h
+++ b/drivers/raw/ifpga/ifpga_rawdev.h
@@ -63,4 +63,6 @@ struct ifpga_rawdev {
 	/* 0 for FME interrupt, others are reserved for AFU irq */
 	void *intr_handle[IFPGA_MAX_IRQ];
+	/* enable monitor thread poll device's sensors or not */
+	int poll_enabled;
 };
 
-- 
2.34.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-03-08 13:55:29.348136534 +0000
+++ 0039-raw-ifpga-fix-monitor-thread.patch	2022-03-08 13:55:28.510315202 +0000
@@ -1 +1 @@
-From 2479a1e9a8886c93ba4c8a7aa2a35a04302f1aae Mon Sep 17 00:00:00 2001
+From 415ad41107c755841c92221bde4fecf696c92b5e Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 2479a1e9a8886c93ba4c8a7aa2a35a04302f1aae ]
+
@@ -14 +15,0 @@
-Cc: stable at dpdk.org
@@ -24 +25 @@
-index cc569c5e71..26c1366a64 100644
+index c2e74518aa..2d3c4fd229 100644
@@ -147 +148 @@
-@@ -1572,4 +1593,8 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev,
+@@ -1573,4 +1594,8 @@ ifpga_rawdev_create(struct rte_pci_device *pci_dev,
@@ -156 +157 @@
-@@ -1647,5 +1672,5 @@ static int
+@@ -1648,5 +1673,5 @@ static int
@@ -163 +164 @@
-@@ -1698,5 +1723,4 @@ ifpga_cfg_probe(struct rte_vdev_device *dev)
+@@ -1699,5 +1724,4 @@ ifpga_cfg_probe(struct rte_vdev_device *dev)
@@ -169 +170 @@
-@@ -1747,8 +1771,4 @@ ifpga_cfg_probe(struct rte_vdev_device *dev)
+@@ -1748,8 +1772,4 @@ ifpga_cfg_probe(struct rte_vdev_device *dev)



More information about the stable mailing list