From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 1EAD85B34 for ; Fri, 14 Dec 2018 14:43:34 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 64A69308402B; Fri, 14 Dec 2018 13:43:33 +0000 (UTC) Received: from ktraynor.remote.csb (ovpn-116-106.ams2.redhat.com [10.36.116.106]) by smtp.corp.redhat.com (Postfix) with ESMTP id B9C0C1059597; Fri, 14 Dec 2018 13:43:32 +0000 (UTC) To: Darek Stojaczyk , stable@dpdk.org References: <20181127125817.134710-1-dariusz.stojaczyk@intel.com> From: Kevin Traynor Organization: Red Hat Message-ID: <7b36f74d-cff5-bee9-612d-3e3fbc0030e1@redhat.com> Date: Fri, 14 Dec 2018 13:43:31 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 In-Reply-To: <20181127125817.134710-1-dariusz.stojaczyk@intel.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Fri, 14 Dec 2018 13:43:33 +0000 (UTC) Subject: Re: [dpdk-stable] [PATCH 18.08] vfio: don't needlessly setup devices in secondary process X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Dec 2018 13:43:34 -0000 On 11/27/2018 12:58 PM, Darek Stojaczyk wrote: > Setting up a device that wasn't setup in the primary > process will possibly break the primary process. That's > because the IPC message to retrieve the group fd in the > primary will also *open* that group if it wasn't opened > before. Even though the secondary process closes that fd > soon after as a part of its error handling path, the > primary process leaks it. > > What's worse, opening that fd on the primary will > increment the process-local counter of opened groups. > If it was 0 before, then the group will never be added > to the vfio container, nor dpdk memory will be ever > mapped. > > This patch moves the proper error checks earlier in the > code to fuly prevent setting up devices in secondary > processes that weren't setup in the primary process. > > Fixes: 2f4adfad0a69 ("vfio: add multiprocess support") > Hi Dariusz, Thanks for indicating it should be backported. I had picked it directly from dpdk master also. https://git.dpdk.org/dpdk-stable/commit/?h=18.08&id=2de3da91ce9120561965583a962fd1fad3793916 Kevin. > Change-Id: I9ea4dfa7522fd6cf144f40db4492645c7e8c8a65 > Signed-off-by: Darek Stojaczyk > Acked-by: Anatoly Burakov > Reviewed-by: Maxime Coquelin > --- > drivers/bus/pci/linux/pci_vfio.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c > index 686386d6a..569953666 100644 > --- a/drivers/bus/pci/linux/pci_vfio.c > +++ b/drivers/bus/pci/linux/pci_vfio.c > @@ -551,11 +551,6 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev) > snprintf(pci_addr, sizeof(pci_addr), PCI_PRI_FMT, > loc->domain, loc->bus, loc->devid, loc->function); > > - ret = rte_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr, > - &vfio_dev_fd, &device_info); > - if (ret) > - return ret; > - > /* if we're in a secondary process, just find our tailq entry */ > TAILQ_FOREACH(vfio_res, vfio_res_list, next) { > if (rte_pci_addr_cmp(&vfio_res->pci_addr, > @@ -567,9 +562,14 @@ pci_vfio_map_resource_secondary(struct rte_pci_device *dev) > if (vfio_res == NULL) { > RTE_LOG(ERR, EAL, " %s cannot find TAILQ entry for PCI device!\n", > pci_addr); > - goto err_vfio_dev_fd; > + return -1; > } > > + ret = rte_vfio_setup_device(rte_pci_get_sysfs_path(), pci_addr, > + &vfio_dev_fd, &device_info); > + if (ret) > + return ret; > + > /* map BARs */ > maps = vfio_res->maps; > >