[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 12/15] Use a DPC per CPU for EVTCHN Trigger
Using a single DPC potentially means re-afinitizing it for each use, and this potentially means Windows could try to insert it onto multiple CPU queues at the same time, which probably won't end well. Using a DPC per CPU seems a lot safer. Also add a DPC flush before we zero out data structures. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenbus/evtchn.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c index 4cb00eb..81f97e4 100644 --- a/src/xenbus/evtchn.c +++ b/src/xenbus/evtchn.c @@ -105,7 +105,7 @@ struct _XENBUS_EVTCHN_CONTEXT { BOOLEAN UseEvtchnFifoAbi; PXENBUS_HASH_TABLE Table; LIST_ENTRY List; - KDPC Dpc; + KDPC Dpc[MAXIMUM_PROCESSORS]; }; #define XENBUS_EVTCHN_TAG 'CTVE' @@ -471,14 +471,14 @@ EvtchnTrigger( ) { PXENBUS_EVTCHN_CONTEXT Context = Interface->Context; - PKDPC Dpc = &Context->Dpc; + PKDPC Dpc; KIRQL Irql; ASSERT3U(Channel->Magic, ==, XENBUS_EVTCHN_CHANNEL_MAGIC); KeAcquireSpinLock(&Channel->Lock, &Irql); - KeSetTargetProcessorDpc(Dpc, (CCHAR)Channel->Cpu); + Dpc = &Context->Dpc[Channel->Cpu]; KeInsertQueueDpc(Dpc, Channel, NULL); KeReleaseSpinLock(&Channel->Lock, Irql); @@ -1213,6 +1213,7 @@ EvtchnInitialize( { HANDLE ParametersKey; ULONG UseEvtchnFifoAbi; + ULONG Cpu; NTSTATUS status; Trace("====>\n"); @@ -1269,7 +1270,13 @@ EvtchnInitialize( InitializeListHead(&(*Context)->List); KeInitializeSpinLock(&(*Context)->Lock); - KeInitializeDpc(&(*Context)->Dpc, EvtchnCallback, Context); + + for (Cpu = 0; Cpu < MAXIMUM_PROCESSORS; Cpu++) { + PKDPC Dpc = &(*Context)->Dpc[Cpu]; + + KeInitializeDpc(Dpc, EvtchnCallback, *Context); + KeSetTargetProcessorDpc(Dpc, (CCHAR)Cpu); + } (*Context)->Fdo = Fdo; @@ -1380,9 +1387,12 @@ EvtchnTeardown( { Trace("====>\n"); + ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL); + KeFlushQueuedDpcs(); + Context->Fdo = NULL; - RtlZeroMemory(&Context->Dpc, sizeof (KDPC)); + RtlZeroMemory(&Context->Dpc, sizeof (KDPC) * MAXIMUM_PROCESSORS); RtlZeroMemory(&Context->Lock, sizeof (KSPIN_LOCK)); RtlZeroMemory(&Context->List, sizeof (LIST_ENTRY)); -- 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 |