Already sent this to several lists, but forgot netdev ;-)... This one's sort of outside my normal area of expertise so sending this as an RFC to gather feedback on the idea.
Some background: The cifs_mount() and cifs_umount() functions currently send a signal to the cifsd kthread prior to calling kthread_stop on it. The reasoning is apparently that it's likely that cifsd will have called kernel_recvmsg() and if it doesn't do this there can be a rather long delay when a filesystem is unmounted. The following patch is a first stab at removing this need. It makes it so that in tcp_recvmsg() we also check kthread_should_stop() at any point where we currently check to see if the task was signalled. If that returns true, then it acts as if it were signalled. I've tested this on a fairly recent kernel with a cifs module that doesn't send signals on unmount and it seems to work as expected. I'm just not clear on whether it will have any adverse side-effects. Obviously if this approach is OK then we'll probably also want to fix up other recvmsg functions (udp_recvmsg, etc). Anyone care to comment? Thanks, Signed-off-by: Jeff Layton <[EMAIL PROTECTED]> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index bd4c295..1ad91fa 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -258,6 +258,7 @@ #include <linux/cache.h> #include <linux/err.h> #include <linux/crypto.h> +#include <linux/kthread.h> #include <net/icmp.h> #include <net/tcp.h> @@ -1154,7 +1155,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, if (tp->urg_data && tp->urg_seq == *seq) { if (copied) break; - if (signal_pending(current)) { + if (signal_pending(current) || kthread_should_stop()) { copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; break; } @@ -1197,6 +1198,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, (sk->sk_shutdown & RCV_SHUTDOWN) || !timeo || signal_pending(current) || + kthread_should_stop() || (flags & MSG_PEEK)) break; } else { @@ -1227,7 +1229,7 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, break; } - if (signal_pending(current)) { + if (signal_pending(current) || kthread_should_stop()) { copied = sock_intr_errno(timeo); break; } - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html