aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtur Rojek <ar@semihalf.com>2021-08-12 08:34:25 +0000
committerMarcin Wojtas <mw@FreeBSD.org>2021-09-01 23:06:06 +0000
commit433ab9b6987b42b3e5b25b8b5dc7e5178c7ef9bb (patch)
treefcc868fec60f5a2ac2e3ebdbee779c942c907dc9
parent36130d2979d695dd439bc607feb00dcdb9a1937b (diff)
downloadsrc-433ab9b6987b42b3e5b25b8b5dc7e5178c7ef9bb.tar.gz
src-433ab9b6987b42b3e5b25b8b5dc7e5178c7ef9bb.zip
ena: Prevent reset after device destruction
Check for ENA_FLAG_TRIGGER_RESET inside a locked context in order to avoid potential race conditions with ena_destroy_device. This aligns the reset task logic with the Linux driver. Obtained from: Semihalf MFC after: 2 weeks Sponsored by: Amazon, Inc.
-rw-r--r--sys/dev/ena/ena.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c
index 84d58c844332..7615bf4d7cc0 100644
--- a/sys/dev/ena/ena.c
+++ b/sys/dev/ena/ena.c
@@ -3539,15 +3539,11 @@ ena_reset_task(void *arg, int pending)
{
struct ena_adapter *adapter = (struct ena_adapter *)arg;
- if (unlikely(!ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
- ena_log(adapter->pdev, WARN,
- "device reset scheduled but trigger_reset is off\n");
- return;
- }
-
ENA_LOCK_LOCK(adapter);
- ena_destroy_device(adapter, false);
- ena_restore_device(adapter);
+ if (likely(ENA_FLAG_ISSET(ENA_FLAG_TRIGGER_RESET, adapter))) {
+ ena_destroy_device(adapter, false);
+ ena_restore_device(adapter);
+ }
ENA_LOCK_UNLOCK(adapter);
}