]> xenbits.xensource.com Git - pvdrivers/win/xenvif.git/commitdiff
poller: fix event channels when backends do not support multi-queue
authorChris Patterson <cjp256@gmail.com>
Wed, 21 Feb 2018 09:54:57 +0000 (09:54 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 21 Feb 2018 09:54:57 +0000 (09:54 +0000)
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
...

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@gmail.com>
src/xenvif/poller.c

index a7ce37a40956c9640890e78514cfa4cfc9efde1a..6ff2c8ccf33013b903d9163ed89e7b3b1c0ffbf0 100644 (file)
@@ -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);