Using kthread_stop() to terminate a thread causes tcp_recvmsg() to enter a dead loop when the kernel thread uses tcp_recvmsg() to receive a message.
tcp_recvmsg()-->sk_wait_data()-->sk_wait_event()-->wait_woken(). wait_woken() will directly return unchanged timeout value rather than be executed as normally. tcp_recvmsg () will continues to execute sk_wait_data(). So finally this situation will creat an endless loop that cannot be exited. Signed-off-by: Qingjie Xing <xqjc...@gmail.com> --- kernel/sched/wait.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/sched/wait.c b/kernel/sched/wait.c index ba059fb..a27bbbd 100644 --- a/kernel/sched/wait.c +++ b/kernel/sched/wait.c @@ -431,6 +431,8 @@ long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout) set_current_state(mode); /* A */ if (!(wq_entry->flags & WQ_FLAG_WOKEN) && !is_kthread_should_stop()) timeout = schedule_timeout(timeout); + if (is_kthread_should_stop()) + timeout = 0; __set_current_state(TASK_RUNNING); /* -- 1.8.3.1