|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Fix compatibility with older backends
There was a problem when XENVIF was brought up on backends that don't
implement a control ring. This patch fixes the issue.
Reportted-by: Rafal Wojdyla <omeg@xxxxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
src/xenvif/controller.c | 143 +++++++++++++++---------------------------------
src/xenvif/frontend.c | 115 ++++++++++++++++++++++++--------------
src/xenvif/frontend.h | 5 --
src/xenvif/receiver.c | 18 ------
4 files changed, 119 insertions(+), 162 deletions(-)
diff --git a/src/xenvif/controller.c b/src/xenvif/controller.c
index 1d1f16e..e54c9fc 100644
--- a/src/xenvif/controller.c
+++ b/src/xenvif/controller.c
@@ -73,7 +73,6 @@ struct _XENVIF_CONTROLLER {
ULONG Dpcs;
ULONG Events;
BOOLEAN Connected;
- BOOLEAN Enabled;
USHORT RequestId;
struct xen_netif_ctrl_request Request;
struct xen_netif_ctrl_response Response;
@@ -193,9 +192,13 @@ ControllerPutRequest(
BOOLEAN Notify;
NTSTATUS status;
+ status = STATUS_NOT_SUPPORTED;
+ if (!Controller->Connected)
+ goto fail1;
+
status = STATUS_INSUFFICIENT_RESOURCES;
if (RING_FULL(&Controller->Front))
- goto fail1;
+ goto fail2;
Controller->Request.type = Type;
Controller->Request.id = Controller->RequestId++;
@@ -227,6 +230,9 @@ ControllerPutRequest(
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n", status);
@@ -340,11 +346,11 @@ ControllerWatchdog(
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
__ControllerAcquireLock(Controller);
- if (Controller->Enabled) {
+ if (Controller->Connected) {
KeMemoryBarrier();
if (Controller->Shared->rsp_prod != rsp_prod &&
- Controller->Front.rsp_cons == rsp_cons) {
+ Controller->Front.rsp_cons == rsp_cons) {
XENBUS_DEBUG(Trigger,
&Controller->DebugInterface,
Controller->DebugCallback);
@@ -392,7 +398,7 @@ ControllerDpc(
__ControllerAcquireLock(Controller);
- if (Controller->Enabled)
+ if (Controller->Connected)
ControllerPoll(Controller);
__ControllerReleaseLock(Controller);
@@ -767,15 +773,9 @@ ControllerEnable(
IN PXENVIF_CONTROLLER Controller
)
{
- Trace("====>\n");
-
- __ControllerAcquireLock(Controller);
+ UNREFERENCED_PARAMETER(Controller);
- Controller->Enabled = TRUE;
-
- __ControllerReleaseLock(Controller);
-
- Trace("<====\n");
+ Trace("<===>\n");
}
VOID
@@ -783,15 +783,9 @@ ControllerDisable(
IN PXENVIF_CONTROLLER Controller
)
{
- Trace("====>\n");
-
- __ControllerAcquireLock(Controller);
-
- Controller->Enabled = FALSE;
+ UNREFERENCED_PARAMETER(Controller);
- __ControllerReleaseLock(Controller);
-
- Trace("<====\n");
+ Trace("<===>\n");
}
VOID
@@ -906,29 +900,22 @@ ControllerSetHashAlgorithm(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Connected)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_ALGORITHM,
Algorithm,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
@@ -953,29 +940,22 @@ ControllerGetHashFlags(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_GET_HASH_FLAGS,
0,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, Flags);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
@@ -1000,29 +980,22 @@ ControllerSetHashFlags(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Connected)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_FLAGS,
Flags,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
@@ -1052,15 +1025,11 @@ ControllerSetHashKey(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Controller->Mdl == NULL)
- goto fail2;
+ goto fail1;
Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
ASSERT(Buffer != NULL);
@@ -1078,7 +1047,7 @@ ControllerSetHashKey(
FALSE,
&Entry);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_KEY,
@@ -1088,11 +1057,11 @@ ControllerSetHashKey(
Size,
0);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail3;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
@@ -1106,26 +1075,23 @@ ControllerSetHashKey(
return STATUS_SUCCESS;
-fail5:
- Error("fail5\n");
-
fail4:
Error("fail4\n");
+fail3:
+ Error("fail3\n");
+
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
Controller->GnttabCache,
TRUE,
Entry);
-fail3:
- Error("fail3\n");
-
- __FreePage(Mdl);
-
fail2:
Error("fail2\n");
+ __FreePage(Mdl);
+
fail1:
Error("fail1 (%08x)\n", status);
@@ -1147,29 +1113,22 @@ ControllerGetHashMappingSize(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_GET_HASH_MAPPING_SIZE,
0,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, Size);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
@@ -1194,29 +1153,22 @@ ControllerSetHashMappingSize(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING_SIZE,
Size,
0,
0);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
__ControllerReleaseLock(Controller);
return STATUS_SUCCESS;
-fail3:
- Error("fail3\n");
-
fail2:
Error("fail2\n");
@@ -1247,19 +1199,15 @@ ControllerSetHashMapping(
__ControllerAcquireLock(Controller);
- status = STATUS_NOT_SUPPORTED;
- if (!Controller->Enabled)
- goto fail1;
-
status = STATUS_INVALID_PARAMETER;
if (Size * sizeof (ULONG) > PAGE_SIZE)
- goto fail2;
+ goto fail1;
Mdl = __AllocatePage();
status = STATUS_NO_MEMORY;
if (Controller->Mdl == NULL)
- goto fail3;
+ goto fail2;
Buffer = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
ASSERT(Buffer != NULL);
@@ -1277,7 +1225,7 @@ ControllerSetHashMapping(
FALSE,
&Entry);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail3;
status = ControllerPutRequest(Controller,
XEN_NETIF_CTRL_TYPE_SET_HASH_MAPPING,
@@ -1287,11 +1235,11 @@ ControllerSetHashMapping(
Size,
Offset);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
status = ControllerGetResponse(Controller, NULL);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail5;
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
@@ -1305,26 +1253,23 @@ ControllerSetHashMapping(
return STATUS_SUCCESS;
-fail6:
- Error("fail6\n");
-
fail5:
Error("fail5\n");
+fail4:
+ Error("fail4\n");
+
(VOID) XENBUS_GNTTAB(RevokeForeignAccess,
&Controller->GnttabInterface,
Controller->GnttabCache,
TRUE,
Entry);
-fail4:
- Error("fail4\n");
-
- __FreePage(Mdl);
-
fail3:
Error("fail3\n");
+ __FreePage(Mdl);
+
fail2:
Error("fail2\n");
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 0fbd640..6a2019e 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -1808,16 +1808,16 @@ FrontendIsSplit(
static FORCEINLINE NTSTATUS
__FrontendUpdateHash(
- IN PXENVIF_FRONTEND Frontend
+ PXENVIF_FRONTEND Frontend,
+ PXENVIF_FRONTEND_HASH Hash
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
- PXENVIF_CONTROLLER Controller;
- ULONG Zero = 0;
- ULONG Size;
- PULONG Mapping;
- ULONG Flags;
- NTSTATUS status;
+ PXENVIF_CONTROLLER Controller;
+ ULONG Zero = 0;
+ ULONG Size;
+ PULONG Mapping;
+ ULONG Flags;
+ NTSTATUS status;
Controller = __FrontendGetController(Frontend);
@@ -1884,35 +1884,17 @@ fail1:
}
NTSTATUS
-FrontendUpdateHash(
- IN PXENVIF_FRONTEND Frontend
- )
-{
- KIRQL Irql;
- NTSTATUS status;
-
- KeAcquireSpinLock(&Frontend->Lock, &Irql);
- status = __FrontendUpdateHash(Frontend);
- KeReleaseSpinLock(&Frontend->Lock, Irql);
-
- return status;
-}
-
-NTSTATUS
FrontendSetHashAlgorithm(
IN PXENVIF_FRONTEND Frontend,
IN XENVIF_PACKET_HASH_ALGORITHM Algorithm
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
NTSTATUS status;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
- if (Algorithm == Hash->Algorithm)
- goto done;
-
switch (Algorithm) {
case XENVIF_PACKET_HASH_ALGORITHM_NONE:
case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
@@ -1934,13 +1916,23 @@ FrontendSetHashAlgorithm(
(Algorithm == XENVIF_PACKET_HASH_ALGORITHM_TOEPLITZ) ? "TOEPLITZ" :
"");
- Hash->Algorithm = Algorithm;
+ Hash = Frontend->Hash;
+
+ Hash.Algorithm = Algorithm;
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Frontend->Hash = Hash;
-done:
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n");
@@ -1995,7 +1987,7 @@ FrontendSetHashMapping(
IN ULONG Size
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
NTSTATUS status;
@@ -2005,13 +1997,24 @@ FrontendSetHashMapping(
if (Size > XENVIF_FRONTEND_MAXIMUM_HASH_MAPPING_SIZE)
goto fail1;
- RtlCopyMemory(Hash->Mapping, Mapping, sizeof (ULONG) * Size);
- Hash->Size = Size;
+ Hash = Frontend->Hash;
+
+ RtlCopyMemory(Hash.Mapping, Mapping, sizeof (ULONG) * Size);
+ Hash.Size = Size;
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Frontend->Hash = Hash;
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+fail2:
+ Error("fail2\n");
+
fail1:
Error("fail1 (%08x)\n", status);
@@ -2026,16 +2029,32 @@ FrontendSetHashKey(
IN PUCHAR Key
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
+ NTSTATUS status;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
- RtlCopyMemory(Hash->Key, Key, XENVIF_VIF_HASH_KEY_SIZE);
+ Hash = Frontend->Hash;
+
+ RtlCopyMemory(Hash.Key, Key, XENVIF_VIF_HASH_KEY_SIZE);
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ Frontend->Hash = Hash;
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ KeReleaseSpinLock(&Frontend->Lock, Irql);
+
+ return status;
}
NTSTATUS
@@ -2044,12 +2063,15 @@ FrontendSetHashTypes(
IN ULONG Types
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
+ XENVIF_FRONTEND_HASH Hash;
KIRQL Irql;
ULONG Flags;
+ NTSTATUS status;
KeAcquireSpinLock(&Frontend->Lock, &Irql);
+ Hash = Frontend->Hash;
+
Flags = 0;
if (Types & (1 << XENVIF_PACKET_HASH_TYPE_IPV4))
Flags |= XEN_NETIF_CTRL_HASH_TYPE_IPV4;
@@ -2060,11 +2082,24 @@ FrontendSetHashTypes(
if (Types & (1 << XENVIF_PACKET_HASH_TYPE_IPV6_TCP))
Flags |= XEN_NETIF_CTRL_HASH_TYPE_IPV6_TCP;
- Hash->Flags = Flags;
+ Hash.Flags = Flags;
+
+ status = __FrontendUpdateHash(Frontend, &Hash);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ Frontend->Hash = Hash;
KeReleaseSpinLock(&Frontend->Lock, Irql);
return STATUS_SUCCESS;
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ KeReleaseSpinLock(&Frontend->Lock, Irql);
+
+ return status;
}
ULONG
@@ -2073,17 +2108,16 @@ FrontendGetQueue(
IN ULONG Value
)
{
- PXENVIF_FRONTEND_HASH Hash = &Frontend->Hash;
ULONG Queue;
- switch (Hash->Algorithm) {
+ switch (Frontend->Hash.Algorithm) {
case XENVIF_PACKET_HASH_ALGORITHM_NONE:
case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
Queue = Value % __FrontendGetNumQueues(Frontend);
break;
case XENVIF_PACKET_HASH_ALGORITHM_TOEPLITZ:
- Queue = Hash->Mapping[Value % Hash->Size];
+ Queue = Frontend->Hash.Mapping[Value % Frontend->Hash.Size];
break;
default:
@@ -2226,6 +2260,7 @@ abort:
break;
case XenbusStateConnected:
+ case XenbusStateClosed:
break;
default:
@@ -2350,7 +2385,7 @@ FrontendEnable(
if (!NT_SUCCESS(status))
goto fail3;
- status = __FrontendUpdateHash(Frontend);
+ status = __FrontendUpdateHash(Frontend, &Frontend->Hash);
if (!NT_SUCCESS(status))
goto fail4;
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index 513e812..06ae78a 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -206,11 +206,6 @@ FrontendAdvertiseIpAddresses(
);
extern NTSTATUS
-FrontendUpdateHash(
- IN PXENVIF_FRONTEND Frontend
- );
-
-extern NTSTATUS
FrontendSetHashAlgorithm(
IN PXENVIF_FRONTEND Frontend,
IN XENVIF_PACKET_HASH_ALGORITHM Algorithm
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index f2d57ba..a33f8ce 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -3621,15 +3621,8 @@ ReceiverSetHashAlgorithm(
if (!NT_SUCCESS(status))
goto fail1;
- status = FrontendUpdateHash(Frontend);
- if (!NT_SUCCESS(status))
- goto fail2;
-
return STATUS_SUCCESS;
-fail2:
- Error("fail2\n");
-
fail1:
Error("fail1 (%08x)\n", status);
@@ -3697,10 +3690,6 @@ ReceiverUpdateHashParameters(
status = FrontendSetHashKey(Frontend, Key);
if (!NT_SUCCESS(status))
- goto fail1;
-
- status = FrontendUpdateHash(Frontend);
- if (!NT_SUCCESS(status))
goto fail2;
return STATUS_SUCCESS;
@@ -3749,17 +3738,10 @@ ReceiverUpdateHashMapping(
if (!NT_SUCCESS(status))
goto fail3;
- status = FrontendUpdateHash(Frontend);
- if (!NT_SUCCESS(status))
- goto fail4;
-
__ReceiverFree(QueueMapping);
return STATUS_SUCCESS;
-fail4:
- Error("fail4\n");
-
fail3:
Error("fail3\n");
--
2.1.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |