Re: [PATCH v6 09/17] virtio: add minimal support for virtqueues

Paolo Bonzini
2014-07-11T09:32:25Z

Il 11/07/2014 11:23, Paolo Bonzini ha scritto:
>
>> +static struct virtqueue *vm_setup_vq(struct virtio_device *vdev,
>> + unsigned index,
>> + void (*callback)(struct virtqueue *vq),
>> + const char *name)
>> +{
>> + struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev);
>> + struct vring_virtqueue *vq;
>> + void *queue;
>> + unsigned num = VIRTIO_MMIO_QUEUE_NUM_MIN;
>> +
>> + vq = alloc(sizeof(*vq));
>
> You can move the allocation of vq to vm_find_vqs (interleaving alloc and
> alloc_aligned causes some fragmentation), allocating a single block
> instead of one per vq.

... or even use static storage for the "struct virtqueue". You can just
merge "struct vring_virtqueue" and "struct virtqueue", as the idea of
other virtqueue transport never materialized. Then:

+static struct virtqueue in_vq;
+static struct virtqueue out_vq;
+
void chr_testdev_init(void)
{
const char *io_names[] = { "input", "output" };
- struct virtqueue *vqs[2];
+ struct virtqueue *vqs[2] = { &in_vq, &out_vq };
int ret;

vcon = virtio_bind(VIRTIO_ID_CONSOLE);
if (vcon == NULL) {
printf("%s: %s: can't find a virtio-console\n",
__func__, TESTDEV_NAME);
return;
}

ret = vcon->config->find_vqs(vcon, 2, vqs, NULL, io_names);
if (ret < 0) {
printf("%s: %s: can't init virtqueues\n",
__func__, TESTDEV_NAME);
vcon = NULL;
return;
}

- in_vq = vqs[0];
- out_vq = vqs[1];
}

Paolo