lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 3 Feb 2017 16:02:20 +0800
From:   Jason Wang <jasowang@...hat.com>
To:     Christoph Hellwig <hch@....de>, mst@...hat.com
Cc:     axboe@...nel.dk, pbonzini@...hat.com,
        virtualization@...ts.linux-foundation.org,
        linux-block@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 6/9] virtio: provide a method to get the IRQ affinity mask
 for a virtqueue



On 2017年01月27日 16:16, Christoph Hellwig wrote:
> This basically passed up the pci_irq_get_affinity information through
> virtio through an optional get_vq_affinity method.  It is only implemented
> by the PCI backend for now, and only when we use per-virtqueue IRQs.
>
> Signed-off-by: Christoph Hellwig <hch@....de>
> ---

Reviewed-by: Jason Wang <jasowang@...hat.com>

>   drivers/virtio/virtio_pci_common.c | 11 +++++++++++
>   drivers/virtio/virtio_pci_common.h |  2 ++
>   drivers/virtio/virtio_pci_legacy.c |  1 +
>   drivers/virtio/virtio_pci_modern.c |  2 ++
>   include/linux/virtio_config.h      |  3 +++
>   5 files changed, 19 insertions(+)
>
> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> index c244212..31ba259 100644
> --- a/drivers/virtio/virtio_pci_common.c
> +++ b/drivers/virtio/virtio_pci_common.c
> @@ -361,6 +361,17 @@ int vp_set_vq_affinity(struct virtqueue *vq, int cpu)
>   	return 0;
>   }
>   
> +const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vdev);
> +	unsigned int *map = vp_dev->msix_vector_map;
> +
> +	if (!map || map[index] == VIRTIO_MSI_NO_VECTOR)
> +		return NULL;
> +
> +	return pci_irq_get_affinity(vp_dev->pci_dev, map[index]);
> +}
> +
>   #ifdef CONFIG_PM_SLEEP
>   static int virtio_pci_freeze(struct device *dev)
>   {
> diff --git a/drivers/virtio/virtio_pci_common.h b/drivers/virtio/virtio_pci_common.h
> index a6ad9ec..ac8c9d7 100644
> --- a/drivers/virtio/virtio_pci_common.h
> +++ b/drivers/virtio/virtio_pci_common.h
> @@ -108,6 +108,8 @@ const char *vp_bus_name(struct virtio_device *vdev);
>    */
>   int vp_set_vq_affinity(struct virtqueue *vq, int cpu);
>   
> +const struct cpumask *vp_get_vq_affinity(struct virtio_device *vdev, int index);
> +
>   #if IS_ENABLED(CONFIG_VIRTIO_PCI_LEGACY)
>   int virtio_pci_legacy_probe(struct virtio_pci_device *);
>   void virtio_pci_legacy_remove(struct virtio_pci_device *);
> diff --git a/drivers/virtio/virtio_pci_legacy.c b/drivers/virtio/virtio_pci_legacy.c
> index 2ab6aee..f7362c5 100644
> --- a/drivers/virtio/virtio_pci_legacy.c
> +++ b/drivers/virtio/virtio_pci_legacy.c
> @@ -190,6 +190,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
>   	.finalize_features = vp_finalize_features,
>   	.bus_name	= vp_bus_name,
>   	.set_vq_affinity = vp_set_vq_affinity,
> +	.get_vq_affinity = vp_get_vq_affinity,
>   };
>   
>   /* the PCI probing function */
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index a7a0981..7bc3004 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -437,6 +437,7 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
>   	.finalize_features = vp_finalize_features,
>   	.bus_name	= vp_bus_name,
>   	.set_vq_affinity = vp_set_vq_affinity,
> +	.get_vq_affinity = vp_get_vq_affinity,
>   };
>   
>   static const struct virtio_config_ops virtio_pci_config_ops = {
> @@ -452,6 +453,7 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
>   	.finalize_features = vp_finalize_features,
>   	.bus_name	= vp_bus_name,
>   	.set_vq_affinity = vp_set_vq_affinity,
> +	.get_vq_affinity = vp_get_vq_affinity,
>   };
>   
>   /**
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index 2ebe506..8355bab 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -58,6 +58,7 @@ struct irq_affinity;
>    *      This returns a pointer to the bus name a la pci_name from which
>    *      the caller can then copy.
>    * @set_vq_affinity: set the affinity for a virtqueue.
> + * @get_vq_affinity: get the affinity for a virtqueue (optional).
>    */
>   typedef void vq_callback_t(struct virtqueue *);
>   struct virtio_config_ops {
> @@ -77,6 +78,8 @@ struct virtio_config_ops {
>   	int (*finalize_features)(struct virtio_device *vdev);
>   	const char *(*bus_name)(struct virtio_device *vdev);
>   	int (*set_vq_affinity)(struct virtqueue *vq, int cpu);
> +	const struct cpumask *(*get_vq_affinity)(struct virtio_device *vdev,
> +			int index);
>   };
>   
>   /* If driver didn't advertise the feature, it will never appear. */

Powered by blists - more mailing lists