Loading drivers/gpu/msm/adreno_drawctxt.c +15 −1 Original line number Diff line number Diff line Loading @@ -64,8 +64,22 @@ void adreno_drawctxt_dump(struct kgsl_device *device, * We may have cmdbatch timer running, which also uses same * lock, take a lock with software interrupt disabled (bh) * to avoid spin lock recursion. * * Use Spin trylock because dispatcher can acquire drawctxt->lock * if context is pending and the fence it is waiting on just got * signalled. Dispatcher acquires drawctxt->lock and tries to * delete the cmdbatch timer using del_timer_sync(). * del_timer_sync() waits till timer and its pending handlers * are deleted. But if the timer expires at the same time, * timer handler could be waiting on drawctxt->lock leading to a * deadlock. To prevent this use spin_trylock_bh. */ spin_lock_bh(&drawctxt->lock); if (!spin_trylock_bh(&drawctxt->lock)) { dev_err(device->dev, " context[%d]: could not get lock\n", context->id); return; } dev_err(device->dev, " context[%d]: queue=%d, submit=%d, start=%d, retire=%d\n", context->id, queue, drawctxt->submitted_timestamp, Loading Loading
drivers/gpu/msm/adreno_drawctxt.c +15 −1 Original line number Diff line number Diff line Loading @@ -64,8 +64,22 @@ void adreno_drawctxt_dump(struct kgsl_device *device, * We may have cmdbatch timer running, which also uses same * lock, take a lock with software interrupt disabled (bh) * to avoid spin lock recursion. * * Use Spin trylock because dispatcher can acquire drawctxt->lock * if context is pending and the fence it is waiting on just got * signalled. Dispatcher acquires drawctxt->lock and tries to * delete the cmdbatch timer using del_timer_sync(). * del_timer_sync() waits till timer and its pending handlers * are deleted. But if the timer expires at the same time, * timer handler could be waiting on drawctxt->lock leading to a * deadlock. To prevent this use spin_trylock_bh. */ spin_lock_bh(&drawctxt->lock); if (!spin_trylock_bh(&drawctxt->lock)) { dev_err(device->dev, " context[%d]: could not get lock\n", context->id); return; } dev_err(device->dev, " context[%d]: queue=%d, submit=%d, start=%d, retire=%d\n", context->id, queue, drawctxt->submitted_timestamp, Loading