This patch changes virtio_pci to treat the PCI config space as opaque memory. This is closer semantically to what the virtio API exposes and is it a lot easier to implement on the guest side. It also doesn't preclude a more PCI-like treatment of the ABI. Signed-off-by: Anthony Liguori <aliguori@xxxxxxxxxx> diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index eb9a8e0..36e86eb 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -112,46 +112,11 @@ static void vp_get(struct virtio_device *vdev, unsigned offset, { struct virtio_pci_device *vp_dev = to_vp_device(vdev); void *ioaddr = vp_dev->ioaddr + VIRTIO_PCI_CONFIG + offset; + u8 *ptr = buf; + int i; - /* We translate appropriately sized get requests into more natural - * IO operations. These functions also take care of endianness - * conversion. */ - switch (len) { - case 1: { - u8 val; - val = ioread8(ioaddr); - memcpy(buf, &val, sizeof(val)); - break; - } - case 2: { - u16 val; - val = ioread16(ioaddr); - memcpy(buf, &val, sizeof(val)); - break; - } - case 4: { - u32 val; - val = ioread32(ioaddr); - memcpy(buf, &val, sizeof(val)); - break; - } - case 8: { - u64 val; - val = (u64)ioread32(ioaddr) << 32; - val |= ioread32(ioaddr + 4); - memcpy(buf, &val, sizeof(val)); - break; - } - - default: { - uint8_t *ptr = buf; - int i; - - for (i = 0; i < len; i++) - ptr[i] = ioread8(ioaddr + i); - break; - } - } + for (i = 0; i < len; i++) + ptr[i] = ioread8(ioaddr + i); } /* the config->set() implementation. it's symmetric to the config->get() @@ -161,42 +126,11 @@ static void vp_set(struct virtio_device *vdev, unsigned offset, { struct virtio_pci_device *vp_dev = to_vp_device(vdev); void *ioaddr = vp_dev->ioaddr + VIRTIO_PCI_CONFIG + offset; + const u8 *ptr = buf; + int i; - switch (len) { - case 1: { - u8 val; - memcpy(&val, buf, sizeof(val)); - iowrite8(val, ioaddr); - break; - } - case 2: { - u16 val; - memcpy(&val, buf, sizeof(val)); - iowrite16(val, ioaddr); - break; - } - case 4: { - u32 val; - memcpy(&val, buf, sizeof(val)); - iowrite32(val, ioaddr); - break; - } - case 8: { - u64 val; - memcpy(&val, buf, sizeof(val)); - iowrite32(val >> 32, ioaddr); - iowrite32(val, ioaddr + 4); - break; - } - default: { - const uint8_t *ptr = buf; - int i; - - for (i = 0; i < len; i++) - iowrite8(ptr[i], ioaddr + i); - break; - } - } + for (i = 0; i < len; i++) + iowrite8(ptr[i], ioaddr + i); } /* config->{get,set}_status() implementations */ @@ -281,7 +215,7 @@ static struct virtqueue *vp_find_vq(struct virtio_device *vdev, unsigned index, info->queue_index = index; info->num = num; - info->queue = kmalloc(vring_size(num), GFP_KERNEL | __GFP_ZERO); + info->queue = kzalloc(PAGE_ALIGN(vring_size(num)), GFP_KERNEL); if (info->queue == NULL) { err = -ENOMEM; goto out_info; _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/virtualization