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

Re: [win-pv-devel] Advice on evtchn interrupt handling



On 2015-12-10 13:27, Paul Durrant wrote:
>> -----Original Message-----
>> From: win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx [mailto:win-pv-devel-
>> bounces@xxxxxxxxxxxxxxxxxxxx] On Behalf Of Rafal Wojdyla
>> Sent: 09 December 2015 14:06
>> To: Paul Durrant; win-pv-devel@xxxxxxxxxxxxxxxxxxxx
>> Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
>>
>> On 12/09/2015 02:02 PM, Paul Durrant wrote:
>>>> -----Original Message-----
>>>> From: RafaÅ WojdyÅa [mailto:omeg@xxxxxxxxxxxxxxxxxxxxxx]
>>>> Sent: 09 December 2015 11:08
>>>> To: Paul Durrant; win-pv-devel@xxxxxxxxxxxxxxxxxxxx
>>>> Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
>>>>
>>>> On 2015-12-09 11:44, Paul Durrant wrote:
>>>>>> -----Original Message-----
>>>>>> From: win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx [mailto:win-pv-
>> devel-
>>>>>> bounces@xxxxxxxxxxxxxxxxxxxx] On Behalf Of Rafal Wojdyla
>>>>>> Sent: 09 December 2015 10:19
>>>>>> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
>>>>>> Subject: [win-pv-devel] Advice on evtchn interrupt handling
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I found an issue in my evtchn handling in xeniface that I'm not sure how
>>>>>> to properly fix. Namely, the interrupt callback that's assigned for a
>>>>>> particular channel can be called before its queued DPC (that signals the
>>>>>> caller-provided event) finishes. In such case the interrupt callback
>>>>>> fails to insert the DPC again and an event is lost, potentially causing
>>>>>> a vchan "deadlock" down the way.
>>>>>>
>>>>>
>>>>> Hi Rafal,
>>>>>
>>>>> That shouldn't be the case. Windows de-queues a DPC before running
>> for
>>>> precisely this kind of reason. I.e. just because your DPC is running, it
>> should
>>>> not stop another from being queued. Are you definitely seeing a failure to
>>>> queue even when no DPC is actually queued? What you may actually be
>>>> getting caught by is evtchn auto-masking. If you have enabled auto-
>> masking
>>>> then you need to explicitly unmask at the end of your DPC. (The
>> transmitter
>>>> and receiver ring DPCs in XENVIF are a good example of this).
>>>>>
>>>>> Cheers,
>>>>>
>>>>>   Paul
>>>>>
>>>> Here's the relevant bit:
>>>>
>> http://xenbits.xen.org/gitweb/?p=pvdrivers/win/xeniface.git;a=blob;f=src/x
>>>>
>> eniface/ioctl_evtchn.c;h=9c5af19e00a91a08f68da0c630709cbaa6e8413d;hb=
>>>> HEAD#l66
>>>>
>>>> I check the result of KeInsertQueueDpc() and I definitely see it fail
>>>> sometimes, even if the HVM only has 1 vcpu. My DPC unmasks the
>> channel
>>>> after setting an event so this shouldn't be the reason.
>>>>
>>>
>>> The article at https://www.osronline.com/article.cfm?article=529 is worth
>> reading. The comment labelled "DPC Reentrancy" points out that DPCs are
>> de-queued before being executed. So really you should not see a queueing
>> failure unless either then unmasking is not working correctly or there's a 
>> bug
>> in Windows itself.
>>
>> Yeah, I've read that before and was wondering whether I'm missing
>> something that would explain the behavior I see.
> 
> Actually, looking more closely at the code today I do see a problem...
> 
> You have a DPC per CPU so, if you have two separate event channels bound to 
> the same CPU you're gonna hit problems. E.g. an event comes in on the first 
> channel so you schedule a DPC to handle it. Now, an event comes in on the 
> second channel and you can't schedule the DPC because itâs still queued for 
> the first event. You need a DPC per channel.
> 
>   Paul
> 
Ha, that's exactly what I found as well. I implemented a similar change
yesterday and everything seemed fine during my tests. Thanks for the
confirmation - I think you can apply the patch.

>>
>>> Are you running on a Xen with FIFO events or is it old enough to only be 2L?
>>>
>>>   Paul
>>
>> We're using 4.4.3 right now.
>>
>>>
>>>>>> Any advice on how to approach this? The interrupt callback runs at
>>>>>> HIGH_LEVEL which is an issue when it comes to synchronization with
>>>> some
>>>>>> other code that could take care of such "pending" events.
>>>>>>
>>>>>> Also I wonder if the kernel differentiates DPCs only by their KDPC
>>>>>> address, or also by arguments passed to KeInsertQueueDpc()?
>>>>>>

-- 
RafaÅ WojdyÅa
Qubes Tools for Windows developer
https://www.qubes-os.org/

_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

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