From: Marcelo Tosatti <mtosatti@redhat.com>
To: Avi Kivity <avi@qumranet.com>
Cc: kvm-devel <kvm@vger.kernel.org>
Subject: KVM: x86: move vapic page handling out of fast path
Date: Thu, 19 Jun 2008 14:43:47 -0300 [thread overview]
Message-ID: <20080619174347.GA9236@dmt.cnet> (raw)
I fail to see the point of handling the vapic page grab and ref
counting in __vcpu_run's heavyweight enter/exit path.
So move it to kvm_lapic_set_vapic_addr / kvm_free_lapic time.
Other than the obvious improvement for non-Flexpriority case, this
kills a down_read/up_read pair in heavy exits and reduces code size.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Index: kvm/arch/x86/kvm/lapic.c
===================================================================
--- kvm.orig/arch/x86/kvm/lapic.c
+++ kvm/arch/x86/kvm/lapic.c
@@ -800,6 +800,34 @@ static int apic_mmio_range(struct kvm_io
return ret;
}
+static void vapic_get_page(struct kvm_vcpu *vcpu)
+{
+ struct kvm_lapic *apic = vcpu->arch.apic;
+ struct page *page;
+
+ if (!apic || !apic->vapic_addr)
+ return;
+
+ down_read(&vcpu->kvm->slots_lock);
+ down_read(¤t->mm->mmap_sem);
+ page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
+ up_read(¤t->mm->mmap_sem);
+ up_read(&vcpu->kvm->slots_lock);
+
+ vcpu->arch.apic->vapic_page = page;
+}
+
+static void vapic_put_page(struct kvm_vcpu *vcpu)
+{
+ struct kvm_lapic *apic = vcpu->arch.apic;
+
+ if (!irqchip_in_kernel(vcpu->kvm) || !apic || !apic->vapic_addr)
+ return;
+
+ kvm_release_page_dirty(apic->vapic_page);
+ mark_page_dirty(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
+}
+
void kvm_free_lapic(struct kvm_vcpu *vcpu)
{
if (!vcpu->arch.apic)
@@ -810,6 +838,9 @@ void kvm_free_lapic(struct kvm_vcpu *vcp
if (vcpu->arch.apic->regs_page)
__free_page(vcpu->arch.apic->regs_page);
+ if (vcpu->arch.apic->vapic_page)
+ vapic_put_page(vcpu);
+
kfree(vcpu->arch.apic);
}
@@ -1172,5 +1203,9 @@ void kvm_lapic_set_vapic_addr(struct kvm
if (!irqchip_in_kernel(vcpu->kvm))
return;
+ if (vcpu->arch.apic->vapic_page)
+ vapic_put_page(vcpu);
+
vcpu->arch.apic->vapic_addr = vapic_addr;
+ vapic_get_page(vcpu);
}
Index: kvm/arch/x86/kvm/x86.c
===================================================================
--- kvm.orig/arch/x86/kvm/x86.c
+++ kvm/arch/x86/kvm/x86.c
@@ -2737,32 +2737,6 @@ static void post_kvm_run_save(struct kvm
vcpu->arch.irq_summary == 0);
}
-static void vapic_enter(struct kvm_vcpu *vcpu)
-{
- struct kvm_lapic *apic = vcpu->arch.apic;
- struct page *page;
-
- if (!apic || !apic->vapic_addr)
- return;
-
- down_read(¤t->mm->mmap_sem);
- page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
- up_read(¤t->mm->mmap_sem);
-
- vcpu->arch.apic->vapic_page = page;
-}
-
-static void vapic_exit(struct kvm_vcpu *vcpu)
-{
- struct kvm_lapic *apic = vcpu->arch.apic;
-
- if (!apic || !apic->vapic_addr)
- return;
-
- kvm_release_page_dirty(apic->vapic_page);
- mark_page_dirty(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
-}
-
static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
{
int r;
@@ -2778,7 +2752,6 @@ static int __vcpu_run(struct kvm_vcpu *v
}
down_read(&vcpu->kvm->slots_lock);
- vapic_enter(vcpu);
preempted:
if (vcpu->guest_debug.enabled)
@@ -2916,10 +2889,6 @@ out:
post_kvm_run_save(vcpu, kvm_run);
- down_read(&vcpu->kvm->slots_lock);
- vapic_exit(vcpu);
- up_read(&vcpu->kvm->slots_lock);
-
return r;
}
next reply other threads:[~2008-06-19 17:44 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-06-19 17:43 Marcelo Tosatti [this message]
2008-06-22 5:00 ` KVM: x86: move vapic page handling out of fast path Avi Kivity
2008-06-22 17:05 ` Marcelo Tosatti
2008-06-23 2:29 ` Avi Kivity
2008-06-23 14:47 ` Marcelo Tosatti
-- strict thread matches above, loose matches on Subject: below --
2008-06-23 15:04 Marcelo Tosatti
2008-06-29 11:53 ` Avi Kivity
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=20080619174347.GA9236@dmt.cnet \
--to=mtosatti@redhat.com \
--cc=avi@qumranet.com \
--cc=kvm@vger.kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.