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)
|
static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
bool oom = false;
|
bool oom;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (vi->mergeable_rx_bufs)
|
if (vi->mergeable_rx_bufs)
|
||||||
|
@ -425,10 +425,9 @@ static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
|
||||||
else
|
else
|
||||||
err = add_recvbuf_small(vi, gfp);
|
err = add_recvbuf_small(vi, gfp);
|
||||||
|
|
||||||
if (err < 0) {
|
oom = err == -ENOMEM;
|
||||||
oom = true;
|
if (err < 0)
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
++vi->num;
|
++vi->num;
|
||||||
} while (err > 0);
|
} while (err > 0);
|
||||||
if (unlikely(vi->num > vi->max))
|
if (unlikely(vi->num > vi->max))
|
||||||
|
|
Loading…
Reference in New Issue