All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Wang <jasowang@redhat.com>
To: Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	virtualization@lists.linux-foundation.org
Cc: Richard Weinberger <richard@nod.at>,
	Anton Ivanov <anton.ivanov@cambridgegreys.com>,
	Johannes Berg <johannes@sipsolutions.net>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Mark Gross <markgross@kernel.org>,
	Vadim Pasternak <vadimp@nvidia.com>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	Cornelia Huck <cohuck@redhat.com>,
	Halil Pasic <pasic@linux.ibm.com>,
	Eric Farman <farman@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	John Fastabend <john.fastabend@gmail.com>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	linux-um@lists.infradead.org, netdev@vger.kernel.org,
	platform-driver-x86@vger.kernel.org,
	linux-remoteproc@vger.kernel.org, linux-s390@vger.kernel.org,
	kvm@vger.kernel.org, bpf@vger.kernel.org,
	kangjie.xu@linux.alibaba.com
Subject: Re: [PATCH v13 32/42] virtio_pci: support VIRTIO_F_RING_RESET
Date: Wed, 27 Jul 2022 12:37:12 +0800	[thread overview]
Message-ID: <980553b7-ba12-bcdf-0be0-8f3da5985441@redhat.com> (raw)
In-Reply-To: <20220726072225.19884-33-xuanzhuo@linux.alibaba.com>


