From: Avi Kivity <avi@qumranet.com>
To: Luca Tettamanti <kronos.it@gmail.com>
Cc: kvm-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
Subject: Re: [kvm-devel] [BUG] Oops with KVM-27
Date: Sun, 17 Jun 2007 18:24:44 +0300 [thread overview]
Message-ID: <4675523C.9020703@qumranet.com> (raw)
In-Reply-To: <20070617151452.GA21971@dreamland.darkstar.lan>
Luca Tettamanti wrote:
>> Actually we haven't; just before the memcpy(), we can put a memcmp() to
>> guard the kvm_mmu_pte_write(), which is the really expensive operation,
>> especially with guest smp.
>>
>
> Yup, but it seemed wasteful to map (at least when highmem is in use) a
> page just to check for something that we already knew. That was a
> preemptive optmization though, I haven't actually benchmarked the cost
> of setting up the mapping ;-)
>
>
It's negligible compared to the vmexit cost and to the emulation (which
does a kmap_atomic() for every byte of the instruction; this can be
easily optimized away).
In any case, I expect that performance sensitive uses will use x86_64,
whereas i386 is mostly for desktops.
>> I think we can simply remove the if (). For the register case, the
>> check is more expensive that the write; for mmio, we don't want it; and
>> for memory writes, we can put it in emulator_write_phys().
>>
>
> Ok, this way it's simpler. How does this look:
>
> --- a/kernel/x86_emulate.c 2007-06-15 21:13:51.000000000 +0200
> +++ b/kernel/x86_emulate.c 2007-06-17 16:57:50.000000000 +0200
> @@ -1057,40 +1057,38 @@
> }
>
> writeback:
> - if ((d & Mov) || (dst.orig_val != dst.val)) {
> - switch (dst.type) {
> - case OP_REG:
> - /* The 4-byte case *is* correct: in 64-bit mode we zero-extend. */
> - switch (dst.bytes) {
> - case 1:
> - *(u8 *)dst.ptr = (u8)dst.val;
> - break;
> - case 2:
> - *(u16 *)dst.ptr = (u16)dst.val;
> - break;
> - case 4:
> - *dst.ptr = (u32)dst.val;
> - break; /* 64b: zero-ext */
> - case 8:
> - *dst.ptr = dst.val;
> - break;
> - }
> + switch (dst.type) {
> + case OP_REG:
> + /* The 4-byte case *is* correct: in 64-bit mode we zero-extend. */
> + switch (dst.bytes) {
> + case 1:
> + *(u8 *)dst.ptr = (u8)dst.val;
> break;
> - case OP_MEM:
> - if (lock_prefix)
> - rc = ops->cmpxchg_emulated((unsigned long)dst.
> - ptr, &dst.orig_val,
> - &dst.val, dst.bytes,
> - ctxt);
> - else
> - rc = ops->write_emulated((unsigned long)dst.ptr,
> - &dst.val, dst.bytes,
> - ctxt);
> - if (rc != 0)
> - goto done;
> - default:
> + case 2:
> + *(u16 *)dst.ptr = (u16)dst.val;
> + break;
> + case 4:
> + *dst.ptr = (u32)dst.val;
> + break; /* 64b: zero-ext */
> + case 8:
> + *dst.ptr = dst.val;
> break;
> }
> + break;
> + case OP_MEM:
> + if (lock_prefix)
> + rc = ops->cmpxchg_emulated((unsigned long)dst.
> + ptr, &dst.orig_val,
> + &dst.val, dst.bytes,
> + ctxt);
> + else
> + rc = ops->write_emulated((unsigned long)dst.ptr,
> + &dst.val, dst.bytes,
> + ctxt);
> + if (rc != 0)
> + goto done;
> + default:
> + break;
> }
>
> /* Commit shadow register state. */
>
> --- a/kernel/kvm_main.c 2007-06-15 21:18:08.000000000 +0200
> +++ b/kernel/kvm_main.c 2007-06-17 16:59:33.000000000 +0200
> @@ -1139,8 +1139,10 @@
> return 0;
> mark_page_dirty(vcpu->kvm, gpa >> PAGE_SHIFT);
> virt = kmap_atomic(page, KM_USER0);
> - kvm_mmu_pte_write(vcpu, gpa, virt + offset, val, bytes);
> - memcpy(virt + offset_in_page(gpa), val, bytes);
> + if (memcmp(virt + offset_in_page(gpa), val, bytes)) {
> + kvm_mmu_pte_write(vcpu, gpa, virt + offset, val, bytes);
> + memcpy(virt + offset_in_page(gpa), val, bytes);
> + }
> kunmap_atomic(virt, KM_USER0);
> return 1;
> }
>
>
>
Excellent. We win back a precious indentation level and fix a bug at
the same time. Please test, send me a changelog and a signoff and I'll
commit it.
--
error compiling committee.c: too many arguments to function
next prev parent reply other threads:[~2007-06-17 15:24 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-03 21:34 [BUG] Oops with KVM-27 Luca Tettamanti
2007-06-03 21:34 ` Luca Tettamanti
2007-06-04 9:35 ` [kvm-devel] " Avi Kivity
2007-06-04 9:35 ` Avi Kivity
2007-06-04 20:22 ` [kvm-devel] " Luca Tettamanti
2007-06-04 20:51 ` Avi Kivity
2007-06-04 21:22 ` Luca Tettamanti
2007-06-04 21:22 ` Luca Tettamanti
2007-06-05 7:27 ` [kvm-devel] " Avi Kivity
2007-06-05 7:27 ` Avi Kivity
2007-06-07 19:16 ` [kvm-devel] " Luca
2007-06-07 19:16 ` Luca
2007-06-10 12:22 ` [kvm-devel] " Avi Kivity
2007-06-10 20:54 ` Luca
[not found] ` <68676e00706101354n5fe7e1a9y12cb690cae2924e3-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-06-11 7:44 ` Avi Kivity
2007-06-11 7:44 ` [kvm-devel] " Avi Kivity
2007-06-11 21:06 ` Luca
[not found] ` <68676e00706111406r16eafd0eseaf1fb24f5c0d075-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-06-12 6:44 ` Avi Kivity
2007-06-12 6:44 ` [kvm-devel] " Avi Kivity
2007-06-12 17:52 ` Luca Tettamanti
[not found] ` <20070612175246.GA5864-sTXFmx6KbOnUXq0IF5SVAZ4oGUkBHcCu@public.gmane.org>
2007-06-13 8:59 ` Avi Kivity
2007-06-13 8:59 ` [kvm-devel] " Avi Kivity
2007-06-13 20:49 ` Luca Tettamanti
2007-06-13 20:49 ` Luca Tettamanti
2007-06-14 8:26 ` [kvm-devel] " Avi Kivity
2007-06-14 8:26 ` Avi Kivity
2007-06-14 22:33 ` [kvm-devel] " Luca Tettamanti
[not found] ` <4670FBB5.70707-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-14 22:33 ` Luca Tettamanti
2007-06-14 22:53 ` [kvm-devel] " Luca Tettamanti
2007-06-14 23:13 ` Luca Tettamanti
2007-06-14 23:27 ` Luca
2007-06-15 9:06 ` Avi Kivity
2007-06-15 9:06 ` Avi Kivity
2007-06-15 21:49 ` [kvm-devel] " Luca Tettamanti
2007-06-16 7:43 ` Avi Kivity
2007-06-16 7:43 ` Avi Kivity
2007-06-17 15:14 ` [kvm-devel] " Luca Tettamanti
2007-06-17 15:14 ` Luca Tettamanti
2007-06-17 15:24 ` Avi Kivity [this message]
2007-06-17 16:52 ` [PATCH 1/2] kvm: Fix x86 emulator writeback Luca Tettamanti
2007-06-17 16:58 ` Avi Kivity
2007-06-17 16:58 ` Avi Kivity
2007-06-18 10:07 ` Avi Kivity
2007-06-18 10:07 ` Avi Kivity
2007-06-18 11:32 ` Avi Kivity
2007-06-18 11:32 ` Avi Kivity
2007-06-19 20:25 ` Luca Tettamanti
2007-06-19 20:25 ` Luca Tettamanti
2007-06-19 20:41 ` Luca Tettamanti
2007-06-19 20:41 ` Luca Tettamanti
2007-06-20 7:47 ` Avi Kivity
2007-06-20 7:47 ` Avi Kivity
2007-06-19 20:41 ` [PATCH 2/2] kvm: avoid useless memory write when possible Luca Tettamanti
2007-06-19 20:41 ` Luca Tettamanti
2007-06-17 16:52 ` Luca Tettamanti
[not found] ` <466CFD6D.2080201-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-11 21:06 ` [BUG] Oops with KVM-27 Luca
2007-06-12 17:52 ` Luca Tettamanti
[not found] ` <466BED18.5040708-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-10 20:54 ` Luca
[not found] ` <68676e00706071216i4bd051c5hb1c114f3c13ab97f-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2007-06-10 12:22 ` Avi Kivity
[not found] ` <20070604202248.GA18668-sTXFmx6KbOnUXq0IF5SVAZ4oGUkBHcCu@public.gmane.org>
2007-06-04 20:51 ` Avi Kivity
[not found] ` <4663DCE9.3000107-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-06-04 20:22 ` Luca Tettamanti
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=4675523C.9020703@qumranet.com \
--to=avi@qumranet.com \
--cc=kronos.it@gmail.com \
--cc=kvm-devel@lists.sourceforge.net \
--cc=linux-kernel@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.