From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Xu <peterx@redhat.com>
Subject: [Qemu-devel] [PULL 02/28] memory: introduce IOMMUOps.notify_flag_changed
Date: Mon, 26 Sep 2016 15:40:32 +0200 [thread overview]
Message-ID: <1474897258-1205-3-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1474897258-1205-1-git-send-email-pbonzini@redhat.com>
From: Peter Xu <peterx@redhat.com>
The new interface can be used to replace the old notify_started() and
notify_stopped(). Meanwhile it provides explicit flags so that IOMMUs
can know what kind of notifications it is requested for.
Acked-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Peter Xu <peterx@redhat.com>
Message-Id: <1474606948-14391-3-git-send-email-peterx@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/i386/intel_iommu.c | 6 ++++--
hw/ppc/spapr_iommu.c | 18 ++++++++++--------
include/exec/memory.h | 9 +++++----
memory.c | 29 +++++++++++++++++++++--------
4 files changed, 40 insertions(+), 22 deletions(-)
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 28c31a2..9d49be7 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -1974,7 +1974,9 @@ static IOMMUTLBEntry vtd_iommu_translate(MemoryRegion *iommu, hwaddr addr,
return ret;
}
-static void vtd_iommu_notify_started(MemoryRegion *iommu)
+static void vtd_iommu_notify_flag_changed(MemoryRegion *iommu,
+ IOMMUNotifierFlag old,
+ IOMMUNotifierFlag new)
{
VTDAddressSpace *vtd_as = container_of(iommu, VTDAddressSpace, iommu);
@@ -2348,7 +2350,7 @@ static void vtd_init(IntelIOMMUState *s)
memset(s->womask, 0, DMAR_REG_SIZE);
s->iommu_ops.translate = vtd_iommu_translate;
- s->iommu_ops.notify_started = vtd_iommu_notify_started;
+ s->iommu_ops.notify_flag_changed = vtd_iommu_notify_flag_changed;
s->root = 0;
s->root_extended = false;
s->dmar_enabled = false;
diff --git a/hw/ppc/spapr_iommu.c b/hw/ppc/spapr_iommu.c
index f20b0b8..ae30bbe 100644
--- a/hw/ppc/spapr_iommu.c
+++ b/hw/ppc/spapr_iommu.c
@@ -156,14 +156,17 @@ static uint64_t spapr_tce_get_min_page_size(MemoryRegion *iommu)
return 1ULL << tcet->page_shift;
}
-static void spapr_tce_notify_started(MemoryRegion *iommu)
+static void spapr_tce_notify_flag_changed(MemoryRegion *iommu,
+ IOMMUNotifierFlag old,
+ IOMMUNotifierFlag new)
{
- spapr_tce_set_need_vfio(container_of(iommu, sPAPRTCETable, iommu), true);
-}
+ struct sPAPRTCETable *tbl = container_of(iommu, sPAPRTCETable, iommu);
-static void spapr_tce_notify_stopped(MemoryRegion *iommu)
-{
- spapr_tce_set_need_vfio(container_of(iommu, sPAPRTCETable, iommu), false);
+ if (old == IOMMU_NOTIFIER_NONE && new != IOMMU_NOTIFIER_NONE) {
+ spapr_tce_set_need_vfio(tbl, true);
+ } else if (old != IOMMU_NOTIFIER_NONE && new == IOMMU_NOTIFIER_NONE) {
+ spapr_tce_set_need_vfio(tbl, false);
+ }
}
static int spapr_tce_table_post_load(void *opaque, int version_id)
@@ -246,8 +249,7 @@ static const VMStateDescription vmstate_spapr_tce_table = {
static MemoryRegionIOMMUOps spapr_iommu_ops = {
.translate = spapr_tce_translate_iommu,
.get_min_page_size = spapr_tce_get_min_page_size,
- .notify_started = spapr_tce_notify_started,
- .notify_stopped = spapr_tce_notify_stopped,
+ .notify_flag_changed = spapr_tce_notify_flag_changed,
};
static int spapr_tce_table_realize(DeviceState *dev)
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 14cda67..a3f988b 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -174,10 +174,10 @@ struct MemoryRegionIOMMUOps {
IOMMUTLBEntry (*translate)(MemoryRegion *iommu, hwaddr addr, bool is_write);
/* Returns minimum supported page size */
uint64_t (*get_min_page_size)(MemoryRegion *iommu);
- /* Called when the first notifier is set */
- void (*notify_started)(MemoryRegion *iommu);
- /* Called when the last notifier is removed */
- void (*notify_stopped)(MemoryRegion *iommu);
+ /* Called when IOMMU Notifier flag changed */
+ void (*notify_flag_changed)(MemoryRegion *iommu,
+ IOMMUNotifierFlag old_flags,
+ IOMMUNotifierFlag new_flags);
};
typedef struct CoalescedMemoryRange CoalescedMemoryRange;
@@ -223,6 +223,7 @@ struct MemoryRegion {
unsigned ioeventfd_nb;
MemoryRegionIoeventfd *ioeventfds;
QLIST_HEAD(, IOMMUNotifier) iommu_notify;
+ IOMMUNotifierFlag iommu_notify_flags;
};
/**
diff --git a/memory.c b/memory.c
index 69d9d9a..27a3f2f 100644
--- a/memory.c
+++ b/memory.c
@@ -1414,6 +1414,7 @@ void memory_region_init_iommu(MemoryRegion *mr,
mr->iommu_ops = ops,
mr->terminates = true; /* then re-forwards */
QLIST_INIT(&mr->iommu_notify);
+ mr->iommu_notify_flags = IOMMU_NOTIFIER_NONE;
}
static void memory_region_finalize(Object *obj)
@@ -1508,16 +1509,31 @@ bool memory_region_is_logging(MemoryRegion *mr, uint8_t client)
return memory_region_get_dirty_log_mask(mr) & (1 << client);
}
+static void memory_region_update_iommu_notify_flags(MemoryRegion *mr)
+{
+ IOMMUNotifierFlag flags = IOMMU_NOTIFIER_NONE;
+ IOMMUNotifier *iommu_notifier;
+
+ QLIST_FOREACH(iommu_notifier, &mr->iommu_notify, node) {
+ flags |= iommu_notifier->notifier_flags;
+ }
+
+ if (flags != mr->iommu_notify_flags &&
+ mr->iommu_ops->notify_flag_changed) {
+ mr->iommu_ops->notify_flag_changed(mr, mr->iommu_notify_flags,
+ flags);
+ }
+
+ mr->iommu_notify_flags = flags;
+}
+
void memory_region_register_iommu_notifier(MemoryRegion *mr,
IOMMUNotifier *n)
{
/* We need to register for at least one bitfield */
assert(n->notifier_flags != IOMMU_NOTIFIER_NONE);
- if (mr->iommu_ops->notify_started &&
- QLIST_EMPTY(&mr->iommu_notify)) {
- mr->iommu_ops->notify_started(mr);
- }
QLIST_INSERT_HEAD(&mr->iommu_notify, n, node);
+ memory_region_update_iommu_notify_flags(mr);
}
uint64_t memory_region_iommu_get_min_page_size(MemoryRegion *mr)
@@ -1555,10 +1571,7 @@ void memory_region_unregister_iommu_notifier(MemoryRegion *mr,
IOMMUNotifier *n)
{
QLIST_REMOVE(n, node);
- if (mr->iommu_ops->notify_stopped &&
- QLIST_EMPTY(&mr->iommu_notify)) {
- mr->iommu_ops->notify_stopped(mr);
- }
+ memory_region_update_iommu_notify_flags(mr);
}
void memory_region_notify_iommu(MemoryRegion *mr,
--
2.7.4
next prev parent reply other threads:[~2016-09-26 13:41 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-26 13:40 [Qemu-devel] [PULL 00/28] Misc patches for 2016-09-26 Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 01/28] memory: introduce IOMMUNotifier and its caps Paolo Bonzini
2016-09-26 13:40 ` Paolo Bonzini [this message]
2016-09-26 13:40 ` [Qemu-devel] [PULL 03/28] intel_iommu: allow UNMAP notifiers Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 04/28] x86: ioapic: boost default version to 0x20 Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 05/28] checkpatch: downgrade "architecture specific defines should be avoided" Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 06/28] compiler: Swap 'public domain' header for license Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 07/28] migration: sync all address spaces Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 08/28] build-sys: remove unused GLIB_CFLAGS Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 09/28] build-sys: put glib_cflags in QEMU_CFLAGS Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 10/28] cpus: pass CPUState to run_on_cpu helpers Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 11/28] cpus: Move common code out of {async_, }run_on_cpu() Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 12/28] cpus: Rename flush_queued_work() Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 13/28] linux-user: Use QemuMutex and QemuCond Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 14/28] linux-user: Add qemu_cpu_is_self() and qemu_cpu_kick() Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 15/28] cpus-common: move CPU list management to common code Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 16/28] cpus-common: move CPU work item " Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 17/28] cpus-common: fix uninitialized variable use in run_on_cpu Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 18/28] cpus-common: move exclusive work infrastructure from linux-user Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 19/28] docs: include formal model for TCG exclusive sections Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 20/28] cpus-common: always defer async_run_on_cpu work items Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 21/28] cpus-common: remove redundant call to exclusive_idle() Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 22/28] cpus-common: simplify locking for start_exclusive/end_exclusive Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 23/28] cpus-common: Introduce async_safe_run_on_cpu() Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 24/28] tcg: Make tb_flush() thread safe Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 25/28] cpus-common: lock-free fast path for cpu_exec_start/end Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 26/28] replay: move internal data to the structure Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 27/28] replay: vmstate for replay module Paolo Bonzini
2016-09-26 13:40 ` [Qemu-devel] [PULL 28/28] replay: allow replay stopping and restarting Paolo Bonzini
2016-09-26 14:26 ` [Qemu-devel] [PULL 00/28] Misc patches for 2016-09-26 no-reply
2016-09-26 21:19 ` Peter Maydell
2016-09-27 2:12 ` Peter Xu
2016-09-27 8:53 ` Paolo Bonzini
2016-09-27 9:25 ` Peter Xu
2016-09-27 10:11 ` Paolo Bonzini
2016-09-28 3:12 ` Peter Xu
2016-09-28 9:54 ` Jason Wang
-- strict thread matches above, loose matches on Subject: below --
2016-09-28 19:43 [Qemu-devel] [PULL v2 " Paolo Bonzini
2016-09-28 19:43 ` [Qemu-devel] [PULL 02/28] memory: introduce IOMMUOps.notify_flag_changed Paolo Bonzini
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=1474897258-1205-3-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).