From: Avi Kivity <avi@redhat.com>
To: qemu-devel@nongnu.org, Anthony Liguori <anthony@codemonkey.ws>,
liu ping fan <qemulist@gmail.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Blue Swirl <blauwirbel@gmail.com>
Subject: [Qemu-devel] [PATCH v3 03/23] kvm: use separate MemoryListeners for memory and I/O
Date: Tue, 9 Oct 2012 18:32:28 +0200 [thread overview]
Message-ID: <1349800368-15228-4-git-send-email-avi@redhat.com> (raw)
In-Reply-To: <1349800368-15228-1-git-send-email-avi@redhat.com>
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 <avi@redhat.com>
---
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 = {
+ .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
next prev parent reply other threads:[~2012-10-09 16:33 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-09 16:32 [Qemu-devel] [PULL v3 00/23] Integrate DMA into the memory API Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 01/23] memory: rename 'exec-obsolete.h' Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 02/23] vhost: use MemoryListener filtering to only monitor RAM address space Avi Kivity
2012-10-09 16:32 ` Avi Kivity [this message]
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 04/23] xen_pt: use separate MemoryListeners for memory and I/O Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 05/23] memory: prepare AddressSpace for exporting Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 06/23] memory: export AddressSpace Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 07/23] memory: maintain a list of address spaces Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 08/23] memory: provide defaults for MemoryListener operations Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 09/23] memory: drop no-op MemoryListener callbacks Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 11/23] xen_pt: " Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 13/23] xen: " Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 14/23] memory: manage coalesced mmio via a MemoryListener Avi Kivity
2012-10-22 12:57 ` Peter Maydell
2012-10-22 13:00 ` Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 15/23] memory: move address_space_memory and address_space_io out of memory core Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 16/23] memory: move tcg flush into a tcg memory listener Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 17/23] memory: use AddressSpace for MemoryListener filtering Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 18/23] s390: avoid reaching into memory core internals Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 21/23] memory: add address_space_destroy() Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 22/23] pci: give each device its own address space Avi Kivity
2012-10-09 16:32 ` [Qemu-devel] [PATCH v3 23/23] pci: honor PCI_COMMAND_MASTER Avi Kivity
2012-10-11 3:38 ` liu ping fan
2012-10-11 8:34 ` Avi Kivity
2012-10-11 8:49 ` liu ping fan
2012-10-11 8:53 ` Avi Kivity
[not found] ` <1349800368-15228-20-git-send-email-avi@redhat.com>
2012-10-11 3:38 ` [Qemu-devel] [PATCH v3 19/23] memory: per-AddressSpace dispatch liu ping fan
2012-10-11 8:31 ` Avi Kivity
2012-10-11 8:45 ` liu ping fan
2012-10-11 8:51 ` Avi Kivity
2012-10-11 21:01 ` [Qemu-devel] [PULL v3 00/23] Integrate DMA into the memory API Anthony Liguori
2012-10-15 13:16 ` Avi Kivity
2012-10-22 9:35 ` Avi Kivity
2012-10-22 12:39 ` Peter Maydell
2012-10-22 19:46 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1349800368-15228-4-git-send-email-avi@redhat.com \
--to=avi@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=blauwirbel@gmail.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemulist@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).