Thank you for your contribution! Sashiko AI review found 1 potential issue(s) 
to consider:

Pre-existing issues:
- [High] Unconditional zeroing of `wgen` in `dept_event` creates a race 
condition that systematically loses dependencies for shared locks, blinding the 
deadlock detector.
--

commit f7ae795e924d8a4b1154e57adaf0e878e810272c
Author: Byungchul Park <[email protected]>

dept: make dept able to work with an external wgen

This commit introduces an external wait generation structure, struct
dept_ext_wgen, to allow subsystems with memory constraints to use DEPT
without embedding a full struct dept_map. It modifies dept_request_event()
and dept_event() to optionally accept and operate on this external wgen
instead of the one embedded in struct dept_map.

> diff --git a/kernel/dependency/dept.c b/kernel/dependency/dept.c
> index 5ef85977e6314..e425d3ab05e5a 100644
> --- a/kernel/dependency/dept.c
> +++ b/kernel/dependency/dept.c
[ ... ]
> @@ -2816,24 +2826,26 @@ void dept_event(struct dept_map *m, unsigned long e_f,
>       if (m->nocheck)
>               return;
>  
> +     wg_p = ewg ? &ewg->wgen : &m->wgen;
> +
>       if (dt->recursive) {
>               /*
>                * Dept won't work with this even though an event
>                * context has been asked. Don't make it confused at
>                * handling the event. Disable it until the next.
>                */
> -             WRITE_ONCE(m->wgen, 0U);
> +             WRITE_ONCE(*wg_p, 0U);
>               return;
>       }
>  
>       flags = dept_enter();
>  
> -     __dept_event(m, m, e_f, ip, e_fn, false);
> +     __dept_event(m, m, e_f, ip, e_fn, false, READ_ONCE(*wg_p));
>  
>       /*
>        * Keep the map diabled until the next sleep.
>        */
> -     WRITE_ONCE(m->wgen, 0U);
> +     WRITE_ONCE(*wg_p, 0U);

[Severity: High]
This is a pre-existing issue, but does unconditionally clearing the wgen here
in dept_event() create a race condition that loses dependencies for shared
locks?

When multiple threads hold a shared lock (e.g., a read-lock like
rw_semaphore), and a writer begins waiting, the writer calls
dept_request_event() which sets the lock's wgen. The first reader to unlock
calls dept_event(), which reads the wgen, processes the wait dependency for
its own context, and then unconditionally clears wgen to 0 here.

All subsequent readers unlocking will read 0 and fail to record the dependency
between the writer's wait and their own read-side critical sections, which
could blind the deadlock detector.

Since this issue affects the newly introduced ewg->wgen as well, could this
be addressed to ensure dependencies aren't lost when multiple threads share
the lock?

-- 
Sashiko AI review ยท 
https://sashiko.dev/#/patchset/[email protected]?part=21

Reply via email to