[dpdk-stable] patch 'vfio: fix group descriptor check' has been queued to LTS release 18.11.11

Kevin Traynor ktraynor at redhat.com
Thu Nov 5 13:39:46 CET 2020


Hi,

FYI, your patch has been queued to LTS release 18.11.11

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/10/20. 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-queue

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

Thanks.

Kevin.

---
>From 8cba350de777b2cdf703cb742ff05afcbcc8ea88 Mon Sep 17 00:00:00 2001
From: Yunjian Wang <wangyunjian at huawei.com>
Date: Tue, 19 May 2020 11:42:00 +0800
Subject: [PATCH] vfio: fix group descriptor check

[ upstream commit 1f16fa99aa36e043e395184d6ad37a348eafeba7 ]

The issue is that a file descriptor at 0 is a valid one. Currently
the file not found, the return value will be set to 0. As a result,
it is impossible to distinguish between a correct descriptor and a
failed return value. Fix it to return -ENOENT instead of 0.

Fixes: b758423bc4fe ("vfio: fix race condition with sysfs")
Fixes: ff0b67d1c868 ("vfio: DMA mapping")

Signed-off-by: Yunjian Wang <wangyunjian at huawei.com>
Reviewed-by: Anatoly Burakov <anatoly.burakov at intel.com>
---
 lib/librte_eal/linuxapp/eal/eal_vfio.c        | 23 +++++++++++--------
 .../linuxapp/eal/eal_vfio_mp_sync.c           |  4 ++--
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/librte_eal/linuxapp/eal/eal_vfio.c
index be969bbaac..7c4bd68732 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
@@ -293,5 +293,5 @@ vfio_open_group_fd(int iommu_group_num)
 					return -1;
 				}
-				return 0;
+				return -ENOENT;
 			}
 			/* noiommu group found */
@@ -318,10 +318,10 @@ vfio_open_group_fd(int iommu_group_num)
 		} else if (p->result == SOCKET_NO_FD) {
 			RTE_LOG(ERR, EAL, "  bad VFIO group fd\n");
-			vfio_group_fd = 0;
+			vfio_group_fd = -ENOENT;
 		}
 	}
 
 	free(mp_reply.msgs);
-	if (vfio_group_fd < 0)
+	if (vfio_group_fd < 0 && vfio_group_fd != -ENOENT)
 		RTE_LOG(ERR, EAL, "  cannot request group fd\n");
 	return vfio_group_fd;
