为什么在进程上下文中调用 sock_def_readable?

Why is sock_def_readable called in process context?

我在 sock_def_readable 中添加了以下行:

printk("TT: %s\tcontext=%c\tpid=%d\tcomm=%s\n",
       __FUNCTION__,
       in_interrupt() ? 'i' : 'p',
       current->pid,
       current->comm);

并且很惊讶地看到它的输出。这是我在 VM 运行ning lighttpd:

中得到的
[  626.627938] TT: sock_def_readable    context=i   pid=0   comm=swapper/0
[  626.628682] TT: sock_def_readable    context=i   pid=0   comm=swapper/0
[  626.629410] TT: sock_def_readable    context=i   pid=0   comm=swapper/0
[  626.630730] TT: sock_def_readable    context=i   pid=3123    comm=lighttpd
正如预期的那样,

sock_def_readable 始终在中断上下文中调用。 Apache httpd 也有同样的情况。但是,如果我 运行 mysqld:

[  750.271819] TT: sock_def_readable    context=p   pid=3809    comm=mysqld
[  750.276922] TT: sock_def_readable    context=p   pid=3742    comm=mysqld
[  750.278017] TT: sock_def_readable    context=p   pid=4333    comm=mysqld

问题:为什么在 mysqld 的进程上下文中调用 sock_def_readable?为什么 sock_def_readable 会在进程上下文中被调用?

以防万一,我正在使用:

sock_def_readable 提供操作的(默认)版本 "Wake up any process waiting to receive on this socket." 通常对于 TCP 连接,该操作是在中断上下文中执行的,因为从网络设备驱动程序的接收接收到新消息打断。

mysqld 很可能是来自 Unix 域套接字的 sending/receiving。 Unix 域套接字不需要中断,因为所有数据传输都在一个进程与另一个进程之间进行。

当进程A在连接的(unix)套接字上发送消息时,调用sock_def_readable(通过sk->sk_data_ready)以确定是否有接收进程在套接字上等待数据。该调用将在发送方的进程上下文中进行。