On 2022/09/02 0:23, Christian Schoenebeck wrote: > So the intention in this alternative approach is to allow user space apps > still being able to perform blocking I/O, while at the same time making the > kernel thread interruptible to fix this hung task issue, correct? Making the kernel thread "non-blocking" (rather than "interruptible") in order not to be blocked on I/O on pipes. Since kernel threads by default do not receive signals, being "interruptible" or "killable" does not help (except for silencing khungtaskd warning). Being "non-blocking" like I/O on sockets helps. >> --- a/net/9p/trans_fd.c >> +++ b/net/9p/trans_fd.c >> @@ -256,11 +256,13 @@ static int p9_fd_read(struct p9_client *client, void >> *v, int len) if (!ts) >> return -EREMOTEIO; >> >> - if (!(ts->rd->f_flags & O_NONBLOCK)) >> - p9_debug(P9_DEBUG_ERROR, "blocking read ...\n"); >> - >> pos = ts->rd->f_pos; >> + /* Force non-blocking read() even without O_NONBLOCK. */ >> + set_thread_flag(TIF_SIGPENDING); >> ret = kernel_read(ts->rd, v, len, &pos); >> + spin_lock_irq(¤t->sighand->siglock); >> + recalc_sigpending(); >> + spin_unlock_irq(¤t->sighand->siglock); > > Is the recalc_sigpending() block here actually needed? The TIF_SIGPENDING flag > is already cleared by net/9p/client.c, no? This is actually needed. The thread which processes this function is a kernel workqueue thread which is supposed to process other functions (which might call "interruptible" functions even if signals are not received by default). The thread which currently clearing the TIF_SIGPENDING flag is a user process (which are calling "killable" functions from syscall context but effectively "uninterruptible" due to clearing the TIF_SIGPENDING flag and retrying). By the way, clearing the TIF_SIGPENDING flag before retrying "killable" functions (like p9_client_rpc() does) is very bad and needs to be avoided...