repository: c:/kernel.org/kvm-guest-drivers-windows
branch: master
commit 0f7574bdc663aba3ae7f2a8addb2b3a4f34fdd76
Author: Vadim Rozenfeld <[email protected]>
Date: Fri Oct 1 13:04:00 2010 +0200
[virtio] From: Yan Vugenfirer <[email protected]> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html