Thank you for your contribution! Sashiko AI review found 2 potential issue(s) 
to consider:
- [Medium] The timeout consideration logic fails for wait_event_hrtimeout(), 
hashed-waitqueues, and DMA fences, causing them to be falsely treated as 
infinite waits.
- [Medium] The ___wait_event() and ___wait_var_event() macros skip the DEPT 
sleep end annotation on the signal interruption error path, leaking the DEPT 
tracking stage context.
--

commit 25089e0217c82211740316928fec38c6d2b7e4fa
Author: Byungchul Park <[email protected]>

dept: apply timeout consideration to waitqueue wait

This commit applies timeout consideration to waitqueue waits by using the
ret parameter in ___wait_event() as a timeout value for DEPT tracking. It
leverages CONFIG_DEPT_AGGRESSIVE_TIMEOUT_WAIT to help reduce false positive
deadlock reports for waits that are meant to expire.

> diff --git a/include/linux/wait.h b/include/linux/wait.h
> index c8f8b44060fb9..a9524bc8630b7 100644
> --- a/include/linux/wait.h
> +++ b/include/linux/wait.h
> @@ -306,7 +306,7 @@ extern void init_wait_entry(struct wait_queue_entry 
> *wq_entry, int flags);
>       struct wait_queue_entry __wq_entry;                                     
> \
>       long __ret = ret;       /* explicit shadow */                           
> \
>                                                                               
> \
> -     sdt_might_sleep_start(NULL);                                            
> \
> +     sdt_might_sleep_start_timeout(NULL, __ret);                             
> \

[Severity: Medium]
Does this logic also need to be applied to __wait_event_hrtimeout(),
hashed-waitqueues, and DMA fences?

For example, __wait_event_hrtimeout() passes 0 as the 'ret' parameter to
___wait_event(), causing sdt_might_sleep_start_timeout() to treat it as an
infinite wait.

Additionally, hashed-waitqueues (in ___wait_var_event) and DMA fences
(in dma_fence_default_wait and dma_fence_wait_any_timeout) still hardcode
sdt_might_sleep_start(NULL) even when taking a timeout. This seems to cause
DEPT to falsely report deadlocks for these bounded waits.

>       init_wait_entry(&__wq_entry, exclusive ? WQ_FLAG_EXCLUSIVE : 0);        
> \
>       for (;;) {                                                              
> \
>               long __int = prepare_to_wait_event(&wq_head, &__wq_entry, 
> state);\

[Severity: Medium]
Can the DEPT sleep end annotation be skipped on the signal interruption
error path?

Looking further down in the ___wait_event() macro, if the wait is
interruptible and interrupted by a signal, it takes the goto __out branch:

                if (___wait_is_interruptible(state) && __int) {
                        __ret = __int;
                        goto __out;
                }
                ...
        }
        finish_wait(&wq_head, &__wq_entry);
        sdt_might_sleep_end();
__out:  __ret;

This skips over sdt_might_sleep_end(), which leaks the DEPT wait stage
context. As a result, DEPT will mistakenly treat subsequent wait events for
this task as nested waits.

The same issue appears to exist in ___wait_var_event() for
hashed-waitqueues.

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

Reply via email to