From 45e1325918e0385de07c55571a28e73fca9dac47 Mon Sep 17 00:00:00 2001 From: Shirley Ma Date: Wed, 20 Jul 2011 10:23:12 -0700 Subject: [PATCH] --- yaml --- r: 256627 b: refs/heads/master c: 9e380825ab3f5176f65306c4ac119fd23634ce03 h: refs/heads/master i: 256625: e3f178c80c22ac5169ccd5198fd0ed365349caee 256623: 3089bbf8489a8fdc760851a41ffc36cf704453cf v: v3 --- [refs] | 2 +- trunk/drivers/vhost/net.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index cfbffae4f078..b106a386dc4a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c047e5f3170c2595e66ed67f87cec01afd717212 +refs/heads/master: 9e380825ab3f5176f65306c4ac119fd23634ce03 diff --git a/trunk/drivers/vhost/net.c b/trunk/drivers/vhost/net.c index 248b25008d1a..882a51fe7b3c 100644 --- a/trunk/drivers/vhost/net.c +++ b/trunk/drivers/vhost/net.c @@ -182,15 +182,21 @@ static void handle_tx(struct vhost_net *net) break; /* Nothing new? Wait for eventfd to tell us they refilled. */ if (head == vq->num) { + int num_pends; + wmem = atomic_read(&sock->sk->sk_wmem_alloc); if (wmem >= sock->sk->sk_sndbuf * 3 / 4) { tx_poll_start(net, sock); set_bit(SOCK_ASYNC_NOSPACE, &sock->flags); break; } - /* If more outstanding DMAs, queue the work */ - if (unlikely(vq->upend_idx - vq->done_idx > - VHOST_MAX_PEND)) { + /* If more outstanding DMAs, queue the work. + * Handle upend_idx wrap around + */ + num_pends = likely(vq->upend_idx >= vq->done_idx) ? + (vq->upend_idx - vq->done_idx) : + (vq->upend_idx + UIO_MAXIOV - vq->done_idx); + if (unlikely(num_pends > VHOST_MAX_PEND)) { tx_poll_start(net, sock); set_bit(SOCK_ASYNC_NOSPACE, &sock->flags); break;