- 论坛徽章:
- 6
|
回复 1# niaocai_123
当接收到一个数据包时,该函数先判断进程上下文是不是在使用这个sock,如果这个sock没用被使用,则通过tcp_prequeue函数来处理。
在tcp_prequeue里面,有个条件说如果tp->ucopy.task为空则不放到prequeue队列里面。
我的理解是:既然前面已经判断没有用户进程在使用这个sock,不就说明没有进程在读取数据,即tp->ucopy.task为空吗?这样的话无论如何skb也不会放到preque里面了。
请问我这样理解哪里不对啊?不知道sk_lock.owned=0与tp->ucopy.task=null有什么区别?
tp->ucopy.task 与 sock_owned_by_sock没有必然的联系
例如:
tcp_recvmsg -> install ucopy reader -> no data so call sk_wait_data() -> set task to TASK_INTERRUPTIBLE -> sk_wait_event -> release_sock-->__release_sock
This time, packet in!
这个时候就是,tcp_v4_rcv-->满足!sk_owned_by_user并且tp->ucopy.task!= null
|
|