在 2022/7/26 15:22, Xuan Zhuo 写道:
> This patch implements virtio pci support for QUEUE RESET.
>
> Performing reset on a queue is divided into these steps:
>
>   1. notify the device to reset the queue
>   2. recycle the buffer submitted
>   3. reset the vring (may re-alloc)
>   4. mmap vring to device, and enable the queue
>
> This patch implements virtio_reset_vq(), virtio_enable_resetq() in the
> pci scenario.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/virtio/virtio_pci_common.c | 12 +++-
>   drivers/virtio/virtio_pci_modern.c | 88 ++++++++++++++++++++++++++++++
>   2 files changed, 97 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> index ca51fcc9daab..ad258a9d3b9f 100644
> --- a/drivers/virtio/virtio_pci_common.c
> +++ b/drivers/virtio/virtio_pci_common.c
> @@ -214,9 +214,15 @@ static void vp_del_vq(struct virtqueue *vq)
>   	struct virtio_pci_vq_info *info = vp_dev->vqs[vq->index];
>   	unsigned long flags;
>   
> -	spin_lock_irqsave(&vp_dev->lock, flags);
> -	list_del(&info->node);
> -	spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	/*
> +	 * If it fails during re-enable reset vq. This way we won't rejoin
> +	 * info->node to the queue. Prevent unexpected irqs.
> +	 */
> +	if (!vq->reset) {
> +		spin_lock_irqsave(&vp_dev->lock, flags);
> +		list_del(&info->node);
> +		spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	}
>   
>   	vp_dev->del_vq(info);
>   	kfree(info);
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index 9041d9a41b7d..c3b9f2761849 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -34,6 +34,9 @@ static void vp_transport_features(struct virtio_device *vdev, u64 features)
>   	if ((features & BIT_ULL(VIRTIO_F_SR_IOV)) &&
>   			pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_SRIOV))
>   		__virtio_set_bit(vdev, VIRTIO_F_SR_IOV);
> +
> +	if (features & BIT_ULL(VIRTIO_F_RING_RESET))
> +		__virtio_set_bit(vdev, VIRTIO_F_RING_RESET);
>   }
>   
>   /* virtio config->finalize_features() implementation */
> @@ -199,6 +202,87 @@ static int vp_active_vq(struct virtqueue *vq, u16 msix_vec)
>   	return 0;
>   }
>   
> +static int vp_modern_disable_vq_and_reset(struct virtqueue *vq)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
> +	struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> +	struct virtio_pci_vq_info *info;
> +	unsigned long flags;
> +
> +	if (!virtio_has_feature(vq->vdev, VIRTIO_F_RING_RESET))
> +		return -ENOENT;
> +
> +	vp_modern_set_queue_reset(mdev, vq->index);
> +
> +	info = vp_dev->vqs[vq->index];
> +
> +	/* delete vq from irq handler */
> +	spin_lock_irqsave(&vp_dev->lock, flags);
> +	list_del(&info->node);
> +	spin_unlock_irqrestore(&vp_dev->lock, flags);
> +
> +	INIT_LIST_HEAD(&info->node);
> +
> +#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +	__virtqueue_break(vq);
> +#endif
> +
> +	/* For the case where vq has an exclusive irq, call synchronize_irq() to
> +	 * wait for completion.
> +	 *
> +	 * note: We can't use disable_irq() since it conflicts with the affinity
> +	 * managed IRQ that is used by some drivers.
> +	 */
> +	if (vp_dev->per_vq_vectors && info->msix_vector != VIRTIO_MSI_NO_VECTOR)
> +		synchronize_irq(pci_irq_vector(vp_dev->pci_dev, info->msix_vector));
> +
> +	vq->reset = true;
> +
> +	return 0;
> +}
> +
> +static int vp_modern_enable_vq_after_reset(struct virtqueue *vq)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
> +	struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> +	struct virtio_pci_vq_info *info;
> +	unsigned long flags, index;
> +	int err;
> +
> +	if (!vq->reset)
> +		return -EBUSY;
> +
> +	index = vq->index;
> +	info = vp_dev->vqs[index];
> +
> +	if (vp_modern_get_queue_reset(mdev, index))
> +		return -EBUSY;
> +
> +	if (vp_modern_get_queue_enable(mdev, index))
> +		return -EBUSY;
> +
> +	err = vp_active_vq(vq, info->msix_vector);
> +	if (err)
> +		return err;
> +
> +	if (vq->callback) {
> +		spin_lock_irqsave(&vp_dev->lock, flags);
> +		list_add(&info->node, &vp_dev->virtqueues);
> +		spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	} else {
> +		INIT_LIST_HEAD(&info->node);
> +	}
> +
> +#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +	__virtqueue_unbreak(vq);
> +#endif
> +
> +	vp_modern_set_queue_enable(&vp_dev->mdev, index, true);
> +	vq->reset = false;
> +
> +	return 0;
> +}
> +
>   static u16 vp_config_vector(struct virtio_pci_device *vp_dev, u16 vector)
>   {
>   	return vp_modern_config_vector(&vp_dev->mdev, vector);
> @@ -413,6 +497,8 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
>   	.set_vq_affinity = vp_set_vq_affinity,
>   	.get_vq_affinity = vp_get_vq_affinity,
>   	.get_shm_region  = vp_get_shm_region,
> +	.disable_vq_and_reset = vp_modern_disable_vq_and_reset,
> +	.enable_vq_after_reset = vp_modern_enable_vq_after_reset,
>   };
>   
>   static const struct virtio_config_ops virtio_pci_config_ops = {
> @@ -431,6 +517,8 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
>   	.set_vq_affinity = vp_set_vq_affinity,
>   	.get_vq_affinity = vp_get_vq_affinity,
>   	.get_shm_region  = vp_get_shm_region,
> +	.disable_vq_and_reset = vp_modern_disable_vq_and_reset,
> +	.enable_vq_after_reset = vp_modern_enable_vq_after_reset,
>   };
>   
>   /* the PCI probing function */