@@ -379,7 +379,7 @@ vfio_get_group_fd(struct vfio_config *vfio_cfg,
 
 	vfio_group_fd = vfio_open_group_fd(iommu_group_num);
-	if (vfio_group_fd <= 0) {
+	if (vfio_group_fd < 0) {
 		RTE_LOG(ERR, EAL, "Failed to open group %d\n", iommu_group_num);
-		return -1;
+		return vfio_group_fd;
 	}
 
@@ -705,9 +705,12 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
 	/* get the actual group fd */
 	vfio_group_fd = rte_vfio_get_group_fd(iommu_group_num);
-	if (vfio_group_fd < 0)
+	if (vfio_group_fd < 0 && vfio_group_fd != -ENOENT)
 		return -1;
 
-	/* if group_fd == 0, that means the device isn't managed by VFIO */
-	if (vfio_group_fd == 0) {
+	/*
+	 * if vfio_group_fd == -ENOENT, that means the device
+	 * isn't managed by VFIO
+	 */
+	if (vfio_group_fd == -ENOENT) {
 		RTE_LOG(WARNING, EAL, " %s not managed by VFIO driver, skipping\n",
 				dev_addr);
@@ -929,8 +932,8 @@ rte_vfio_release_device(const char *sysfs_base, const char *dev_addr,
 	/* get the actual group fd */
 	vfio_group_fd = rte_vfio_get_group_fd(iommu_group_num);
-	if (vfio_group_fd <= 0) {
+	if (vfio_group_fd < 0) {
 		RTE_LOG(INFO, EAL, "rte_vfio_get_group_fd failed for %s\n",
 				   dev_addr);
-		ret = -1;
+		ret = vfio_group_fd;
 		goto out;
 	}
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c b/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
index 2a47f29d5a..126b568c16 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
@@ -44,7 +44,7 @@ vfio_mp_primary(const struct rte_mp_msg *msg, const void *peer)
 		r->group_num = m->group_num;
 		fd = rte_vfio_get_group_fd(m->group_num);
-		if (fd < 0)
+		if (fd < 0 && fd != -ENOENT)
 			r->result = SOCKET_ERR;
-		else if (fd == 0)
+		else if (fd == -ENOENT)
 			/* if VFIO group exists but isn't bound to VFIO driver */
 			r->result = SOCKET_NO_FD;
-- 
2.26.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-11-05 12:38:55.005221269 +0000
+++ 0039-vfio-fix-group-descriptor-check.patch	2020-11-05 12:38:54.240896020 +0000
@@ -1 +1 @@
-From 1f16fa99aa36e043e395184d6ad37a348eafeba7 Mon Sep 17 00:00:00 2001
+From 8cba350de777b2cdf703cb742ff05afcbcc8ea88 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 1f16fa99aa36e043e395184d6ad37a348eafeba7 ]
+
@@ -13 +14,0 @@
-Cc: stable at dpdk.org
@@ -18,2 +19,2 @@
- lib/librte_eal/linux/eal_vfio.c         | 23 +++++++++++++----------
- lib/librte_eal/linux/eal_vfio_mp_sync.c |  4 ++--
+ lib/librte_eal/linuxapp/eal/eal_vfio.c        | 23 +++++++++++--------
+ .../linuxapp/eal/eal_vfio_mp_sync.c           |  4 ++--
@@ -22,5 +23,5 @@
-diff --git a/lib/librte_eal/linux/eal_vfio.c b/lib/librte_eal/linux/eal_vfio.c
-index e07979936e..380f2f44aa 100644
---- a/lib/librte_eal/linux/eal_vfio.c
-+++ b/lib/librte_eal/linux/eal_vfio.c
-@@ -296,5 +296,5 @@ vfio_open_group_fd(int iommu_group_num)
+diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/librte_eal/linuxapp/eal/eal_vfio.c
+index be969bbaac..7c4bd68732 100644
+--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
++++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
+@@ -293,5 +293,5 @@ vfio_open_group_fd(int iommu_group_num)
@@ -33 +34 @@
-@@ -321,10 +321,10 @@ vfio_open_group_fd(int iommu_group_num)
+@@ -318,10 +318,10 @@ vfio_open_group_fd(int iommu_group_num)
@@ -46 +47 @@
-@@ -382,7 +382,7 @@ vfio_get_group_fd(struct vfio_config *vfio_cfg,
+@@ -379,7 +379,7 @@ vfio_get_group_fd(struct vfio_config *vfio_cfg,
@@ -56 +57 @@
-@@ -734,9 +734,12 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
+@@ -705,9 +705,12 @@ rte_vfio_setup_device(const char *sysfs_base, const char *dev_addr,
@@ -72 +73 @@
-@@ -976,8 +979,8 @@ rte_vfio_release_device(const char *sysfs_base, const char *dev_addr,
+@@ -929,8 +932,8 @@ rte_vfio_release_device(const char *sysfs_base, const char *dev_addr,
@@ -83,5 +84,5 @@
-diff --git a/lib/librte_eal/linux/eal_vfio_mp_sync.c b/lib/librte_eal/linux/eal_vfio_mp_sync.c
-index 5f2a5fc1d9..6254696ae5 100644
---- a/lib/librte_eal/linux/eal_vfio_mp_sync.c
-+++ b/lib/librte_eal/linux/eal_vfio_mp_sync.c
-@@ -45,7 +45,7 @@ vfio_mp_primary(const struct rte_mp_msg *msg, const void *peer)
+diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c b/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
+index 2a47f29d5a..126b568c16 100644
+--- a/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
++++ b/lib/librte_eal/linuxapp/eal/eal_vfio_mp_sync.c
+@@ -44,7 +44,7 @@ vfio_mp_primary(const struct rte_mp_msg *msg, const void *peer)



More information about the stable mailing list