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

Jianbo Liu jianbo.liu at linaro.org
Thu Nov 10 03:24:29 CET 2016


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.

>  }
>
>  /* 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
>


More information about the dev mailing list