|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/4] Apply new PDO revision numbering policy
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
include/revision.h | 43 +++++++++++++
src/xenvif/pdo.c | 181 ++++++++++++++++++-----------------------------------
2 files changed, 104 insertions(+), 120 deletions(-)
create mode 100644 include/revision.h
diff --git a/include/revision.h b/include/revision.h
new file mode 100644
index 0000000..6ae273c
--- /dev/null
+++ b/include/revision.h
@@ -0,0 +1,43 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the
+ * following disclaimer in the documentation and/or other
+ * materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _REVISION_H
+#define _REVISION_H
+
+// Key:
+// C - XENBUS_CACHE_INTERFACE
+// V - XENVIF_VIF_INTERFACE
+
+// REVISION C V
+#define DEFINE_REVISION_TABLE \
+ DEFINE_REVISION(0x08000002, 1, 2)
+
+#endif // _REVISION_H
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index ec4a248..1470c8a 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -58,6 +58,7 @@
#include "assert.h"
#include "util.h"
#include "version.h"
+#include "revision.h"
#define PDO_POOL 'ODP'
@@ -76,9 +77,6 @@ struct _XENVIF_PDO {
UNICODE_STRING ContainerID;
- PULONG Revision;
- ULONG Count;
-
ETHERNET_ADDRESS PermanentAddress;
ETHERNET_ADDRESS CurrentAddress;
@@ -528,99 +526,52 @@ fail1:
#define MAXTEXTLEN 1024
-static NTSTATUS
-PdoAddRevision(
- IN PXENVIF_PDO Pdo,
- IN ULONG Revision
- )
-{
- PVOID Buffer;
- ULONG Count;
- NTSTATUS status;
-
- Count = Pdo->Count + 1;
-
- Buffer = __PdoAllocate(sizeof (ULONG) * Count);
-
- status = STATUS_NO_MEMORY;
- if (Buffer == NULL)
- goto fail1;
-
- if (Pdo->Revision != NULL) {
- RtlCopyMemory(Buffer,
- Pdo->Revision,
- sizeof (ULONG) * Pdo->Count);
- __PdoFree(Pdo->Revision);
- }
+typedef struct _XENVIF_PDO_REVISION {
+ ULONG Number;
+ ULONG CacheInterfaceVersion;
+ ULONG VifInterfaceVersion;
+} XENVIF_PDO_REVISION, *PXENVIF_PDO_REVISION;
- Pdo->Revision = Buffer;
- Pdo->Revision[Pdo->Count] = Revision;
+#define DEFINE_REVISION(_N, _C, _V) \
+ { (_N), (_C), (_V) }
- Pdo->Count++;
- ASSERT3U(Pdo->Count, <=, 64);
-
- return STATUS_SUCCESS;
-
-fail1:
- Error("fail1 (%08x)\n", status);
+static XENVIF_PDO_REVISION PdoRevision[] = {
+ DEFINE_REVISION_TABLE
+};
- return status;
-}
+#undef DEFINE_REVISION
-static NTSTATUS
-PdoSetRevisions(
+static VOID
+PdoDumpRevisions(
IN PXENVIF_PDO Pdo
)
{
- ULONG Cache;
- ULONG Revision;
- NTSTATUS status;
+ ULONG Index;
- Revision = MAJOR_VERSION << 24;
-
- // Enumerate all possible combinations of exported interface versions
since v1
- // and add a PDO revsion for each combination that's currently supported.
Note that
- // the exported interfaces include any interface queries we pass through.
- // We must enumerate from v1 to ensure that revision numbers don't change
- // even when a particular combination of interface versions becomes
- // unsupported. (See README.md for API versioning policy).
-
- for (Cache = 1; Cache <= XENBUS_CACHE_INTERFACE_VERSION_MAX; Cache++) {
- ULONG Vif;
-
- for (Vif = 1; Vif <= XENVIF_VIF_INTERFACE_VERSION_MAX; Vif++) {
- Revision++;
-
- if (Cache >= XENBUS_CACHE_INTERFACE_VERSION_MIN &&
- Vif >= XENVIF_VIF_INTERFACE_VERSION_MIN) {
- Info("%08X -> "
- "CACHE v%u "
- "VIF v%u\n",
- Revision,
- Cache,
- Vif);
-
- status = PdoAddRevision(Pdo, Revision);
- if (!NT_SUCCESS(status))
- goto fail1;
- }
- }
- }
+ UNREFERENCED_PARAMETER(Pdo);
- ASSERT(Pdo->Count > 0);
- return STATUS_SUCCESS;
+ for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+ PXENVIF_PDO_REVISION Revision = &PdoRevision[Index];
-fail1:
- Error("fail1 (%08x)\n", status);
+ ASSERT3U(Revision->CacheInterfaceVersion, >=,
XENBUS_CACHE_INTERFACE_VERSION_MIN);
+ ASSERT3U(Revision->CacheInterfaceVersion, <=,
XENBUS_CACHE_INTERFACE_VERSION_MAX);
+ ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+ Revision->CacheInterfaceVersion ==
XENBUS_CACHE_INTERFACE_VERSION_MAX));
- if (Pdo->Revision != NULL) {
- __PdoFree(Pdo->Revision);
- Pdo->Revision = NULL;
- }
+ ASSERT3U(Revision->VifInterfaceVersion, >=,
XENVIF_VIF_INTERFACE_VERSION_MIN);
+ ASSERT3U(Revision->VifInterfaceVersion, <=,
XENVIF_VIF_INTERFACE_VERSION_MAX);
+ ASSERT(IMPLY(Index == ARRAYSIZE(PdoRevision) - 1,
+ Revision->VifInterfaceVersion ==
XENVIF_VIF_INTERFACE_VERSION_MAX));
- Pdo->Count = 0;
+ ASSERT3U(Revision->Number >> 24, ==, MAJOR_VERSION);
- return status;
+ Info("%08X -> "
+ "CACHE v%u "
+ "VIF v%u\n",
+ Revision->Number,
+ Revision->CacheInterfaceVersion,
+ Revision->VifInterfaceVersion);
+ }
}
static FORCEINLINE PDEVICE_OBJECT
@@ -1823,12 +1774,12 @@ PdoQueryId(
case BusQueryHardwareIDs:
Trace("BusQueryHardwareIDs\n");
- Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof
(WCHAR);
+ Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN *
ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
break;
case BusQueryCompatibleIDs:
Trace("BusQueryCompatibleIDs\n");
- Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN * Pdo->Count) * sizeof
(WCHAR);
+ Id.MaximumLength = (USHORT)(MAX_DEVICE_ID_LEN *
ARRAYSIZE(PdoRevision)) * sizeof (WCHAR);
break;
break;
@@ -1880,16 +1831,18 @@ PdoQueryId(
break;
case BusQueryDeviceID: {
- ULONG Index;
+ ULONG Index;
+ PXENVIF_PDO_REVISION Revision;
Type = REG_SZ;
- Index = Pdo->Count - 1;
+ Index = ARRAYSIZE(PdoRevision) - 1;
+ Revision = &PdoRevision[Index];
status = RtlStringCbPrintfW(Buffer,
Id.MaximumLength,
L"XENVIF\\VEN_%hs&DEV_NET&REV_%08X",
__PdoGetVendorName(Pdo),
- Pdo->Revision[Index]);
+ Revision->Number);
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
@@ -1904,12 +1857,14 @@ PdoQueryId(
Type = REG_MULTI_SZ;
Length = Id.MaximumLength;
- for (Index = 0; Index < Pdo->Count; Index++) {
+ for (Index = 0; Index < ARRAYSIZE(PdoRevision); Index++) {
+ PXENVIF_PDO_REVISION Revision = &PdoRevision[Index];
+
status = RtlStringCbPrintfW(Buffer,
Length,
L"XENVIF\\VEN_%hs&DEV_NET&REV_%08X",
__PdoGetVendorName(Pdo),
- Pdo->Revision[Index]);
+ Revision->Number);
ASSERT(NT_SUCCESS(status));
Buffer += wcslen(Buffer);
@@ -2569,21 +2524,17 @@ PdoCreate(
if (!NT_SUCCESS(status))
goto fail6;
- status = PdoSetRevisions(Pdo);
- if (!NT_SUCCESS(status))
- goto fail7;
-
status = BusInitialize(Pdo, &Pdo->BusInterface);
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail7;
status = VifInitialize(Pdo, &Pdo->VifContext);
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail8;
status = FrontendInitialize(Pdo, &Pdo->Frontend);
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail9;
FdoGetSuspendInterface(Fdo,&Pdo->SuspendInterface);
@@ -2591,27 +2542,28 @@ PdoCreate(
status = FdoAddPhysicalDeviceObject(Fdo, Pdo);
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail10;
status = STATUS_UNSUCCESSFUL;
if (__PdoIsEjectRequested(Pdo))
- goto fail12;
+ goto fail11;
- Info("%p (%s: Highest Revision = %08X)\n",
+ Info("%p (%s)\n",
PhysicalDeviceObject,
- __PdoGetName(Pdo),
- Pdo->Revision[Pdo->Count - 1]);
+ __PdoGetName(Pdo));
+
+ PdoDumpRevisions(Pdo);
PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
-fail12:
- Error("fail12\n");
+fail11:
+ Error("fail11\n");
FdoRemovePhysicalDeviceObject(Fdo, Pdo);
-fail11:
- Error("fail11\n");
+fail10:
+ Error("fail10\n");
(VOID) __PdoClearEjectRequested(Pdo);
@@ -2623,23 +2575,16 @@ fail11:
FrontendTeardown(__PdoGetFrontend(Pdo));
Pdo->Frontend = NULL;
-fail10:
- Error("fail10\n");
-
- VifTeardown(Pdo->VifContext);
- Pdo->VifContext = NULL;
-
fail9:
Error("fail9\n");
- BusTeardown(&Pdo->BusInterface);
+ VifTeardown(Pdo->VifContext);
+ Pdo->VifContext = NULL;
fail8:
Error("fail8\n");
- __PdoFree(Pdo->Revision);
- Pdo->Revision = NULL;
- Pdo->Count = 0;
+ BusTeardown(&Pdo->BusInterface);
fail7:
Error("fail7\n");
@@ -2724,10 +2669,6 @@ PdoDestroy(
BusTeardown(&Pdo->BusInterface);
- __PdoFree(Pdo->Revision);
- Pdo->Revision = NULL;
- Pdo->Count = 0;
-
RtlFreeUnicodeString(&Pdo->ContainerID);
RtlZeroMemory(&Pdo->ContainerID, sizeof (UNICODE_STRING));
--
2.1.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |