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

Reply via email to