memory: Add global-locking property to memory regions
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>
This commit is contained in:
parent
afbe70535f
commit
196ea13104
@ -180,6 +180,7 @@ struct MemoryRegion {
|
|||||||
bool rom_device;
|
bool rom_device;
|
||||||
bool warning_printed; /* For reservations */
|
bool warning_printed; /* For reservations */
|
||||||
bool flush_coalesced_mmio;
|
bool flush_coalesced_mmio;
|
||||||
|
bool global_locking;
|
||||||
MemoryRegion *alias;
|
MemoryRegion *alias;
|
||||||
hwaddr alias_offset;
|
hwaddr alias_offset;
|
||||||
int32_t priority;
|
int32_t priority;
|
||||||
@ -824,6 +825,31 @@ void memory_region_set_flush_coalesced(MemoryRegion *mr);
|
|||||||
*/
|
*/
|
||||||
void memory_region_clear_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
|
* memory_region_add_eventfd: Request an eventfd to be triggered when a word
|
||||||
* is written to a location.
|
* is written to a location.
|
||||||
|
11
memory.c
11
memory.c
@ -1012,6 +1012,7 @@ static void memory_region_initfn(Object *obj)
|
|||||||
mr->ram_addr = RAM_ADDR_INVALID;
|
mr->ram_addr = RAM_ADDR_INVALID;
|
||||||
mr->enabled = true;
|
mr->enabled = true;
|
||||||
mr->romd_mode = true;
|
mr->romd_mode = true;
|
||||||
|
mr->global_locking = true;
|
||||||
mr->destructor = memory_region_destructor_none;
|
mr->destructor = memory_region_destructor_none;
|
||||||
QTAILQ_INIT(&mr->subregions);
|
QTAILQ_INIT(&mr->subregions);
|
||||||
QTAILQ_INIT(&mr->coalesced);
|
QTAILQ_INIT(&mr->coalesced);
|
||||||
@ -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,
|
void memory_region_add_eventfd(MemoryRegion *mr,
|
||||||
hwaddr addr,
|
hwaddr addr,
|
||||||
unsigned size,
|
unsigned size,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user