Re: [PATCH 06/10] s390/cio: add basic protected virtualization support

Cornelia Huck
2019-05-13T09:41:36Z

On Fri, 26 Apr 2019 20:32:41 +0200
Halil Pasic <pasic@linux.ibm.com> wrote:

> As virtio-ccw devices are channel devices, we need to use the dma area
> for any communication with the hypervisor.
>
> This patch addresses the most basic stuff (mostly what is required for
> virtio-ccw), and does take care of QDIO or any devices.

"does not take care of QDIO", surely? (Also, what does "any devices"
mean? Do you mean "every arbitrary device", perhaps?)

>
> An interesting side effect is that virtio structures are now going to
> get allocated in 31 bit addressable storage.

Hm...

>
> Signed-off-by: Halil Pasic <pasic@linux.ibm.com>
> ---
> arch/s390/include/asm/ccwdev.h | 4 +++
> drivers/s390/cio/ccwreq.c | 8 ++---
> drivers/s390/cio/device.c | 65 +++++++++++++++++++++++++++++++++-------
> drivers/s390/cio/device_fsm.c | 40 ++++++++++++-------------
> drivers/s390/cio/device_id.c | 18 +++++------
> drivers/s390/cio/device_ops.c | 21 +++++++++++--
> drivers/s390/cio/device_pgid.c | 20 ++++++-------
> drivers/s390/cio/device_status.c | 24 +++++++--------
> drivers/s390/cio/io_sch.h | 21 +++++++++----
> drivers/s390/virtio/virtio_ccw.c | 10 -------
> 10 files changed, 148 insertions(+), 83 deletions(-)

(...)

> diff --git a/drivers/s390/virtio/virtio_ccw.c b/drivers/s390/virtio/virtio_ccw.c
> index 6d989c360f38..bb7a92316fc8 100644
> --- a/drivers/s390/virtio/virtio_ccw.c
> +++ b/drivers/s390/virtio/virtio_ccw.c
> @@ -66,7 +66,6 @@ struct virtio_ccw_device {
> bool device_lost;
> unsigned int config_ready;
> void *airq_info;
> - u64 dma_mask;
> };
>
> struct vq_info_block_legacy {
> @@ -1255,16 +1254,7 @@ static int virtio_ccw_online(struct ccw_device *cdev)
> ret = -ENOMEM;
> goto out_free;
> }
> -
> vcdev->vdev.dev.parent = &cdev->dev;
> - cdev->dev.dma_mask = &vcdev->dma_mask;
> - /* we are fine with common virtio infrastructure using 64 bit DMA */
> - ret = dma_set_mask_and_coherent(&cdev->dev, DMA_BIT_MASK(64));
> - if (ret) {
> - dev_warn(&cdev->dev, "Failed to enable 64-bit DMA.\n");
> - goto out_free;
> - }

This means that vring structures now need to fit into 31 bits as well,
I think? Is there any way to reserve the 31 bit restriction for channel
subsystem structures and keep vring in the full 64 bit range? (Or am I
fundamentally misunderstanding something?)

> -
> vcdev->config_block = kzalloc(sizeof(*vcdev->config_block),
> GFP_DMA | GFP_KERNEL);
> if (!vcdev->config_block) {