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