From: Julien Thierry <julien.thierry@arm.com>
To: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu
Cc: will.deacon@arm.com
Subject: [PATCH kvmtool 10/13] virtio/blk: Reset virtqueue
Date: Tue, 4 Dec 2018 11:08:43 +0000 [thread overview]
Message-ID: <1543921726-54571-11-git-send-email-julien.thierry@arm.com> (raw)
In-Reply-To: <1543921726-54571-1-git-send-email-julien.thierry@arm.com>
From: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Move pthread creation to init_vq, and kill the thread in exit_vq.
Initialize the virtqueue states at runtime.
All in-flight I/O is canceled with the virtqueue pthreads, except for AIO
threads, but after reading the code I'm not sure if AIO has ever worked
anyway.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Signed-off-by: Julien Thierry <julien.thierry@arm.com>
---
virtio/blk.c | 67 ++++++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 45 insertions(+), 22 deletions(-)
diff --git a/virtio/blk.c b/virtio/blk.c
index 6a6b3b7..a57df2e 100644
--- a/virtio/blk.c
+++ b/virtio/blk.c
@@ -178,9 +178,29 @@ static void notify_status(struct kvm *kvm, void *dev, u32 status)
{
}
+static void *virtio_blk_thread(void *dev)
+{
+ struct blk_dev *bdev = dev;
+ u64 data;
+ int r;
+
+ kvm__set_thread_name("virtio-blk-io");
+
+ while (1) {
+ r = read(bdev->io_efd, &data, sizeof(u64));
+ if (r < 0)
+ continue;
+ virtio_blk_do_io(bdev->kvm, &bdev->vqs[0], bdev);
+ }
+
+ pthread_exit(NULL);
+ return NULL;
+}
+
static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align,
u32 pfn)
{
+ unsigned int i;
struct blk_dev *bdev = dev;
struct virt_queue *queue;
void *p;
@@ -194,26 +214,37 @@ static int init_vq(struct kvm *kvm, void *dev, u32 vq, u32 page_size, u32 align,
vring_init(&queue->vring, VIRTIO_BLK_QUEUE_SIZE, p, align);
virtio_init_device_vq(&bdev->vdev, queue);
+ if (vq != 0)
+ return 0;
+
+ for (i = 0; i < ARRAY_SIZE(bdev->reqs); i++) {
+ bdev->reqs[i] = (struct blk_dev_req) {
+ .bdev = bdev,
+ .kvm = kvm,
+ };
+ }
+
+ mutex_init(&bdev->mutex);
+ bdev->io_efd = eventfd(0, 0);
+ if (bdev->io_efd < 0)
+ return -errno;
+
+ if (pthread_create(&bdev->io_thread, NULL, virtio_blk_thread, bdev))
+ return -errno;
+
return 0;
}
-static void *virtio_blk_thread(void *dev)
+static void exit_vq(struct kvm *kvm, void *dev, u32 vq)
{
struct blk_dev *bdev = dev;
- u64 data;
- int r;
- kvm__set_thread_name("virtio-blk-io");
+ if (vq != 0)
+ return;
- while (1) {
- r = read(bdev->io_efd, &data, sizeof(u64));
- if (r < 0)
- continue;
- virtio_blk_do_io(bdev->kvm, &bdev->vqs[0], bdev);
- }
-
- pthread_exit(NULL);
- return NULL;
+ close(bdev->io_efd);
+ pthread_cancel(bdev->io_thread);
+ pthread_join(bdev->io_thread, NULL);
}
static int notify_vq(struct kvm *kvm, void *dev, u32 vq)
@@ -259,6 +290,7 @@ static struct virtio_ops blk_dev_virtio_ops = {
.set_guest_features = set_guest_features,
.get_vq_count = get_vq_count,
.init_vq = init_vq,
+ .exit_vq = exit_vq,
.notify_status = notify_status,
.notify_vq = notify_vq,
.get_vq = get_vq,
@@ -269,7 +301,6 @@ static struct virtio_ops blk_dev_virtio_ops = {
static int virtio_blk__init_one(struct kvm *kvm, struct disk_image *disk)
{
struct blk_dev *bdev;
- unsigned int i;
if (!disk)
return -EINVAL;
@@ -279,13 +310,11 @@ static int virtio_blk__init_one(struct kvm *kvm, struct disk_image *disk)
return -ENOMEM;
*bdev = (struct blk_dev) {
- .mutex = MUTEX_INITIALIZER,
.disk = disk,
.blk_config = (struct virtio_blk_config) {
.capacity = disk->size / SECTOR_SIZE,
.seg_max = DISK_SEG_MAX,
},
- .io_efd = eventfd(0, 0),
.kvm = kvm,
};
@@ -295,14 +324,8 @@ static int virtio_blk__init_one(struct kvm *kvm, struct disk_image *disk)
list_add_tail(&bdev->list, &bdevs);
- for (i = 0; i < ARRAY_SIZE(bdev->reqs); i++) {
- bdev->reqs[i].bdev = bdev;
- bdev->reqs[i].kvm = kvm;
- }
-
disk_image__set_callback(bdev->disk, virtio_blk_complete);
- pthread_create(&bdev->io_thread, NULL, virtio_blk_thread, bdev);
if (compat_id == -1)
compat_id = virtio_compat_add_message("virtio-blk", "CONFIG_VIRTIO_BLK");
--
1.9.1
next prev parent reply other threads:[~2018-12-04 11:09 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-04 11:08 [PATCH kvmtool 00/13] Implement reset of virtio devices Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 01/13] ioeventfd: Fix removal of ioeventfd Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 02/13] virtio: Implement notify_status Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 03/13] virtio: Add get_vq_count() callback Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 04/13] virtio: Add get_vq() callback Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 05/13] virtio: Add exit_vq() callback Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 06/13] virtio: Add reset() callback Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 07/13] net/uip: Add exit function Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 08/13] virtio/net: Clean virtqueue state Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 09/13] virtio/net: Implement device and virtqueue reset Julien Thierry
2018-12-04 11:08 ` Julien Thierry [this message]
2018-12-04 11:08 ` [PATCH kvmtool 11/13] threadpool: Add cancel() function Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 12/13] virtio/p9: Implement reset Julien Thierry
2018-12-04 11:08 ` [PATCH kvmtool 13/13] virtio/console: " Julien Thierry
2018-12-05 8:21 ` [PATCH kvmtool 00/13] Implement reset of virtio devices Gerd Hoffmann
2018-12-05 9:10 ` Julien Thierry
2018-12-05 10:09 ` Gerd Hoffmann
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=1543921726-54571-11-git-send-email-julien.thierry@arm.com \
--to=julien.thierry@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=will.deacon@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox