- 论坛徽章:
- 6
|
回复 5# jiufei19
感谢瀚海书香,你给出的调用序列,我之前仔细查看过,这里有一个问题,即在sk_wait_data中将调用sk_wait_event,进一步就会调用release_sock(__sk),于是用户进程将释放对此sk的占用,此时sk->sk_lock.owner将被置为NULL,于是我的问题就出现了,既然都为NULL了,那么如下的红色判断将不可能成立了,所以也没有机会执行set RUNNING
if (tp->ucopy.task == current && sock_owned_by_user(sk) && !copied_early)
我的理解是否有误?
Please check the pass carefully!
int sk_wait_data(struct sock *sk, long *timeo)
{
int rc;
DEFINE_WAIT(wait);
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
Softirq can trigged here!(before release_sock())
set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
rc = sk_wait_event(sk, timeo, !skb_queue_empty(&sk->sk_receive_queue));
clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
finish_wait(sk_sleep(sk), &wait);
return rc;
}
|
|