All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerin Jacob <jerin.jacob@caviumnetworks.com>
To: Alejandro Lucero <alejandro.lucero@netronome.com>
Cc: dev@dpdk.org, anatoly.burakov@intel.com, thomas@monjalon.net
Subject: Re: [PATCH] vfio: use right index when tracking devices in a vfio group
Date: Tue, 9 May 2017 09:34:48 +0530	[thread overview]
Message-ID: <20170509040447.GA6207@jerin> (raw)
In-Reply-To: <1494265458-35709-1-git-send-email-alejandro.lucero@netronome.com>

-----Original Message-----
> Date: Mon, 8 May 2017 18:44:18 +0100
> From: Alejandro Lucero <alejandro.lucero@netronome.com>
> 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 <alejandro.lucero@netronome.com>

Tested-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>

> ---
>  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
> 

  reply	other threads:[~2017-05-09  4:05 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-08 17:44 [PATCH] vfio: use right index when tracking devices in a vfio group Alejandro Lucero
2017-05-09  4:04 ` Jerin Jacob [this message]
2017-05-09 15:18 ` Burakov, Anatoly
2017-05-09 21:16   ` Alejandro Lucero

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170509040447.GA6207@jerin \
    --to=jerin.jacob@caviumnetworks.com \
    --cc=alejandro.lucero@netronome.com \
    --cc=anatoly.burakov@intel.com \
    --cc=dev@dpdk.org \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.