memory: count number of active VGA logging clients
For a board that has multiple framebuffer devices, both of them might want to use DIRTY_MEMORY_VGA on the same memory region. The lack of reference counting in memory_region_set_log makes this very awkward to implement. Suggested-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
fb43096959
commit
deb809edb8
|
@ -180,6 +180,7 @@ struct MemoryRegion {
|
||||||
bool warning_printed; /* For reservations */
|
bool warning_printed; /* For reservations */
|
||||||
bool flush_coalesced_mmio;
|
bool flush_coalesced_mmio;
|
||||||
bool global_locking;
|
bool global_locking;
|
||||||
|
uint8_t vga_logging_count;
|
||||||
MemoryRegion *alias;
|
MemoryRegion *alias;
|
||||||
hwaddr alias_offset;
|
hwaddr alias_offset;
|
||||||
int32_t priority;
|
int32_t priority;
|
||||||
|
|
7
memory.c
7
memory.c
|
@ -1433,8 +1433,15 @@ void memory_region_notify_iommu(MemoryRegion *mr,
|
||||||
void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client)
|
void memory_region_set_log(MemoryRegion *mr, bool log, unsigned client)
|
||||||
{
|
{
|
||||||
uint8_t mask = 1 << client;
|
uint8_t mask = 1 << client;
|
||||||
|
uint8_t old_logging;
|
||||||
|
|
||||||
assert(client == DIRTY_MEMORY_VGA);
|
assert(client == DIRTY_MEMORY_VGA);
|
||||||
|
old_logging = mr->vga_logging_count;
|
||||||
|
mr->vga_logging_count += log ? 1 : -1;
|
||||||
|
if (!!old_logging == !!mr->vga_logging_count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
memory_region_transaction_begin();
|
memory_region_transaction_begin();
|
||||||
mr->dirty_log_mask = (mr->dirty_log_mask & ~mask) | (log * mask);
|
mr->dirty_log_mask = (mr->dirty_log_mask & ~mask) | (log * mask);
|
||||||
memory_region_update_pending |= mr->enabled;
|
memory_region_update_pending |= mr->enabled;
|
||||||
|
|
Loading…
Reference in a new issue