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>
{
PXENVIF_POLLER_INSTANCE Instance;
PXENVIF_POLLER Poller;
+ PCHAR Path;
ULONG Port;
NTSTATUS status;
if (Channel->Channel == NULL)
goto done;
+ Path = (FrontendGetNumQueues(Poller->Frontend) == 1) ?
+ FrontendGetPath(Poller->Frontend) :
+ Instance->Path;
+
Port = XENBUS_EVTCHN(GetPort,
&Poller->EvtchnInterface,
Channel->Channel);
status = XENBUS_STORE(Printf,
&Poller->StoreInterface,
Transaction,
- Instance->Path,
+ Path,
(PCHAR)Channel->Node,
"%u",
Port);