| From foo@baz Fri Mar 8 08:25:51 CET 2019 |
| From: Timur Celik <mail@timurcelik.de> |
| Date: Sat, 23 Feb 2019 12:53:13 +0100 |
| Subject: tun: fix blocking read |
| |
| From: Timur Celik <mail@timurcelik.de> |
| |
| [ Upstream commit 71828b2240692cec0e68b8d867bc00e1745e7fae ] |
| |
| This patch moves setting of the current state into the loop. Otherwise |
| the task may end up in a busy wait loop if none of the break conditions |
| are met. |
| |
| Signed-off-by: Timur Celik <mail@timurcelik.de> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/tun.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/tun.c |
| +++ b/drivers/net/tun.c |
| @@ -2122,9 +2122,9 @@ static void *tun_ring_recv(struct tun_fi |
| } |
| |
| add_wait_queue(&tfile->wq.wait, &wait); |
| - current->state = TASK_INTERRUPTIBLE; |
| |
| while (1) { |
| + set_current_state(TASK_INTERRUPTIBLE); |
| ptr = ptr_ring_consume(&tfile->tx_ring); |
| if (ptr) |
| break; |
| @@ -2140,7 +2140,7 @@ static void *tun_ring_recv(struct tun_fi |
| schedule(); |
| } |
| |
| - current->state = TASK_RUNNING; |
| + set_current_state(TASK_RUNNING); |
| remove_wait_queue(&tfile->wq.wait, &wait); |
| |
| out: |