From: Xiao Guangrong <guangrong.xiao@linux.intel.com>
To: pbonzini@redhat.com
Cc: gleb@kernel.org, mtosatti@redhat.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org,
Xiao Guangrong <guangrong.xiao@linux.intel.com>
Subject: [PATCH v3 04/10] KVM: MMU: introduce for_each_slot_rmap_range
Date: Wed, 13 May 2015 14:42:22 +0800 [thread overview]
Message-ID: <1431499348-25188-5-git-send-email-guangrong.xiao@linux.intel.com> (raw)
In-Reply-To: <1431499348-25188-1-git-send-email-guangrong.xiao@linux.intel.com>
It's used to abstract the code from kvm_handle_hva_range and it will be
used by later patch
Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
---
arch/x86/kvm/mmu.c | 97 +++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 75 insertions(+), 22 deletions(-)
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index e0e15b8..df403b3 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -1412,6 +1412,74 @@ restart:
return 0;
}
+struct slot_rmap_walk_iterator {
+ /* input fields. */
+ struct kvm_memory_slot *slot;
+ gfn_t start_gfn;
+ gfn_t end_gfn;
+ int start_level;
+ int end_level;
+
+ /* output fields. */
+ gfn_t gfn;
+ unsigned long *rmap;
+ int level;
+
+ /* private field. */
+ unsigned long *end_rmap;
+};
+
+static void
+rmap_walk_init_level(struct slot_rmap_walk_iterator *iterator, int level)
+{
+ iterator->level = level;
+ iterator->gfn = iterator->start_gfn;
+ iterator->rmap = __gfn_to_rmap(iterator->gfn, level, iterator->slot);
+ iterator->end_rmap = __gfn_to_rmap(iterator->end_gfn, level,
+ iterator->slot);
+}
+
+static void
+slot_rmap_walk_init(struct slot_rmap_walk_iterator *iterator,
+ struct kvm_memory_slot *slot, int start_level,
+ int end_level, gfn_t start_gfn, gfn_t end_gfn)
+{
+ iterator->slot = slot;
+ iterator->start_level = start_level;
+ iterator->end_level = end_level;
+ iterator->start_gfn = start_gfn;
+ iterator->end_gfn = end_gfn;
+
+ rmap_walk_init_level(iterator, iterator->start_level);
+}
+
+static bool slot_rmap_walk_okay(struct slot_rmap_walk_iterator *iterator)
+{
+ return !!iterator->rmap;
+}
+
+static void slot_rmap_walk_next(struct slot_rmap_walk_iterator *iterator)
+{
+ if (++iterator->rmap <= iterator->end_rmap) {
+ iterator->gfn += (1UL << KVM_HPAGE_GFN_SHIFT(iterator->level));
+ return;
+ }
+
+ if (++iterator->level > iterator->end_level) {
+ iterator->rmap = NULL;
+ return;
+ }
+
+ rmap_walk_init_level(iterator, iterator->level);
+}
+
+#define for_each_slot_rmap_range(_slot_, _start_level_, _end_level_, \
+ _start_gfn, _end_gfn, _iter_) \
+ for (slot_rmap_walk_init(_iter_, _slot_, _start_level_, \
+ _end_level_, _start_gfn, _end_gfn); \
+ slot_rmap_walk_okay(_iter_); \
+ slot_rmap_walk_next(_iter_))
+
static int kvm_handle_hva_range(struct kvm *kvm,
unsigned long start,
unsigned long end,
@@ -1423,10 +1491,10 @@ static int kvm_handle_hva_range(struct kvm *kvm,
int level,
unsigned long data))
{
- int j;
- int ret = 0;
struct kvm_memslots *slots;
struct kvm_memory_slot *memslot;
+ struct slot_rmap_walk_iterator iterator;
+ int ret = 0;
slots = kvm_memslots(kvm);
@@ -1446,26 +1514,11 @@ static int kvm_handle_hva_range(struct kvm *kvm,
gfn_start = hva_to_gfn_memslot(hva_start, memslot);
gfn_end = hva_to_gfn_memslot(hva_end + PAGE_SIZE - 1, memslot);
- for (j = PT_PAGE_TABLE_LEVEL;
- j <= PT_MAX_HUGEPAGE_LEVEL; ++j) {
- unsigned long idx, idx_end;
- unsigned long *rmapp;
- gfn_t gfn = gfn_start;
-
- /*
- * {idx(page_j) | page_j intersects with
- * [hva_start, hva_end)} = {idx, idx+1, ..., idx_end}.
- */
- idx = gfn_to_index(gfn_start, memslot->base_gfn, j);
- idx_end = gfn_to_index(gfn_end - 1, memslot->base_gfn, j);
-
- rmapp = __gfn_to_rmap(gfn_start, j, memslot);
-
- for (; idx <= idx_end;
- ++idx, gfn += (1UL << KVM_HPAGE_GFN_SHIFT(j)))
- ret |= handler(kvm, rmapp++, memslot,
- gfn, j, data);
- }
+ for_each_slot_rmap_range(memslot, PT_PAGE_TABLE_LEVEL,
+ PT_MAX_HUGEPAGE_LEVEL, gfn_start, gfn_end - 1,
+ &iterator)
+ ret |= handler(kvm, iterator.rmap, memslot,
+ iterator.gfn, iterator.level, data);
}
return ret;
--
2.1.0
next prev parent reply other threads:[~2015-05-13 6:46 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-13 6:42 [PATCH v3 00/10] KVM: MTRR fixes and some cleanups Xiao Guangrong
2015-05-13 6:42 ` [PATCH v3 01/10] KVM: MMU: fix decoding cache type from MTRR Xiao Guangrong
2015-05-13 8:09 ` Wanpeng Li
2015-07-12 17:33 ` Alex Williamson
2015-07-12 18:59 ` Xiao Guangrong
2015-07-13 7:32 ` Paolo Bonzini
2015-07-13 14:45 ` Xiao Guangrong
2015-07-13 15:13 ` Paolo Bonzini
2015-07-13 15:15 ` Xiao Guangrong
2015-07-14 21:12 ` MTRR setup in OVMF [was: PATCH v3 01/10 KVM: MMU: fix decoding cache type from MTRR] Laszlo Ersek
2015-07-14 21:15 ` Paolo Bonzini
2015-07-14 21:29 ` Laszlo Ersek
2015-07-14 22:37 ` Jordan Justen
2015-07-15 9:57 ` Laszlo Ersek
2015-07-15 0:14 ` [edk2] " Fan, Jeff
2015-07-15 19:30 ` Xiao Guangrong
2015-07-15 19:41 ` Laszlo Ersek
2015-07-12 19:12 ` [PATCH v3 01/10] KVM: MMU: fix decoding cache type from MTRR Bandan Das
2015-05-13 6:42 ` [PATCH v3 02/10] KVM: MMU: introduce for_each_rmap_spte() Xiao Guangrong
2015-05-13 6:42 ` [PATCH v3 03/10] KVM: MMU: introduce PT_MAX_HUGEPAGE_LEVEL Xiao Guangrong
2015-05-13 6:42 ` Xiao Guangrong [this message]
2015-05-13 6:42 ` [PATCH v3 05/10] KVM: MMU: introduce slot_handle_level_range() and its helpers Xiao Guangrong
2015-05-13 6:42 ` [PATCH v3 06/10] KVM: MMU: use slot_handle_level and its helper to clean up the code Xiao Guangrong
2015-05-13 6:42 ` [PATCH v3 07/10] KVM: MMU: introduce kvm_zap_rmapp Xiao Guangrong
2015-05-13 6:42 ` [PATCH v3 08/10] KVM: MMU: introduce kvm_zap_gfn_range Xiao Guangrong
2015-05-13 6:42 ` [PATCH v3 09/10] KVM: MMU: fix MTRR update Xiao Guangrong
2015-05-13 8:43 ` Wanpeng Li
2015-05-13 14:10 ` Paolo Bonzini
2015-05-14 0:16 ` Wanpeng Li
2015-05-14 8:43 ` Paolo Bonzini
2015-05-13 6:42 ` [PATCH v3 10/10] KVM: x86: do not reset mmu if CR0.CD and CR0.NW are changed Xiao Guangrong
2015-05-13 14:14 ` [PATCH v3 00/10] KVM: MTRR fixes and some cleanups 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=1431499348-25188-5-git-send-email-guangrong.xiao@linux.intel.com \
--to=guangrong.xiao@linux.intel.com \
--cc=gleb@kernel.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
--cc=pbonzini@redhat.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
all inboxes | Powered by JetHome®