[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

 


Rackspace

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