Re: [patch 1/3] rtmutex: Add missing deadlock check

From: Lai Jiangshan
Date: Tue May 13 2014 - 01:48:19 EST


Hi, Thomas,

I think this patch is just a workaround, it is not the proper fix.
you need a updated deadlock-check mechanism:

- (old) skip the check when top_waiter != task_top_pi_waiter(task)
+ (new) skip the check when top_waiter->prio > task->prio

/*
* Drop out, when the task has no waiters. Note,
* top_waiter can be NULL, when we are in the deboosting
* mode!
*/
if (top_waiter && (!task_has_pi_waiters(task) ||
top_waiter != task_top_pi_waiter(task)))
goto out_unlock_pi;


(also need to update the code in other places respectively)

On 05/13/2014 04:45 AM, Thomas Gleixner wrote:
> /*
> + * Deadlock check for the following scenario:
> + *
> + * T holds lock L and has waiters
> + * T locks L again, but does not end up as it's own top waiter

ABBA problem (TA TB TC TD are of the same priority)

TA holds lock LA, and try to lock LB which TC already has waited on
TB holds lock LB, and try to lock LA which TD already has waited on

I think this check can't detect it IIUC.

> + *
> + * So we would drop out at the next check without noticing.
> + *
> + * Note, we need to check for orig_waiter as it might be NULL
> + * when deboosting!
> + */
> + if (orig_waiter && orig_waiter->task == rt_mutex_owner(lock)) {

when non-first-loop, it is already checked.

> + ret = deadlock_detect ? -EDEADLK : 0;
> + goto out_unlock_pi;
> + }

I considered you blamed to me.
I would feel better if you directly blamed to me.

Thanks
Lai
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/