Blame SOURCES/0001-net-nfp-fix-lock-file-usage.patch

a6040a
From 552ff0a9afc2d41685ed0295e6080df0c05382b4 Mon Sep 17 00:00:00 2001
a6040a
From: Alejandro Lucero <alejandro.lucero@netronome.com>
a6040a
Date: Wed, 23 May 2018 13:28:56 +0100
a6040a
Subject: [PATCH] net/nfp: fix lock file usage
a6040a
a6040a
DPDK apps can be executed as non-root users but current NFP lock
a6040a
file for avoiding concurrent accesses to CPP interface is precluding
a6040a
this option or requires to modify system file permissions.
a6040a
a6040a
When the NFP device is bound to VFIO, this driver does not allow this
a6040a
concurrent access, so the lock file is not required at all.
a6040a
a6040a
OVS-DPDK as executed in RedHat distributions is the main NFP user
a6040a
needing this fix.
a6040a
a6040a
Fixes: c7e9729da6b5 ("net/nfp: support CPP")
a6040a
a6040a
Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
a6040a
(cherry picked from commit 5f6ed2f4e0cb79580c0bedba2bd764a39923d7ec)
a6040a
---
a6040a
 drivers/net/nfp/nfp_net.c                  | 13 ++++++++++++-
a6040a
 drivers/net/nfp/nfpcore/nfp_cpp.h          |  5 ++++-
a6040a
 drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c | 11 +++++++----
a6040a
 drivers/net/nfp/nfpcore/nfp_cppcore.c      |  7 ++++---
a6040a
 4 files changed, 27 insertions(+), 9 deletions(-)
a6040a
a6040a
diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
a6040a
index 559230ab6..71249572d 100644
a6040a
--- a/drivers/net/nfp/nfp_net.c
a6040a
+++ b/drivers/net/nfp/nfp_net.c
a6040a
@@ -3146,7 +3146,18 @@ static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
a6040a
 	if (!dev)
a6040a
 		return ret;
a6040a
 
