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: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Signed-off-by: Jiri Pirko <jiri@nvidia.com> Message-Id: <20240708074814.1739223-12-jiri@resnulli.us> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
0c60458b18
commit
cd54c623a8
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user