[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v1 03/22] kvm: use separate MemoryListeners for me
From: |
Blue Swirl |
Subject: |
Re: [Qemu-devel] [RFC v1 03/22] kvm: use separate MemoryListeners for memory and I/O |
Date: |
Wed, 3 Oct 2012 20:16:00 +0000 |
On Wed, Oct 3, 2012 at 4:03 PM, Avi Kivity <address@hidden> wrote:
> The construct
>
> if (address_space == get_system_memory()) {
> // memory thing
> } else {
> // io thing
> }
>
> fails if we have more than two address spaces. Use a separate listener
> for memory and I/O, and utilize MemoryListener's address space filtering to
> fix this.
>
> Signed-off-by: Avi Kivity <address@hidden>
> ---
> kvm-all.c | 83
> +++++++++++++++++++++++++++++++++------------------------------
> 1 file changed, 44 insertions(+), 39 deletions(-)
>
> diff --git a/kvm-all.c b/kvm-all.c
> index 92a7137..c69e012 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -755,9 +755,16 @@ static void kvm_log_global_stop(struct MemoryListener
> *listener)
> assert(r >= 0);
> }
>
> -static void kvm_mem_ioeventfd_add(MemoryRegionSection *section,
> - bool match_data, uint64_t data, int fd)
> +static void kvm_log_nop(struct MemoryListener *listener)
> {
> +}
> +
> +static void kvm_mem_ioeventfd_add(MemoryListener *listener,
> + MemoryRegionSection *section,
> + bool match_data, uint64_t data,
> + EventNotifier *e)
> +{
> + int fd = event_notifier_get_fd(e);
> int r;
>
> assert(match_data && section->size <= 8);
> @@ -769,9 +776,12 @@ static void kvm_mem_ioeventfd_add(MemoryRegionSection
> *section,
> }
> }
>
> -static void kvm_mem_ioeventfd_del(MemoryRegionSection *section,
> - bool match_data, uint64_t data, int fd)
> +static void kvm_mem_ioeventfd_del(MemoryListener *listener,
> + MemoryRegionSection *section,
> + bool match_data, uint64_t data,
> + EventNotifier *e)
> {
> + int fd = event_notifier_get_fd(e);
> int r;
>
> r = kvm_set_ioeventfd_mmio(fd, section->offset_within_address_space,
> @@ -781,9 +791,12 @@ static void kvm_mem_ioeventfd_del(MemoryRegionSection
> *section,
> }
> }
>
> -static void kvm_io_ioeventfd_add(MemoryRegionSection *section,
> - bool match_data, uint64_t data, int fd)
> +static void kvm_io_ioeventfd_add(MemoryListener *listener,
> + MemoryRegionSection *section,
> + bool match_data, uint64_t data,
> + EventNotifier *e)
> {
> + int fd = event_notifier_get_fd(e);
> int r;
>
> assert(match_data && section->size == 2);
> @@ -795,10 +808,13 @@ static void kvm_io_ioeventfd_add(MemoryRegionSection
> *section,
> }
> }
>
> -static void kvm_io_ioeventfd_del(MemoryRegionSection *section,
> - bool match_data, uint64_t data, int fd)
> +static void kvm_io_ioeventfd_del(MemoryListener *listener,
> + MemoryRegionSection *section,
> + bool match_data, uint64_t data,
> + EventNotifier *e)
>
> {
> + int fd = event_notifier_get_fd(e);
> int r;
>
> r = kvm_set_ioeventfd_pio_word(fd, section->offset_within_address_space,
> @@ -808,34 +824,6 @@ static void kvm_io_ioeventfd_del(MemoryRegionSection
> *section,
> }
> }
>
> -static void kvm_eventfd_add(MemoryListener *listener,
> - MemoryRegionSection *section,
> - bool match_data, uint64_t data,
> - EventNotifier *e)
> -{
> - if (section->address_space == get_system_memory()) {
> - kvm_mem_ioeventfd_add(section, match_data, data,
> - event_notifier_get_fd(e));
> - } else {
> - kvm_io_ioeventfd_add(section, match_data, data,
> - event_notifier_get_fd(e));
> - }
> -}
> -
> -static void kvm_eventfd_del(MemoryListener *listener,
> - MemoryRegionSection *section,
> - bool match_data, uint64_t data,
> - EventNotifier *e)
> -{
> - if (section->address_space == get_system_memory()) {
> - kvm_mem_ioeventfd_del(section, match_data, data,
> - event_notifier_get_fd(e));
> - } else {
> - kvm_io_ioeventfd_del(section, match_data, data,
> - event_notifier_get_fd(e));
> - }
> -}
> -
> static MemoryListener kvm_memory_listener = {
> .begin = kvm_begin,
> .commit = kvm_commit,
> @@ -847,8 +835,24 @@ static void kvm_eventfd_del(MemoryListener *listener,
> .log_sync = kvm_log_sync,
> .log_global_start = kvm_log_global_start,
> .log_global_stop = kvm_log_global_stop,
> - .eventfd_add = kvm_eventfd_add,
> - .eventfd_del = kvm_eventfd_del,
> + .eventfd_add = kvm_mem_ioeventfd_add,
> + .eventfd_del = kvm_mem_ioeventfd_del,
> + .priority = 10,
> +};
> +
> +static MemoryListener kvm_io_listener = {
const
> + .begin = kvm_begin,
> + .commit = kvm_commit,
> + .region_add = kvm_region_nop,
> + .region_del = kvm_region_nop,
> + .region_nop = kvm_region_nop,
> + .log_start = kvm_region_nop,
> + .log_stop = kvm_region_nop,
> + .log_sync = kvm_region_nop,
> + .log_global_start = kvm_log_nop,
> + .log_global_stop = kvm_log_nop,
> + .eventfd_add = kvm_io_ioeventfd_add,
> + .eventfd_del = kvm_io_ioeventfd_del,
> .priority = 10,
> };
>
> @@ -1401,7 +1405,8 @@ int kvm_init(void)
> }
>
> kvm_state = s;
> - memory_listener_register(&kvm_memory_listener, NULL);
> + memory_listener_register(&kvm_memory_listener, get_system_memory());
> + memory_listener_register(&kvm_io_listener, get_system_io());
>
> s->many_ioeventfds = kvm_check_many_ioeventfds();
>
> --
> 1.7.12
>
- [Qemu-devel] [RFC v1 00/22] Integrate DMA into the memory API, Avi Kivity, 2012/10/03
- [Qemu-devel] [RFC v1 01/22] memory: rename 'exec-obsolete.h', Avi Kivity, 2012/10/03
- [Qemu-devel] [RFC v1 02/22] vhost: use MemoryListener filtering to only monitor RAM address space, Avi Kivity, 2012/10/03
- [Qemu-devel] [RFC v1 05/22] memory: prepare AddressSpace for exporting, Avi Kivity, 2012/10/03
- [Qemu-devel] [RFC v1 04/22] xen_pt: use separate MemoryListeners for memory and I/O, Avi Kivity, 2012/10/03
- [Qemu-devel] [RFC v1 03/22] kvm: use separate MemoryListeners for memory and I/O, Avi Kivity, 2012/10/03
- Re: [Qemu-devel] [RFC v1 03/22] kvm: use separate MemoryListeners for memory and I/O,
Blue Swirl <=
[Qemu-devel] [RFC v1 09/22] memory: use new MEMORY_LISTENER_DEFAULT_OPS, Avi Kivity, 2012/10/03
[Qemu-devel] [RFC v1 06/22] memory: export AddressSpace, Avi Kivity, 2012/10/03
[Qemu-devel] [RFC v1 07/22] memory: maintain a list of address spaces, Avi Kivity, 2012/10/03