From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 18D705690 for ; Fri, 13 Mar 2015 16:03:58 +0100 (CET) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 13 Mar 2015 08:03:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.11,395,1422950400"; d="scan'208";a="698318159" Received: from irsmsx109.ger.corp.intel.com ([163.33.3.23]) by orsmga002.jf.intel.com with ESMTP; 13 Mar 2015 08:03:12 -0700 Received: from irsmsx108.ger.corp.intel.com ([169.254.11.218]) by IRSMSX109.ger.corp.intel.com ([169.254.13.103]) with mapi id 14.03.0195.001; Fri, 13 Mar 2015 15:03:10 +0000 From: "Iremonger, Bernard" To: Tetsuya Mukawa , "dev@dpdk.org" Thread-Topic: [PATCH v2 11/15] eal: Consolidate rte_eal_pci_probe/close_one_driver() of linuxapp and bsdapp Thread-Index: AQHQXK3xsrabYFB36021MsdF5wUYeJ0ag26g Date: Fri, 13 Mar 2015 15:03:10 +0000 Message-ID: <8CEF83825BEC744B83065625E567D7C2049F29EB@IRSMSX108.ger.corp.intel.com> References: <1425438703-18895-1-git-send-email-mukawa@igel.co.jp> <1426155474-1596-1-git-send-email-mukawa@igel.co.jp> <1426155474-1596-12-git-send-email-mukawa@igel.co.jp> In-Reply-To: <1426155474-1596-12-git-send-email-mukawa@igel.co.jp> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.182] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v2 11/15] eal: Consolidate rte_eal_pci_probe/close_one_driver() of linuxapp and bsdapp X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Mar 2015 15:04:00 -0000 > -----Original Message----- > From: Tetsuya Mukawa [mailto:mukawa@igel.co.jp] > Sent: Thursday, March 12, 2015 10:18 AM > To: dev@dpdk.org > Cc: Iremonger, Bernard; Richardson, Bruce; Tetsuya Mukawa > Subject: [PATCH v2 11/15] eal: Consolidate rte_eal_pci_probe/close_one_dr= iver() of linuxapp and > bsdapp >=20 > This patch consolidates below functions, and implements these in common e= al code. > - rte_eal_pci_probe_one_driver() > - rte_eal_pci_close_one_driver() >=20 > Because pci_map_device() is only implemented in linuxapp, the patch imple= ments it in bsdapp too. > This implemented function will be merged to linuxapp one with later patch= . >=20 > Signed-off-by: Tetsuya Mukawa > --- > lib/librte_eal/bsdapp/eal/eal_pci.c | 79 ++--------------- > lib/librte_eal/common/eal_common_pci.c | 138 +++++++++++++++++++++++++++= ++ > lib/librte_eal/common/eal_private.h | 21 ++--- > lib/librte_eal/linuxapp/eal/eal_pci.c | 153 ++-------------------------= ------ > 4 files changed, 162 insertions(+), 229 deletions(-) >=20 > diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/= eal/eal_pci.c > index 67ad88f..3778763 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_pci.c > +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c > @@ -88,7 +88,7 @@ static struct rte_tailq_elem rte_uio_tailq =3D { > EAL_REGISTER_TAILQ(rte_uio_tailq) >=20 > /* unbind kernel driver for this device */ -static int > +int > pci_unbind_kernel_driver(struct rte_pci_device *dev __rte_unused) { > RTE_LOG(ERR, EAL, "RTE_PCI_DRV_FORCE_UNBIND flag is not implemented " > @@ -429,6 +429,13 @@ skipdev: > return 0; > } >=20 > +/* Map pci device */ > +int > +pci_map_device(struct rte_pci_device *dev) { > + return pci_uio_map_resource(dev); > +} > + > /* > * Scan the content of the PCI bus, and add the devices in the devices > * list. Call pci_scan_one() for each pci entry found. > @@ -479,76 +486,6 @@ error: > return -1; > } >=20 > -/* > - * If vendor/device ID match, call the devinit() function of the > - * driver. > - */ > -int > -rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_d= evice *dev) -{ > - struct rte_pci_id *id_table; > - int ret; > - > - for (id_table =3D dr->id_table ; id_table->vendor_id !=3D 0; id_table++= ) { > - > - /* check if device's identifiers match the driver's ones */ > - if (id_table->vendor_id !=3D dev->id.vendor_id && > - id_table->vendor_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->device_id !=3D dev->id.device_id && > - id_table->device_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->subsystem_vendor_id !=3D > - dev->id.subsystem_vendor_id && > - id_table->subsystem_vendor_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->subsystem_device_id !=3D > - dev->id.subsystem_device_id && > - id_table->subsystem_device_id !=3D PCI_ANY_ID) > - continue; > - > - struct rte_pci_addr *loc =3D &dev->addr; > - > - RTE_LOG(DEBUG, EAL, > - "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", > - loc->domain, loc->bus, loc->devid, loc->function, > - dev->numa_node); > - > - RTE_LOG(DEBUG, EAL, > - " probe driver: %x:%x %s\n", dev->id.vendor_id, > - dev->id.device_id, dr->name); > - > - /* no initialization when blacklisted, return without error */ > - if (dev->devargs !=3D NULL && > - dev->devargs->type =3D=3D RTE_DEVTYPE_BLACKLISTED_PCI) { > - > - RTE_LOG(DEBUG, EAL, > - " Device is blacklisted, not initializing\n"); > - return 0; > - } > - > - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { > - /* map resources for devices that use igb_uio */ > - ret =3D pci_uio_map_resource(dev); > - if (ret !=3D 0) > - return ret; > - } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND && > - rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { > - /* unbind current driver */ > - if (pci_unbind_kernel_driver(dev) < 0) > - return -1; > - } > - > - /* reference driver structure */ > - dev->driver =3D dr; > - > - /* call the driver devinit() function */ > - return dr->devinit(dr, dev); > - } > - /* return positive value if driver is not found */ > - return 1; > -} > - > /* Init the PCI EAL subsystem */ > int > rte_eal_pci_init(void) > diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/comm= on/eal_common_pci.c > index 808b87b..538b2d9 100644 > --- a/lib/librte_eal/common/eal_common_pci.c > +++ b/lib/librte_eal/common/eal_common_pci.c > @@ -99,6 +99,144 @@ static struct rte_devargs *pci_devargs_lookup(struct = rte_pci_device *dev) } >=20 > /* > + * If vendor/device ID match, call the devinit() function of the > + * driver. > + */ > +static int > +rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, > + struct rte_pci_device *dev) > +{ > + int ret; > + struct rte_pci_id *id_table; > + > + for (id_table =3D dr->id_table ; id_table->vendor_id !=3D 0; id_table++= ) { > + > + /* check if device's identifiers match the driver's ones */ > + if (id_table->vendor_id !=3D dev->id.vendor_id && > + id_table->vendor_id !=3D PCI_ANY_ID) > + continue; > + if (id_table->device_id !=3D dev->id.device_id && > + id_table->device_id !=3D PCI_ANY_ID) > + continue; > + if (id_table->subsystem_vendor_id !=3D > + dev->id.subsystem_vendor_id && > + id_table->subsystem_vendor_id !=3D PCI_ANY_ID) > + continue; > + if (id_table->subsystem_device_id !=3D > + dev->id.subsystem_device_id && > + id_table->subsystem_device_id !=3D PCI_ANY_ID) > + continue; > + > + struct rte_pci_addr *loc =3D &dev->addr; > + > + RTE_LOG(DEBUG, EAL, > + "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", > + loc->domain, loc->bus, loc->devid, loc->function, > + dev->numa_node); > + > + RTE_LOG(DEBUG, EAL, > + " probe driver: %x:%x %s\n", dev->id.vendor_id, > + dev->id.device_id, dr->name); > + > + /* no initialization when blacklisted, return without error */ > + if (dev->devargs !=3D NULL && > + dev->devargs->type =3D=3D RTE_DEVTYPE_BLACKLISTED_PCI) { > + RTE_LOG(DEBUG, EAL, > + " Device is blacklisted, not initializing\n"); > + return 1; > + } > + > + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { #ifdef RTE_PCI_CONFIG > + /* > + * Set PCIe config space for high performance. > + * Return value can be ignored. > + */ > + pci_config_space_set(dev); > +#endif > + /* map resources for devices that use igb_uio */ > + ret =3D pci_map_device(dev); > + if (ret !=3D 0) > + return ret; > + } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND && > + rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { > + /* unbind current driver */ > + if (pci_unbind_kernel_driver(dev) < 0) > + return -1; > + } > + > + /* reference driver structure */ > + dev->driver =3D dr; > + > + /* call the driver devinit() function */ > + return dr->devinit(dr, dev); > + } > + /* return positive value if driver is not found */ > + return 1; > +} > + > +#ifdef RTE_LIBRTE_EAL_HOTPLUG Hi Tetsuya, Can #ifdef RTE_LIBRTE_EAL_HOTPLUG be removed now as file is common ? Regards, Bernard. > +/* > + * If vendor/device ID match, call the devuninit() function of the > + * driver. > + */ > +static int > +rte_eal_pci_close_one_driver(struct rte_pci_driver *dr, > + struct rte_pci_device *dev) > +{ > + struct rte_pci_id *id_table; > + > + if ((dr =3D=3D NULL) || (dev =3D=3D NULL)) > + return -EINVAL; > + > + for (id_table =3D dr->id_table ; id_table->vendor_id !=3D 0; id_table++= ) { > + > + /* check if device's identifiers match the driver's ones */ > + if (id_table->vendor_id !=3D dev->id.vendor_id && > + id_table->vendor_id !=3D PCI_ANY_ID) > + continue; > + if (id_table->device_id !=3D dev->id.device_id && > + id_table->device_id !=3D PCI_ANY_ID) > + continue; > + if (id_table->subsystem_vendor_id !=3D > + dev->id.subsystem_vendor_id && > + id_table->subsystem_vendor_id !=3D PCI_ANY_ID) > + continue; > + if (id_table->subsystem_device_id !=3D > + dev->id.subsystem_device_id && > + id_table->subsystem_device_id !=3D PCI_ANY_ID) > + continue; > + > + struct rte_pci_addr *loc =3D &dev->addr; > + > + RTE_LOG(DEBUG, EAL, > + "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", > + loc->domain, loc->bus, loc->devid, > + loc->function, dev->numa_node); > + > + RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", > + dev->id.vendor_id, dev->id.device_id, > + dr->name); > + > + /* call the driver devuninit() function */ > + if (dr->devuninit && (dr->devuninit(dev) < 0)) > + return -1; /* negative value is an error */ > + > + /* clear driver structure */ > + dev->driver =3D NULL; > + > + if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) > + /* unmap resources for devices that use igb_uio */ > + pci_unmap_device(dev); > + > + return 0; > + } > + /* return positive value if driver is not found */ > + return 1; > +} > +#endif /* RTE_LIBRTE_EAL_HOTPLUG */ Hi Tetsuya, Can the #endif be removed too? Regards, Bernard. =20 > + > +/* > * If vendor/device ID match, call the devinit() function of all > * registered driver for the given device. Return -1 if initialization > * failed, return 1 if no driver is found for this device. > diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/= eal_private.h > index 4acf5a0..fe2c596 100644 > --- a/lib/librte_eal/common/eal_private.h > +++ b/lib/librte_eal/common/eal_private.h > @@ -154,30 +154,31 @@ struct rte_pci_driver; struct rte_pci_device; >=20 > /** > - * Mmap memory for single PCI device > + * Unbind kernel driver for this device > * > * This function is private to EAL. > * > * @return > * 0 on success, negative on error > */ > -int rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, > - struct rte_pci_device *dev); > +int pci_unbind_kernel_driver(struct rte_pci_device *dev); >=20 > /** > - * Munmap memory for single PCI device > + * Map this device > * > * This function is private to EAL. > * > - * @param dr > - * The pointer to the pci driver structure > - * @param dev > - * The pointer to the pci device structure > * @return > * 0 on success, negative on error > */ > -int rte_eal_pci_close_one_driver(struct rte_pci_driver *dr, > - struct rte_pci_device *dev); > +int pci_map_device(struct rte_pci_device *dev); > + > +/** > + * Unmap this device > + * > + * This function is private to EAL. > + */ > +void pci_unmap_device(struct rte_pci_device *dev); >=20 > /** > * Init tail queues for non-EAL library structures. This is to allow dif= f --git > a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal= _pci.c > index 353b0b8..dbc2548 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c > @@ -57,7 +57,7 @@ > */ >=20 > /* unbind kernel driver for this device */ -static int > +int > pci_unbind_kernel_driver(struct rte_pci_device *dev) { > int n; > @@ -565,7 +565,8 @@ pci_config_space_set(struct rte_pci_device *dev) } = #endif >=20 > -static int > +/* Map pci device */ > +int > pci_map_device(struct rte_pci_device *dev) { > int ret =3D -1; > @@ -594,7 +595,8 @@ pci_map_device(struct rte_pci_device *dev) } >=20 > #ifdef RTE_LIBRTE_EAL_HOTPLUG > -static void > +/* Unmap pci device */ > +void > pci_unmap_device(struct rte_pci_device *dev) { > if (dev =3D=3D NULL) > @@ -618,151 +620,6 @@ pci_unmap_device(struct rte_pci_device *dev) } #e= ndif /* > RTE_LIBRTE_EAL_HOTPLUG */ >=20 > -/* > - * If vendor/device ID match, call the devinit() function of the > - * driver. > - */ > -int > -rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct rte_pci_d= evice *dev) -{ > - int ret; > - struct rte_pci_id *id_table; > - > - for (id_table =3D dr->id_table ; id_table->vendor_id !=3D 0; id_table++= ) { > - > - /* check if device's identifiers match the driver's ones */ > - if (id_table->vendor_id !=3D dev->id.vendor_id && > - id_table->vendor_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->device_id !=3D dev->id.device_id && > - id_table->device_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->subsystem_vendor_id !=3D > - dev->id.subsystem_vendor_id && > - id_table->subsystem_vendor_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->subsystem_device_id !=3D > - dev->id.subsystem_device_id && > - id_table->subsystem_device_id !=3D PCI_ANY_ID) > - continue; > - > - struct rte_pci_addr *loc =3D &dev->addr; > - > - RTE_LOG(DEBUG, EAL, > - "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", > - loc->domain, loc->bus, loc->devid, loc->function, > - dev->numa_node); > - > - RTE_LOG(DEBUG, EAL, > - " probe driver: %x:%x %s\n", dev->id.vendor_id, > - dev->id.device_id, dr->name); > - > - /* no initialization when blacklisted, return without error */ > - if (dev->devargs !=3D NULL && > - dev->devargs->type =3D=3D RTE_DEVTYPE_BLACKLISTED_PCI) { > - RTE_LOG(DEBUG, EAL, > - " Device is blacklisted, not initializing\n"); > - return 1; > - } > - > - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { > -#ifdef RTE_PCI_CONFIG > - /* > - * Set PCIe config space for high performance. > - * Return value can be ignored. > - */ > - pci_config_space_set(dev); > -#endif > - /* map resources for devices that use igb_uio */ > - ret =3D pci_map_device(dev); > - if (ret !=3D 0) > - return ret; > - } else if (dr->drv_flags & RTE_PCI_DRV_FORCE_UNBIND && > - rte_eal_process_type() =3D=3D RTE_PROC_PRIMARY) { > - /* unbind current driver */ > - if (pci_unbind_kernel_driver(dev) < 0) > - return -1; > - } > - > - /* reference driver structure */ > - dev->driver =3D dr; > - > - /* call the driver devinit() function */ > - return dr->devinit(dr, dev); > - } > - /* return positive value if driver is not found */ > - return 1; > -} > - > -#ifdef RTE_LIBRTE_EAL_HOTPLUG > -/* > - * If vendor/device ID match, call the devuninit() function of the > - * driver. > - */ > -int > -rte_eal_pci_close_one_driver(struct rte_pci_driver *dr, > - struct rte_pci_device *dev) > -{ > - struct rte_pci_id *id_table; > - > - if ((dr =3D=3D NULL) || (dev =3D=3D NULL)) > - return -EINVAL; > - > - for (id_table =3D dr->id_table ; id_table->vendor_id !=3D 0; id_table++= ) { > - > - /* check if device's identifiers match the driver's ones */ > - if (id_table->vendor_id !=3D dev->id.vendor_id && > - id_table->vendor_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->device_id !=3D dev->id.device_id && > - id_table->device_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->subsystem_vendor_id !=3D > - dev->id.subsystem_vendor_id && > - id_table->subsystem_vendor_id !=3D PCI_ANY_ID) > - continue; > - if (id_table->subsystem_device_id !=3D > - dev->id.subsystem_device_id && > - id_table->subsystem_device_id !=3D PCI_ANY_ID) > - continue; > - > - struct rte_pci_addr *loc =3D &dev->addr; > - > - RTE_LOG(DEBUG, EAL, > - "PCI device "PCI_PRI_FMT" on NUMA socket %i\n", > - loc->domain, loc->bus, loc->devid, > - loc->function, dev->numa_node); > - > - RTE_LOG(DEBUG, EAL, " remove driver: %x:%x %s\n", > - dev->id.vendor_id, dev->id.device_id, > - dr->name); > - > - /* call the driver devuninit() function */ > - if (dr->devuninit && (dr->devuninit(dev) < 0)) > - return -1; /* negative value is an error */ > - > - /* clear driver structure */ > - dev->driver =3D NULL; > - > - if (dr->drv_flags & RTE_PCI_DRV_NEED_MAPPING) > - /* unmap resources for devices that use igb_uio */ > - pci_unmap_device(dev); > - > - return 0; > - } > - /* return positive value if driver is not found */ > - return 1; > -} > -#else /* RTE_LIBRTE_EAL_HOTPLUG */ > -int > -rte_eal_pci_close_one_driver(struct rte_pci_driver *dr __rte_unused, > - struct rte_pci_device *dev __rte_unused) > -{ > - RTE_LOG(ERR, EAL, "Hotplug support isn't enabled\n"); > - return -1; > -} > -#endif /* RTE_LIBRTE_EAL_HOTPLUG */ > - > /* Init the PCI EAL subsystem */ > int > rte_eal_pci_init(void) > -- > 1.9.1