diff options
author | Artur Rojek <ar@semihalf.com> | 2021-08-12 08:34:25 +0000 |
---|---|---|
committer | Marcin Wojtas <mw@FreeBSD.org> | 2021-09-01 23:06:06 +0000 |
commit | 433ab9b6987b42b3e5b25b8b5dc7e5178c7ef9bb (patch) | |
tree | fcc868fec60f5a2ac2e3ebdbee779c942c907dc9 | |
parent | 36130d2979d695dd439bc607feb00dcdb9a1937b (diff) | |
download | src-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.c | 12 |
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); } |