WARNING: multiple messages have this Message-ID (diff)
From: Jason Wang <jasowang@redhat.com>
To: Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	virtualization@lists.linux-foundation.org
Cc: Vadim Pasternak <vadimp@nvidia.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	linux-remoteproc@vger.kernel.org,
	Alexei Starovoitov <ast@kernel.org>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Eric Dumazet <edumazet@google.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Anton Ivanov <anton.ivanov@cambridgegreys.com>,
	linux-s390@vger.kernel.org, kvm@vger.kernel.org,
	Daniel Borkmann <daniel@iogearbox.net>,
	Richard Weinberger <richard@nod.at>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	John Fastabend <john.fastabend@gmail.com>,
	Halil Pasic <pasic@linux.ibm.com>,
	Jakub Kicinski <kuba@kernel.org>,
	Eric Farman <farman@linux.ibm.com>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	Vasily Gorbik <gor@linux.ibm.com>,
	kangjie.xu@linux.alibaba.com, Heiko Carstens <hca@linux.ibm.com>,
	linux-um@lists.infradead.org, Mark Gross <markgross@kernel.org>,
	Hans de Goede <hdegoede@redhat.com>,
	platform-driver-x86@vger.kernel.org, bpf@vger.kernel.org,
	Paolo Abeni <pabeni@redhat.com>,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	netdev@vger.kernel.org, Cornelia Huck <cohuck@redhat.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Johannes Berg <johannes@sipsolutions.net>,
	"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH v13 32/42] virtio_pci: support VIRTIO_F_RING_RESET
Date: Wed, 27 Jul 2022 12:37:12 +0800	[thread overview]
Message-ID: <980553b7-ba12-bcdf-0be0-8f3da5985441@redhat.com> (raw)
In-Reply-To: <20220726072225.19884-33-xuanzhuo@linux.alibaba.com>


