[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [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
...

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>
---
 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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.