diff options
author | Alexander Bulekov <alxndr@bu.edu> | 2023-05-16 04:40:02 -0400 |
---|---|---|
committer | Thomas Huth <thuth@redhat.com> | 2023-05-22 10:35:28 +0200 |
commit | 3884bf6468ac6bbb58c2b3feaa74e87f821b52f3 (patch) | |
tree | ae8a8f00443a884a1ff28ebdd8ae68711f792180 | |
parent | 1afae3b8813023c32eaaf422af39c402b0f1930a (diff) |
memory: stricter checks prior to unsetting engaged_in_io
engaged_in_io could be unset by an MR with re-entrancy checks disabled.
Ensure that only MRs that can set the engaged_in_io flag can unset it.
Signed-off-by: Alexander Bulekov <alxndr@bu.edu>
Message-Id: <20230516084002.3813836-1-alxndr@bu.edu>
Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
-rw-r--r-- | softmmu/memory.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/softmmu/memory.c b/softmmu/memory.c index 342c121514..9ee4131d75 100644 --- a/softmmu/memory.c +++ b/softmmu/memory.c @@ -534,6 +534,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, unsigned access_size; unsigned i; MemTxResult r = MEMTX_OK; + bool reentrancy_guard_applied = false; if (!access_size_min) { access_size_min = 1; @@ -552,6 +553,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, return MEMTX_ACCESS_ERROR; } mr->dev->mem_reentrancy_guard.engaged_in_io = true; + reentrancy_guard_applied = true; } /* FIXME: support unaligned access? */ @@ -568,7 +570,7 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, access_mask, attrs); } } - if (mr->dev) { + if (mr->dev && reentrancy_guard_applied) { mr->dev->mem_reentrancy_guard.engaged_in_io = false; } return r; |