在 2022/7/26 15:22, Xuan Zhuo 写道:
> This patch implements virtio pci support for QUEUE RESET.
>
> Performing reset on a queue is divided into these steps:
>
>   1. notify the device to reset the queue
>   2. recycle the buffer submitted
>   3. reset the vring (may re-alloc)
>   4. mmap vring to device, and enable the queue
>
> This patch implements virtio_reset_vq(), virtio_enable_resetq() in the
> pci scenario.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/virtio/virtio_pci_common.c | 12 +++-
>   drivers/virtio/virtio_pci_modern.c | 88 ++++++++++++++++++++++++++++++
>   2 files changed, 97 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> index ca51fcc9daab..ad258a9d3b9f 100644
> --- a/drivers/virtio/virtio_pci_common.c
> +++ b/drivers/virtio/virtio_pci_common.c
> @@ -214,9 +214,15 @@ static void vp_del_vq(struct virtqueue *vq)
>   	struct virtio_pci_vq_info *info = vp_dev->vqs[vq->index];
>   	unsigned long flags;
>   
> -	spin_lock_irqsave(&vp_dev->lock, flags);
> -	list_del(&info->node);
> -	spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	/*
> +	 * If it fails during re-enable reset vq. This way we won't rejoin
> +	 * info->node to the queue. Prevent unexpected irqs.
> +	 */
> +	if (!vq->reset) {
> +		spin_lock_irqsave(&vp_dev->lock, flags);
> +		list_del(&info->node);
> +		spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	}
>   
>   	vp_dev->del_vq(info);
>   	kfree(info);
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index 9041d9a41b7d..c3b9f2761849 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -34,6 +34,9 @@ static void vp_transport_features(struct virtio_device *vdev, u64 features)
>   	if ((features & BIT_ULL(VIRTIO_F_SR_IOV)) &&
>   			pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_SRIOV))
>   		__virtio_set_bit(vdev, VIRTIO_F_SR_IOV);
> +
> +	if (features & BIT_ULL(VIRTIO_F_RING_RESET))
> +		__virtio_set_bit(vdev, VIRTIO_F_RING_RESET);
>   }
>   
>   /* virtio config->finalize_features() implementation */
> @@ -199,6 +202,87 @@ static int vp_active_vq(struct virtqueue *vq, u16 msix_vec)
>   	return 0;
>   }
>   
> +static int vp_modern_disable_vq_and_reset(struct virtqueue *vq)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
> +	struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> +	struct virtio_pci_vq_info *info;
> +	unsigned long flags;
> +
> +	if (!virtio_has_feature(vq->vdev, VIRTIO_F_RING_RESET))
> +		return -ENOENT;
> +
> +	vp_modern_set_queue_reset(mdev, vq->index);
> +
> +	info = vp_dev->vqs[vq->index];
> +
> +	/* delete vq from irq handler */
> +	spin_lock_irqsave(&vp_dev->lock, flags);
> +	list_del(&info->node);
> +	spin_unlock_irqrestore(&vp_dev->lock, flags);
> +
> +	INIT_LIST_HEAD(&info->node);
> +
> +#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +	__virtqueue_break(vq);
> +#endif
> +
> +	/* For the case where vq has an exclusive irq, call synchronize_irq() to
> +	 * wait for completion.
> +	 *
> +	 * note: We can't use disable_irq() since it conflicts with the affinity
> +	 * managed IRQ that is used by some drivers.
> +	 */
> +	if (vp_dev->per_vq_vectors && info->msix_vector != VIRTIO_MSI_NO_VECTOR)
> +		synchronize_irq(pci_irq_vector(vp_dev->pci_dev, info->msix_vector));
> +
> +	vq->reset = true;
> +
> +	return 0;
> +}
> +
> +static int vp_modern_enable_vq_after_reset(struct virtqueue *vq)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
> +	struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> +	struct virtio_pci_vq_info *info;
> +	unsigned long flags, index;
> +	int err;
> +
> +	if (!vq->reset)
> +		return -EBUSY;
> +
> +	index = vq->index;
> +	info = vp_dev->vqs[index];
> +
> +	if (vp_modern_get_queue_reset(mdev, index))
> +		return -EBUSY;
> +
> +	if (vp_modern_get_queue_enable(mdev, index))
> +		return -EBUSY;
> +
> +	err = vp_active_vq(vq, info->msix_vector);
> +	if (err)
> +		return err;
> +
> +	if (vq->callback) {
> +		spin_lock_irqsave(&vp_dev->lock, flags);
> +		list_add(&info->node, &vp_dev->virtqueues);
> +		spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	} else {
> +		INIT_LIST_HEAD(&info->node);
> +	}
> +
> +#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +	__virtqueue_unbreak(vq);
> +#endif
> +
> +	vp_modern_set_queue_enable(&vp_dev->mdev, index, true);
> +	vq->reset = false;
> +
> +	return 0;
> +}
> +
>   static u16 vp_config_vector(struct virtio_pci_device *vp_dev, u16 vector)
>   {
>   	return vp_modern_config_vector(&vp_dev->mdev, vector);
> @@ -413,6 +497,8 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
>   	.set_vq_affinity = vp_set_vq_affinity,
>   	.get_vq_affinity = vp_get_vq_affinity,
>   	.get_shm_region  = vp_get_shm_region,
> +	.disable_vq_and_reset = vp_modern_disable_vq_and_reset,
> +	.enable_vq_after_reset = vp_modern_enable_vq_after_reset,
>   };
>   
>   static const struct virtio_config_ops virtio_pci_config_ops = {
> @@ -431,6 +517,8 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
>   	.set_vq_affinity = vp_set_vq_affinity,
>   	.get_vq_affinity = vp_get_vq_affinity,
>   	.get_shm_region  = vp_get_shm_region,
> +	.disable_vq_and_reset = vp_modern_disable_vq_and_reset,
> +	.enable_vq_after_reset = vp_modern_enable_vq_after_reset,
>   };
>   
>   /* the PCI probing function */

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

WARNING: multiple messages have this Message-ID (diff)
From: Jason Wang <jasowang@redhat.com>
To: Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
	virtualization@lists.linux-foundation.org
Cc: Richard Weinberger <richard@nod.at>,
	Anton Ivanov <anton.ivanov@cambridgegreys.com>,
	Johannes Berg <johannes@sipsolutions.net>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Hans de Goede <hdegoede@redhat.com>,
	Mark Gross <markgross@kernel.org>,
	Vadim Pasternak <vadimp@nvidia.com>,
	Bjorn Andersson <bjorn.andersson@linaro.org>,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	Cornelia Huck <cohuck@redhat.com>,
	Halil Pasic <pasic@linux.ibm.com>,
	Eric Farman <farman@linux.ibm.com>,
	Heiko Carstens <hca@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Alexander Gordeev <agordeev@linux.ibm.com>,
	Christian Borntraeger <borntraeger@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Jesper Dangaard Brouer <hawk@kernel.org>,
	John Fastabend <john.fastabend@gmail.com>,
	Vincent Whitchurch <vincent.whitchurch@axis.com>,
	linux-um@lists.infradead.org, netdev@vger.kernel.org,
	platform-driver-x86@vger.kernel.org,
	linux-remoteproc@vger.kernel.org, linux-s390@vger.kernel.org,
	kvm@vger.kernel.org, bpf@vger.kernel.org,
	kangjie.xu@linux.alibaba.com
