[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] EVTCHN FIFO ABI should keep per-vcpu queue head shadow
There is currently only one shadow head per priority which means that polling event channels of the same priority on different CPUs can conflict, leading to lost events. This patch fixes the problem. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xenbus/evtchn_fifo.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c index ef72fdb..e3cff7a 100644 --- a/src/xenbus/evtchn_fifo.c +++ b/src/xenbus/evtchn_fifo.c @@ -49,7 +49,7 @@ typedef struct _XENBUS_EVTCHN_FIFO_CONTEXT { PMDL ControlBlockMdl[MAX_HVM_VCPUS]; PMDL *EventPageMdl; ULONG EventPageCount; - ULONG Head[EVTCHN_FIFO_MAX_QUEUES]; + ULONG Head[MAX_HVM_VCPUS][EVTCHN_FIFO_MAX_QUEUES]; } XENBUS_EVTCHN_FIFO_CONTEXT, *PXENBUS_EVTCHN_FIFO_CONTEXT; #define EVENT_WORDS_PER_PAGE (PAGE_SIZE / sizeof (event_word_t)) @@ -282,7 +282,7 @@ EvtchnFifoContract( static BOOLEAN EvtchnFifoPollPriority( IN PXENBUS_EVTCHN_FIFO_CONTEXT Context, - IN evtchn_fifo_control_block_t *ControlBlock, + IN unsigned int vcpu_id, IN ULONG Priority, IN PULONG Ready, IN XENBUS_EVTCHN_ABI_EVENT Event, @@ -294,9 +294,17 @@ EvtchnFifoPollPriority( event_word_t *EventWord; BOOLEAN DoneSomething; - Head = Context->Head[Priority]; + Head = Context->Head[vcpu_id][Priority]; if (Head == 0) { + PMDL Mdl; + evtchn_fifo_control_block_t *ControlBlock; + + Mdl = Context->ControlBlockMdl[vcpu_id]; + + ControlBlock = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority); + ASSERT(ControlBlock != NULL); + KeMemoryBarrier(); Head = ControlBlock->head[Priority]; } @@ -315,7 +323,7 @@ EvtchnFifoPollPriority( __EvtchnFifoTestFlag(EventWord, EVTCHN_FIFO_PENDING)) DoneSomething = Event(Argument, Port); - Context->Head[Priority] = Head; + Context->Head[vcpu_id][Priority] = Head; return DoneSomething; } @@ -346,7 +354,7 @@ EvtchnFifoPoll( while (_BitScanReverse(&Priority, Ready)) { DoneSomething |= EvtchnFifoPollPriority(Context, - ControlBlock, + vcpu_id, Priority, &Ready, Event, -- 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 |