From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Michael Chapman <mike@very.puzzling.org>
Subject: [Qemu-devel] [PULL 41/45] target-i386: kvm: clear unusable segments' flags in migration
Date: Thu, 17 Dec 2015 18:46:37 +0100 [thread overview]
Message-ID: <1450374401-31352-42-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1450374401-31352-1-git-send-email-pbonzini@redhat.com>
From: Michael Chapman <mike@very.puzzling.org>
This commit fixes migration of a QEMU/KVM guest from kernel >= v3.9 to
kernel <= v3.7 (e.g. from RHEL 7 to RHEL 6). Without this commit a guest
migrated across these kernel versions fails to resume on the target host
as its segment descriptors are invalid.
Two separate kernel commits combined together to result in this bug:
commit f0495f9b9992f80f82b14306946444b287193390
Author: Avi Kivity <avi@redhat.com>
Date: Thu Jun 7 17:06:10 2012 +0300
KVM: VMX: Relax check on unusable segment
Some userspace (e.g. QEMU 1.1) munge the d and g bits of segment
descriptors, causing us not to recognize them as unusable segments
with emulate_invalid_guest_state=1. Relax the check by testing for
segment not present (a non-present segment cannot be usable).
Signed-off-by: Avi Kivity <avi@redhat.com>
commit 25391454e73e3156202264eb3c473825afe4bc94
Author: Gleb Natapov <gleb@redhat.com>
Date: Mon Jan 21 15:36:46 2013 +0200
KVM: VMX: don't clobber segment AR of unusable segments.
Usability is returned in unusable field, so not need to clobber entire
AR. Callers have to know how to deal with unusable segments already
since if emulate_invalid_guest_state=true AR is not zeroed.
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
The first commit changed the KVM_SET_SREGS ioctl so that it did no treat
segment flags == 0 as an unusable segment, instead only looking at the
"present" flag.
The second commit changed KVM_GET_SREGS so that it did not clear the
flags of an unusable segment.
Since QEMU does not itself maintain the "unusable" flag across a
migration, the end result is that unusable segments read from a kernel
with these commits and loaded into a kernel without these commits are
not properly recognised as being unusable.
This commit updates both get_seg and set_seg so that the problem is
avoided even when migrating to or migrating from a QEMU without this
commit. In get_seg, we clear the segment flags if the segment is marked
unusable. In set_seg, we mark the segment unusable if the segment's
"present" flag is not set.
Signed-off-by: Michael Chapman <mike@very.puzzling.org>
Message-Id: <1449464047-17467-1-git-send-email-mike@very.puzzling.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
target-i386/kvm.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 7b01328..ab65a6e 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -1145,7 +1145,7 @@ static void set_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
lhs->l = (flags >> DESC_L_SHIFT) & 1;
lhs->g = (flags & DESC_G_MASK) != 0;
lhs->avl = (flags & DESC_AVL_MASK) != 0;
- lhs->unusable = 0;
+ lhs->unusable = !lhs->present;
lhs->padding = 0;
}
@@ -1154,14 +1154,18 @@ static void get_seg(SegmentCache *lhs, const struct kvm_segment *rhs)
lhs->selector = rhs->selector;
lhs->base = rhs->base;
lhs->limit = rhs->limit;
- lhs->flags = (rhs->type << DESC_TYPE_SHIFT) |
- (rhs->present * DESC_P_MASK) |
- (rhs->dpl << DESC_DPL_SHIFT) |
- (rhs->db << DESC_B_SHIFT) |
- (rhs->s * DESC_S_MASK) |
- (rhs->l << DESC_L_SHIFT) |
- (rhs->g * DESC_G_MASK) |
- (rhs->avl * DESC_AVL_MASK);
+ if (rhs->unusable) {
+ lhs->flags = 0;
+ } else {
+ lhs->flags = (rhs->type << DESC_TYPE_SHIFT) |
+ (rhs->present * DESC_P_MASK) |
+ (rhs->dpl << DESC_DPL_SHIFT) |
+ (rhs->db << DESC_B_SHIFT) |
+ (rhs->s * DESC_S_MASK) |
+ (rhs->l << DESC_L_SHIFT) |
+ (rhs->g * DESC_G_MASK) |
+ (rhs->avl * DESC_AVL_MASK);
+ }
}
static void kvm_getput_reg(__u64 *kvm_reg, target_ulong *qemu_reg, int set)
--
2.5.0
next prev parent reply other threads:[~2015-12-17 17:47 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-17 17:45 [Qemu-devel] [PULL 00/45] KVM, memory, SCSI, qemu_log, Coverity patches for 2015-12-17 Paolo Bonzini
2015-12-17 17:45 ` [Qemu-devel] [PULL 01/45] exec: Eliminate qemu_ram_free_from_ptr() Paolo Bonzini
2015-12-17 17:45 ` [Qemu-devel] [PULL 02/45] memory: Eliminate memory_region_destructor_ram_from_ptr() Paolo Bonzini
2015-12-17 17:45 ` [Qemu-devel] [PULL 03/45] exec: Remove unnecessary RAM_FILE flag Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 04/45] kvm-all: PAGE_SIZE should be real host page size Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 05/45] memory: emulate ioeventfd Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 06/45] vmw_pvscsi: Set device subsystem and revision Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 07/45] vmw_pvscsi: Change offset of msi pci capability Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 08/45] vmw_pvscsi: Introduce 'x-old-pci-configuration' backword compatability property Paolo Bonzini
2015-12-17 18:08 ` Eric Blake
2015-12-18 6:21 ` Shmulik Ladkani
2015-12-17 17:46 ` [Qemu-devel] [PULL 09/45] vmw_pvscsi: coding: Introduce PVSCSIClass Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 10/45] vmw_pvscsi: The pvscsi device is a PCIE endpoint Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 11/45] vmw_pvscsi: Introduce 'x-disable-pcie' backword compatability property Paolo Bonzini
2015-12-17 18:09 ` Eric Blake
2015-12-17 17:46 ` [Qemu-devel] [PULL 12/45] linux-headers: update from kvm/next Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 13/45] target-i386/kvm: Hyper-V SynIC MSR's support Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 14/45] kvm: Hyper-V SynIC irq routing support Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 15/45] target-i386/hyperv: Hyper-V SynIC SINT routing and vcpu exit Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 16/45] hw/misc: Hyper-V test device 'hyperv-testdev' Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 17/45] target-i386/kvm: Hyper-V SynIC timers MSR's support Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 18/45] kvm: add support for -machine kernel_irqchip=split Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 19/45] kvm: x86: add support for KVM_CAP_SPLIT_IRQCHIP Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 20/45] qemu-char: append opt to stop truncation of serial file Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 21/45] qemu-log: introduce qemu_log_separate Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 22/45] alpha: convert "naked" qemu_log to tracepoint Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 23/45] cris: avoid "naked" qemu_log Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 24/45] microblaze: " Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 25/45] s390x: " Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 26/45] ppc: cleanup logging Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 27/45] tricore: avoid "naked" qemu_log Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 28/45] xtensa: " Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 29/45] user: introduce "-d page" Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 30/45] linux-user: avoid "naked" qemu_log Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 31/45] linux-user: convert DEBUG_SIGNAL logging to tracepoints Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 32/45] exec: always call qemu_get_ram_ptr within rcu_read_lock Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 33/45] exec: make qemu_ram_ptr_length more similar to qemu_get_ram_ptr Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 34/45] memory: reorder MemoryRegion fields Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 35/45] memory: avoid unnecessary object_ref/unref Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 36/45] memory: split address_space_read and address_space_write Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 37/45] memory: extract first iteration of " Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 38/45] memory: inline a few small accessors Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 39/45] memory: try to inline constant-length reads Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 40/45] rcu: optimize rcu_read_lock Paolo Bonzini
2015-12-17 17:46 ` Paolo Bonzini [this message]
2015-12-17 17:46 ` [Qemu-devel] [PULL 42/45] scsi: use scsi_req_cancel_async when purging requests Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 43/45] scsi: always call notifier on async cancellation Paolo Bonzini
2015-12-18 0:57 ` Fam Zheng
2015-12-18 6:05 ` Paolo Bonzini
2015-12-18 7:51 ` Fam Zheng
2015-12-17 17:46 ` [Qemu-devel] [PULL 44/45] coverity: Model g_poll() Paolo Bonzini
2015-12-17 17:46 ` [Qemu-devel] [PULL 45/45] coverity: Model g_memdup() Paolo Bonzini
2015-12-17 19:55 ` [Qemu-devel] [PULL 00/45] KVM, memory, SCSI, qemu_log, Coverity patches for 2015-12-17 Peter Maydell
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=1450374401-31352-42-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=mike@very.puzzling.org \
--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).