On 2020/09/22 19:13, Oliver Neukum wrote: > +/* flush() is uninterruptible, but we cannot wait forever */ > +#define WDM_FLUSH_TIMEOUT (30 * HZ) > static int wdm_flush(struct file *file, fl_owner_t id) > { > struct wdm_device *desc = file->private_data; > + int rv; > > - wait_event(desc->wait, > + rv = wait_event_timeout(desc->wait, > /* > * needs both flags. We cannot do with one > * because resetting it would cause a race > @@ -595,16 +630,25 @@ static int wdm_flush(struct file *file, fl_owner_t id) > * a disconnect > */ > !test_bit(WDM_IN_USE, &desc->flags) || > - test_bit(WDM_DISCONNECTING, &desc->flags)); > + test_bit(WDM_DISCONNECTING, &desc->flags), > + WDM_FLUSH_TIMEOUT); > Generally looks OK. Any chance we can use wait_event_killable_timeout() or wait_event_killable() here? syzkaller sends SIGKILL after 5 seconds from process creation. Blocking for 30 seconds in TASK_UNINTERRUPTIBLE state is not happy when killed by e.g. OOM killer.