virtio_net: do not reschedule rx refill forever
We currently fill all of RX ring, then add_buf returns ENOSPC, which gets mis-detected as an out of memory condition and causes us to reschedule the work, and so on forever. Fix this by oom = err == -ENOMEM; Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Cc: stable@kernel.org # .34.x Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4a49043223
commit
1788f49548
|
@ -415,7 +415,7 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, gfp_t gfp)
|
|||
static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
|
||||
{
|
||||
int err;
|
||||
bool oom = false;
|
||||
bool oom;
|
||||
|
||||
do {
|
||||
if (vi->mergeable_rx_bufs)
|
||||
|
@ -425,10 +425,9 @@ static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
|
|||
else
|
||||
err = add_recvbuf_small(vi, gfp);
|
||||
|
||||
if (err < 0) {
|
||||
oom = true;
|
||||
oom = err == -ENOMEM;
|
||||
if (err < 0)
|
||||
break;
|
||||
}
|
||||
++vi->num;
|
||||
} while (err > 0);
|
||||
if (unlikely(vi->num > vi->max))
|
||||
|
|
Loading…
Reference in New Issue