You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.7 KiB
79 lines
2.7 KiB
From 932ad5d965a7ed50fd53f7869ad72e695b6c9906 Mon Sep 17 00:00:00 2001
|
|
From: Igor Russkikh <irusskik@redhat.com>
|
|
Date: Fri, 6 Nov 2020 18:36:29 -0500
|
|
Subject: [PATCH 012/139] [netdrv] net: aquantia: fix out of memory condition
|
|
on rx side
|
|
|
|
Message-id: <1604687916-15087-13-git-send-email-irusskik@redhat.com>
|
|
Patchwork-id: 338438
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.4 BZ 1857861 012/139] net: aquantia: fix out of memory condition on rx side
|
|
Bugzilla: 1857861
|
|
RH-Acked-by: David Arcari <darcari@redhat.com>
|
|
RH-Acked-by: John Linville <linville@redhat.com>
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1857861
|
|
|
|
commit be6cef69ba570ebb327eba1ef6438f7af49aaf86
|
|
Author: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>
|
|
Date: Fri Aug 30 12:08:38 2019 +0000
|
|
|
|
net: aquantia: fix out of memory condition on rx side
|
|
|
|
On embedded environments with hard memory limits it is a normal although
|
|
rare case when skb can't be allocated on rx part under high traffic.
|
|
|
|
In such OOM cases napi_complete_done() was not called.
|
|
So the napi object became in an invalid state like it is "scheduled".
|
|
Kernel do not re-schedules the poll of that napi object.
|
|
|
|
Consequently, kernel can not remove that object the system hangs on
|
|
`ifconfig down` waiting for a poll.
|
|
|
|
We are fixing this by gracefully closing napi poll routine with correct
|
|
invocation of napi_complete_done.
|
|
|
|
This was reproduced with artificially failing the allocation of skb to
|
|
simulate an "out of memory" error case and check that traffic does
|
|
not get stuck.
|
|
|
|
Fixes: 970a2e9864b0 ("net: ethernet: aquantia: Vector operations")
|
|
Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
|
|
Signed-off-by: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
Signed-off-by: Igor Russkikh <irusskik@redhat.com>
|
|
|
|
Cc: David Arcari <darcari@redhat.com>
|
|
Cc: Igor Russkikh <irusskik@redhat.com>
|
|
Signed-off-by: Jan Stancek <jstancek@redhat.com>
|
|
---
|
|
drivers/net/ethernet/aquantia/atlantic/aq_vec.c | 3 ++-
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
|
|
index 715685aa48c3..28892b8acd0e 100644
|
|
--- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
|
|
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c
|
|
@@ -86,6 +86,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)
|
|
}
|
|
}
|
|
|
|
+err_exit:
|
|
if (!was_tx_cleaned)
|
|
work_done = budget;
|
|
|
|
@@ -95,7 +96,7 @@ static int aq_vec_poll(struct napi_struct *napi, int budget)
|
|
1U << self->aq_ring_param.vec_idx);
|
|
}
|
|
}
|
|
-err_exit:
|
|
+
|
|
return work_done;
|
|
}
|
|
|
|
--
|
|
2.13.6
|
|
|