Re: [PATCH v4 22/24] dept: Don't create dependencies between different depths in any case

From: Hyeonggon Yoo
Date: Fri Mar 04 2022 - 06:39:49 EST


On Fri, Mar 04, 2022 at 04:06:41PM +0900, Byungchul Park wrote:
> Dept already prevents creating dependencies between different depths of
> the class indicated by *_lock_nested() when the lock acquisitions happen
> consecutively.
>
> lock A0 with depth
> lock_nested A1 with depth + 1
> ...
> unlock A1
> unlock A0
>
> Dept does not create A0 -> A1 dependency in this case, either.
>
> However, once another class cut in, the code becomes problematic. When
> Dept tries to create real dependencies, it does not only create real
> ones but also wrong ones between different depths of the class.
>
> lock A0 with depth
> lock B
> lock_nested A1 with depth + 1
> ...
> unlock A1
> unlock B
> unlock A0
>
> Even in this case, Dept should not create A0 -> A1 dependency.
>
> So let Dept not create wrong dependencies between different depths of
> the class in any case.
>
> Reported-by: 42.hyeyoo@xxxxxxxxx
> Signed-off-by: Byungchul Park <byungchul.park@xxxxxxx>
> ---
> kernel/dependency/dept.c | 9 +--------
> 1 file changed, 1 insertion(+), 8 deletions(-)
>
> diff --git a/kernel/dependency/dept.c b/kernel/dependency/dept.c
> index 5d4efc3..cc1b3a3 100644
> --- a/kernel/dependency/dept.c
> +++ b/kernel/dependency/dept.c
> @@ -1458,14 +1458,7 @@ static void add_wait(struct dept_class *c, unsigned long ip,
>
> eh = dt->ecxt_held + i;
> if (eh->ecxt->class != c || eh->nest == ne)
> - break;
> - }
> -
> - for (; i >= 0; i--) {
> - struct dept_ecxt_held *eh;
> -
> - eh = dt->ecxt_held + i;
> - add_dep(eh->ecxt, w);
> + add_dep(eh->ecxt, w);
> }
>
> if (!wait_consumed(w) && !rich_stack) {
> --
> 1.9.1
>
>

Works as expected, Thanks!
I would report if there is anything else interesting.

Tested-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx>

--
Thank you, You are awesome!
Hyeonggon :-)