From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
To: virtualization@lists.linux-foundation.org, netdev@vger.kernel.org
Cc: Jeff Dike <jdike@addtoit.com>,
Richard Weinberger <richard@nod.at>,
Anton Ivanov <anton.ivanov@cambridgegreys.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Jason Wang <jasowang@redhat.com>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>,
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>,
Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
Alexander Gordeev <agordeev@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>,
Johannes Berg <johannes.berg@intel.com>,
Vincent Whitchurch <vincent.whitchurch@axis.com>,
Xuan Zhuo <xuanzhuo@linux.alibaba.com>,
linux-um@lists.infradead.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
Subject: [PATCH v6 08/26] virtio_ring: extract the logic of freeing vring
Date: Thu, 24 Feb 2022 16:10:44 +0800 [thread overview]
Message-ID: <20220224081102.80224-9-xuanzhuo@linux.alibaba.com> (raw)
In-Reply-To: <20220224081102.80224-1-xuanzhuo@linux.alibaba.com>
Introduce vring_free() to free the vring of vq.
Prevent double free by setting vq->reset.
Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
---
drivers/virtio/virtio_ring.c | 25 ++++++++++++++++++++-----
include/linux/virtio.h | 8 ++++++++
2 files changed, 28 insertions(+), 5 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index 039015823c53..0b5360052ac2 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -2442,14 +2442,10 @@ struct virtqueue *vring_new_virtqueue(unsigned int index,
}
EXPORT_SYMBOL_GPL(vring_new_virtqueue);
-void vring_del_virtqueue(struct virtqueue *_vq)
+static void __vring_free(struct virtqueue *_vq)
{
struct vring_virtqueue *vq = to_vvq(_vq);
- spin_lock(&vq->vq.vdev->vqs_list_lock);
- list_del(&_vq->list);
- spin_unlock(&vq->vq.vdev->vqs_list_lock);
-
if (vq->we_own_ring) {
if (vq->packed_ring) {
vring_free_queue(vq->vq.vdev,
@@ -2480,6 +2476,25 @@ void vring_del_virtqueue(struct virtqueue *_vq)
kfree(vq->split.desc_state);
kfree(vq->split.desc_extra);
}
+}
+
+static void vring_free(struct virtqueue *vq)
+{
+ __vring_free(vq);
+ vq->reset = VIRTIO_VQ_RESET_STEP_VRING_RELEASE;
+}
+
+void vring_del_virtqueue(struct virtqueue *_vq)
+{
+ struct vring_virtqueue *vq = to_vvq(_vq);
+
+ spin_lock(&vq->vq.vdev->vqs_list_lock);
+ list_del(&_vq->list);
+ spin_unlock(&vq->vq.vdev->vqs_list_lock);
+
+ if (_vq->reset != VIRTIO_VQ_RESET_STEP_VRING_RELEASE)
+ __vring_free(_vq);
+
kfree(vq);
}
EXPORT_SYMBOL_GPL(vring_del_virtqueue);
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index d59adc4be068..e3714e6db330 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -10,6 +10,13 @@
#include <linux/mod_devicetable.h>
#include <linux/gfp.h>
+enum virtio_vq_reset_step {
+ VIRTIO_VQ_RESET_STEP_NONE,
+ VIRTIO_VQ_RESET_STEP_DEVICE,
+ VIRTIO_VQ_RESET_STEP_VRING_RELEASE,
+ VIRTIO_VQ_RESET_STEP_VRING_ATTACH,
+};
+
/**
* virtqueue - a queue to register buffers for sending or receiving.
* @list: the chain of virtqueues for this device
@@ -33,6 +40,7 @@ struct virtqueue {
unsigned int num_free;
unsigned int num_max;
void *priv;
+ enum virtio_vq_reset_step reset;
};
int virtqueue_add_outbuf(struct virtqueue *vq,
--
2.31.0
next prev parent reply other threads:[~2022-02-24 8:12 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-24 8:10 [PATCH v6 00/26] virtio pci support VIRTIO_F_RING_RESET Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 01/26] virtio_pci: struct virtio_pci_common_cfg add queue_notify_data Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 02/26] virtio: queue_reset: add VIRTIO_F_RING_RESET Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 03/26] virtio: add helper virtqueue_get_vring_max_size() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 04/26] virtio_ring: split: extract the logic of creating vring Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 05/26] virtio_ring: split: extract the logic of init vq and attach vring Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 06/26] virtio_ring: packed: extrace the logic of creating vring Xuan Zhuo
2022-03-07 22:17 ` Michael S. Tsirkin
2022-03-08 7:01 ` Xuan Zhuo
2022-03-08 7:28 ` Jason Wang
2022-03-08 8:01 ` Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 07/26] virtio_ring: packed: extract the logic of init vq and attach vring Xuan Zhuo
2022-02-24 8:10 ` Xuan Zhuo [this message]
2022-02-24 8:10 ` [PATCH v6 09/26] virtio_ring: split: implement virtqueue_reset_vring_split() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 10/26] virtio_ring: packed: implement virtqueue_reset_vring_packed() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 11/26] virtio_ring: introduce virtqueue_reset_vring() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 12/26] virtio_ring: update the document of the virtqueue_detach_unused_buf for queue reset Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 13/26] virtio: queue_reset: struct virtio_config_ops add callbacks for queue_reset Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 14/26] virtio: add helper for queue reset Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 15/26] virtio_pci: queue_reset: update struct virtio_pci_common_cfg and option functions Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 16/26] virtio_pci: queue_reset: extract the logic of active vq for modern pci Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 17/26] virtio_pci: queue_reset: support VIRTIO_F_RING_RESET Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 18/26] virtio: find_vqs() add arg sizes Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 19/26] virtio_pci: support the arg sizes of find_vqs() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 20/26] virtio_mmio: " Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 21/26] virtio: add helper virtio_find_vqs_ctx_size() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 22/26] virtio_net: get ringparam by virtqueue_get_vring_max_size() Xuan Zhuo
2022-02-24 8:10 ` [PATCH v6 23/26] virtio_net: split free_unused_bufs() Xuan Zhuo
2022-02-24 8:11 ` [PATCH v6 24/26] virtio_net: support rx/tx queue reset Xuan Zhuo
2022-02-24 8:11 ` [PATCH v6 25/26] virtio_net: set the default max ring size by find_vqs() Xuan Zhuo
2022-02-24 8:11 ` [PATCH v6 26/26] virtio_net: support set_ringparam 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=20220224081102.80224-9-xuanzhuo@linux.alibaba.com \
--to=xuanzhuo@linux.alibaba.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=gor@linux.ibm.com \
--cc=hawk@kernel.org \
--cc=hca@linux.ibm.com \
--cc=hdegoede@redhat.com \
--cc=jasowang@redhat.com \
--cc=jdike@addtoit.com \
--cc=johannes.berg@intel.com \
--cc=john.fastabend@gmail.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=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 \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).