From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerin Jacob Subject: Re: [PATCH] vfio: use right index when tracking devices in a vfio group Date: Tue, 9 May 2017 09:34:48 +0530 Message-ID: <20170509040447.GA6207@jerin> References: <1494265458-35709-1-git-send-email-alejandro.lucero@netronome.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: dev@dpdk.org, anatoly.burakov@intel.com, thomas@monjalon.net To: Alejandro Lucero Return-path: Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0061.outbound.protection.outlook.com [104.47.36.61]) by dpdk.org (Postfix) with ESMTP id 4441E2C16 for ; Tue, 9 May 2017 06:05:07 +0200 (CEST) Content-Disposition: inline In-Reply-To: <1494265458-35709-1-git-send-email-alejandro.lucero@netronome.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" -----Original Message----- > Date: Mon, 8 May 2017 18:44:18 +0100 > From: Alejandro Lucero > To: dev@dpdk.org > CC: anatoly.burakov@intel.com, jerin.jacob@caviumnetworks.com, > thomas@monjalon.net > Subject: [PATCH] vfio: use right index when tracking devices in a vfio group > X-Mailer: git-send-email 1.9.1 > > Previous fix for properly handling devices from the same VFIO group > introduced another bug where the file descriptor of a kernel vfio > group is used as the index for tracking number of devices of a vfio > group struct handled by dpdk vfio code. Instead of the file > descriptor itself, the vfio group object that file descriptor is > registered with has to be used. > > This patch introduces specific functions for incrementing or > decrementing the device counter for a specific vfio group using the > vfio file descriptor as a parameter. Note the code is not optimized > as the vfio group is found sequentially going through the vfio group > array but this should not be a problem as this is not related to > packet handling at all. > > Fixes: a9c349e3a100 ("vfio: fix device unplug when several devices per group") > > Signed-off-by: Alejandro Lucero Tested-by: Jerin Jacob > --- > lib/librte_eal/linuxapp/eal/eal_vfio.c | 60 +++++++++++++++++++++++++++------- > 1 file changed, 49 insertions(+), 11 deletions(-) > > diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/librte_eal/linuxapp/eal/eal_vfio.c > index d3eae20..21d126f 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_vfio.c > +++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c > @@ -172,6 +172,44 @@ > return -1; > } > > + > +static int > +get_vfio_group_idx(int vfio_group_fd) > +{ > + int i; > + for (i = 0; i < VFIO_MAX_GROUPS; i++) > + if (vfio_cfg.vfio_groups[i].fd == vfio_group_fd) > + return i; > + return -1; > +} > + > +static void > +vfio_group_device_get(int vfio_group_fd) > +{ > + int i; > + > + i = get_vfio_group_idx(vfio_group_fd); > + vfio_cfg.vfio_groups[i].devices++; > +} > + > +static void > +vfio_group_device_put(int vfio_group_fd) > +{ > + int i; > + > + i = get_vfio_group_idx(vfio_group_fd); > + vfio_cfg.vfio_groups[i].devices--; > +} > + > +static int > +vfio_group_device_count(int vfio_group_fd) > +{ > + int i; > + > + i = get_vfio_group_idx(vfio_group_fd); > + return vfio_cfg.vfio_groups[i].devices; > +} > + > int > clear_group(int vfio_group_fd) > { > @@ -180,15 +218,14 @@ > > if (internal_config.process_type == RTE_PROC_PRIMARY) { > > - for (i = 0; i < VFIO_MAX_GROUPS; i++) > - if (vfio_cfg.vfio_groups[i].fd == vfio_group_fd) { > - vfio_cfg.vfio_groups[i].group_no = -1; > - vfio_cfg.vfio_groups[i].fd = -1; > - vfio_cfg.vfio_groups[i].devices = 0; > - vfio_cfg.vfio_active_groups--; > - return 0; > - } > - return -1; > + i = get_vfio_group_idx(vfio_group_fd); > + if ( i < 0) > + return -1; > + vfio_cfg.vfio_groups[i].group_no = -1; > + vfio_cfg.vfio_groups[i].fd = -1; > + vfio_cfg.vfio_groups[i].devices = 0; > + vfio_cfg.vfio_active_groups--; > + return 0; > } > > /* This is just for SECONDARY processes */ > @@ -358,7 +395,7 @@ > clear_group(vfio_group_fd); > return -1; > } > - vfio_cfg.vfio_groups[vfio_group_fd].devices++; > + vfio_group_device_get(vfio_group_fd); > > return 0; > } > @@ -406,7 +443,8 @@ > /* An VFIO group can have several devices attached. Just when there is > * no devices remaining should the group be closed. > */ > - if (--vfio_cfg.vfio_groups[vfio_group_fd].devices == 0) { > + vfio_group_device_put(vfio_group_fd); > + if (!vfio_group_device_count(vfio_group_fd)) { > > if (close(vfio_group_fd) < 0) { > RTE_LOG(INFO, EAL, "Error when closing vfio_group_fd for %s\n", > -- > 1.9.1 >