为什么在进程上下文中调用 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
会在进程上下文中被调用?
以防万一,我正在使用:
- Linux 内核 4.8-rc2
- Lighttpd 1.4.34
- 阿帕奇 2.4.10 (mod_prefork) + PHP 5.6
- MySQL 5.5
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
)以确定是否有接收进程在套接字上等待数据。该调用将在发送方的进程上下文中进行。
我在 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
会在进程上下文中被调用?
以防万一,我正在使用:
- Linux 内核 4.8-rc2
- Lighttpd 1.4.34
- 阿帕奇 2.4.10 (mod_prefork) + PHP 5.6
- MySQL 5.5
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
)以确定是否有接收进程在套接字上等待数据。该调用将在发送方的进程上下文中进行。