gpt4 book ai didi

套接字中的回调函数为 sk_data_ready()

转载 作者:太空狗 更新时间:2023-10-29 11:09:53 27 4
gpt4 key购买 nike

我试图计算 Linux 内核中为 TCP/IP 网络堆栈定义的用于处理数据包的各个层和函数消耗的 CPU 周期。所以我使用 TSC 进行各种功能的 CPU 消耗。这表明对 sk_data_ready() 函数的单次调用需要大量 CPU 周期。

所以我遵循 Linux 内核中原始套接字的 TCP/IP 堆栈的源代码,并在数据包最终在特定套接字的接收循环链表中排队时获得了信息。

但是在将数据包入队之后,在 sock.c 中定义为 sock_queue_rcv_skb() 调用的函数

sk->sk_data_ready(sk, skb_len); 

这是回调函数(我认为)。但我无法获得此回调函数的任何源代码。

谁能帮我找到代码及其工作原理?

recvfrom()函数是否也与上面定义的回调函数有关?

最佳答案

默认的 ->sk_data_ready() 回调是 sock_def_readable():

static void sock_def_readable(struct sock *sk, int len)
{
struct socket_wq *wq;

rcu_read_lock();
wq = rcu_dereference(sk->sk_wq);
if (wq_has_sleeper(wq))
wake_up_interruptible_sync_poll(&wq->wait, POLLIN | POLLPRI |
POLLRDNORM | POLLRDBAND);
sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
rcu_read_unlock();
}

基本上就是唤醒等待这些数据的进程,比如recv(),让它们处理->sk_receive_queue中的数据。

某些协议(protocol)可能会覆盖它,例如 netlink,请参阅 __netlink_kernel_create()。

顺便说一句,您可以使用 perf top 命令查看哪个内核函数消耗了最多的 CPU 周期。

关于套接字中的回调函数为 sk_data_ready(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14040328/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com