DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] usertools: fix bind failed can not regression
@ 2019-11-26  6:49 Hui Wei
  2019-11-26 22:54 ` Thomas Monjalon
  0 siblings, 1 reply; 2+ messages in thread
From: Hui Wei @ 2019-11-26  6:49 UTC (permalink / raw)
  To: dev

nic bind to mlx5_core, enable sriov, nic has one pf and 8 vfs,
bind pf to vfio-pci failed, can not regress to mlx5_core

Signed-off-by: Wei Hui <huiweics@hotmail.com>
---
 usertools/dpdk-devbind.py | 165 ++++++++++++++++++++++----------------
 1 file changed, 94 insertions(+), 71 deletions(-)

diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py
index 7b5cbc12c..59e3960af 100755
--- a/usertools/dpdk-devbind.py
+++ b/usertools/dpdk-devbind.py
@@ -379,6 +379,7 @@ def bind_one(dev_id, driver, force):
     is already bound to a different driver, it will be unbound first'''
     dev = devices[dev_id]
     saved_driver = None  # used to rollback any unbind in case of failure
+    bind_success = False
 
     # prevent disconnection of our ssh session
     if dev["Ssh_if"] and not force:
@@ -386,16 +387,12 @@ def bind_one(dev_id, driver, force):
               "Not modifying" % dev_id, file=sys.stderr)
         return
 
-    # unbind any existing drivers we don't want
+    # does not need to do anything
     if has_driver(dev_id):
         if dev["Driver_str"] == driver:
             print("Notice: %s already bound to driver %s, skipping" %
                   (dev_id, driver), file=sys.stderr)
             return
-        else:
-            saved_driver = dev["Driver_str"]
-            unbind_one(dev_id, force)
-            dev["Driver_str"] = ""  # clear driver string
 
     # For kernels >= 3.15 driver_override can be used to specify the driver
     # for a device rather than relying on the driver to provide a positive
@@ -403,40 +400,45 @@ def bind_one(dev_id, driver, force):
     # the vendor and device ID, adding them to the driver new_id,
     # will erroneously bind other devices too which has the additional burden
     # of unbinding those devices
-    if driver in dpdk_drivers:
-        filename = "/sys/bus/pci/devices/%s/driver_override" % dev_id
-        if os.path.exists(filename):
-            try:
-                f = open(filename, "w")
-            except:
-                print("Error: bind failed for %s - Cannot open %s"
-                      % (dev_id, filename), file=sys.stderr)
-                return
-            try:
-                f.write("%s" % driver)
-                f.close()
-            except:
-                print("Error: bind failed for %s - Cannot write driver %s to "
-                      "PCI ID " % (dev_id, driver), file=sys.stderr)
-                return
-        # For kernels < 3.15 use new_id to add PCI id's to the driver
-        else:
-            filename = "/sys/bus/pci/drivers/%s/new_id" % driver
-            try:
-                f = open(filename, "w")
-            except:
-                print("Error: bind failed for %s - Cannot open %s"
-                      % (dev_id, filename), file=sys.stderr)
-                return
-            try:
-                # Convert Device and Vendor Id to int to write to new_id
-                f.write("%04x %04x" % (int(dev["Vendor"],16),
-                        int(dev["Device"], 16)))
-                f.close()
-            except:
-                print("Error: bind failed for %s - Cannot write new PCI ID to "
-                      "driver %s" % (dev_id, driver), file=sys.stderr)
-                return
+    filename = "/sys/bus/pci/devices/%s/driver_override" % dev_id
+    if os.path.exists(filename):
+        try:
+            f = open(filename, "w")
+        except:
+            print("Error: bind failed for %s - Cannot open %s"
+                  % (dev_id, filename), file=sys.stderr)
+            return
+        try:
+            f.write("%s" % driver)
+            f.close()
+        except:
+            print("Error: bind failed for %s - Cannot write driver %s to "
+                  "PCI ID " % (dev_id, driver), file=sys.stderr)
+            return
+    # For kernels < 3.15 use new_id to add PCI id's to the driver
+    else:
+        filename = "/sys/bus/pci/drivers/%s/new_id" % driver
+        try:
+            f = open(filename, "w")
+        except:
+            print("Error: bind failed for %s - Cannot open %s"
+                  % (dev_id, filename), file=sys.stderr)
+            return
+        try:
+            # Convert Device and Vendor Id to int to write to new_id
+            f.write("%04x %04x" % (int(dev["Vendor"],16),
+                    int(dev["Device"], 16)))
+            f.close()
+        except:
+            print("Error: bind failed for %s - Cannot write new PCI ID to "
+                  "driver %s" % (dev_id, driver), file=sys.stderr)
+            return
+
+    # unbind any existing drivers we don't want
+    if has_driver(dev_id):
+        saved_driver = dev["Driver_str"]
+        unbind_one(dev_id, force)
+        del dev["Driver_str"]  # clear driver string
 
     # do the bind by writing to /sys
     filename = "/sys/bus/pci/drivers/%s/bind" % driver
@@ -445,42 +447,63 @@ def bind_one(dev_id, driver, force):
     except:
         print("Error: bind failed for %s - Cannot open %s"
               % (dev_id, filename), file=sys.stderr)
-        if saved_driver is not None:  # restore any previous driver
-            bind_one(dev_id, saved_driver, force)
-        return
-    try:
-        f.write(dev_id)
-        f.close()
-    except:
-        # for some reason, closing dev_id after adding a new PCI ID to new_id
-        # results in IOError. however, if the device was successfully bound,
-        # we don't care for any errors and can safely ignore IOError
-        tmp = get_pci_device_details(dev_id, True)
-        if "Driver_str" in tmp and tmp["Driver_str"] == driver:
-            return
-        print("Error: bind failed for %s - Cannot bind to driver %s"
-              % (dev_id, driver), file=sys.stderr)
-        if saved_driver is not None:  # restore any previous driver
-            bind_one(dev_id, saved_driver, force)
-        return
-
-    # For kernels > 3.15 driver_override is used to bind a device to a driver.
-    # Before unbinding it, overwrite driver_override with empty string so that
-    # the device can be bound to any other driver
-    filename = "/sys/bus/pci/devices/%s/driver_override" % dev_id
-    if os.path.exists(filename):
-        try:
-            f = open(filename, "w")
-        except:
-            sys.exit("Error: unbind failed for %s - Cannot open %s"
-                  % (dev_id, filename))
+    else:
         try:
-            f.write("\00")
+            f.write(dev_id)
             f.close()
         except:
-            sys.exit("Error: unbind failed for %s - Cannot open %s"
-                  % (dev_id, filename))
+            # for some reason, closing dev_id after adding a new PCI ID to new_id
+            # results in IOError. however, if the device was successfully bound,
+            # we don't care for any errors and can safely ignore IOError
+            tmp = get_pci_device_details(dev_id, True)
+            if "Driver_str" in tmp and tmp["Driver_str"] == driver:
+                return
+            print("Error: bind failed for %s - Cannot bind to driver %s"
+                  % (dev_id, driver), file=sys.stderr)
+        else:
+            bind_success = True
 
+    if False == bind_success:
+        if saved_driver is not None:  # restore any previous driver
+            bind_one(dev_id, saved_driver, force)
+            dev["Driver_str"] = saved_driver
+        else:
+            # At this point, pci device previous does not bind to any driver, or it will
+            # be restored it's previous driver.
+            # For kernels > 3.15 driver_override is used to bind a device to a driver.
+            # Before unbinding it, overwrite driver_override with empty string so that
+            # the device can be bound to any other driver
+            filename = "/sys/bus/pci/devices/%s/driver_override" % dev_id
+            if os.path.exists(filename):
+                try:
+                    f = open(filename, "w")
+                except:
+                    sys.exit("Error: restore failed for %s - Cannot open %s"
+                          % (dev_id, filename))
+                try:
+                    f.write("\00")
+                    f.close()
+                except:
+                    sys.exit("Error: restore failed for %s - Cannot write %s"
+                          % (dev_id, filename))
+            # For kernels < 3.15 use remove_id to delete PCI id's from the driver
+            else:
+                filename = "/sys/bus/pci/drivers/%s/remove_id" % driver
+                try:
+                    f = open(filename, "w")
+                except:
+                    print("Error: restore failed for %s - Cannot open %s"
+                          % (dev_id, filename), file=sys.stderr)
+                    return
+                try:
+                    # Convert Device and Vendor Id to int to write to remove_id
+                    f.write("%04x %04x" % (int(dev["Vendor"],16),
+                            int(dev["Device"], 16)))
+                    f.close()
+                except:
+                    print("Error: restore failed for %s - Cannot write new PCI ID to "
+                          "driver %s remove_id" % (dev_id, driver), file=sys.stderr)
+                    return
 
 def unbind_all(dev_list, force=False):
     """Unbind method, takes a list of device locations"""
-- 
2.24.0.windows.2


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-11-26 22:54 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-26  6:49 [dpdk-dev] [PATCH] usertools: fix bind failed can not regression Hui Wei
2019-11-26 22:54 ` Thomas Monjalon

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).