* BUG with Win7 and user-return-notifier @ 2009-10-27 12:52 Jan Kiszka 2009-10-27 13:11 ` Avi Kivity 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2009-10-27 12:52 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm Hi Avi, just booted kvm.git master (974ae8d7ff) as host and re-ran my boot test of Windows 7. Already during "Starting Windows" I get this: ... general protection fault: 0000 [#1] PREEMPT SMP last sysfs file: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0A:01/power_supply/CMB2/charge_full CPU 0 Modules linked in: kvm_intel kvm ip6t_LOG xt_pkttype xt_TCPMSS xt_tcpudp ipt_LOG xt_limit iptable_nat nf_nat xt_physdev sco bridge stp bnep rfcomm l2cap snd_pcm_oss snd_mixer_oss crc16 snd_seq coretemp snd_seq_device i915 drm_kms_helper drm i2c_algo_bit af_packet ip6t_REJECT nf_conntrack_ipv6 ip6table_raw xt_NOTRACK ipt_REJECT xt_state iptable_raw iptable_filter ip6table_mangle nf_conntrack_netbios_ns nf_conntrack_ipv4 nf_conntrack nf_defrag_ipv4 ip_tables ip6table_filter ip6_tables x_tables ipv6 microcode fuse ohci_hcd loop snd_hda_codec_realtek arc4 ecb snd_hda_intel ath5k snd_hda_codec mac80211 ath snd_hwdep btusb pcmcia snd_pcm sdhci_pci video snd_timer cfg80211 iTCO_wdt rtc_cmos ppdev bluetooth sdhci yenta_socket iTCO_vendor_support i2c_i801 snd rsrc_nonstatic fujitsu_laptop rtc_core soundcore mmc_core output ohci1394 parport_pc battery rfkill ac rtc_lib i2c_core snd_page_alloc pcmcia_core intel_agp parport joydev serio_raw led_class ieee1394 pcspkr button sky2 sg sha256 _generic aes_generic cbc dm_crypt usbhid hid ehci_hcd uhci_hcd sd_mod crc_t10dif usbcore dm_snapshot dm_mod edd ext3 mbcache jbd fan thermal_sys hwmon ata_piix ahci libata scsi_mod Pid: 7404, comm: qemu-system-x86 Not tainted 2.6.32-rc5 #8 LIFEBOOK E8110 RIP: 0010:[<ffffffffa05853ad>] [<ffffffffa05853ad>] kvm_set_shared_msr+0x51/0x7a [kvm] RSP: 0018:ffff880060947cc8 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000003 RCX: 00000000c0000080 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003 RBP: ffff880060947ce8 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000012 R11: ffff880062b01158 R12: ffff88000601dad0 R13: 0000000000000000 R14: ffff880062b00058 R15: ffff880062b00059 FS: 00007f91606df950(0000) GS:ffff880006000000(0000) knlGS:0000000000000000 CS: 0010 DS: 002b ES: 002b CR0: 0000000080050033 CR2: 0000000000000000 CR3: 00000000665ab000 CR4: 00000000000026f0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process qemu-system-x86 (pid: 7404, threadinfo ffff880060946000, task ffff880062989950) Stack: 0000000060947cf8 0000000000000004 ffff880062b00000 0000000000000000 <0> ffff880060947d08 ffffffffa05d1ef9 ffff880060991f80 ffff880062b00000 <0> ffff880060947dd8 ffffffffa0582e40 ffff880060947d38 000000000001db70 Call Trace: [<ffffffffa05d1ef9>] vmx_save_host_state+0x141/0x150 [kvm_intel] [<ffffffffa0582e40>] kvm_arch_vcpu_ioctl_run+0x510/0xb25 [kvm] [<ffffffffa0571dda>] kvm_vcpu_ioctl+0xfb/0x722 [kvm] [<ffffffffa05743de>] ? kvm_vm_ioctl+0x33a/0x36b [kvm] [<ffffffff81330022>] ? sub_preempt_count+0x9/0x83 [<ffffffff810cb698>] ? fire_user_return_notifiers+0x50/0x6b [<ffffffff81122bf4>] vfs_ioctl+0x2f/0x7d [<ffffffff81123112>] do_vfs_ioctl+0x450/0x48d [<ffffffff81330022>] ? sub_preempt_count+0x9/0x83 [<ffffffff811231a9>] sys_ioctl+0x5a/0x7c [<ffffffff8100bc5b>] system_call_fastpath+0x16/0x1b Code: 03 24 c5 60 a8 6f 81 89 d8 48 8d 50 04 4d 3b 2c d4 74 38 4d 89 2c d4 48 c1 e0 04 4c 89 ea 8b 88 f8 50 5a a0 48 c1 ea 20 44 89 e8 <0f> 30 41 80 7c 24 18 00 75 16 49 c7 04 24 d6 53 58 a0 4c 89 e7 RIP [<ffffffffa05853ad>] kvm_set_shared_msr+0x51/0x7a [kvm] RSP <ffff880060947cc8> ---[ end trace 44d1410c7cb2d885 ]--- note: qemu-system-x86[7404] exited with preempt_count 1 So the problem is not kvm-kmod related. Any ideas? Need .config or other additional information? Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-27 12:52 BUG with Win7 and user-return-notifier Jan Kiszka @ 2009-10-27 13:11 ` Avi Kivity 2009-10-27 13:13 ` Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Avi Kivity @ 2009-10-27 13:11 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm On 10/27/2009 02:52 PM, Jan Kiszka wrote: > Hi Avi, > > just booted kvm.git master (974ae8d7ff) as host and re-ran my boot test > of Windows 7. Already during "Starting Windows" I get this: > x86 or x64 7? > RAX: 0000000000000000 RBX: 0000000000000003 RCX: 00000000c0000080 > RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003 > > Call Trace: > [<ffffffffa05d1ef9>] vmx_save_host_state+0x141/0x150 [kvm_intel] > [<ffffffffa0582e40>] kvm_arch_vcpu_ioctl_run+0x510/0xb25 [kvm] > [<ffffffffa0571dda>] kvm_vcpu_ioctl+0xfb/0x722 [kvm] > [<ffffffffa05743de>] ? kvm_vm_ioctl+0x33a/0x36b [kvm] > [<ffffffff81330022>] ? sub_preempt_count+0x9/0x83 > [<ffffffff810cb698>] ? fire_user_return_notifiers+0x50/0x6b > [<ffffffff81122bf4>] vfs_ioctl+0x2f/0x7d > [<ffffffff81123112>] do_vfs_ioctl+0x450/0x48d > [<ffffffff81330022>] ? sub_preempt_count+0x9/0x83 > [<ffffffff811231a9>] sys_ioctl+0x5a/0x7c > [<ffffffff8100bc5b>] system_call_fastpath+0x16/0x1b > Code: 03 24 c5 60 a8 6f 81 89 d8 48 8d 50 04 4d 3b 2c d4 74 38 4d 89 2c d4 48 c1 e0 04 4c 89 ea 8b 88 f8 50 5a a0 48 c1 ea 20 44 89 e8<0f> 30 41 80 7c 24 18 00 75 16 49 c7 04 24 d6 53 58 a0 4c 89 e7 > RIP [<ffffffffa05853ad>] kvm_set_shared_msr+0x51/0x7a [kvm] > That's a wrmsr(EFER, 0), which should definitely fault. update_transition_efer() should have taken care of it. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-27 13:11 ` Avi Kivity @ 2009-10-27 13:13 ` Jan Kiszka 2009-10-27 13:24 ` Avi Kivity 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2009-10-27 13:13 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm Avi Kivity wrote: > On 10/27/2009 02:52 PM, Jan Kiszka wrote: >> Hi Avi, >> >> just booted kvm.git master (974ae8d7ff) as host and re-ran my boot test >> of Windows 7. Already during "Starting Windows" I get this: >> > > x86 or x64 7? x64. > >> RAX: 0000000000000000 RBX: 0000000000000003 RCX: 00000000c0000080 >> RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003 >> >> Call Trace: >> [<ffffffffa05d1ef9>] vmx_save_host_state+0x141/0x150 [kvm_intel] >> [<ffffffffa0582e40>] kvm_arch_vcpu_ioctl_run+0x510/0xb25 [kvm] >> [<ffffffffa0571dda>] kvm_vcpu_ioctl+0xfb/0x722 [kvm] >> [<ffffffffa05743de>] ? kvm_vm_ioctl+0x33a/0x36b [kvm] >> [<ffffffff81330022>] ? sub_preempt_count+0x9/0x83 >> [<ffffffff810cb698>] ? fire_user_return_notifiers+0x50/0x6b >> [<ffffffff81122bf4>] vfs_ioctl+0x2f/0x7d >> [<ffffffff81123112>] do_vfs_ioctl+0x450/0x48d >> [<ffffffff81330022>] ? sub_preempt_count+0x9/0x83 >> [<ffffffff811231a9>] sys_ioctl+0x5a/0x7c >> [<ffffffff8100bc5b>] system_call_fastpath+0x16/0x1b >> Code: 03 24 c5 60 a8 6f 81 89 d8 48 8d 50 04 4d 3b 2c d4 74 38 4d 89 2c d4 48 c1 e0 04 4c 89 ea 8b 88 f8 50 5a a0 48 c1 ea 20 44 89 e8<0f> 30 41 80 7c 24 18 00 75 16 49 c7 04 24 d6 53 58 a0 4c 89 e7 >> RIP [<ffffffffa05853ad>] kvm_set_shared_msr+0x51/0x7a [kvm] >> > > That's a wrmsr(EFER, 0), which should definitely fault. > update_transition_efer() should have taken care of it. > Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-27 13:13 ` Jan Kiszka @ 2009-10-27 13:24 ` Avi Kivity 2009-10-27 13:25 ` Avi Kivity 0 siblings, 1 reply; 20+ messages in thread From: Avi Kivity @ 2009-10-27 13:24 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm On 10/27/2009 03:13 PM, Jan Kiszka wrote: > Avi Kivity wrote: > >> On 10/27/2009 02:52 PM, Jan Kiszka wrote: >> >>> Hi Avi, >>> >>> just booted kvm.git master (974ae8d7ff) as host and re-ran my boot test >>> of Windows 7. Already during "Starting Windows" I get this: >>> >>> >> x86 or x64 7? >> > x64. > Worked for me - getting to the initial prompt. Do you have CONFIG_USER_RETURN_NOTIFIER=y in your .config? -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-27 13:24 ` Avi Kivity @ 2009-10-27 13:25 ` Avi Kivity 2009-10-28 8:18 ` Avi Kivity 0 siblings, 1 reply; 20+ messages in thread From: Avi Kivity @ 2009-10-27 13:25 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm On 10/27/2009 03:24 PM, Avi Kivity wrote: > > Worked for me - getting to the initial prompt. Do you have > > CONFIG_USER_RETURN_NOTIFIER=y > > in your .config? > If you do, send your own .config, will try to reproduce. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-27 13:25 ` Avi Kivity @ 2009-10-28 8:18 ` Avi Kivity 2009-10-28 14:01 ` Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Avi Kivity @ 2009-10-28 8:18 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm On 10/27/2009 03:25 PM, Avi Kivity wrote: > On 10/27/2009 03:24 PM, Avi Kivity wrote: >> >> Worked for me - getting to the initial prompt. Do you have >> >> CONFIG_USER_RETURN_NOTIFIER=y >> >> in your .config? >> > > If you do, send your own .config, will try to reproduce. > As I can't reproduce it, can you send a trace of what's going on? The kvm:kvm_msr and kvm:kvm_cr events should suffice to understand what's going on. Please enlarge your buffer size (buffer_size_kb) so we don't drop events. -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-28 8:18 ` Avi Kivity @ 2009-10-28 14:01 ` Jan Kiszka 2009-10-28 16:00 ` Avi Kivity 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2009-10-28 14:01 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm [-- Attachment #1: Type: text/plain, Size: 783 bytes --] Avi Kivity wrote: > On 10/27/2009 03:25 PM, Avi Kivity wrote: >> On 10/27/2009 03:24 PM, Avi Kivity wrote: >>> Worked for me - getting to the initial prompt. Do you have >>> >>> CONFIG_USER_RETURN_NOTIFIER=y >>> >>> in your .config? >>> >> If you do, send your own .config, will try to reproduce. >> > > As I can't reproduce it, can you send a trace of what's going on? > > The kvm:kvm_msr and kvm:kvm_cr events should suffice to understand > what's going on. Please enlarge your buffer size (buffer_size_kb) so we > don't drop events. > Find such a trace attached. I hope I caught all important events (there were tons of identical kvm_cr events before them which I cut off). Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux [-- Attachment #2: msr-crash.bz2 --] [-- Type: application/x-bzip, Size: 6224 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-28 14:01 ` Jan Kiszka @ 2009-10-28 16:00 ` Avi Kivity 2009-10-28 19:55 ` Jan Kiszka [not found] ` <4AE8AC20.50506@web.de> 0 siblings, 2 replies; 20+ messages in thread From: Avi Kivity @ 2009-10-28 16:00 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm [-- Attachment #1: Type: text/plain, Size: 1333 bytes --] On 10/28/2009 04:01 PM, Jan Kiszka wrote: > Avi Kivity wrote: > >> On 10/27/2009 03:25 PM, Avi Kivity wrote: >> >>> On 10/27/2009 03:24 PM, Avi Kivity wrote: >>> >>>> Worked for me - getting to the initial prompt. Do you have >>>> >>>> CONFIG_USER_RETURN_NOTIFIER=y >>>> >>>> in your .config? >>>> >>>> >>> If you do, send your own .config, will try to reproduce. >>> >>> >> As I can't reproduce it, can you send a trace of what's going on? >> >> The kvm:kvm_msr and kvm:kvm_cr events should suffice to understand >> what's going on. Please enlarge your buffer size (buffer_size_kb) so we >> don't drop events. >> >> > Find such a trace attached. I hope I caught all important events (there > were tons of identical kvm_cr events before them which I cut off). > [you can get longer, more detailed traces by using /sys/kernel/debug/tracing/trace instead of dmesg] Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : kvm_msr: msr_read c0000080 = 0x500 Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : kvm_msr: msr_write c0000080 = 0xd01 So Windows is setting EFER.SCE and EFER.NX while in long mode - perfectly reasonable. Can you rerun with the attached debug patch? -- error compiling committee.c: too many arguments to function [-- Attachment #2: efer-debug.patch --] [-- Type: text/x-patch, Size: 1346 bytes --] diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 85f97d1..6bd6d2c 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -590,6 +590,8 @@ static bool update_transition_efer(struct vcpu_vmx *vmx) u64 guest_efer; u64 ignore_bits; + printk("%s: efer_offset %d efer %llx\n", + __func__, efer_offset, vmx->vcpu.arch.shadow_efer); if (efer_offset < 0) return false; guest_efer = vmx->vcpu.arch.shadow_efer; @@ -606,10 +608,11 @@ static bool update_transition_efer(struct vcpu_vmx *vmx) ignore_bits &= ~(u64)EFER_SCE; #endif if ((guest_efer & ~ignore_bits) == (host_efer & ~ignore_bits)) - return false; + return printk("%s: ignoring all bits\n", __func__), false; guest_efer &= ~ignore_bits; guest_efer |= host_efer & ignore_bits; + printk("%s: transition efer %llx\n", __func__, guest_efer); vmx->guest_msrs[efer_offset].data = guest_efer; return true; } @@ -928,8 +931,11 @@ static void setup_msrs(struct vcpu_vmx *vmx) } #endif vmx->msr_offset_efer = index = __find_msr_index(vmx, MSR_EFER); - if (index >= 0 && update_transition_efer(vmx)) + if (index >= 0 && update_transition_efer(vmx)) { + printk("%s: marking efer for reload\n", __func__); move_msr_up(vmx, index, save_nmsrs++); + } else + printk("%s: marking efer for no reload\n", __func__); vmx->save_nmsrs = save_nmsrs; ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-28 16:00 ` Avi Kivity @ 2009-10-28 19:55 ` Jan Kiszka [not found] ` <4AE8AC20.50506@web.de> 1 sibling, 0 replies; 20+ messages in thread From: Jan Kiszka @ 2009-10-28 19:55 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm [-- Attachment #1: Type: text/plain, Size: 2014 bytes --] Avi Kivity wrote: > On 10/28/2009 04:01 PM, Jan Kiszka wrote: >> Avi Kivity wrote: >> >>> On 10/27/2009 03:25 PM, Avi Kivity wrote: >>> >>>> On 10/27/2009 03:24 PM, Avi Kivity wrote: >>>> >>>>> Worked for me - getting to the initial prompt. Do you have >>>>> >>>>> CONFIG_USER_RETURN_NOTIFIER=y >>>>> >>>>> in your .config? >>>>> >>>>> >>>> If you do, send your own .config, will try to reproduce. >>>> >>>> >>> As I can't reproduce it, can you send a trace of what's going on? >>> >>> The kvm:kvm_msr and kvm:kvm_cr events should suffice to understand >>> what's going on. Please enlarge your buffer size (buffer_size_kb) so we >>> don't drop events. >>> >>> >> Find such a trace attached. I hope I caught all important events (there >> were tons of identical kvm_cr events before them which I cut off). >> > > [you can get longer, more detailed traces by using > /sys/kernel/debug/tracing/trace instead of dmesg] > > Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : > kvm_msr: msr_read c0000080 = 0x500 > Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : > kvm_msr: msr_write c0000080 = 0xd01 > > So Windows is setting EFER.SCE and EFER.NX while in long mode - > perfectly reasonable. Can you rerun with the attached debug patch? > Currently building, expect results soon. But while we are at it: > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index 85f97d1..6bd6d2c 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c ... > @@ -928,8 +931,11 @@ static void setup_msrs(struct vcpu_vmx *vmx) > } > #endif > vmx->msr_offset_efer = index = __find_msr_index(vmx, MSR_EFER); > - if (index >= 0 && update_transition_efer(vmx)) > + if (index >= 0 && update_transition_efer(vmx)) { > + printk("%s: marking efer for reload\n", __func__); > move_msr_up(vmx, index, save_nmsrs++); The last line breaks x86-32 builds. Jan [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 257 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <4AE8AC20.50506@web.de>]
* Re: BUG with Win7 and user-return-notifier [not found] ` <4AE8AC20.50506@web.de> @ 2009-10-29 7:37 ` Avi Kivity 2009-10-29 8:03 ` Jan Kiszka 2009-10-29 16:07 ` Jan Kiszka 0 siblings, 2 replies; 20+ messages in thread From: Avi Kivity @ 2009-10-29 7:37 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm-devel On 10/28/2009 10:40 PM, Jan Kiszka wrote: > >> [you can get longer, more detailed traces by using >> /sys/kernel/debug/tracing/trace instead of dmesg] >> >> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >> kvm_msr: msr_read c0000080 = 0x500 >> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >> kvm_msr: msr_write c0000080 = 0xd01 >> >> So Windows is setting EFER.SCE and EFER.NX while in long mode - >> perfectly reasonable. Can you rerun with the attached debug patch? >> >> > Log attached. > So the last bits are: Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 efer d01 Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all bits Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload We're not reloading efer (correctly, as guest efer == host efer), yet vmx_save_host_state() fails while loading efer. I've looked at move_msr_up() (which is used by setup_msrs() to partition the msr space into reloaded and non-reloaded msrs), and it seems correct. Can you see any way where update_transition_efer() returns false, yet efer turns up in the first save_nmsrs entries of vmx->guest_msrs? -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 7:37 ` Avi Kivity @ 2009-10-29 8:03 ` Jan Kiszka 2009-10-29 8:06 ` Jan Kiszka 2009-10-29 8:07 ` Avi Kivity 2009-10-29 16:07 ` Jan Kiszka 1 sibling, 2 replies; 20+ messages in thread From: Jan Kiszka @ 2009-10-29 8:03 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm-devel [-- Attachment #1: Type: text/plain, Size: 1453 bytes --] Avi Kivity wrote: > On 10/28/2009 10:40 PM, Jan Kiszka wrote: >> >>> [you can get longer, more detailed traces by using >>> /sys/kernel/debug/tracing/trace instead of dmesg] >>> >>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>> kvm_msr: msr_read c0000080 = 0x500 >>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>> kvm_msr: msr_write c0000080 = 0xd01 >>> >>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>> perfectly reasonable. Can you rerun with the attached debug patch? >>> >>> >> Log attached. >> > > So the last bits are: > > Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 > efer d01 > Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all bits > Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload > > We're not reloading efer (correctly, as guest efer == host efer), yet > vmx_save_host_state() fails while loading efer. I've looked at > move_msr_up() (which is used by setup_msrs() to partition the msr space > into reloaded and non-reloaded msrs), and it seems correct. > > Can you see any way where update_transition_efer() returns false, yet > efer turns up in the first save_nmsrs entries of vmx->guest_msrs? > Without understanding the code completely yet: When you push the slot containing EFER around, do you also update msr_offset_efer? Jan [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 257 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 8:03 ` Jan Kiszka @ 2009-10-29 8:06 ` Jan Kiszka 2009-10-29 8:07 ` Avi Kivity 1 sibling, 0 replies; 20+ messages in thread From: Jan Kiszka @ 2009-10-29 8:06 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm-devel [-- Attachment #1: Type: text/plain, Size: 2075 bytes --] Jan Kiszka wrote: > Avi Kivity wrote: >> On 10/28/2009 10:40 PM, Jan Kiszka wrote: >>>> [you can get longer, more detailed traces by using >>>> /sys/kernel/debug/tracing/trace instead of dmesg] >>>> >>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>>> kvm_msr: msr_read c0000080 = 0x500 >>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>>> kvm_msr: msr_write c0000080 = 0xd01 >>>> >>>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>>> perfectly reasonable. Can you rerun with the attached debug patch? >>>> >>>> >>> Log attached. >>> >> So the last bits are: >> >> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 >> efer d01 >> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all bits >> Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload >> >> We're not reloading efer (correctly, as guest efer == host efer), yet >> vmx_save_host_state() fails while loading efer. I've looked at >> move_msr_up() (which is used by setup_msrs() to partition the msr space >> into reloaded and non-reloaded msrs), and it seems correct. >> >> Can you see any way where update_transition_efer() returns false, yet >> efer turns up in the first save_nmsrs entries of vmx->guest_msrs? >> > > Without understanding the code completely yet: When you push the slot > containing EFER around, do you also update msr_offset_efer? diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 4264e09..0b1f461 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -928,8 +928,10 @@ static void setup_msrs(struct vcpu_vmx *vmx) } #endif vmx->msr_offset_efer = index = __find_msr_index(vmx, MSR_EFER); - if (index >= 0 && update_transition_efer(vmx)) + if (index >= 0 && update_transition_efer(vmx)) { + vmx->msr_offset_efer = save_nmsrs; move_msr_up(vmx, index, save_nmsrs++); + } vmx->save_nmsrs = save_nmsrs; ? Untested as I don't want to crash my notebook ATM. :) Jan [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 257 bytes --] ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 8:03 ` Jan Kiszka 2009-10-29 8:06 ` Jan Kiszka @ 2009-10-29 8:07 ` Avi Kivity 2009-10-29 8:32 ` Jan Kiszka 1 sibling, 1 reply; 20+ messages in thread From: Avi Kivity @ 2009-10-29 8:07 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm-devel On 10/29/2009 10:03 AM, Jan Kiszka wrote: > Avi Kivity wrote: > >> On 10/28/2009 10:40 PM, Jan Kiszka wrote: >> >>> >>>> [you can get longer, more detailed traces by using >>>> /sys/kernel/debug/tracing/trace instead of dmesg] >>>> >>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>>> kvm_msr: msr_read c0000080 = 0x500 >>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>>> kvm_msr: msr_write c0000080 = 0xd01 >>>> >>>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>>> perfectly reasonable. Can you rerun with the attached debug patch? >>>> >>>> >>>> >>> Log attached. >>> >>> >> So the last bits are: >> >> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 >> efer d01 >> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all bits >> Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload >> >> We're not reloading efer (correctly, as guest efer == host efer), yet >> vmx_save_host_state() fails while loading efer. I've looked at >> move_msr_up() (which is used by setup_msrs() to partition the msr space >> into reloaded and non-reloaded msrs), and it seems correct. >> >> Can you see any way where update_transition_efer() returns false, yet >> efer turns up in the first save_nmsrs entries of vmx->guest_msrs? >> >> > Without understanding the code completely yet: When you push the slot > containing EFER around, do you also update msr_offset_efer? > > We don't, but msr_offset_efer is only used from update_transition_efer(), which is only ever called from setup_msrs() immediately after updating msr_offset_efer. Of course, it should be an argument to update_transition_efer(), I'll clean up this leftover. -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 8:07 ` Avi Kivity @ 2009-10-29 8:32 ` Jan Kiszka 2009-10-29 15:45 ` Jan Kiszka 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2009-10-29 8:32 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm-devel [-- Attachment #1: Type: text/plain, Size: 1998 bytes --] Avi Kivity wrote: > On 10/29/2009 10:03 AM, Jan Kiszka wrote: >> Avi Kivity wrote: >> >>> On 10/28/2009 10:40 PM, Jan Kiszka wrote: >>> >>>> >>>>> [you can get longer, more detailed traces by using >>>>> /sys/kernel/debug/tracing/trace instead of dmesg] >>>>> >>>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>>>> kvm_msr: msr_read c0000080 = 0x500 >>>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>>>> kvm_msr: msr_write c0000080 = 0xd01 >>>>> >>>>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>>>> perfectly reasonable. Can you rerun with the attached debug patch? >>>>> >>>>> >>>>> >>>> Log attached. >>>> >>>> >>> So the last bits are: >>> >>> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 >>> efer d01 >>> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all >>> bits >>> Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload >>> >>> We're not reloading efer (correctly, as guest efer == host efer), yet >>> vmx_save_host_state() fails while loading efer. I've looked at >>> move_msr_up() (which is used by setup_msrs() to partition the msr space >>> into reloaded and non-reloaded msrs), and it seems correct. >>> >>> Can you see any way where update_transition_efer() returns false, yet >>> efer turns up in the first save_nmsrs entries of vmx->guest_msrs? >>> >>> >> Without understanding the code completely yet: When you push the slot >> containing EFER around, do you also update msr_offset_efer? >> >> > > We don't, but msr_offset_efer is only used from > update_transition_efer(), which is only ever called from setup_msrs() > immediately after updating msr_offset_efer. Indeed. > > Of course, it should be an argument to update_transition_efer(), I'll > clean up this leftover. > OK, will see that I can debug this later today. Jan [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 257 bytes --] ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 8:32 ` Jan Kiszka @ 2009-10-29 15:45 ` Jan Kiszka 2009-10-29 16:05 ` Avi Kivity 0 siblings, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2009-10-29 15:45 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm-devel Jan Kiszka wrote: > Avi Kivity wrote: >> On 10/29/2009 10:03 AM, Jan Kiszka wrote: >>> Avi Kivity wrote: >>> >>>> On 10/28/2009 10:40 PM, Jan Kiszka wrote: >>>> >>>>> >>>>>> [you can get longer, more detailed traces by using >>>>>> /sys/kernel/debug/tracing/trace instead of dmesg] >>>>>> >>>>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>>>>> kvm_msr: msr_read c0000080 = 0x500 >>>>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>>>>> kvm_msr: msr_write c0000080 = 0xd01 >>>>>> >>>>>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>>>>> perfectly reasonable. Can you rerun with the attached debug patch? >>>>>> >>>>>> >>>>>> >>>>> Log attached. >>>>> >>>>> >>>> So the last bits are: >>>> >>>> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 >>>> efer d01 >>>> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all >>>> bits >>>> Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload >>>> >>>> We're not reloading efer (correctly, as guest efer == host efer), yet >>>> vmx_save_host_state() fails while loading efer. I've looked at >>>> move_msr_up() (which is used by setup_msrs() to partition the msr space >>>> into reloaded and non-reloaded msrs), and it seems correct. >>>> >>>> Can you see any way where update_transition_efer() returns false, yet >>>> efer turns up in the first save_nmsrs entries of vmx->guest_msrs? >>>> >>>> >>> Without understanding the code completely yet: When you push the slot >>> containing EFER around, do you also update msr_offset_efer? >>> >>> >> We don't, but msr_offset_efer is only used from >> update_transition_efer(), which is only ever called from setup_msrs() >> immediately after updating msr_offset_efer. > > Indeed. > >> Of course, it should be an argument to update_transition_efer(), I'll >> clean up this leftover. >> > > OK, will see that I can debug this later today. > Haven't found the actual problem yet, but some oddities: > static int vmx_vcpu_setup(struct vcpu_vmx *vmx) > { > ... > for (i = 0; i < NR_VMX_MSR; ++i) { > u32 index = vmx_msr_index[i]; > u32 data_low, data_high; > u64 data; > int j = vmx->nmsrs; > > if (rdmsr_safe(index, &data_low, &data_high) < 0) > continue; > if (wrmsr_safe(index, data_low, data_high) < 0) > continue; > data = data_low | ((u64)data_high << 32); > vmx->guest_msrs[j].index = i; > vmx->guest_msrs[j].data = 0; ^^^^^ Local 'data' drops on the floor. Is that correct (then it deserves a cleanup)? Previous version did a "guest = host". > static void vmx_set_efer(struct kvm_vcpu *vcpu, u64 efer) > { > struct vcpu_vmx *vmx = to_vmx(vcpu); > struct shared_msr_entry *msr = find_msr_entry(vmx, MSR_EFER); > > if (!msr) > return; > vcpu->arch.shadow_efer = efer; > if (!msr) > return; One "if (!msr)" too much - really the second one? Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 15:45 ` Jan Kiszka @ 2009-10-29 16:05 ` Avi Kivity 0 siblings, 0 replies; 20+ messages in thread From: Avi Kivity @ 2009-10-29 16:05 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm-devel On 10/29/2009 05:45 PM, Jan Kiszka wrote: > >> static int vmx_vcpu_setup(struct vcpu_vmx *vmx) >> { >> ... >> for (i = 0; i< NR_VMX_MSR; ++i) { >> u32 index = vmx_msr_index[i]; >> u32 data_low, data_high; >> u64 data; >> int j = vmx->nmsrs; >> >> if (rdmsr_safe(index,&data_low,&data_high)< 0) >> continue; >> if (wrmsr_safe(index, data_low, data_high)< 0) >> continue; >> data = data_low | ((u64)data_high<< 32); >> vmx->guest_msrs[j].index = i; >> vmx->guest_msrs[j].data = 0; >> > ^^^^^ > Local 'data' drops on the floor. Is that correct (then it deserves a > cleanup)? Previous version did a "guest = host". > Arguably, it's more correct than what we used to have. This code dates back to the day when kvm started in 64-bit mode and so we copied important MSRs from the host. Shouldn't matter for our case. >> static void vmx_set_efer(struct kvm_vcpu *vcpu, u64 efer) >> { >> struct vcpu_vmx *vmx = to_vmx(vcpu); >> struct shared_msr_entry *msr = find_msr_entry(vmx, MSR_EFER); >> >> if (!msr) >> return; >> vcpu->arch.shadow_efer = efer; >> if (!msr) >> return; >> > One "if (!msr)" too much - really the second one? > Yes. (Either really - if there is no host EFER, the only legal value for efer is 0, so whether we update it or not doesn't matter). Likely introduced by a bad merge. How code rots. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 7:37 ` Avi Kivity 2009-10-29 8:03 ` Jan Kiszka @ 2009-10-29 16:07 ` Jan Kiszka 2009-10-29 16:14 ` Jan Kiszka 2009-10-29 16:49 ` Avi Kivity 1 sibling, 2 replies; 20+ messages in thread From: Jan Kiszka @ 2009-10-29 16:07 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm-devel Avi Kivity wrote: > On 10/28/2009 10:40 PM, Jan Kiszka wrote: >> >>> [you can get longer, more detailed traces by using >>> /sys/kernel/debug/tracing/trace instead of dmesg] >>> >>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>> kvm_msr: msr_read c0000080 = 0x500 >>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>> kvm_msr: msr_write c0000080 = 0xd01 >>> >>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>> perfectly reasonable. Can you rerun with the attached debug patch? >>> >>> >> Log attached. >> > > So the last bits are: > > Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 > efer d01 > Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all bits > Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload > > We're not reloading efer (correctly, as guest efer == host efer), yet > vmx_save_host_state() fails while loading efer. I've looked at > move_msr_up() (which is used by setup_msrs() to partition the msr space > into reloaded and non-reloaded msrs), and it seems correct. > > Can you see any way where update_transition_efer() returns false, yet > efer turns up in the first save_nmsrs entries of vmx->guest_msrs? > Question: When a VCPU migrates, what syncs the shared_msrs per-cpu vars before or after that, or why is this no problem? I'm currently following the theory that guest_msrs contains some non-EFER entry with 0 value, but shared_msrs has a different index in the slot passed to kvm_set_shared_msr. Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 16:07 ` Jan Kiszka @ 2009-10-29 16:14 ` Jan Kiszka 2009-10-29 16:52 ` Avi Kivity 2009-10-29 16:49 ` Avi Kivity 1 sibling, 1 reply; 20+ messages in thread From: Jan Kiszka @ 2009-10-29 16:14 UTC (permalink / raw) To: Avi Kivity; +Cc: kvm-devel Jan Kiszka wrote: > Avi Kivity wrote: >> On 10/28/2009 10:40 PM, Jan Kiszka wrote: >>>> [you can get longer, more detailed traces by using >>>> /sys/kernel/debug/tracing/trace instead of dmesg] >>>> >>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996395us : >>>> kvm_msr: msr_read c0000080 = 0x500 >>>> Oct 28 14:29:56 mchn012c kernel: qemu-sys-7200 0...1. 676996403us : >>>> kvm_msr: msr_write c0000080 = 0xd01 >>>> >>>> So Windows is setting EFER.SCE and EFER.NX while in long mode - >>>> perfectly reasonable. Can you rerun with the attached debug patch? >>>> >>>> >>> Log attached. >>> >> So the last bits are: >> >> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: efer_offset 4 >> efer d01 >> Oct 28 21:26:41 mchn012c kernel: update_transition_efer: ignoring all bits >> Oct 28 21:26:41 mchn012c kernel: setup_msrs: marking efer for no reload >> >> We're not reloading efer (correctly, as guest efer == host efer), yet >> vmx_save_host_state() fails while loading efer. I've looked at >> move_msr_up() (which is used by setup_msrs() to partition the msr space >> into reloaded and non-reloaded msrs), and it seems correct. >> >> Can you see any way where update_transition_efer() returns false, yet >> efer turns up in the first save_nmsrs entries of vmx->guest_msrs? >> > > Question: When a VCPU migrates, what syncs the shared_msrs per-cpu vars > before or after that, or why is this no problem? > > I'm currently following the theory that guest_msrs contains some > non-EFER entry with 0 value, but shared_msrs has a different index in > the slot passed to kvm_set_shared_msr. > OK, EFER is a globally shared msr. But there still needs to be a consensus on the slot id used for guest_msrs and shared_msrs_global.msrs, right? move_msr_up works per-vcpu and is obviously decoupled... Jan -- Siemens AG, Corporate Technology, CT SE 2 Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 16:14 ` Jan Kiszka @ 2009-10-29 16:52 ` Avi Kivity 0 siblings, 0 replies; 20+ messages in thread From: Avi Kivity @ 2009-10-29 16:52 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm-devel On 10/29/2009 06:14 PM, Jan Kiszka wrote: > > OK, EFER is a globally shared msr. But there still needs to be a > consensus on the slot id used for guest_msrs and > shared_msrs_global.msrs, right? move_msr_up works per-vcpu and is > obviously decoupled... > > move_msr_up() moves a shared_msr_entry, which contains an index into the shared_msrs_global structure. Double indirection: msr_index = kvm_shared_msrs_global.msrs[vmx->guest_msrs[index].index].msr So guest_msrs can be rearranged at will. Except for your oops. -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: BUG with Win7 and user-return-notifier 2009-10-29 16:07 ` Jan Kiszka 2009-10-29 16:14 ` Jan Kiszka @ 2009-10-29 16:49 ` Avi Kivity 1 sibling, 0 replies; 20+ messages in thread From: Avi Kivity @ 2009-10-29 16:49 UTC (permalink / raw) To: Jan Kiszka; +Cc: kvm-devel On 10/29/2009 06:07 PM, Jan Kiszka wrote: > > Question: When a VCPU migrates, what syncs the shared_msrs per-cpu vars > before or after that, or why is this no problem? > > The guest's msrs remain on the old cpu (until a new guest is switched in or we return to userspace). The guest msrs are loaded into the new cpu when vmx_save_host_state() is called as part or kvm_arch_vcpu_load(). > I'm currently following the theory that guest_msrs contains some > non-EFER entry with 0 value, but shared_msrs has a different index in > the slot passed to kvm_set_shared_msr. > That's a global... -- Do not meddle in the internals of kernels, for they are subtle and quick to panic. ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2009-10-29 16:52 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-27 12:52 BUG with Win7 and user-return-notifier Jan Kiszka
2009-10-27 13:11 ` Avi Kivity
2009-10-27 13:13 ` Jan Kiszka
2009-10-27 13:24 ` Avi Kivity
2009-10-27 13:25 ` Avi Kivity
2009-10-28 8:18 ` Avi Kivity
2009-10-28 14:01 ` Jan Kiszka
2009-10-28 16:00 ` Avi Kivity
2009-10-28 19:55 ` Jan Kiszka
[not found] ` <4AE8AC20.50506@web.de>
2009-10-29 7:37 ` Avi Kivity
2009-10-29 8:03 ` Jan Kiszka
2009-10-29 8:06 ` Jan Kiszka
2009-10-29 8:07 ` Avi Kivity
2009-10-29 8:32 ` Jan Kiszka
2009-10-29 15:45 ` Jan Kiszka
2009-10-29 16:05 ` Avi Kivity
2009-10-29 16:07 ` Jan Kiszka
2009-10-29 16:14 ` Jan Kiszka
2009-10-29 16:52 ` Avi Kivity
2009-10-29 16:49 ` Avi Kivity
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox