[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 1/3] Move check for split event channels into Frontend module
Reduce code duplication and efficiency a little by checking the xenstore key once in Frontend and then providing a function with Transmitter and Receiver can use to grab the value. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenvif/frontend.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++- src/xenvif/frontend.h | 5 +++++ src/xenvif/receiver.c | 20 ++------------------ src/xenvif/transmitter.c | 36 +++++++++++++++-------------------- 4 files changed, 70 insertions(+), 40 deletions(-) diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c index 98efee5..b066d0b 100644 --- a/src/xenvif/frontend.c +++ b/src/xenvif/frontend.c @@ -70,6 +70,7 @@ struct _XENVIF_FRONTEND { USHORT BackendDomain; ULONG MaxQueues; ULONG NumQueues; + BOOLEAN Split; PXENVIF_MAC Mac; PXENVIF_RECEIVER Receiver; @@ -1674,7 +1675,8 @@ FrontendSetNumQueues( BackendMaxQueues = 1; } - Frontend->NumQueues = __min(Frontend->MaxQueues, BackendMaxQueues); + Frontend->NumQueues = __min(__FrontendGetMaxQueues(Frontend), + BackendMaxQueues); Info("%s: %u\n", __FrontendGetPath(Frontend), Frontend->NumQueues); } @@ -1695,6 +1697,50 @@ FrontendGetNumQueues( return __FrontendGetNumQueues(Frontend); } +static VOID +FrontendSetSplit( + IN PXENVIF_FRONTEND Frontend + ) +{ + PCHAR Buffer; + NTSTATUS status; + + status = XENBUS_STORE(Read, + &Frontend->StoreInterface, + NULL, + __FrontendGetBackendPath(Frontend), + "feature-split-event-channels", + &Buffer); + if (NT_SUCCESS(status)) { + Frontend->Split = (BOOLEAN)strtol(Buffer, NULL, 2); + + XENBUS_STORE(Free, + &Frontend->StoreInterface, + Buffer); + } else { + Frontend->Split = FALSE; + } + + Info("%s: %s\n", __FrontendGetPath(Frontend), + (Frontend->Split) ? "TRUE" : "FALSE"); +} + +static FORCEINLINE BOOLEAN +__FrontendIsSplit( + IN PXENVIF_FRONTEND Frontend + ) +{ + return Frontend->Split; +} + +BOOLEAN +FrontendIsSplit( + IN PXENVIF_FRONTEND Frontend + ) +{ + return __FrontendIsSplit(Frontend); +} + static NTSTATUS FrontendConnect( IN PXENVIF_FRONTEND Frontend @@ -1731,6 +1777,7 @@ FrontendConnect( goto fail4; FrontendSetNumQueues(Frontend); + FrontendSetSplit(Frontend); status = ReceiverConnect(__FrontendGetReceiver(Frontend)); if (!NT_SUCCESS(status)) diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h index bd39767..eda9e3d 100644 --- a/src/xenvif/frontend.h +++ b/src/xenvif/frontend.h @@ -122,6 +122,11 @@ FrontendGetNumQueues( IN PXENVIF_FRONTEND Frontend ); +extern BOOLEAN +FrontendIsSplit( + IN PXENVIF_FRONTEND Frontend + ); + extern PCHAR FrontendFormatPath( IN PXENVIF_FRONTEND Frontend, diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c index c6f64b5..36557b7 100644 --- a/src/xenvif/receiver.c +++ b/src/xenvif/receiver.c @@ -2859,7 +2859,6 @@ ReceiverConnect( { PXENVIF_FRONTEND Frontend; LONG Index; - PCHAR Buffer; NTSTATUS status; Trace("====>\n"); @@ -2886,21 +2885,7 @@ ReceiverConnect( if (!NT_SUCCESS(status)) goto fail5; - status = XENBUS_STORE(Read, - &Receiver->StoreInterface, - NULL, - FrontendGetBackendPath(Frontend), - "feature-split-event-channels", - &Buffer); - if (!NT_SUCCESS(status)) { - Receiver->Split = FALSE; - } else { - Receiver->Split = (BOOLEAN)strtol(Buffer, NULL, 2); - - XENBUS_STORE(Free, - &Receiver->StoreInterface, - Buffer); - } + Receiver->Split = FrontendIsSplit(Frontend); Receiver->NumQueues = FrontendGetNumQueues(Frontend); ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues); @@ -3211,8 +3196,6 @@ ReceiverDisconnect( Frontend = Receiver->Frontend; - Receiver->Split = FALSE; - XENBUS_DEBUG(Deregister, &Receiver->DebugInterface, Receiver->DebugCallback); @@ -3226,6 +3209,7 @@ ReceiverDisconnect( } Receiver->NumQueues = 0; + Receiver->Split = FALSE; XENBUS_GNTTAB(Release, &Receiver->GnttabInterface); diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c index 5f84eb5..615d2d0 100644 --- a/src/xenvif/transmitter.c +++ b/src/xenvif/transmitter.c @@ -710,6 +710,15 @@ TransmitterRingDebugCallback( Ring->PacketsUnprepared, Ring->PacketsSent, Ring->PacketsCompleted); + + if (Transmitter->Split) { + // Dump event channel + XENBUS_DEBUG(Printf, + &Transmitter->DebugInterface, + "Events = %lu Dpcs = %lu\n", + Ring->Events, + Ring->Dpcs); + } } static BOOLEAN @@ -3618,8 +3627,6 @@ __TransmitterRingDisconnect( Transmitter = Ring->Transmitter; Frontend = Transmitter->Frontend; - Transmitter->Split = FALSE; - if (Ring->Channel != NULL) { XENBUS_EVTCHN(Close, &Transmitter->EvtchnInterface, @@ -4189,22 +4196,6 @@ TransmitterConnect( &Transmitter->StoreInterface, NULL, FrontendGetBackendPath(Frontend), - "feature-split-event-channels", - &Buffer); - if (!NT_SUCCESS(status)) { - Transmitter->Split = FALSE; - } else { - Transmitter->Split = (BOOLEAN)strtol(Buffer, NULL, 2); - - XENBUS_STORE(Free, - &Transmitter->StoreInterface, - Buffer); - } - - status = XENBUS_STORE(Read, - &Transmitter->StoreInterface, - NULL, - FrontendGetBackendPath(Frontend), "feature-multicast-control", &Buffer); if (!NT_SUCCESS(status)) { @@ -4217,6 +4208,8 @@ TransmitterConnect( Buffer); } + Transmitter->Split = FrontendIsSplit(Frontend); + Transmitter->NumQueues = FrontendGetNumQueues(Frontend); ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues); @@ -4260,6 +4253,8 @@ fail9: } Transmitter->NumQueues = 0; + Transmitter->Split = FALSE; + Transmitter->MulticastControl = FALSE; XENBUS_CACHE(Destroy, &Transmitter->CacheInterface, @@ -4401,9 +4396,6 @@ TransmitterDisconnect( Frontend = Transmitter->Frontend; - Transmitter->MulticastControl = FALSE; - Transmitter->Split = FALSE; - XENBUS_DEBUG(Deregister, &Transmitter->DebugInterface, Transmitter->DebugCallback); @@ -4417,6 +4409,8 @@ TransmitterDisconnect( } Transmitter->NumQueues = 0; + Transmitter->MulticastControl = FALSE; + Transmitter->Split = FALSE; XENBUS_CACHE(Destroy, &Transmitter->CacheInterface, -- 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 |