virtiofs: provide a helper function for virtqueue initialization
authorVivek Goyal <vgoyal@redhat.com>
Wed, 19 Aug 2020 22:19:44 +0000 (18:19 -0400)
committerMiklos Szeredi <mszeredi@redhat.com>
Thu, 10 Sep 2020 09:39:22 +0000 (11:39 +0200)
This reduces code duplication and make it little easier to read code.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/virtio_fs.c

index 104f35d..ed8da48 100644 (file)
@@ -24,6 +24,8 @@ enum {
        VQ_REQUEST
 };
 
+#define VQ_NAME_LEN    24
+
 /* Per-virtqueue state */
 struct virtio_fs_vq {
        spinlock_t lock;
@@ -36,7 +38,7 @@ struct virtio_fs_vq {
        bool connected;
        long in_flight;
        struct completion in_flight_zero; /* No inflight requests */
-       char name[24];
+       char name[VQ_NAME_LEN];
 } ____cacheline_aligned_in_smp;
 
 /* A virtio-fs device instance */
@@ -596,6 +598,26 @@ static void virtio_fs_vq_done(struct virtqueue *vq)
        schedule_work(&fsvq->done_work);
 }
 
+static void virtio_fs_init_vq(struct virtio_fs_vq *fsvq, char *name,
+                             int vq_type)
+{
+       strncpy(fsvq->name, name, VQ_NAME_LEN);
+       spin_lock_init(&fsvq->lock);
+       INIT_LIST_HEAD(&fsvq->queued_reqs);
+       INIT_LIST_HEAD(&fsvq->end_reqs);
+       init_completion(&fsvq->in_flight_zero);
+
+       if (vq_type == VQ_REQUEST) {
+               INIT_WORK(&fsvq->done_work, virtio_fs_requests_done_work);
+               INIT_DELAYED_WORK(&fsvq->dispatch_work,
+                                 virtio_fs_request_dispatch_work);
+       } else {
+               INIT_WORK(&fsvq->done_work, virtio_fs_hiprio_done_work);
+               INIT_DELAYED_WORK(&fsvq->dispatch_work,
+                                 virtio_fs_hiprio_dispatch_work);
+       }
+}
+
 /* Initialize virtqueues */
 static int virtio_fs_setup_vqs(struct virtio_device *vdev,
                               struct virtio_fs *fs)
@@ -611,7 +633,7 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
        if (fs->num_request_queues == 0)
                return -EINVAL;
 
-       fs->nvqs = 1 + fs->num_request_queues;
+       fs->nvqs = VQ_REQUEST + fs->num_request_queues;
        fs->vqs = kcalloc(fs->nvqs, sizeof(fs->vqs[VQ_HIPRIO]), GFP_KERNEL);
        if (!fs->vqs)
                return -ENOMEM;
@@ -625,29 +647,17 @@ static int virtio_fs_setup_vqs(struct virtio_device *vdev,
                goto out;
        }
 
+       /* Initialize the hiprio/forget request virtqueue */
        callbacks[VQ_HIPRIO] = virtio_fs_vq_done;
-       snprintf(fs->vqs[VQ_HIPRIO].name, sizeof(fs->vqs[VQ_HIPRIO].name),
-                       "hiprio");
+       virtio_fs_init_vq(&fs->vqs[VQ_HIPRIO], "hiprio", VQ_HIPRIO);
        names[VQ_HIPRIO] = fs->vqs[VQ_HIPRIO].name;
-       INIT_WORK(&fs->vqs[VQ_HIPRIO].done_work, virtio_fs_hiprio_done_work);
-       INIT_LIST_HEAD(&fs->vqs[VQ_HIPRIO].queued_reqs);
-       INIT_LIST_HEAD(&fs->vqs[VQ_HIPRIO].end_reqs);
-       INIT_DELAYED_WORK(&fs->vqs[VQ_HIPRIO].dispatch_work,
-                       virtio_fs_hiprio_dispatch_work);
-       init_completion(&fs->vqs[VQ_HIPRIO].in_flight_zero);
-       spin_lock_init(&fs->vqs[VQ_HIPRIO].lock);
 
        /* Initialize the requests virtqueues */
        for (i = VQ_REQUEST; i < fs->nvqs; i++) {
-               spin_lock_init(&fs->vqs[i].lock);
-               INIT_WORK(&fs->vqs[i].done_work, virtio_fs_requests_done_work);
-               INIT_DELAYED_WORK(&fs->vqs[i].dispatch_work,
-                                 virtio_fs_request_dispatch_work);
-               INIT_LIST_HEAD(&fs->vqs[i].queued_reqs);
-               INIT_LIST_HEAD(&fs->vqs[i].end_reqs);
-               init_completion(&fs->vqs[i].in_flight_zero);
-               snprintf(fs->vqs[i].name, sizeof(fs->vqs[i].name),
-                        "requests.%u", i - VQ_REQUEST);
+               char vq_name[VQ_NAME_LEN];
+
+               snprintf(vq_name, VQ_NAME_LEN, "requests.%u", i - VQ_REQUEST);
+               virtio_fs_init_vq(&fs->vqs[i], vq_name, VQ_REQUEST);
                callbacks[i] = virtio_fs_vq_done;
                names[i] = fs->vqs[i].name;
        }