[SLOF] [PATCH v2 04/19] virtio: introduce helper for initializing virt queue
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Thu Jan 21 15:59:49 AEDT 2016
Thomas Huth <thuth at redhat.com> writes:
> On 20.01.2016 13:10, Nikunj A Dadhania wrote:
>> The routine takes care to allocate and set the queue address in the
>> device. Add these calls in virtio-net, virtio-blk and virtio-9p.
>>
>> With the lack of this routine, devices like virtio-blk and virtio-9p did
>> not do a device reset in the driver initialization code. This helper
>> will fix that problem
>>
>> Change the signature of virtio_set_qaddr, accepting queue address as
>> unsigned long argumet.
>>
>> Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
>> ---
> ...
>> diff --git a/lib/libvirtio/virtio-9p.c b/lib/libvirtio/virtio-9p.c
>> index 5a5fd01..81cedb9 100644
>> --- a/lib/libvirtio/virtio-9p.c
>> +++ b/lib/libvirtio/virtio-9p.c
>> @@ -19,6 +19,7 @@
>> #include "virtio-9p.h"
>> #include "p9.h"
>>
>> +struct vqs vq;
>
> Defining this as global sounds wrong - what if there is more than one
> virtio device?
I am not using this vq anywhere apart from initializing the vq
currently. So for other virtio device, same vq struct is going to be
used for the init, and a new desc is allocated.
> Should this variable maybe be part of "struct virtio_device" or so instead?
Number of vqs are not fixed per device, some have 1/2/3. One way will be
to create a per device structure like virtio_blk, and introduce a
private pointer
> If that's not feasible, I think you should at least make it "static".
This seems simple for now.
>
>> /**
>> * Notes for 9P Server config:
>> @@ -189,6 +190,12 @@ int virtio_9p_init(struct virtio_device *dev, void *tx_buf, void *rx_buf,
>> /* Device specific setup - we do not support special features */
>> virtio_set_guest_features(dev, 0);
>>
>> + if(!virtio_queue_init_vq(dev, &vq, 0)) {
>> + virtio_set_status(dev, VIRTIO_STAT_ACKNOWLEDGE|VIRTIO_STAT_DRIVER
>> + |VIRTIO_STAT_FAILED);
>> + return -1;
>> + }
>> +
>> vq_avail = virtio_get_vring_avail(dev, 0);
>> vq_avail->flags = VRING_AVAIL_F_NO_INTERRUPT;
>> vq_avail->idx = 0;
>> diff --git a/lib/libvirtio/virtio-blk.c b/lib/libvirtio/virtio-blk.c
>> index 826f2ea..28d9c29 100644
>> --- a/lib/libvirtio/virtio-blk.c
>> +++ b/lib/libvirtio/virtio-blk.c
>> @@ -18,6 +18,8 @@
>>
>> #define DEFAULT_SECTOR_SIZE 512
>>
>> +struct vqs vq;
>
> dito
>
>> /**
>> * Initialize virtio-block device.
>> * @param dev pointer to virtio device information
>> @@ -44,6 +46,12 @@ virtioblk_init(struct virtio_device *dev)
>> /* Device specific setup - we support F_BLK_SIZE */
>> virtio_set_guest_features(dev, VIRTIO_BLK_F_BLK_SIZE);
>>
>> + if(!virtio_queue_init_vq(dev, &vq, 0)) {
>> + virtio_set_status(dev, VIRTIO_STAT_ACKNOWLEDGE|VIRTIO_STAT_DRIVER
>> + |VIRTIO_STAT_FAILED);
>> + return 0;
>> + }
>> +
>> vq_avail = virtio_get_vring_avail(dev, 0);
>> vq_avail->flags = VRING_AVAIL_F_NO_INTERRUPT;
>> vq_avail->idx = 0;
>
>> +int virtio_queue_init_vq(struct virtio_device *dev, struct vqs *vq, unsigned int id)
>> +{
>> + vq->size = virtio_get_qsize(dev, id);
>> + vq->desc = SLOF_alloc_mem_aligned(virtio_vring_size(vq->size), 4096);
>> + if (!vq->desc) {
>> + printf("memory allocation failed!\n");
>> + return false;
>> + }
>> + memset(vq->desc, 0, virtio_vring_size(vq->size));
>> + virtio_set_qaddr(dev, id, (unsigned long)vq->desc);
>> + vq->avail = virtio_get_vring_avail(dev, id);
>> + vq->used = virtio_get_vring_used(dev, id);
>> + vq->id = id;
>> + return true;
>> +}
>
> Introducing that function is basically a very good idea ... but since
> most of the virtio code seems to use 0 for success and -1 for error
> code, I think it would be better if you'd change the return statements
> here for consistency? If you do not want to change it, could you at
> least change the return type to "bool" instead of "int"?
Will keep it int and return 0/-1
Regards
Nikunj
More information about the SLOF
mailing list