[dpdk-dev] [PATCH v7 03/21] eal/linux: generalize PCI kernel unbinding driver to EAL

Shreyansh Jain shreyansh.jain at nxp.com
Thu Nov 10 06:46:40 CET 2016


Hello Jianbo,

Thanks a lot for your time in commenting this. My comments inline (as 
well as on other similar mails).

On Thursday 10 November 2016 07:54 AM, Jianbo Liu wrote:
> On 28 October 2016 at 20:26, Shreyansh Jain <shreyansh.jain at nxp.com> wrote:
>> From: Jan Viktorin <viktorin at rehivetech.com>
>>
>> Generalize the PCI-specific pci_unbind_kernel_driver. It is now divided
>> into two parts. First, determination of the path and string identification
>> of the device to be unbound. Second, the actual unbind operation which is
>> generic.
>>
>> BSD implementation updated as ENOTSUP
>>
>> Signed-off-by: Jan Viktorin <viktorin at rehivetech.com>
>> Signed-off-by: Shreyansh Jain <shreyansh.jain at nxp.com>
>> --
>> Changes since v2:
>>  - update BSD support for unbind kernel driver
>> ---
>>  lib/librte_eal/bsdapp/eal/eal.c       |  7 +++++++
>>  lib/librte_eal/bsdapp/eal/eal_pci.c   |  4 ++--
>>  lib/librte_eal/common/eal_private.h   | 13 +++++++++++++
>>  lib/librte_eal/linuxapp/eal/eal.c     | 26 ++++++++++++++++++++++++++
>>  lib/librte_eal/linuxapp/eal/eal_pci.c | 33 +++++++++------------------------
>>  5 files changed, 57 insertions(+), 26 deletions(-)
>>
>> diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c
>> index 35e3117..5271fc2 100644
>> --- a/lib/librte_eal/bsdapp/eal/eal.c
>> +++ b/lib/librte_eal/bsdapp/eal/eal.c
>> @@ -633,3 +633,10 @@ rte_eal_process_type(void)
>>  {
>>         return rte_config.process_type;
>>  }
>> +
>> +int
>> +rte_eal_unbind_kernel_driver(const char *devpath __rte_unused,
>> +                            const char *devid __rte_unused)
>> +{
>> +       return -ENOTSUP;
>> +}
>> diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c
>> index 7ed0115..703f034 100644
>> --- a/lib/librte_eal/bsdapp/eal/eal_pci.c
>> +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c
>> @@ -89,11 +89,11 @@
>>
>>  /* unbind kernel driver for this device */
>>  int
>> -pci_unbind_kernel_driver(struct rte_pci_device *dev __rte_unused)
>> +pci_unbind_kernel_driver(struct rte_pci_device *dev)
>>  {
>>         RTE_LOG(ERR, EAL, "RTE_PCI_DRV_FORCE_UNBIND flag is not implemented "
>>                 "for BSD\n");
>> -       return -ENOTSUP;
>> +       return rte_eal_unbind_kernel_driver(dev);
>
> Missing the second parameter for devid.

Indeed. I will fix this.
Being BSD, I didn't compile test this part. I will have to find a way to 
fix this in my sanity before sending next series.

>
>>  }
>>
>>  /* Map pci device */
>> diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h
>> index 9e7d8f6..b0c208a 100644
>> --- a/lib/librte_eal/common/eal_private.h
>> +++ b/lib/librte_eal/common/eal_private.h
>> @@ -256,6 +256,19 @@ int rte_eal_alarm_init(void);
>>  int rte_eal_check_module(const char *module_name);
>>
>>  /**
>> + * Unbind kernel driver bound to the device specified by the given devpath,
>> + * and its string identification.
>> + *
>> + * @param devpath  path to the device directory ("/sys/.../devices/<name>")
>> + * @param devid    identification of the device (<name>)
>> + *
>> + * @return
>> + *      -1  unbind has failed
>> + *       0  module has been unbound
>> + */
>> +int rte_eal_unbind_kernel_driver(const char *devpath, const char *devid);
>> +
>> +/**
>>   * Get cpu core_id.
>>   *
>>   * This function is private to the EAL.
>> diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
>> index 2075282..5f6676d 100644
>> --- a/lib/librte_eal/linuxapp/eal/eal.c
>> +++ b/lib/librte_eal/linuxapp/eal/eal.c
>> @@ -943,3 +943,29 @@ rte_eal_check_module(const char *module_name)
>>         /* Module has been found */
>>         return 1;
>>  }
>> +
>> +int
>> +rte_eal_unbind_kernel_driver(const char *devpath, const char *devid)
>> +{
>> +       char filename[PATH_MAX];
>> +       FILE *f;
>> +
>> +       snprintf(filename, sizeof(filename),
>> +                "%s/driver/unbind", devpath);
>> +
>> +       f = fopen(filename, "w");
>> +       if (f == NULL) /* device was not bound */
>> +               return 0;
>> +
>> +       if (fwrite(devid, strlen(devid), 1, f) == 0) {
>> +               RTE_LOG(ERR, EAL, "%s(): could not write to %s\n", __func__,
>> +                               filename);
>> +               goto error;
>> +       }
>> +
>> +       fclose(f);
>> +       return 0;
>> +error:
>> +       fclose(f);
>> +       return -1;
>> +}
>> diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
>> index 876ba38..a03553f 100644
>> --- a/lib/librte_eal/linuxapp/eal/eal_pci.c
>> +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
>> @@ -59,38 +59,23 @@ int
>>  pci_unbind_kernel_driver(struct rte_pci_device *dev)
>>  {
>>         int n;
>> -       FILE *f;
>> -       char filename[PATH_MAX];
>> -       char buf[BUFSIZ];
>> +       char devpath[PATH_MAX];
>> +       char devid[BUFSIZ];
>>         struct rte_pci_addr *loc = &dev->addr;
>>
>> -       /* open /sys/bus/pci/devices/AAAA:BB:CC.D/driver */
>> -       snprintf(filename, sizeof(filename),
>> -               "%s/" PCI_PRI_FMT "/driver/unbind", pci_get_sysfs_path(),
>> +       /* devpath /sys/bus/pci/devices/AAAA:BB:CC.D */
>> +       snprintf(devpath, sizeof(devpath),
>> +               "%s/" PCI_PRI_FMT, pci_get_sysfs_path(),
>>                 loc->domain, loc->bus, loc->devid, loc->function);
>>
>> -       f = fopen(filename, "w");
>> -       if (f == NULL) /* device was not bound */
>> -               return 0;
>> -
>> -       n = snprintf(buf, sizeof(buf), PCI_PRI_FMT "\n",
>> +       n = snprintf(devid, sizeof(devid), PCI_PRI_FMT "\n",
>>                      loc->domain, loc->bus, loc->devid, loc->function);
>> -       if ((n < 0) || (n >= (int)sizeof(buf))) {
>> +       if ((n < 0) || (n >= (int)sizeof(devid))) {
>>                 RTE_LOG(ERR, EAL, "%s(): snprintf failed\n", __func__);
>> -               goto error;
>> -       }
>> -       if (fwrite(buf, n, 1, f) == 0) {
>> -               RTE_LOG(ERR, EAL, "%s(): could not write to %s\n", __func__,
>> -                               filename);
>> -               goto error;
>> +               return -1;
>>         }
>>
>> -       fclose(f);
>> -       return 0;
>> -
>> -error:
>> -       fclose(f);
>> -       return -1;
>> +       return rte_eal_unbind_kernel_driver(devpath, devid);
>>  }
>>
>>  static int
>> --
>> 2.7.4
>>
>

-
Shreyansh


More information about the dev mailing list