Skip to content

Commit

Permalink
memory: Add global-locking property to memory regions
Browse files Browse the repository at this point in the history
This introduces the memory region property "global_locking". It is true
by default. By setting it to false, a device model can request BQL-free
dispatching of region accesses to its r/w handlers. The actual BQL
break-up will be provided in a separate patch.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Frederic Konrad <fred.konrad@greensocs.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1434646046-27150-4-git-send-email-pbonzini@redhat.com>
  • Loading branch information
jan-kiszka authored and bonzini committed Jul 1, 2015
1 parent afbe705 commit 196ea13
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
26 changes: 26 additions & 0 deletions include/exec/memory.h
Expand Up @@ -180,6 +180,7 @@ struct MemoryRegion {
bool rom_device;
bool warning_printed; /* For reservations */
bool flush_coalesced_mmio;
bool global_locking;
MemoryRegion *alias;
hwaddr alias_offset;
int32_t priority;
Expand Down Expand Up @@ -824,6 +825,31 @@ void memory_region_set_flush_coalesced(MemoryRegion *mr);
*/
void memory_region_clear_flush_coalesced(MemoryRegion *mr);

/**
* memory_region_set_global_locking: Declares the access processing requires
* QEMU's global lock.
*
* When this is invoked, accesses to the memory region will be processed while
* holding the global lock of QEMU. This is the default behavior of memory
* regions.
*
* @mr: the memory region to be updated.
*/
void memory_region_set_global_locking(MemoryRegion *mr);

/**
* memory_region_clear_global_locking: Declares that access processing does
* not depend on the QEMU global lock.
*
* By clearing this property, accesses to the memory region will be processed
* outside of QEMU's global lock (unless the lock is held on when issuing the
* access request). In this case, the device model implementing the access
* handlers is responsible for synchronization of concurrency.
*
* @mr: the memory region to be updated.
*/
void memory_region_clear_global_locking(MemoryRegion *mr);

/**
* memory_region_add_eventfd: Request an eventfd to be triggered when a word
* is written to a location.
Expand Down
11 changes: 11 additions & 0 deletions memory.c
Expand Up @@ -1012,6 +1012,7 @@ static void memory_region_initfn(Object *obj)
mr->ram_addr = RAM_ADDR_INVALID;
mr->enabled = true;
mr->romd_mode = true;
mr->global_locking = true;
mr->destructor = memory_region_destructor_none;
QTAILQ_INIT(&mr->subregions);
QTAILQ_INIT(&mr->coalesced);
Expand Down Expand Up @@ -1646,6 +1647,16 @@ void memory_region_clear_flush_coalesced(MemoryRegion *mr)
}
}

void memory_region_set_global_locking(MemoryRegion *mr)
{
mr->global_locking = true;
}

void memory_region_clear_global_locking(MemoryRegion *mr)
{
mr->global_locking = false;
}

void memory_region_add_eventfd(MemoryRegion *mr,
hwaddr addr,
unsigned size,
Expand Down

0 comments on commit 196ea13

Please sign in to comment.