From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id A377DA0526; Wed, 8 Jul 2020 16:11:38 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 846721DF90; Wed, 8 Jul 2020 16:11:38 +0200 (CEST) Received: from mail-io1-f68.google.com (mail-io1-f68.google.com [209.85.166.68]) by dpdk.org (Postfix) with ESMTP id 6D4811DB08 for ; Wed, 8 Jul 2020 16:11:37 +0200 (CEST) Received: by mail-io1-f68.google.com with SMTP id q74so23560995iod.1 for ; Wed, 08 Jul 2020 07:11:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=emumba-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=t1wRYBVuCVz0N2L6bOD6n4ucwUQA+JlIQj8guXGAhuQ=; b=Y8U8AnT/BN10Dx9pOwKYgJpPzjCNVnep3y4QOW/XC5r341vFKV2vJEA7uXsF+b1Ism tJ7m8J8s55mHS9fRHpJrmGQH0xquOEBwkLE9hVDTsD9tIJfQCoh5Ei3gFzCtmEOd2psN a6ZSazyabNy5ewkxtarCXegnkBqNCA6waAqGi2xuknVONXDp/2X4GkIGf8qKwz28n1PS pTtwSNzLIISL+tI0ncrsxEwbbBE5NMQ121H+z03k8UPA1lDGJ0zBLNym5mdkZIoWxl9U T/ZcqiVBQ68PxYm1lR6T764C1haRX+lfidrbFNpMnksOEpyAW101BYii+MxROJ8gTxJo jvIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=t1wRYBVuCVz0N2L6bOD6n4ucwUQA+JlIQj8guXGAhuQ=; b=oSubDvt6RDyXKYvRYvQg8aEGNa9JyPx29drVxh4n/eBLr2hEEmiMvPZlskFyZqiuFO +ZkJIlJij/G4BT3RQg/5G+6mqsXrrMjrfYU0j9xsNSj1+DsQatquiV2dt/OxiNsIy6MP HzjugGFJ5hO9Om3AVmxc6DKA9lZm/39J/9+KAIuQ5VTX0fs3nUBR39EEUI9oRJ3uAfb2 CnIMux5/YH7owGmbqkP6JmK2w7i3kXp6/5ZxDpRUx7MSzHatNJcd4CtrF3moKekB344+ Fm2RiqPkUFU1i0dYhU6aNx/cDf6HQpfknvxp8LpLiuCs5CI73XerYL81QhtW0qpI45rE U59g== X-Gm-Message-State: AOAM530kJFdZzqa09wKxrCSW+36meO2sGksXhKEc83kzl6tE52tZO/ND k8Si06H5OxYRZ15gEvI6yRaBeYHpnrRfaKRE5rNzxw== X-Google-Smtp-Source: ABdhPJz6aPauhTQGhzxu6Rh4mKZtO4YC+UTwFzqWKvByluzoAyd9YS7VLMlKthiW57je0j38VDVLVLWQGCxIv6afet4= X-Received: by 2002:a05:6602:134d:: with SMTP id i13mr38207243iov.113.1594217496640; Wed, 08 Jul 2020 07:11:36 -0700 (PDT) MIME-Version: 1.0 References: <20200708120329.103200-1-m.bilal@emumba.com> In-Reply-To: <20200708120329.103200-1-m.bilal@emumba.com> From: Muhammad Bilal Date: Wed, 8 Jul 2020 19:11:25 +0500 Message-ID: To: ferruh.yigit@intel.com, anatoly.burakov@intel.com Cc: vipin.varghese@intel.com, jgrajcia@cisco.com, jerinj@marvell.com, dev@dpdk.org, stable@dpdk.org Content-Type: text/plain; charset="UTF-8" Subject: Re: [dpdk-dev] [PATCH] EAL: Called remove() of drivers for vdev and pci buses X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Wed, Jul 8, 2020 at 5:04 PM Muhammad Bilal wrote: > > while using memif with app, the resources are not cleaned on exit, > So an error occurred on running it second time. The cause of this problem > is that remove() of memif driver is not called by rte_eal_cleanup() which > is counterpart of probe() called from rte_eal_init(). This is a case for > all other divers e.g pci, so to solve this problem I have added the > functionality of calling remove() function of all the driver attached to > devices on vdev and pci buses. > Little correction Bugzilla ID: 437 > Bugzilla ID: 353 > Signed-off-by: Muhammad Bilal > --- > drivers/bus/pci/pci_common.c | 23 +++++++++++++++++++++++ > drivers/bus/vdev/vdev.c | 19 ++++++++++++++++++- > lib/librte_eal/common/eal_common_bus.c | 18 ++++++++++++++++++ > lib/librte_eal/include/rte_bus.h | 23 +++++++++++++++++++++++ > lib/librte_eal/linux/eal.c | 2 ++ > 5 files changed, 84 insertions(+), 1 deletion(-) > > diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c > index 245d94f59..203b32a23 100644 > --- a/drivers/bus/pci/pci_common.c > +++ b/drivers/bus/pci/pci_common.c > @@ -320,6 +320,28 @@ pci_probe(void) > return (probed && probed == failed) ? -1 : 0; > } > > +/* > + * Scan the content of the PCI bus, and call the remove() function for > + * all registered drivers of devices that have already been probed. > + */ > +static int > +pci_remove(void) > +{ > + struct rte_pci_device *dev = NULL; > + int ret = 0; > + > + FOREACH_DEVICE_ON_PCIBUS(dev) { > + if (rte_dev_is_probed(&dev->device)) > + if (rte_pci_detach_dev(dev) != 0) { > + RTE_LOG(INFO, EAL, > + "failed to detach driver form %s\n", > + dev->device.name); > + ret = -1; > + } > + } > + return ret; > +} > + > /* dump one device */ > static int > pci_dump_one_device(FILE *f, struct rte_pci_device *dev) > @@ -669,6 +691,7 @@ struct rte_pci_bus rte_pci_bus = { > .bus = { > .scan = rte_pci_scan, > .probe = pci_probe, > + .remove = pci_remove, > .find_device = pci_find_device, > .plug = pci_plug, > .unplug = pci_unplug, > diff --git a/drivers/bus/vdev/vdev.c b/drivers/bus/vdev/vdev.c > index a89ea2353..692c936b9 100644 > --- a/drivers/bus/vdev/vdev.c > +++ b/drivers/bus/vdev/vdev.c > @@ -546,6 +546,22 @@ vdev_unplug(struct rte_device *dev) > return rte_vdev_uninit(dev->name); > } > > +static int > +vdev_remove(void) > +{ > + struct rte_vdev_device *dev; > + int ret = 0; > + > + TAILQ_FOREACH(dev, &vdev_device_list, next) { > + if (vdev_remove_driver(dev) != 0) { > + VDEV_LOG(INFO, "driver of %s is not removed\n", > + dev->device.name); > + ret = -1; > + } > + } > + return ret; > +} > + > static struct rte_bus rte_vdev_bus = { > .scan = vdev_scan, > .probe = vdev_probe, > @@ -554,7 +570,8 @@ static struct rte_bus rte_vdev_bus = { > .unplug = vdev_unplug, > .parse = vdev_parse, > .dev_iterate = rte_vdev_dev_iterate, > -}; > + .remove = vdev_remove, > + }; > > RTE_REGISTER_BUS(vdev, rte_vdev_bus); > > diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c > index baa5b532a..bff95a0ae 100644 > --- a/lib/librte_eal/common/eal_common_bus.c > +++ b/lib/librte_eal/common/eal_common_bus.c > @@ -85,6 +85,24 @@ rte_bus_probe(void) > return 0; > } > > +/* Remove all devices of all buses */ > +int > +rte_bus_remove(void) > +{ > + int ret; > + struct rte_bus *bus; > + > + TAILQ_FOREACH(bus, &rte_bus_list, next) { > + if (!strcmp(bus->name, "vdev") || !strcmp(bus->name, "pci")) { > + ret = bus->remove(); > + if (ret) > + RTE_LOG(INFO, EAL, "Bus (%s) remove failed.\n", > + bus->name); > + } > + } > + return 0; > +} > + > /* Dump information of a single bus */ > static int > bus_dump_one(FILE *f, struct rte_bus *bus) > diff --git a/lib/librte_eal/include/rte_bus.h b/lib/librte_eal/include/rte_bus.h > index d3034d0ed..c3e7e62c9 100644 > --- a/lib/librte_eal/include/rte_bus.h > +++ b/lib/librte_eal/include/rte_bus.h > @@ -67,6 +67,18 @@ typedef int (*rte_bus_scan_t)(void); > */ > typedef int (*rte_bus_probe_t)(void); > > +/** > + * Implementation specific remove function which is responsible for unlinking > + * devices on that bus from attached drivers. > + * > + * This is called while iterating over each registered bus. > + * > + * @return > + * 0 for successful remove > + * !0 for any error while removing > + */ > +typedef int (*rte_bus_remove_t)(void); > + > /** > * Device iterator to find a device on a bus. > * > @@ -248,6 +260,7 @@ struct rte_bus { > const char *name; /**< Name of the bus */ > rte_bus_scan_t scan; /**< Scan for devices attached to bus */ > rte_bus_probe_t probe; /**< Probe devices on bus */ > + rte_bus_remove_t remove; /**< remove device on bus */ > rte_bus_find_device_t find_device; /**< Find a device on the bus */ > rte_bus_plug_t plug; /**< Probe single device for drivers */ > rte_bus_unplug_t unplug; /**< Remove single device from driver */ > @@ -301,6 +314,16 @@ int rte_bus_scan(void); > */ > int rte_bus_probe(void); > > +/** > + * For each device on the buses,call the driver-specific remove > + * for device uninitialization. > + * > + * @return > + * 0 for successful match/probe > + * !0 otherwise > + */ > +int rte_bus_remove(void); > + > /** > * Dump information of all the buses registered with EAL. > * > diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c > index f162124a3..89a03d3bb 100644 > --- a/lib/librte_eal/linux/eal.c > +++ b/lib/librte_eal/linux/eal.c > @@ -1330,6 +1330,8 @@ mark_freeable(const struct rte_memseg_list *msl, const struct rte_memseg *ms, > int > rte_eal_cleanup(void) > { > + /* Remove devices/drivers from all buses */ > + rte_bus_remove(); > /* if we're in a primary process, we need to mark hugepages as freeable > * so that finalization can release them back to the system. > */ > -- > 2.25.1 >