聊cmpxchg的楔子
近些日子,一直埋头于进程上下文/软中断对TCP传输控制块的访问,总想着在这个点里为TCP传输优化做点事。
原因也很简单,因为进程上下文/软中断的锁。
对于这种锁,最常见的就是TCP发送数据的入口。
int tcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
{
int ret;
lock_sock(sk);
ret = tcp_sendmsg_locked(sk, msg, size);
release_sock(sk);
return ret;
}
EXPORT_SYMBOL(tcp_sendmsg);
简单明了,lock_sock
上锁,release_sock
解锁。
而对于TCP的所有,都需要等待上层的解锁操作,才能继续自己的工作,定时器、TSQ、DelayACK和PMTU都不例外。像极了被地主强取豪夺的佃农,但TCP生下来就得吃这碗饭,所以TCP传输优化也应将关注点放一些在进程上下文/软中断的锁上,毕竟地主少克扣点,佃农的日子也会好过很多。
这几天,往复看了很多遍lock_sock和release_sock。虽然更多是在lock_sock上下功夫,但对release_sock也执念颇深。
release_sock
的回调是tcp_release_cb