a6040a
-	cpp = nfp_cpp_from_device_name(dev->device.name);
a6040a
+	/*
a6040a
+	 * When device bound to UIO, the device could be used, by mistake,
a6040a
+	 * by two DPDK apps, and the UIO driver does not avoid it. This
a6040a
+	 * could lead to a serious problem when configuring the NFP CPP
a6040a
+	 * interface. Here we avoid this telling to the CPP init code to
a6040a
+	 * use a lock file if UIO is being used.
a6040a
+	 */
a6040a
+	if (dev->kdrv == RTE_KDRV_VFIO)
a6040a
+		cpp = nfp_cpp_from_device_name(dev->device.name, 0);
a6040a
+	else
a6040a
+		cpp = nfp_cpp_from_device_name(dev->device.name, 1);
a6040a
+
a6040a
 	if (!cpp) {
a6040a
 		RTE_LOG(ERR, PMD, "A CPP handle can not be obtained");
a6040a
 		ret = -EIO;
a6040a
diff --git a/drivers/net/nfp/nfpcore/nfp_cpp.h b/drivers/net/nfp/nfpcore/nfp_cpp.h
a6040a
index 7e862145c..de2ff84e9 100644
a6040a
--- a/drivers/net/nfp/nfpcore/nfp_cpp.h
a6040a
+++ b/drivers/net/nfp/nfpcore/nfp_cpp.h
a6040a
@@ -31,6 +31,8 @@ struct nfp_cpp {
a6040a
 	 * island XPB CSRs.
a6040a
 	 */
a6040a
 	uint32_t imb_cat_table[16];
a6040a
+
a6040a
+	int driver_lock_needed;
a6040a
 };
a6040a
 
a6040a
 /*
a6040a
@@ -179,7 +181,8 @@ uint32_t __nfp_cpp_model_autodetect(struct nfp_cpp *cpp);
a6040a
  *
a6040a
  * @return NFP CPP handle, or NULL on failure (and set errno accordingly).
a6040a
  */
a6040a
-struct nfp_cpp *nfp_cpp_from_device_name(const char *devname);
a6040a
+struct nfp_cpp *nfp_cpp_from_device_name(const char *devname,
a6040a
+					 int driver_lock_needed);
a6040a
 
a6040a
 /*
a6040a
  * Free a NFP CPP handle
a6040a
diff --git a/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c b/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c
a6040a
index ad6ce72fe..e46dbc7d7 100644
a6040a
--- a/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c
a6040a
+++ b/drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c
a6040a
@@ -848,9 +848,11 @@ nfp6000_init(struct nfp_cpp *cpp, const char *devname)
a6040a
 	memset(desc->busdev, 0, BUSDEV_SZ);
a6040a
 	strncpy(desc->busdev, devname, strlen(devname));
a6040a
 
a6040a
-	ret = nfp_acquire_process_lock(desc);
a6040a
-	if (ret)
a6040a
-		return -1;
a6040a
+	if (cpp->driver_lock_needed) {
a6040a
+		ret = nfp_acquire_process_lock(desc);
a6040a
+		if (ret)
a6040a
+			return -1;
a6040a
+	}
a6040a
 
a6040a
 	snprintf(tmp_str, sizeof(tmp_str), "%s/%s/driver", PCI_DEVICES,
a6040a
 		 desc->busdev);
a6040a
@@ -910,7 +912,8 @@ nfp6000_free(struct nfp_cpp *cpp)
a6040a
 		if (desc->bar[x - 1].iomem)
a6040a
 			munmap(desc->bar[x - 1].iomem, 1 << (desc->barsz - 3));
a6040a
 	}
a6040a
-	close(desc->lock);
a6040a
+	if (cpp->driver_lock_needed)
a6040a
+		close(desc->lock);
a6040a
 	close(desc->device);
a6040a
 	free(desc);
a6040a
 }
a6040a
diff --git a/drivers/net/nfp/nfpcore/nfp_cppcore.c b/drivers/net/nfp/nfpcore/nfp_cppcore.c
a6040a
index 94d4a0b6b..f61143f7e 100644
a6040a
--- a/drivers/net/nfp/nfpcore/nfp_cppcore.c
a6040a
+++ b/drivers/net/nfp/nfpcore/nfp_cppcore.c
a6040a
@@ -542,7 +542,7 @@ nfp_xpb_readl(struct nfp_cpp *cpp, uint32_t xpb_addr, uint32_t *value)
a6040a
 }
a6040a
 
a6040a
 static struct nfp_cpp *
a6040a
-nfp_cpp_alloc(const char *devname)
a6040a
+nfp_cpp_alloc(const char *devname, int driver_lock_needed)
a6040a
 {
a6040a
 	const struct nfp_cpp_operations *ops;
a6040a
 	struct nfp_cpp *cpp;
a6040a
@@ -558,6 +558,7 @@ nfp_cpp_alloc(const char *devname)
a6040a
 		return NULL;
a6040a
 
a6040a
 	cpp->op = ops;
a6040a
+	cpp->driver_lock_needed = driver_lock_needed;
a6040a
 
a6040a
 	if (cpp->op->init) {
a6040a
 		err = cpp->op->init(cpp, devname);
a6040a
@@ -603,9 +604,9 @@ nfp_cpp_free(struct nfp_cpp *cpp)
a6040a
 }
a6040a
 
a6040a
 struct nfp_cpp *
a6040a
-nfp_cpp_from_device_name(const char *devname)
a6040a
+nfp_cpp_from_device_name(const char *devname, int driver_lock_needed)
a6040a
 {
a6040a
-	return nfp_cpp_alloc(devname);
a6040a
+	return nfp_cpp_alloc(devname, driver_lock_needed);
a6040a
 }
a6040a
 
a6040a
 /*
a6040a
-- 
a6040a
2.17.0
a6040a