Am 23.07.2014 09:06, schrieb Maarten Lankhorst:
> op 23-07-14 08:52, Christian K?nig schreef:
>> Am 23.07.2014 08:40, schrieb Maarten Lankhorst:
>>> op 22-07-14 17:59, Christian K?nig schreef:
>>>> Am 22.07.2014 17:42, schrieb Daniel Vetter:
>>>>> On Tue, Jul 22, 2014 at 5:35 PM, Christian K?nig
>>>>> <christian.koenig at amd.com> wrote:
>>>>>> Drivers exporting fences need to provide a fence->signaled and a 
>>>>>> fence->wait
>>>>>> function, everything else like fence->enable_signaling or calling
>>>>>> fence_signaled() from the driver is optional.
>>>>>>
>>>>>> Drivers wanting to use exported fences don't call fence->signaled or
>>>>>> fence->wait in atomic or interrupt context, and not with holding any 
>>>>>> global
>>>>>> locking primitives (like mmap_sem etc...). Holding locking primitives 
>>>>>> local
>>>>>> to the driver is ok, as long as they don't conflict with anything 
>>>>>> possible
>>>>>> used by their own fence implementation.
>>>>> Well that's almost what we have right now with the exception that
>>>>> drivers are allowed (actually must for correctness when updating
>>>>> fences) the ww_mutexes for dma-bufs (or other buffer objects).
>>>> In this case sorry for so much noise. I really haven't looked in so much 
>>>> detail into anything but Maarten's Radeon patches.
>>>>
>>>> But how does that then work right now? My impression was that it's 
>>>> mandatory for drivers to call fence_signaled()?
>>> It's only mandatory to call fence_signal() if the .enable_signaling 
>>> callback has been called, else you can get away with never calling 
>>> signaling a fence at all before dropping the last refcount to it.
>>> This allows you to keep interrupts disabled when you don't need them.
>> Can we somehow avoid the need to call fence_signal() at all? The interrupts 
>> at least on radeon are way to unreliable for such a thing. Can 
>> enable_signalling fail? What's the reason for fence_signaled() in the first 
>> place?
> It doesn't need to be completely reliable, or finish immediately.
>
> And any time wake_up_all(&rdev->fence_queue) is called all the fences that 
> were enabled will be rechecked.
>
>>>>> Agreed that any shared locks are out of the way (especially stuff like
>>>>> dev->struct_mutex or other non-strictly driver-private stuff, i915 is
>>>>> really bad here still).
>>>> Yeah that's also an point I've wanted to note on Maartens patch. Radeon 
>>>> grabs the read side of it's exclusive semaphore while waiting for fences 
>>>> (because it assumes that the fence it waits for is a Radeon fence).
>>>>
>>>> Assuming that we need to wait in both directions with Prime (e.g. Intel 
>>>> driver needs to wait for Radeon to finish rendering and Radeon needs to 
>>>> wait for Intel to finish displaying), this might become a perfect example 
>>>> of locking inversion.
>>> In the preliminary patches where I can sync radeon with other GPU's I've 
>>> been very careful in all the places that call into fences, to make sure 
>>> that radeon wouldn't try to handle lockups for a different (possibly also 
>>> radeon) card.
>> That's actually not such a good idea.
>>
>> In case of a lockup we need to handle the lockup cause otherwise it could 
>> happen that radeon waits for the lockup to be resolved and the lockup 
>> handling needs to wait for a fence that's never signaled because of the 
>> lockup.
> The lockup handling calls radeon_fence_wait, not the generic fence_wait. It 
> doesn't call the exported wait function that takes the exclusive_lock in read 
> mode.
> And lockdep should have complained if I screwed that up. :-)

You screwed it up and lockdep didn't warn you about it :-P

It's not a locking problem I'm talking about here. Radeons lockup 
handling kicks in when anything calls into the driver from the outside, 
if you have a fence wait function that's called from the outside but 
doesn't handle lockups you essentially rely on somebody else calling 
another radeon function for the lockup to be resolved.

Christian.

>
> ~Maarten
>

Reply via email to