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.