diff options
Diffstat (limited to 'drivers/vhost/net.c')
| -rw-r--r-- | drivers/vhost/net.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index df5b6b971f26..57a593c58cf4 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
| @@ -98,7 +98,8 @@ static void tx_poll_start(struct vhost_net *net, struct socket *sock) | |||
| 98 | static void handle_tx(struct vhost_net *net) | 98 | static void handle_tx(struct vhost_net *net) |
| 99 | { | 99 | { |
| 100 | struct vhost_virtqueue *vq = &net->dev.vqs[VHOST_NET_VQ_TX]; | 100 | struct vhost_virtqueue *vq = &net->dev.vqs[VHOST_NET_VQ_TX]; |
| 101 | unsigned head, out, in, s; | 101 | unsigned out, in, s; |
| 102 | int head; | ||
| 102 | struct msghdr msg = { | 103 | struct msghdr msg = { |
| 103 | .msg_name = NULL, | 104 | .msg_name = NULL, |
| 104 | .msg_namelen = 0, | 105 | .msg_namelen = 0, |
| @@ -135,6 +136,9 @@ static void handle_tx(struct vhost_net *net) | |||
| 135 | ARRAY_SIZE(vq->iov), | 136 | ARRAY_SIZE(vq->iov), |
| 136 | &out, &in, | 137 | &out, &in, |
| 137 | NULL, NULL); | 138 | NULL, NULL); |
| 139 | /* On error, stop handling until the next kick. */ | ||
| 140 | if (unlikely(head < 0)) | ||
| 141 | break; | ||
| 138 | /* Nothing new? Wait for eventfd to tell us they refilled. */ | 142 | /* Nothing new? Wait for eventfd to tell us they refilled. */ |
| 139 | if (head == vq->num) { | 143 | if (head == vq->num) { |
| 140 | wmem = atomic_read(&sock->sk->sk_wmem_alloc); | 144 | wmem = atomic_read(&sock->sk->sk_wmem_alloc); |
| @@ -192,7 +196,8 @@ static void handle_tx(struct vhost_net *net) | |||
| 192 | static void handle_rx(struct vhost_net *net) | 196 | static void handle_rx(struct vhost_net *net) |
| 193 | { | 197 | { |
| 194 | struct vhost_virtqueue *vq = &net->dev.vqs[VHOST_NET_VQ_RX]; | 198 | struct vhost_virtqueue *vq = &net->dev.vqs[VHOST_NET_VQ_RX]; |
| 195 | unsigned head, out, in, log, s; | 199 | unsigned out, in, log, s; |
| 200 | int head; | ||
| 196 | struct vhost_log *vq_log; | 201 | struct vhost_log *vq_log; |
| 197 | struct msghdr msg = { | 202 | struct msghdr msg = { |
| 198 | .msg_name = NULL, | 203 | .msg_name = NULL, |
| @@ -228,6 +233,9 @@ static void handle_rx(struct vhost_net *net) | |||
| 228 | ARRAY_SIZE(vq->iov), | 233 | ARRAY_SIZE(vq->iov), |
| 229 | &out, &in, | 234 | &out, &in, |
| 230 | vq_log, &log); | 235 | vq_log, &log); |
| 236 | /* On error, stop handling until the next kick. */ | ||
| 237 | if (unlikely(head < 0)) | ||
| 238 | break; | ||
| 231 | /* OK, now we need to know about added descriptors. */ | 239 | /* OK, now we need to know about added descriptors. */ |
| 232 | if (head == vq->num) { | 240 | if (head == vq->num) { |
| 233 | if (unlikely(vhost_enable_notify(vq))) { | 241 | if (unlikely(vhost_enable_notify(vq))) { |
