[SLOF] [PATCH v3] virtio-scsi: initialize vring avail queue buffers

Thomas Huth thuth at redhat.com
Tue Jan 24 20:55:20 AEDT 2017


On 24.01.2017 10:44, Laurent Vivier wrote:
> From: Laurent Vivier <lvivier at ibm-p8-virt-03.lab.eng.rdu.redhat.com>
> 
> virtioscsi_init() uses the result of virtio_get_vring_avail() whereas
> the queue is not enabled: on the first boot, its value is NULL and
> the driver uses this to communicate with the device. After a reboot,
> its value is the one given by the OS driver, and it works if the
> address is in a range SLOF can access.
> 
> In some cases, for instance with NUMA nodes and hotplugged memory,
> SLOF cannot access the address set by the kernel, and virtioscsi_init()
> fails with a data storage exception.
> 
> To set the vring avail buffer address, we need to enable the queue, what
> is done by virtio_set_qaddr().
> 
> This patch fixes the problem by calling virtio_queue_init_vq() (like other
> virtio drivers) in virtioscsi_init() as it allocates memory and enables the
> queue. virtio_queue_init_vq() also replaces the calls to virtio_vring_size()
> and virtio_get_vring_avail().
> 
> Signed-off-by: Laurent Vivier <lvivier at redhat.com>
> ---
> v3: remove setup-virt-queues
> 
> v2: move vqs declarations to the function
>     only call virtio_cpu_to_modern16() once
>     add CC: to Nikunj
> 
>  board-qemu/slof/virtio-scsi.fs | 17 -----------------
>  lib/libvirtio/virtio-scsi.c    | 28 +++++++++++++++-------------
>  2 files changed, 15 insertions(+), 30 deletions(-)
> 
> diff --git a/board-qemu/slof/virtio-scsi.fs b/board-qemu/slof/virtio-scsi.fs
> index 4fedeee..d9f42ac 100644
> --- a/board-qemu/slof/virtio-scsi.fs
> +++ b/board-qemu/slof/virtio-scsi.fs
> @@ -169,22 +169,6 @@ scsi-close        \ no further scsi words required
>  0 VALUE queue-event-addr
>  0 VALUE queue-cmd-addr
>  
> -: setup-virt-queues
> -    \ add 3 queues 0-controlq, 1-eventq, 2-cmdq
> -    \ fixme: do we need to find more than the above 3 queues if exists
> -    virtiodev 0 virtio-get-qsize virtio-vring-size
> -    alloc-mem to queue-control-addr
> -    virtiodev 0 queue-control-addr virtio-set-qaddr
> -
> -    virtiodev 1 virtio-get-qsize virtio-vring-size
> -    alloc-mem to queue-event-addr
> -    virtiodev 1 queue-event-addr virtio-set-qaddr
> -
> -    virtiodev 2 virtio-get-qsize virtio-vring-size
> -    alloc-mem to queue-cmd-addr
> -    virtiodev 2 queue-cmd-addr virtio-set-qaddr
> -;

I think you can now also remove the queue-control-addr, queue-event-addr
and the queue-cmd-addr variable right before that function.
(and maybe also the virtio-get-qsize, virtio-vring-size and
virtio-set-qaddr wrappers - but that should likely be done in a separate
patch instead)

 Thomas





More information about the SLOF mailing list