Subject: Re: [PATCH v13 32/42] virtio_pci: support VIRTIO_F_RING_RESET
Date: Wed, 27 Jul 2022 12:37:12 +0800	[thread overview]
Message-ID: <980553b7-ba12-bcdf-0be0-8f3da5985441@redhat.com> (raw)
In-Reply-To: <20220726072225.19884-33-xuanzhuo@linux.alibaba.com>


在 2022/7/26 15:22, Xuan Zhuo 写道:
> This patch implements virtio pci support for QUEUE RESET.
>
> Performing reset on a queue is divided into these steps:
>
>   1. notify the device to reset the queue
>   2. recycle the buffer submitted
>   3. reset the vring (may re-alloc)
>   4. mmap vring to device, and enable the queue
>
> This patch implements virtio_reset_vq(), virtio_enable_resetq() in the
> pci scenario.
>
> Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>


Acked-by: Jason Wang <jasowang@redhat.com>


> ---
>   drivers/virtio/virtio_pci_common.c | 12 +++-
>   drivers/virtio/virtio_pci_modern.c | 88 ++++++++++++++++++++++++++++++
>   2 files changed, 97 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c
> index ca51fcc9daab..ad258a9d3b9f 100644
> --- a/drivers/virtio/virtio_pci_common.c
> +++ b/drivers/virtio/virtio_pci_common.c
> @@ -214,9 +214,15 @@ static void vp_del_vq(struct virtqueue *vq)
>   	struct virtio_pci_vq_info *info = vp_dev->vqs[vq->index];
>   	unsigned long flags;
>   
> -	spin_lock_irqsave(&vp_dev->lock, flags);
> -	list_del(&info->node);
> -	spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	/*
> +	 * If it fails during re-enable reset vq. This way we won't rejoin
> +	 * info->node to the queue. Prevent unexpected irqs.
> +	 */
> +	if (!vq->reset) {
> +		spin_lock_irqsave(&vp_dev->lock, flags);
> +		list_del(&info->node);
> +		spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	}
>   
>   	vp_dev->del_vq(info);
>   	kfree(info);
> diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c
> index 9041d9a41b7d..c3b9f2761849 100644
> --- a/drivers/virtio/virtio_pci_modern.c
> +++ b/drivers/virtio/virtio_pci_modern.c
> @@ -34,6 +34,9 @@ static void vp_transport_features(struct virtio_device *vdev, u64 features)
>   	if ((features & BIT_ULL(VIRTIO_F_SR_IOV)) &&
>   			pci_find_ext_capability(pci_dev, PCI_EXT_CAP_ID_SRIOV))
>   		__virtio_set_bit(vdev, VIRTIO_F_SR_IOV);
> +
> +	if (features & BIT_ULL(VIRTIO_F_RING_RESET))
> +		__virtio_set_bit(vdev, VIRTIO_F_RING_RESET);
>   }
>   
>   /* virtio config->finalize_features() implementation */
> @@ -199,6 +202,87 @@ static int vp_active_vq(struct virtqueue *vq, u16 msix_vec)
>   	return 0;
>   }
>   
> +static int vp_modern_disable_vq_and_reset(struct virtqueue *vq)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
> +	struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> +	struct virtio_pci_vq_info *info;
> +	unsigned long flags;
> +
> +	if (!virtio_has_feature(vq->vdev, VIRTIO_F_RING_RESET))
> +		return -ENOENT;
> +
> +	vp_modern_set_queue_reset(mdev, vq->index);
> +
> +	info = vp_dev->vqs[vq->index];
> +
> +	/* delete vq from irq handler */
> +	spin_lock_irqsave(&vp_dev->lock, flags);
> +	list_del(&info->node);
> +	spin_unlock_irqrestore(&vp_dev->lock, flags);
> +
> +	INIT_LIST_HEAD(&info->node);
> +
> +#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +	__virtqueue_break(vq);
> +#endif
> +
> +	/* For the case where vq has an exclusive irq, call synchronize_irq() to
> +	 * wait for completion.
> +	 *
> +	 * note: We can't use disable_irq() since it conflicts with the affinity
> +	 * managed IRQ that is used by some drivers.
> +	 */
> +	if (vp_dev->per_vq_vectors && info->msix_vector != VIRTIO_MSI_NO_VECTOR)
> +		synchronize_irq(pci_irq_vector(vp_dev->pci_dev, info->msix_vector));
> +
> +	vq->reset = true;
> +
> +	return 0;
> +}
> +
> +static int vp_modern_enable_vq_after_reset(struct virtqueue *vq)
> +{
> +	struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
> +	struct virtio_pci_modern_device *mdev = &vp_dev->mdev;
> +	struct virtio_pci_vq_info *info;
> +	unsigned long flags, index;
> +	int err;
> +
> +	if (!vq->reset)
> +		return -EBUSY;
> +
> +	index = vq->index;
> +	info = vp_dev->vqs[index];
> +
> +	if (vp_modern_get_queue_reset(mdev, index))
> +		return -EBUSY;
> +
> +	if (vp_modern_get_queue_enable(mdev, index))
> +		return -EBUSY;
> +
> +	err = vp_active_vq(vq, info->msix_vector);
> +	if (err)
> +		return err;
> +
> +	if (vq->callback) {
> +		spin_lock_irqsave(&vp_dev->lock, flags);
> +		list_add(&info->node, &vp_dev->virtqueues);
> +		spin_unlock_irqrestore(&vp_dev->lock, flags);
> +	} else {
> +		INIT_LIST_HEAD(&info->node);
> +	}
> +
> +#ifdef CONFIG_VIRTIO_HARDEN_NOTIFICATION
> +	__virtqueue_unbreak(vq);
> +#endif
> +
> +	vp_modern_set_queue_enable(&vp_dev->mdev, index, true);
> +	vq->reset = false;
> +
> +	return 0;
> +}
> +
>   static u16 vp_config_vector(struct virtio_pci_device *vp_dev, u16 vector)
>   {
>   	return vp_modern_config_vector(&vp_dev->mdev, vector);
> @@ -413,6 +497,8 @@ static const struct virtio_config_ops virtio_pci_config_nodev_ops = {
>   	.set_vq_affinity = vp_set_vq_affinity,
>   	.get_vq_affinity = vp_get_vq_affinity,
>   	.get_shm_region  = vp_get_shm_region,
> +	.disable_vq_and_reset = vp_modern_disable_vq_and_reset,
> +	.enable_vq_after_reset = vp_modern_enable_vq_after_reset,
>   };
>   
>   static const struct virtio_config_ops virtio_pci_config_ops = {
> @@ -431,6 +517,8 @@ static const struct virtio_config_ops virtio_pci_config_ops = {
>   	.set_vq_affinity = vp_set_vq_affinity,
>   	.get_vq_affinity = vp_get_vq_affinity,
>   	.get_shm_region  = vp_get_shm_region,
> +	.disable_vq_and_reset = vp_modern_disable_vq_and_reset,
> +	.enable_vq_after_reset = vp_modern_enable_vq_after_reset,
>   };
>   
>   /* the PCI probing function */


_______________________________________________
linux-um mailing list
linux-um@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-um

  reply	other threads:[~2022-07-27  4:37 UTC|newest]

Thread overview: 201+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-26  7:21 [PATCH v13 00/42] virtio pci support VIRTIO_F_RING_RESET Xuan Zhuo
2022-07-26  7:21 ` Xuan Zhuo
2022-07-26  7:21 ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 01/42] virtio: record the maximum queue num supported by the device Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 02/42] virtio: struct virtio_config_ops add callbacks for queue_reset Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 03/42] virtio_ring: update the document of the virtqueue_detach_unused_buf for queue reset Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 04/42] virtio_ring: extract the logic of freeing vring Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 05/42] virtio_ring: split vring_virtqueue Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 06/42] virtio_ring: introduce virtqueue_init() Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 07/42] virtio_ring: split: stop __vring_new_virtqueue as export symbol Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-27  2:58   ` Jason Wang
2022-07-27  2:58     ` Jason Wang
2022-07-27  2:58     ` Jason Wang
2022-07-27  7:35     ` Xuan Zhuo
2022-07-27  7:35       ` Xuan Zhuo
2022-07-27  7:35       ` Xuan Zhuo
2022-07-28  2:36       ` Jason Wang
2022-07-28  2:36         ` Jason Wang
2022-07-28  2:36         ` Jason Wang
2022-07-26  7:21 ` [PATCH v13 08/42] virtio_ring: split: __vring_new_virtqueue() accept struct vring_virtqueue_split Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-27  3:05   ` Jason Wang
2022-07-27  3:05     ` Jason Wang
2022-07-27  3:05     ` Jason Wang
2022-07-26  7:21 ` [PATCH v13 09/42] virtio_ring: split: introduce vring_free_split() Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 10/42] virtio_ring: split: extract the logic of alloc queue Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-27  3:14   ` Jason Wang
2022-07-27  3:14     ` Jason Wang
2022-07-27  3:14     ` Jason Wang
2022-07-26  7:21 ` [PATCH v13 11/42] virtio_ring: split: extract the logic of alloc state and extra Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-27  4:23   ` Jason Wang
2022-07-27  4:23     ` Jason Wang
2022-07-27  4:23     ` Jason Wang
2022-07-26  7:21 ` [PATCH v13 12/42] virtio_ring: split: extract the logic of vring init Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 13/42] virtio_ring: split: extract the logic of attach vring Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 14/42] virtio_ring: split: introduce virtqueue_reinit_split() Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 15/42] virtio_ring: split: reserve vring_align, may_reduce_num Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21 ` [PATCH v13 16/42] virtio_ring: split: introduce virtqueue_resize_split() Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-26  7:21   ` Xuan Zhuo
2022-07-27  3:12   ` Jason Wang
2022-07-27  3:12     ` Jason Wang
2022-07-27  3:12     ` Jason Wang
2022-07-27  7:36     ` Xuan Zhuo
2022-07-27  7:36       ` Xuan Zhuo
2022-07-27  7:36       ` Xuan Zhuo
2022-07-28  2:38       ` Jason Wang
2022-07-28  2:38         ` Jason Wang
2022-07-28  2:38         ` Jason Wang
2022-07-28  7:09         ` Xuan Zhuo
2022-07-28  7:09           ` Xuan Zhuo
2022-07-28  7:09           ` Xuan Zhuo
2022-07-28  7:42           ` Jason Wang
2022-07-28  7:42             ` Jason Wang
2022-07-28  7:42             ` Jason Wang
2022-07-28  8:09             ` Xuan Zhuo
2022-07-28  8:09               ` Xuan Zhuo
2022-07-28  8:09               ` Xuan Zhuo
2022-07-28  9:04               ` Jason Wang
2022-07-28  9:04                 ` Jason Wang
2022-07-28  9:04                 ` Jason Wang
2022-07-28  9:42                 ` Xuan Zhuo
2022-07-28  9:42                   ` Xuan Zhuo
2022-07-28  9:42                   ` Xuan Zhuo
2022-08-01  4:49                   ` Jason Wang
2022-08-01  4:49                     ` Jason Wang
2022-08-01  4:49                     ` Jason Wang
2022-08-01  6:11                     ` Xuan Zhuo
2022-08-01  6:11                       ` Xuan Zhuo
2022-08-01  6:11                       ` Xuan Zhuo
2022-08-01  6:27                       ` Jason Wang
2022-08-01  6:27                         ` Jason Wang
2022-08-01  6:27                         ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 17/42] virtio_ring: packed: introduce vring_free_packed Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:24   ` Jason Wang
2022-07-27  4:24     ` Jason Wang
2022-07-27  4:24     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 18/42] virtio_ring: packed: extract the logic of alloc queue Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:29   ` Jason Wang
2022-07-27  4:29     ` Jason Wang
2022-07-27  4:29     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 19/42] virtio_ring: packed: extract the logic of alloc state and extra Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:33   ` Jason Wang
2022-07-27  4:33     ` Jason Wang
2022-07-27  4:33     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 20/42] virtio_ring: packed: extract the logic of vring init Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:33   ` Jason Wang
2022-07-27  4:33     ` Jason Wang
2022-07-27  4:33     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 21/42] virtio_ring: packed: extract the logic of attach vring Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:34   ` Jason Wang
2022-07-27  4:34     ` Jason Wang
2022-07-27  4:34     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 22/42] virtio_ring: packed: introduce virtqueue_reinit_packed() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:35   ` Jason Wang
2022-07-27  4:35     ` Jason Wang
2022-07-27  4:35     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 23/42] virtio_ring: packed: introduce virtqueue_resize_packed() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 24/42] virtio_ring: introduce virtqueue_resize() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 25/42] virtio_pci: struct virtio_pci_common_cfg add queue_notify_data Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 26/42] virtio: allow to unbreak/break virtqueue individually Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 27/42] virtio: queue_reset: add VIRTIO_F_RING_RESET Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 28/42] virtio_ring: struct virtqueue introduce reset Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 29/42] virtio_pci: struct virtio_pci_common_cfg add queue_reset Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 30/42] virtio_pci: introduce helper to get/set queue reset Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 31/42] virtio_pci: extract the logic of active vq for modern pci Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 32/42] virtio_pci: support VIRTIO_F_RING_RESET Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-27  4:37   ` Jason Wang [this message]
2022-07-27  4:37     ` Jason Wang
2022-07-27  4:37     ` Jason Wang
2022-07-26  7:22 ` [PATCH v13 33/42] virtio: find_vqs() add arg sizes Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 34/42] virtio_pci: support the arg sizes of find_vqs() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 35/42] virtio_mmio: " Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 36/42] virtio: add helper virtio_find_vqs_ctx_size() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 37/42] virtio_net: set the default max ring size by find_vqs() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 38/42] virtio_net: get ringparam by virtqueue_get_vring_max_size() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 39/42] virtio_net: split free_unused_bufs() Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 40/42] virtio_net: support rx queue resize Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 41/42] virtio_net: support tx " Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22 ` [PATCH v13 42/42] virtio_net: support set_ringparam Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo
2022-07-26  7:22   ` Xuan Zhuo

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=980553b7-ba12-bcdf-0be0-8f3da5985441@redhat.com \
    --to=jasowang@redhat.com \
    --cc=agordeev@linux.ibm.com \
    --cc=anton.ivanov@cambridgegreys.com \
    --cc=ast@kernel.org \
    --cc=bjorn.andersson@linaro.org \
    --cc=borntraeger@linux.ibm.com \
    --cc=bpf@vger.kernel.org \
    --cc=cohuck@redhat.com \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=farman@linux.ibm.com \
    --cc=gor@linux.ibm.com \
    --cc=hawk@kernel.org \
    --cc=hca@linux.ibm.com \
    --cc=hdegoede@redhat.com \
    --cc=johannes@sipsolutions.net \
    --cc=john.fastabend@gmail.com \
    --cc=kangjie.xu@linux.alibaba.com \
    --cc=kuba@kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-um@lists.infradead.org \
    --cc=markgross@kernel.org \
    --cc=mathieu.poirier@linaro.org \
    --cc=mst@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=pasic@linux.ibm.com \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=richard@nod.at \
    --cc=svens@linux.ibm.com \
    --cc=vadimp@nvidia.com \
    --cc=vincent.whitchurch@axis.com \
    --cc=virtualization@lists.linux-foundation.org \
    --cc=xuanzhuo@linux.alibaba.com \
    /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.