socket中的回调函数为sk_data_ready()

时间:2012-12-26 12:04:10

标签: c linux performance networking linux-kernel

我试图计算各个层消耗的 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()函数是否与上面定义的回调函数有关?

2 个答案:

答案 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