[1/2] usertools/devbind: add error on forgetting to specify driver

Message ID af7e62fabfaf49ab854550e80d6b780dc5719807.1563982007.git.anatoly.burakov@intel.com (mailing list archive)
State Superseded, archived
Headers
Series Small usability improvements for devbind |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/iol-Compile-Testing success Compile Testing PASS
ci/Intel-compilation success Compilation OK
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS

Commit Message

Anatoly Burakov July 24, 2019, 3:34 p.m. UTC
  A common user error is to forget driver to which the PCI devices should
be bound to. Currently, the error message in this case looks unhelpful
misleading and indecipherable to anyone but people who know how devbind
works.

Fix this by checking if the driver string is actually a valid device
string. If it is, we assume that the user has just forgot to specify the
driver, and display appropriate error. We also assume that no one will
name their driver in a format that looks like a PCI address, but that
seems like a reasonable assumption to make.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 usertools/dpdk-devbind.py | 33 ++++++++++++++++++++++++++++-----
 1 file changed, 28 insertions(+), 5 deletions(-)
  

Comments

Stephen Hemminger July 24, 2019, 4:29 p.m. UTC | #1
On Wed, 24 Jul 2019 16:34:43 +0100
Anatoly Burakov <anatoly.burakov@intel.com> wrote:

> A common user error is to forget driver to which the PCI devices should
> be bound to. Currently, the error message in this case looks unhelpful
> misleading and indecipherable to anyone but people who know how devbind
> works.
> 
> Fix this by checking if the driver string is actually a valid device
> string. If it is, we assume that the user has just forgot to specify the
> driver, and display appropriate error. We also assume that no one will
> name their driver in a format that looks like a PCI address, but that
> seems like a reasonable assumption to make.
> 
> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
> ---
>  usertools/dpdk-devbind.py | 33 ++++++++++++++++++++++++++++-----
>  1 file changed, 28 insertions(+), 5 deletions(-)
> 
> diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py
> index 542ecffcc..f7c4c6434 100755
> --- a/usertools/dpdk-devbind.py
> +++ b/usertools/dpdk-devbind.py
> @@ -342,9 +342,8 @@ def dev_id_from_dev_name(dev_name):
>              if dev_name in devices[d]["Interface"].split(","):
>                  return devices[d]["Slot"]
>      # if nothing else matches - error
> -    print("Unknown device: %s. "
> -          "Please specify device in \"bus:slot.func\" format" % dev_name)
> -    sys.exit(1)
> +    raise ValueError("Unknown device: %s. "
> +	    "Please specify device in \"bus:slot.func\" format" % dev_name)
>  
>  
>  def unbind_one(dev_id, force):
> @@ -493,7 +492,12 @@ def unbind_all(dev_list, force=False):
>                      unbind_one(devices[d]["Slot"], force)
>          return
>  
> -    dev_list = map(dev_id_from_dev_name, dev_list)
> +    try:
> +        dev_list = map(dev_id_from_dev_name, dev_list)
> +    except ValueError as ex:
> +        print(ex)
> +        sys.exit(1)
> +
>      for d in dev_list:
>          unbind_one(d, force)
>  
> @@ -502,7 +506,26 @@ def bind_all(dev_list, driver, force=False):
>      """Bind method, takes a list of device locations"""
>      global devices
>  
> -    dev_list = map(dev_id_from_dev_name, dev_list)
> +    # a common user error is to forget to specify the driver the devices need to
> +    # be bound to. check if the driver is a valid device, and if it is, show
> +    # a meaningful error.
> +    try:
> +        dev_id_from_dev_name(driver)
> +        # if we've made it this far, this means that the "driver" was a valid
> +        # device string, so it's probably not a valid driver name.
> +        print("ERROR: Driver '%s' does not look like a valid driver. "
> +              "Did you forget to specify the driver to bind devices to?" %
> +              driver)
> +        sys.exit(1)
> +    except ValueError:
> +        # driver generated error - it's not a valid device ID, so all is well
> +        pass
> +
> +    try:
> +        dev_list = map(dev_id_from_dev_name, dev_list)
> +    except ValueError as ex:
> +        print(ex)
> +        sys.exit(1)
>  
>      for d in dev_list:
>          bind_one(d, driver, force)

It would be better print error messages to stderr.
If you call sys.exit() with a string it will do that.
  
