repository: c:/kernel.org/kvm-guest-drivers-windows branch: master commit 0f7574bdc663aba3ae7f2a8addb2b3a4f34fdd76 Author: Vadim Rozenfeld <vroze...@redhat.com> Date: Fri Oct 1 13:04:00 2010 +0200
[virtio] From: Yan Vugenfirer <yvuge...@redhat.com> Revert published indexes diff --git a/VirtIO/VirtIO.h b/VirtIO/VirtIO.h index e98088b..6125a8f 100644 --- a/VirtIO/VirtIO.h +++ b/VirtIO/VirtIO.h @@ -13,9 +13,6 @@ /* We've given up on this device. */ #define VIRTIO_CONFIG_S_FAILED 0x80 -/* virtio library features bits */ -#define VIRTIO_F_INDIRECT 28 -#define VIRTIO_F_PUBLISH_INDICES 29 /** * virtqueue - a queue to register buffers for sending or receiving. * @callback: the function to call when buffers are consumed (can be NULL). diff --git a/VirtIO/VirtIO.sln b/VirtIO/VirtIO.sln index a9224ed..b50bb8a 100644 --- a/VirtIO/VirtIO.sln +++ b/VirtIO/VirtIO.sln @@ -1,6 +1,6 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VirtIO", "VirtIO.vcproj", "{15DC9616-56BC-474A-90C2-38DBAF64BA06}" EndProject Global diff --git a/VirtIO/VirtIO.vcproj b/VirtIO/VirtIO.vcproj index e4f7760..7cd5731 100644 --- a/VirtIO/VirtIO.vcproj +++ b/VirtIO/VirtIO.vcproj @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" - Version="8.00" + Version="9.00" Name="VirtIO" ProjectGUID="{15DC9616-56BC-474A-90C2-38DBAF64BA06}" RootNamespace="VirtIO" Keyword="MakeFileProj" + TargetFrameworkVersion="131072" > <Platforms> <Platform diff --git a/VirtIO/VirtIOPCI.c b/VirtIO/VirtIOPCI.c index 6d18023..5708de9 100644 --- a/VirtIO/VirtIOPCI.c +++ b/VirtIO/VirtIOPCI.c @@ -97,12 +97,6 @@ bool VirtIODeviceEnableGuestFeature(VirtIODevice * pVirtIODevice, unsigned uFeat return !!(ulValue & (1 << uFeature)); } -bool VirtIODeviceHasFeature(unsigned uFeature) -{ - if (uFeature == VIRTIO_F_PUBLISH_INDICES) return TRUE; - return FALSE; -} - ///////////////////////////////////////////////////////////////////////////////////// // // Reset device @@ -206,7 +200,7 @@ static void vp_notify(struct virtqueue *vq) ULONG VirtIODeviceISR(VirtIODevice * pVirtIODevice) { ULONG status; - DPrintf(6, ("%s\n", __FUNCTION__)); + DPrintf(4, ("%s\n", __FUNCTION__)); status = ReadVirtIODeviceByte(pVirtIODevice->addr + VIRTIO_PCI_ISR); @@ -334,3 +328,8 @@ u32 VirtIODeviceGetQueueSize(struct virtqueue *vq) struct virtio_pci_vq_info *info = vq->priv; return info->num; } + +void* VirtIODeviceDetachUnusedBuf(struct virtqueue *vq) +{ + return vring_detach_unused_buf(vq); +} diff --git a/VirtIO/VirtIORing.c b/VirtIO/VirtIORing.c index 585ada4..207af87 100644 --- a/VirtIO/VirtIORing.c +++ b/VirtIO/VirtIORing.c @@ -44,6 +44,9 @@ struct _declspec(align(PAGE_SIZE)) vring_virtqueue /* Number we've added since last sync. */ unsigned int num_added; + /* Last used index we've seen. */ + u16 last_used_idx; + /* How to notify other side. FIXME: commonalize hcalls! */ void (*notify)(struct virtqueue *vq); @@ -231,27 +234,25 @@ static void vring_shutdown(struct virtqueue *_vq) static bool more_used(const struct vring_virtqueue *vq) { - return vring_last_used(&vq->vring) != vq->vring.used->idx; + return vq->last_used_idx != vq->vring.used->idx; } static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len) { struct vring_virtqueue *vq = to_vvq(_vq); void *ret; - struct vring_used_elem *u; unsigned int i; if (!more_used(vq)) { - DPrintf(4, ("No more buffers in queue: last_used_idx %d vring.used->idx %d\n", - vring_last_used(&vq->vring), - vq->vring.used->idx)); + DPrintf(4, ("No more buffers in queue: last_used_idx %d vring.used->idx %d\n", vq->last_used_idx, vq->vring.used->idx)); return NULL; } - u = &vq->vring.used->ring[vring_last_used(&vq->vring) % vq->vring.num]; - i = u->id; - *len = u->len; + /* Only get used array entries after they have been exposed by host. */ + rmb(); + i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id; + *len = vq->vring.used->ring[vq->last_used_idx% vq->vring.num].len; DPrintf(4, ("%s>>> id %d, len %d\n", __FUNCTION__, i, *len) ); @@ -267,7 +268,7 @@ static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len) /* detach_buf clears data, so grab it now. */ ret = vq->data[i]; detach_buf(vq, i); - vring_last_used(&vq->vring)++; + vq->last_used_idx++; return ret; } @@ -316,7 +317,7 @@ void initialize_virtqueue(struct vring_virtqueue *vq, vq->vq.vq_ops = &vring_vq_ops; vq->notify = notify; vq->broken = 0; - vring_last_used(&vq->vring) = 0; + vq->last_used_idx = 0; vq->num_added = 0; /* No callback? Tell other side not to bother us. */ @@ -365,3 +366,18 @@ void vring_del_virtqueue(struct virtqueue *vq) MmFreeContiguousMemory(to_vvq(vq)); } } + +void* vring_detach_unused_buf(struct virtqueue *_vq) +{ + struct vring_virtqueue *vq = to_vvq(_vq); + unsigned int i; + void *buf; + for (i = 0; i < vq->vring.num; i++) { + if (!vq->data[i]) + continue; + buf = vq->data[i]; + detach_buf(vq, i); + return buf; + } + return NULL; +} \ No newline at end of file diff --git a/VirtIO/virtio_pci.h b/VirtIO/virtio_pci.h index 0c81e10..918a240 100644 --- a/VirtIO/virtio_pci.h +++ b/VirtIO/virtio_pci.h @@ -59,7 +59,6 @@ void VirtIODeviceDumpRegisters(VirtIODevice * pVirtIODevice); bool VirtIODeviceGetHostFeature(VirtIODevice * pVirtIODevice, unsigned uFeature); bool VirtIODeviceEnableGuestFeature(VirtIODevice * pVirtIODevice, unsigned uFeature); -bool VirtIODeviceHasFeature(unsigned uFeature); void VirtIODeviceGet(VirtIODevice * pVirtIODevice, unsigned offset, void *buf, @@ -75,6 +74,7 @@ struct virtqueue *VirtIODeviceFindVirtualQueue(VirtIODevice *vp_dev, void VirtIODeviceDeleteVirtualQueue(struct virtqueue *vq); u32 VirtIODeviceGetQueueSize(struct virtqueue *vq); void VirtIODeviceRenewVirtualQueue(struct virtqueue *vq); +void* VirtIODeviceDetachUnusedBuf(struct virtqueue *vq); void VirtIODeviceAddStatus(VirtIODevice * pVirtIODevice, u8 status); void VirtIODeviceRemoveStatus(VirtIODevice * pVirtIODevice, u8 status); diff --git a/VirtIO/virtio_ring.h b/VirtIO/virtio_ring.h index 0249064..774183b 100644 --- a/VirtIO/virtio_ring.h +++ b/VirtIO/virtio_ring.h @@ -67,8 +67,6 @@ struct vring { struct vring_avail *avail; struct vring_used *used; - - u16 *vring_last_used_ptr; }; #pragma pack (pop) @@ -84,7 +82,6 @@ struct vring { * __u16 avail_flags; * __u16 avail_idx; * __u16 available[num]; - * __u16 last_used_idx; * * // Padding to the next page boundary. * char pad[]; @@ -93,13 +90,9 @@ struct vring { * __u16 used_flags; * __u16 used_idx; * struct vring_used_elem used[num]; - * __u16 last_avail_idx; * }; */ -#define vring_last_used(vr) ((vr)->avail->ring[(vr)->num]) -#define vring_last_avail(vr) (*(__u16 *)&(vr)->used->ring[(vr)->num]) - static void vring_init(struct vring *vr, unsigned int num, void *p, unsigned long pagesize) { @@ -108,14 +101,13 @@ static void vring_init(struct vring *vr, unsigned int num, void *p, vr->avail = (void *) ((u8 *)p + num*sizeof(struct vring_desc)); vr->used = (void *)(((ULONG_PTR)&vr->avail->ring[num] + pagesize-1) & ~((ULONG_PTR)pagesize - 1)); - vr->vring_last_used_ptr = &vring_last_used(vr); } static unsigned vring_size(unsigned int num, unsigned long pagesize) { - return ((sizeof(struct vring_desc) * num + sizeof(u16) * (3 + num) + return ((sizeof(struct vring_desc) * num + sizeof(u16) * (2 + num) + pagesize - 1) & ~((ULONG_PTR)pagesize - 1)) - + sizeof(u16) * 3 + sizeof(struct vring_used_elem) * num; + + sizeof(u16) * 2 + sizeof(struct vring_used_elem) * num; } struct virtqueue *vring_new_virtqueue(unsigned int num, @@ -125,7 +117,6 @@ struct virtqueue *vring_new_virtqueue(unsigned int num, bool (*callback)(struct virtqueue *vq)); void vring_del_virtqueue(struct virtqueue *vq); - - +void* vring_detach_unused_buf(struct virtqueue *vq); #endif /* _LINUX_VIRTIO_RING_H */ -- To unsubscribe from this list: send the line "unsubscribe kvm-commits" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html