Am 30.10.2015 um 13:17 schrieb Cornelia Huck:
> On Tue, 27 Oct 2015 23:48:51 +0100
> Christian Borntraeger <[email protected]> wrote:
>
>> With all infrastructure in place, lets provide dma_ops for virtio
>> devices on s390.
>>
>> Signed-off-by: Christian Borntraeger <[email protected]>
>> ---
>> drivers/s390/virtio/kvm_virtio.c | 2 ++
>> drivers/s390/virtio/virtio_ccw.c | 2 ++
>> 2 files changed, 4 insertions(+)
>>
>> diff --git a/drivers/s390/virtio/kvm_virtio.c
>> b/drivers/s390/virtio/kvm_virtio.c
>> index 53fb975..05adaa9 100644
>> --- a/drivers/s390/virtio/kvm_virtio.c
>> +++ b/drivers/s390/virtio/kvm_virtio.c
>> @@ -13,6 +13,7 @@
>> #include <linux/kernel_stat.h>
>> #include <linux/init.h>
>> #include <linux/bootmem.h>
>> +#include <linux/dma-mapping.h>
>> #include <linux/err.h>
>> #include <linux/virtio.h>
>> #include <linux/virtio_config.h>
>> @@ -318,6 +319,7 @@ static void add_kvm_device(struct kvm_device_desc *d,
>> unsigned int offset)
>> return;
>> }
>>
>> + kdev->vdev.dev.archdata.dma_ops = &dma_noop_ops;
>
> This provides dma_ops for the vdev, while Andy's virtio code looks for
> dma_ops in the vdev's parent (in the ccw and pci cases, the proxy
> device; in this case, it would be our root device).
>
> With
>
> diff --git a/drivers/s390/virtio/kvm_virtio.c
> b/drivers/s390/virtio/kvm_virtio.c
> index 05adaa9..5f79c52 100644
> --- a/drivers/s390/virtio/kvm_virtio.c
> +++ b/drivers/s390/virtio/kvm_virtio.c
> @@ -319,7 +319,6 @@ static void add_kvm_device(struct kvm_device_desc *d,
> unsigned int offset)
> return;
> }
>
> - kdev->vdev.dev.archdata.dma_ops = &dma_noop_ops;
> kdev->vdev.dev.parent = kvm_root;
> kdev->vdev.id.device = d->type;
> kdev->vdev.config = &kvm_vq_configspace_ops;
> @@ -473,6 +472,7 @@ static int __init kvm_devices_init(void)
> vmem_remove_mapping(total_memory_size, PAGE_SIZE);
> return rc;
> }
> + kvm_root->archdata.dma_ops = &dma_noop_ops;
>
> INIT_WORK(&hotplug_work, hotplug_devices);
>
> applied (and the endianness fix in the virtio code), I can boot a
> s390-virtio guest as well.
I am currently reworking this to
static inline struct dma_map_ops *get_dma_ops(struct device *dev)
{
if (dev && dev->archdata.dma_ops)
return dev->archdata.dma_ops;
return &dma_noop_ops;
}
Which uses the dma_noop_ops for everything unless the device overrides (PCI
does)
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html