Anatoly Burakov July 24, 2019, 4:47 p.m. UTC | #2
On 24-Jul-19 5:29 PM, Stephen Hemminger wrote:
> On Wed, 24 Jul 2019 16:34:43 +0100
> Anatoly Burakov <anatoly.burakov@intel.com> wrote:
> 
>> A common user error is to forget driver to which the PCI devices should
>> be bound to. Currently, the error message in this case looks unhelpful
>> misleading and indecipherable to anyone but people who know how devbind
>> works.
>>
>> Fix this by checking if the driver string is actually a valid device
>> string. If it is, we assume that the user has just forgot to specify the
>> driver, and display appropriate error. We also assume that no one will
>> name their driver in a format that looks like a PCI address, but that
>> seems like a reasonable assumption to make.
>>
>> Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
>> ---
>>   usertools/dpdk-devbind.py | 33 ++++++++++++++++++++++++++++-----
>>   1 file changed, 28 insertions(+), 5 deletions(-)
>>
>> diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py
>> index 542ecffcc..f7c4c6434 100755
>> --- a/usertools/dpdk-devbind.py
>> +++ b/usertools/dpdk-devbind.py
>> @@ -342,9 +342,8 @@ def dev_id_from_dev_name(dev_name):
>>               if dev_name in devices[d]["Interface"].split(","):
>>                   return devices[d]["Slot"]
>>       # if nothing else matches - error
>> -    print("Unknown device: %s. "
>> -          "Please specify device in \"bus:slot.func\" format" % dev_name)
>> -    sys.exit(1)
>> +    raise ValueError("Unknown device: %s. "
>> +	    "Please specify device in \"bus:slot.func\" format" % dev_name)
>>   
>>   
>>   def unbind_one(dev_id, force):
>> @@ -493,7 +492,12 @@ def unbind_all(dev_list, force=False):
>>                       unbind_one(devices[d]["Slot"], force)
>>           return
>>   
>> -    dev_list = map(dev_id_from_dev_name, dev_list)
>> +    try:
>> +        dev_list = map(dev_id_from_dev_name, dev_list)
>> +    except ValueError as ex:
>> +        print(ex)
>> +        sys.exit(1)
>> +
>>       for d in dev_list:
>>           unbind_one(d, force)
>>   
>> @@ -502,7 +506,26 @@ def bind_all(dev_list, driver, force=False):
>>       """Bind method, takes a list of device locations"""
>>       global devices
>>   
>> -    dev_list = map(dev_id_from_dev_name, dev_list)
>> +    # a common user error is to forget to specify the driver the devices need to
>> +    # be bound to. check if the driver is a valid device, and if it is, show
>> +    # a meaningful error.
>> +    try:
>> +        dev_id_from_dev_name(driver)
>> +        # if we've made it this far, this means that the "driver" was a valid
>> +        # device string, so it's probably not a valid driver name.
>> +        print("ERROR: Driver '%s' does not look like a valid driver. "
>> +              "Did you forget to specify the driver to bind devices to?" %
>> +              driver)
>> +        sys.exit(1)
>> +    except ValueError:
>> +        # driver generated error - it's not a valid device ID, so all is well
>> +        pass
>> +
>> +    try:
>> +        dev_list = map(dev_id_from_dev_name, dev_list)
>> +    except ValueError as ex:
>> +        print(ex)
>> +        sys.exit(1)
>>   
>>       for d in dev_list:
>>           bind_one(d, driver, force)
> 
> It would be better print error messages to stderr.
> If you call sys.exit() with a string it will do that.
> 

Will fix in v2.
  

Patch

diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py
index 542ecffcc..f7c4c6434 100755
--- a/usertools/dpdk-devbind.py
+++ b/usertools/dpdk-devbind.py
@@ -342,9 +342,8 @@  def dev_id_from_dev_name(dev_name):
             if dev_name in devices[d]["Interface"].split(","):
                 return devices[d]["Slot"]
     # if nothing else matches - error
-    print("Unknown device: %s. "
-          "Please specify device in \"bus:slot.func\" format" % dev_name)
-    sys.exit(1)
+    raise ValueError("Unknown device: %s. "
+	    "Please specify device in \"bus:slot.func\" format" % dev_name)
 
 
 def unbind_one(dev_id, force):
@@ -493,7 +492,12 @@  def unbind_all(dev_list, force=False):
                     unbind_one(devices[d]["Slot"], force)
         return
 
-    dev_list = map(dev_id_from_dev_name, dev_list)
+    try:
+        dev_list = map(dev_id_from_dev_name, dev_list)
+    except ValueError as ex:
+        print(ex)
+        sys.exit(1)
+
     for d in dev_list:
         unbind_one(d, force)
 
@@ -502,7 +506,26 @@  def bind_all(dev_list, driver, force=False):
     """Bind method, takes a list of device locations"""
     global devices
 
-    dev_list = map(dev_id_from_dev_name, dev_list)
+    # a common user error is to forget to specify the driver the devices need to
+    # be bound to. check if the driver is a valid device, and if it is, show
+    # a meaningful error.
+    try:
+        dev_id_from_dev_name(driver)
+        # if we've made it this far, this means that the "driver" was a valid
+        # device string, so it's probably not a valid driver name.
+        print("ERROR: Driver '%s' does not look like a valid driver. "
+              "Did you forget to specify the driver to bind devices to?" %
+              driver)
+        sys.exit(1)
+    except ValueError:
+        # driver generated error - it's not a valid device ID, so all is well
+        pass
+
+    try:
+        dev_list = map(dev_id_from_dev_name, dev_list)
+    except ValueError as ex:
+        print(ex)
+        sys.exit(1)
 
     for d in dev_list:
         bind_one(d, driver, force)