Commit cd54c623 authored by Jiri Pirko's avatar Jiri Pirko Committed by Michael S. Tsirkin
Browse files

virtio_console: convert to use virtio_find_vqs_info()



Instead of passing separate names and callbacks arrays
to virtio_find_vqs(), allocate one of virtual_queue_info structs and
pass it to virtio_find_vqs_info().

Suggested-by: default avatarXuan Zhuo <xuanzhuo@linux.alibaba.com>
Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Message-Id: <20240708074814.1739223-12-jiri@resnulli.us>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 0c60458b
Loading
Loading
Loading
Loading
+18 −26
Original line number Diff line number Diff line
@@ -1804,8 +1804,7 @@ static void config_work_handler(struct work_struct *work)

static int init_vqs(struct ports_device *portdev)
{
	vq_callback_t **io_callbacks;
	char **io_names;
	struct virtqueue_info *vqs_info;
	struct virtqueue **vqs;
	u32 i, j, nr_ports, nr_queues;
	int err;
@@ -1814,15 +1813,12 @@ static int init_vqs(struct ports_device *portdev)
	nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;

	vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
	io_callbacks = kmalloc_array(nr_queues, sizeof(vq_callback_t *),
				     GFP_KERNEL);
	io_names = kmalloc_array(nr_queues, sizeof(char *), GFP_KERNEL);
	vqs_info = kcalloc(nr_queues, sizeof(*vqs_info), GFP_KERNEL);
	portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
					GFP_KERNEL);
	portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
					 GFP_KERNEL);
	if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
	    !portdev->out_vqs) {
	if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) {
		err = -ENOMEM;
		goto free;
	}
@@ -1833,30 +1829,28 @@ static int init_vqs(struct ports_device *portdev)
	 * 0 before others.
	 */
	j = 0;
	io_callbacks[j] = in_intr;
	io_callbacks[j + 1] = out_intr;
	io_names[j] = "input";
	io_names[j + 1] = "output";
	vqs_info[j].callback = in_intr;
	vqs_info[j + 1].callback = out_intr;
	vqs_info[j].name = "input";
	vqs_info[j + 1].name = "output";
	j += 2;

	if (use_multiport(portdev)) {
		io_callbacks[j] = control_intr;
		io_callbacks[j + 1] = NULL;
		io_names[j] = "control-i";
		io_names[j + 1] = "control-o";
		vqs_info[j].callback = control_intr;
		vqs_info[j].name = "control-i";
		vqs_info[j + 1].name = "control-o";

		for (i = 1; i < nr_ports; i++) {
			j += 2;
			io_callbacks[j] = in_intr;
			io_callbacks[j + 1] = out_intr;
			io_names[j] = "input";
			io_names[j + 1] = "output";
			vqs_info[j].callback = in_intr;
			vqs_info[j + 1].callback = out_intr;
			vqs_info[j].name = "input";
			vqs_info[j + 1].name = "output";
		}
	}
	/* Find the queues. */
	err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
			      io_callbacks,
			      (const char **)io_names, NULL);
	err = virtio_find_vqs_info(portdev->vdev, nr_queues, vqs,
				   vqs_info, NULL);
	if (err)
		goto free;

@@ -1874,8 +1868,7 @@ static int init_vqs(struct ports_device *portdev)
			portdev->out_vqs[i] = vqs[j + 1];
		}
	}
	kfree(io_names);
	kfree(io_callbacks);
	kfree(vqs_info);
	kfree(vqs);

	return 0;
@@ -1883,8 +1876,7 @@ static int init_vqs(struct ports_device *portdev)
free:
	kfree(portdev->out_vqs);
	kfree(portdev->in_vqs);
	kfree(io_names);
	kfree(io_callbacks);
	kfree(vqs_info);
	kfree(vqs);

	return err;