]> git.droids-corp.org - dpdk.git/commitdiff
net/nfp: fix lock file usage
authorAlejandro Lucero <alejandro.lucero@netronome.com>
Wed, 23 May 2018 12:28:56 +0000 (13:28 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 25 May 2018 15:07:40 +0000 (17:07 +0200)
DPDK apps can be executed as non-root users but current NFP lock
file for avoiding concurrent accesses to CPP interface is precluding
this option or requires to modify system file permissions.

When the NFP device is bound to VFIO, this driver does not allow this
concurrent access, so the lock file is not required at all.

OVS-DPDK as executed in RedHat distributions is the main NFP user
needing this fix.

Fixes: c7e9729da6b5 ("net/nfp: support CPP")
Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
drivers/net/nfp/nfp_net.c
drivers/net/nfp/nfpcore/nfp_cpp.h
drivers/net/nfp/nfpcore/nfp_cpp_pcie_ops.c
drivers/net/nfp/nfpcore/nfp_cppcore.c

index 34a8cad04350e60e85b058544f588ff885bb13c0..faad1ee9bf235a8b2a80612c6a8c59c05143f9dc 100644 (file)
@@ -3118,7 +3118,18 @@ static int nfp_pf_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
        if (!dev)
                return ret;
 
-       cpp = nfp_cpp_from_device_name(dev->device.name);
+       /*
+        * When device bound to UIO, the device could be used, by mistake,
+        * by two DPDK apps, and the UIO driver does not avoid it. This
+        * could lead to a serious problem when configuring the NFP CPP
+        * interface. Here we avoid this telling to the CPP init code to
+        * use a lock file if UIO is being used.
+        */
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               cpp = nfp_cpp_from_device_name(dev->device.name, 0);
+       else
+               cpp = nfp_cpp_from_device_name(dev->device.name, 1);
+
        if (!cpp) {
                PMD_DRV_LOG(ERR, "A CPP handle can not be obtained");
                ret = -EIO;
index 7e862145c8607c49e8c6a25d08001d0c4675ab12..de2ff84e938580ba8e61ca84c02fc9114ee12d15 100644 (file)
@@ -31,6 +31,8 @@ struct nfp_cpp {
         * island XPB CSRs.
         */
        uint32_t imb_cat_table[16];
+
+       int driver_lock_needed;
 };
 
 /*
@@ -179,7 +181,8 @@ uint32_t __nfp_cpp_model_autodetect(struct nfp_cpp *cpp);
  *
  * @return NFP CPP handle, or NULL on failure (and set errno accordingly).
  */
-struct nfp_cpp *nfp_cpp_from_device_name(const char *devname);
+struct nfp_cpp *nfp_cpp_from_device_name(const char *devname,
+                                        int driver_lock_needed);
 
 /*
  * Free a NFP CPP handle
index 52b2948889151fdbb6ea1a3274c45d79a69daf84..2f5e7f6decf8e00caca18f9d5e8b5c219d09adbb 100644 (file)
@@ -850,9 +850,11 @@ nfp6000_init(struct nfp_cpp *cpp, const char *devname)
        memset(desc->busdev, 0, BUSDEV_SZ);
        strlcpy(desc->busdev, devname, sizeof(desc->busdev));
 
-       ret = nfp_acquire_process_lock(desc);
-       if (ret)
-               return -1;
+       if (cpp->driver_lock_needed) {
+               ret = nfp_acquire_process_lock(desc);
+               if (ret)
+                       return -1;
+       }
 
        snprintf(tmp_str, sizeof(tmp_str), "%s/%s/driver", PCI_DEVICES,
                 desc->busdev);
@@ -912,7 +914,8 @@ nfp6000_free(struct nfp_cpp *cpp)
                if (desc->bar[x - 1].iomem)
                        munmap(desc->bar[x - 1].iomem, 1 << (desc->barsz - 3));
        }
-       close(desc->lock);
+       if (cpp->driver_lock_needed)
+               close(desc->lock);
        close(desc->device);
        free(desc);
 }
index 94d4a0b6b4c0d739ec2e49c2b712bae04fea80a5..f61143f7e1f373fcadd00a0e6d8e7f8f4217bbad 100644 (file)
@@ -542,7 +542,7 @@ nfp_xpb_readl(struct nfp_cpp *cpp, uint32_t xpb_addr, uint32_t *value)
 }
 
 static struct nfp_cpp *
-nfp_cpp_alloc(const char *devname)
+nfp_cpp_alloc(const char *devname, int driver_lock_needed)
 {
        const struct nfp_cpp_operations *ops;
        struct nfp_cpp *cpp;
@@ -558,6 +558,7 @@ nfp_cpp_alloc(const char *devname)
                return NULL;
 
        cpp->op = ops;
+       cpp->driver_lock_needed = driver_lock_needed;
 
        if (cpp->op->init) {
                err = cpp->op->init(cpp, devname);
@@ -603,9 +604,9 @@ nfp_cpp_free(struct nfp_cpp *cpp)
 }
 
 struct nfp_cpp *
-nfp_cpp_from_device_name(const char *devname)
+nfp_cpp_from_device_name(const char *devname, int driver_lock_needed)
 {
-       return nfp_cpp_alloc(devname);
+       return nfp_cpp_alloc(devname, driver_lock_needed);
 }
 
 /*