On 14/8/25 18:05, Igor Mammedov wrote:
This patch brings back Jan's idea [1] of BQL-free IO access

This will let us make access to ACPI PM/HPET timers cheaper,
and prevent BQL contention in case of workload that heavily
uses the timers with a lot of vCPUs.

1) 196ea13104f (memory: Add global-locking property to memory regions)
    ... de7ea885c539 (kvm: Switch to unlocked MMIO)

Signed-off-by: Igor Mammedov <imamm...@redhat.com>
Reviewed-by: Peter Xu <pet...@redhat.com>
---
v4:
   improove doc comment over memory_region_enable_lockless_io()
     David Hildenbrand <da...@redhat.com>
v3:
   add comment for 'mr->disable_reentrancy_guard = true'
     Peter Xu <pet...@redhat.com>
---
  include/system/memory.h | 12 ++++++++++++
  system/memory.c         | 15 +++++++++++++++
  system/physmem.c        |  2 +-
  3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/include/system/memory.h b/include/system/memory.h
index e2cd6ed126..aa85fc27a1 100644
--- a/include/system/memory.h
+++ b/include/system/memory.h
@@ -833,6 +833,7 @@ struct MemoryRegion {
      bool nonvolatile;
      bool rom_device;
      bool flush_coalesced_mmio;
+    bool lockless_io;
      bool unmergeable;
      uint8_t dirty_log_mask;
      bool is_iommu;
@@ -2341,6 +2342,17 @@ void memory_region_set_flush_coalesced(MemoryRegion *mr);
   */
  void memory_region_clear_flush_coalesced(MemoryRegion *mr);
+/**
+ * memory_region_enable_lockless_io: Enable lockless (BQL free) acceess.

Typo "access[es]".

+ *
+ * Enable BQL-free access for devices that are well prepared to handle
+ * locking during I/O themselves: either by doing fine grained locking or
+ * by providing lock-free I/O schemes.
+ *
+ * @mr: the memory region to be updated.

"the memory region to enable [lockless accesses]"?

+ */
+void memory_region_enable_lockless_io(MemoryRegion *mr);
+
  /**
   * memory_region_add_eventfd: Request an eventfd to be triggered when a word
   *                            is written to a location.
diff --git a/system/memory.c b/system/memory.c
index 5646547940..44701c465c 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -2546,6 +2546,21 @@ void memory_region_clear_flush_coalesced(MemoryRegion 
*mr)
      }
  }
+void memory_region_enable_lockless_io(MemoryRegion *mr)
+{
+    mr->lockless_io = true;
+    /*
+     * reentrancy_guard has per device scope, that when enabled
+     * will effectively prevent concurrent access to device's IO
+     * MemoryRegion(s) by not calling accessor callback.
+     *
+     * Turn it off for lock-less IO enabled devices, to allow
+     * concurrent IO.
+     * TODO: remove this when reentrancy_guard becomes per transaction.
+     */
+    mr->disable_reentrancy_guard = true;
+}
+
  void memory_region_add_eventfd(MemoryRegion *mr,
                                 hwaddr addr,
                                 unsigned size,
diff --git a/system/physmem.c b/system/physmem.c
index e5dd760e0b..f498572fc8 100644
--- a/system/physmem.c
+++ b/system/physmem.c
@@ -2900,7 +2900,7 @@ bool prepare_mmio_access(MemoryRegion *mr)
  {
      bool release_lock = false;
- if (!bql_locked()) {
+    if (!bql_locked() && !mr->lockless_io) {

Check @lockless_io first to avoid a call?

       if (likely(!mr->lockless_io) && !bql_locked()) {

          bql_lock();
          release_lock = true;
      }


Reply via email to