[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [win-pv-devel] [PATCH] poller: fix event channels when backends do not support multi-queue
> -----Original Message----- > From: Chris Patterson [mailto:cjp256@xxxxxxxxx] > Sent: 20 February 2018 21:15 > To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx > Cc: Paul Durrant <Paul.Durrant@xxxxxxxxxx>; Ben Chalmers > <ben.chalmers@xxxxxxxxxx>; Owen Smith <owen.smith@xxxxxxxxxx>; Chris > Patterson <cjp256@xxxxxxxxx> > Subject: [PATCH] poller: fix event channels when backends do not support > multi-queue > > The event channels for rx & tx are written to a multi-queue formatted > path even when multiple queues are not supported. This results in a hung > VM with the following logs: > XENBUS|EvtchnWait: TIMED OUT: Count = 00000001 Channel->Count = > 00000000 > ... Quite right. I clearly missed this. Thanks for spotting it. > > This can be reproduced by having a Linux VM network backend with 1 vCPU. > > If FrontendGetNumQueues() is 1 and multiple queues are not supported, > the following paths are used for the poller event channel: > device/vif/1/queue-0/event-channel-[rx|tx] > > However, the proper xenstore path in this case is: > device/vif/1/event-channel-[rx|tx] > > PollerInstanceInitialize() sets its path using FrontendFormatPath(), > which assumes a multi-queue path layout. This is done in a fashion > similar to the transmitter and receiver rings. However, the tx/rx rings > check for the mutually supported number of queues to determine the > actual path written to xenstore, using FrontendGetNumQueues(). See > __TransmitterRingStoreWrite() and __ReceiverRingStoreWrite(). This patch > adds a similar procedure for the poller to write to the appropriate path > in xenstore. > > Signed-off-by: Chris Patterson <cjp256@xxxxxxxxx> Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx> > --- > src/xenvif/poller.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/src/xenvif/poller.c b/src/xenvif/poller.c > index a7ce37a..6ff2c8c 100644 > --- a/src/xenvif/poller.c > +++ b/src/xenvif/poller.c > @@ -351,6 +351,7 @@ PollerChannelStoreWrite( > { > PXENVIF_POLLER_INSTANCE Instance; > PXENVIF_POLLER Poller; > + PCHAR Path; > ULONG Port; > NTSTATUS status; > > @@ -360,6 +361,10 @@ PollerChannelStoreWrite( > if (Channel->Channel == NULL) > goto done; > > + Path = (FrontendGetNumQueues(Poller->Frontend) == 1) ? > + FrontendGetPath(Poller->Frontend) : > + Instance->Path; > + > Port = XENBUS_EVTCHN(GetPort, > &Poller->EvtchnInterface, > Channel->Channel); > @@ -367,7 +372,7 @@ PollerChannelStoreWrite( > status = XENBUS_STORE(Printf, > &Poller->StoreInterface, > Transaction, > - Instance->Path, > + Path, > (PCHAR)Channel->Node, > "%u", > Port); > -- > 2.1.4 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |