macvtap: use prepare_to_wait/finish_wait to ensure mb
instead of raw assignment to current->state Signed-off-by: Hong Zhiguo <honkiko@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e9939c80e9
commit
ccf7e72b54
@ -847,13 +847,12 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
|
||||
const struct iovec *iv, unsigned long len,
|
||||
int noblock)
|
||||
{
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
DEFINE_WAIT(wait);
|
||||
struct sk_buff *skb;
|
||||
ssize_t ret = 0;
|
||||
|
||||
add_wait_queue(sk_sleep(&q->sk), &wait);
|
||||
while (len) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
prepare_to_wait(sk_sleep(&q->sk), &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
/* Read frames from the queue */
|
||||
skb = skb_dequeue(&q->sk.sk_receive_queue);
|
||||
@ -875,8 +874,7 @@ static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
|
||||
break;
|
||||
}
|
||||
|
||||
current->state = TASK_RUNNING;
|
||||
remove_wait_queue(sk_sleep(&q->sk), &wait);
|
||||
finish_wait(sk_sleep(&q->sk), &wait);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user