[dpdk-dev] Add option to dpdk-devbind.py to restore kernel driver binding

Message ID 40ff3805d8a647f8bda4a386cc6a3987@bilemail2.empirix.com (mailing list archive)
State Rejected, archived
Delegated to: Thomas Monjalon
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail apply issues

Commit Message

Tosatti, Giovanni April 10, 2018, 10:55 a.m. UTC
  This patch adds a " --restore" option that will unbind all devices currently bound to DPDK PMDs back to the kernel driver.
  

Comments

Burakov, Anatoly April 10, 2018, 12:55 p.m. UTC | #1
On 10-Apr-18 11:55 AM, Tosatti, Giovanni wrote:
> This patch adds a " --restore" option that will unbind all devices currently bound to DPDK PMDs back to the kernel driver.

Hi Giovanni,

Nitpicking the commit message, but I believe "unbind" here is a bit of a 
misnomer - one does not "unbind to kernel driver", it's either "bind to 
kernel driver" or "bind to DPDK driver" :)

> 
> --- /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07.orig/tools/dpdk-devbind.py
> +++ /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07/tools/dpdk-devbind.py
> @@ -91,6 +91,9 @@
>       -u, --unbind:
>           Unbind a device (Equivalent to \"-b none\")
>   
> +    -r, --restore
> +        Restore ALL the DPDK devices to their kernel drivers

Same here - perhaps for clarity this should be "For all devices bound to 
DPDK drivers, bind them to their kernel drivers".

> +
>       --force:
>           By default, devices which are used by Linux - as indicated by having
>           routes in the routing table - cannot be modified. Using the --force
> @@ -448,6 +451,21 @@
>           if "Driver_str" in devices[d]:
>               unbind_one(d, force)
>   
> +def restore_all_to_kernel():
  
Burakov, Anatoly April 10, 2018, 1:19 p.m. UTC | #2
On 10-Apr-18 11:55 AM, Tosatti, Giovanni wrote:
> This patch adds a " --restore" option that will unbind all devices currently bound to DPDK PMDs back to the kernel driver.
> 
> --- /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07.orig/tools/dpdk-devbind.py
> +++ /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07/tools/dpdk-devbind.py
> @@ -91,6 +91,9 @@
>       -u, --unbind:

Two other issues:

1) the header is also wrongly formatted. it should read something like:

tools/devbind: add option to restore kernel driver binding

2) the patch does not apply. not only it appears to be generated not 
from git-send-email but reads as a diff, but it looks like it's 
generated against a very old version of DPDK.

You might want to look at DPDK contribution guidelines:

http://dpdk.org/doc/guides/contributing/patches.html

Thanks for your effort so far!
  
Ferruh Yigit April 5, 2019, 3:50 p.m. UTC | #3
On 4/10/2018 2:19 PM, Burakov, Anatoly wrote:
> On 10-Apr-18 11:55 AM, Tosatti, Giovanni wrote:
>> This patch adds a " --restore" option that will unbind all devices currently bound to DPDK PMDs back to the kernel driver.
>>
>> --- /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07.orig/tools/dpdk-devbind.py
>> +++ /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07/tools/dpdk-devbind.py
>> @@ -91,6 +91,9 @@
>>       -u, --unbind:
> 
> Two other issues:
> 
> 1) the header is also wrongly formatted. it should read something like:
> 
> tools/devbind: add option to restore kernel driver binding
> 
> 2) the patch does not apply. not only it appears to be generated not 
> from git-send-email but reads as a diff, but it looks like it's 
> generated against a very old version of DPDK.
> 
> You might want to look at DPDK contribution guidelines:
> 
> http://dpdk.org/doc/guides/contributing/patches.html
> 
> Thanks for your effort so far!
> 

There is no response to change request for a year now.

I am marking the patch as rejected, if it is still relevant please send a
new version on top of latest repo.

Sorry for any inconvenience caused.

For reference patches:
https://patches.dpdk.org/patch/37774/
  

Patch

--- /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07.orig/tools/dpdk-devbind.py
+++ /opt/Perforce/gtosatti_centos/E-XMS/CSA-Mainline/Third-Party/dpdk/dpdk-16.07/tools/dpdk-devbind.py
@@ -91,6 +91,9 @@ 
     -u, --unbind:
         Unbind a device (Equivalent to \"-b none\")
 
+    -r, --restore
+        Restore ALL the DPDK devices to their kernel drivers
+
     --force:
         By default, devices which are used by Linux - as indicated by having
         routes in the routing table - cannot be modified. Using the --force
@@ -448,6 +451,21 @@ 
         if "Driver_str" in devices[d]:
             unbind_one(d, force)
 
+def restore_all_to_kernel():
+    global force_flag
+    # List all the available devices
+    for d in devices.keys():
+        if not has_driver(d):
+	    # Discard the unbinded devices
+            continue
+        if devices[d]["Driver_str"] in dpdk_drivers:
+            # List the unused Drivers of the the DPDK Devices...  
+	    unused_drivers = devices[d]["Module_str"].split(",")
+            print("Restoring kernel driver for: %s '%s' '%s'" % (devices[d]["Slot"],
+                  devices[d]["Device_str"], devices[d]["Module_str"]))
+            # Bind the current Device to the FIRST unused Driver
+            if unused_drivers:
+                bind_one(devices[d]["Slot"], unused_drivers[0], force_flag)
 
 def display_devices(title, dev_list, extra_params=None):
     '''Displays to the user the details of a list of devices given in
@@ -513,7 +531,7 @@ 
     try:
         opts, args = getopt.getopt(sys.argv[1:], "b:us",
                                    ["help", "usage", "status", "force",
-                                    "bind=", "unbind"])
+                                    "bind=", "unbind", "restore"])
     except getopt.GetoptError as error:
         print(str(error))
         print("Run '%s --usage' for further information" % sys.argv[0])
@@ -527,11 +545,15 @@ 
             status_flag = True
         if opt == "--force":
             force_flag = True
-        if opt == "-b" or opt == "-u" or opt == "--bind" or opt == "--unbind":
+        if (opt == "-b" or opt == "--bind" or
+            opt == "-u" or opt == "--unbind" or
+            opt == "-r" or opt == "--restore"):
             if b_flag is not None:
                 print("Error - Only one bind or unbind may be specified\n")
                 sys.exit(1)
-            if opt == "-u" or opt == "--unbind":
+            if opt == "-r" or opt == "--restore":
+                b_flag = "restore"
+            elif opt == "-u" or opt == "--unbind":
                 b_flag = "none"
             else:
                 b_flag = arg
@@ -551,11 +573,14 @@ 
         sys.exit(1)
 
     if b_flag is not None and len(args) == 0:
-        print("Error: No devices specified.")
-        print("Run '%s --usage' for further information" % sys.argv[0])
-        sys.exit(1)
-
-    if b_flag == "none" or b_flag == "None":
+   	if b_flag != "restore":
+            print("Error: No devices specified.")
+            print("Run '%s --usage' for further information" % sys.argv[0])
+            sys.exit(1)
+
+    if b_flag == "restore":
+        restore_all_to_kernel()
+    elif b_flag == "none" or b_flag == "None":
         unbind_all(args, force_flag)
     elif b_flag is not None:
         bind_all(args, b_flag, force_flag)