Am 20.08.2013 11:36, schrieb Maarten Lankhorst:
[SNIP]

>>>>> [SNIP]
>>>>> +/**
>>>>> + * radeon_fence_enable_signaling - enable signalling on fence
>>>>> + * @fence: fence
>>>>> + *
>>>>> + * This function is called with fence_queue lock held, and adds a 
>>>>> callback
>>>>> + * to fence_queue that checks if this fence is signaled, and if so it
>>>>> + * signals the fence and removes itself.
>>>>> + */
>>>>> +static bool radeon_fence_enable_signaling(struct fence *f)
>>>>> +{
>>>>> +    struct radeon_fence *fence = to_radeon_fence(f);
>>>>> +
>>>>> +    if (atomic64_read(&fence->rdev->fence_drv[fence->ring].last_seq) >= 
>>>>> fence->seq ||
>>>>> +        !fence->rdev->ddev->irq_enabled)
>>>>> +        return false;
>>>>> +
>>>> Do I get that right that you rely on IRQs to be enabled and working here? 
>>>> Cause that would be a quite bad idea from the conceptual side.
>>> For cross-device synchronization it would be nice to have working irqs, it 
>>> allows signalling fences faster,
>>> and it allows for callbacks on completion to be called. For internal usage 
>>> it's no more required than it was before.
>> That's a big NAK.
>>
>> The fence processing is actually very fine tuned to avoid IRQs and as far as 
>> I can see you just leave them enabled by decrementing the atomic from IRQ 
>> context. Additional to that we need allot of special handling in case of a 
>> hardware lockup here, which isn't done if you abuse the fence interface like 
>> this.
> I think it's not needed to leave the irq enabled, it's a leftover from when I 
> was debugging the mac and no interrupt occurred at all.
>
>> Also your approach of leaking the IRQ context outside of the driver is a 
>> very bad idea from the conceptual side. Please don't modify the fence 
>> interface at all and instead use the wait functions already exposed by 
>> radeon_fence.c. If you need some kind of signaling mechanism then wait 
>> inside a workqueue instead.
> The fence takes up the role of a single shot workqueue here. Manually 
> resetting the counter and calling wake_up_all would end up waking all active 
> fences, there's no special handling needed inside radeon for this.

Yeah that's actually the point here, you NEED to activate ALL fences, 
otherwise the fence handling inside the driver won't work.

> The fence api does provide a synchronous wait function, but this causes a 
> stall of whomever waits on it.

Which is perfectly fine. What actually is the use case of not stalling a 
process who wants to wait for something?

> When I was testing this with intel I used the fence callback to poke a 
> register in i915, this allowed it to not block until it hits the wait op in 
> the command stream, and even then only if the callback was not called first.
>
> It's documented that the callbacks can be called from any context and will be 
> called with irqs disabled, so nothing scary should be done. The kernel 
> provides enough debug mechanisms to find any violators.
> PROVE_LOCKING and DEBUG_ATOMIC_SLEEP for example.

No thanks, we even abandoned that concept internal in the driver. Please 
use the blocking wait functions instead.

Christian.

Reply via email to