我试图计算各个层消耗的 CPU周期& linux内核中为TCP / IP网络堆栈定义的用于处理数据包的函数。所以我使用TSC通过各种功能来消耗CPU。这表明对sk_data_ready()函数的单次调用需要大量的CPU周期。
所以我按照linux内核中TCP / IP堆栈的源代码进行原始套接字&最终在特定套接字的接收循环链表中将数据包排入队列中获取信息。
但是在对数据包进行排队之后,sock.c中定义的函数为sock_queue_rcv_skb()调用
sk->sk_data_ready(sk, skb_len);
这是回调函数(我认为)。但我无法获得此回调函数的任何源代码。
任何人都可以帮我找到代码&它是如何工作的?
recvfrom()函数是否与上面定义的回调函数有关?
答案 0 :(得分:3)
默认 - > 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中的数据。
某些协议可能会覆盖此内容,例如netlink,请参阅__netlink_kernel_create()。
顺便说一句,您可以使用perf top
命令查看哪个内核函数占用大多数CPU周期。
答案 1 :(得分:0)
auto-fill