From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joerg Roedel Subject: Re: WARN_ON in kvm_queue_exception_e triggers Date: Mon, 28 Apr 2008 22:37:02 +0200 Message-ID: <20080428203702.GA7393@amd.com> References: <48160ACE.4070502@siemens.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="u3/rZRmxL6MmkK24" Cc: kvm-devel To: Jan Kiszka Return-path: Content-Disposition: inline In-Reply-To: <48160ACE.4070502@siemens.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org --u3/rZRmxL6MmkK24 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Apr 28, 2008 at 07:35:10PM +0200, Jan Kiszka wrote: > Hi, > > sorry, the test environment is not really reproducible (stock kvm-66, > yet unpublished NMI support by Sheng Yang and me, special guest), but > I'm just fishing for some ideas on what may cause the flood of the > following warning in my kernel log: > > ------------[ cut here ]------------ > WARNING: at /data/kvm-66/kernel/x86.c:180 > kvm_queue_exception_e+0x30/0x54 [kvm]() > Modules linked in: ipt_MASQUERADE kvm_intel kvm bridge tun ip6t_LOG > nf_conntrack_ipv6 xt_pkttype ipt_LOG xt_limit snd_pcm_oss snd_mixer_oss > snd_seq snd_seq_device nls_utf8 cifs af_packet ip6t_REJECT xt_tcpudp > ipt_REJECT xt_state iptable_mangle iptable_nat nf_nat iptable_filter > ip6table_mangle nf_conntrack_ipv4 nf_conntrack ip_tables ip6table_filter > ip6_tables cpufreq_conservative x_tables cpufreq_userspace > cpufreq_powersave acpi_cpufreq ipv6 microcode fuse ohci_hcd loop rfcomm > l2cap wlan_scan_sta ath_rate_sample ath_pci snd_hda_intel wlan pcmcia > firmware_class hci_usb snd_pcm snd_timer ath_hal(P) sdhci battery > bluetooth button ohci1394 mmc_core rtc_cmos parport_pc intel_agp > rtc_core dock ac snd_page_alloc iTCO_wdt ieee1394 sky2 rtc_lib > yenta_socket parport snd_hwdep snd iTCO_vendor_support i2c_i801 > rsrc_nonstatic pcmcia_core sg i2c_core soundcore serio_raw joydev > sha256_generic aes_x86_64 aes_generic cbc dm_crypt crypto_blkcipher > usbhid hid ff_memless sd_mod ehci_hcd uhci_hcd usbcore dm_snapshot > dm_mod edd ext3 mbcache jbd fan ata_piix ahci libata scsi_mod thermal > processor > Pid: 4718, comm: qemu-system-x86 Tainted: P N > 2.6.25-rc5-git2-109.8-default #1 > > Call Trace: > [] dump_trace+0xc4/0x576 > [] show_trace+0x40/0x57 > [] _etext+0x72/0x7b > [] warn_on_slowpath+0x58/0x80 > [] :kvm:kvm_queue_exception_e+0x30/0x54 > [] :kvm:kvm_task_switch+0xca/0x20a > [] :kvm_intel:handle_task_switch+0x19/0x1b > [] :kvm_intel:kvm_handle_exit+0x7f/0x9c > [] :kvm:kvm_arch_vcpu_ioctl_run+0x49b/0x686 > [] :kvm:kvm_vcpu_ioctl+0xf7/0x3ca > [] vfs_ioctl+0x2a/0x78 > [] do_vfs_ioctl+0x247/0x261 > [] sys_ioctl+0x55/0x77 > [] system_call_after_swapgs+0x8a/0x8f > [<00007faed2969267>] > > ---[ end trace 5d286714f3c5c50f ]--- Hmm, seems we have to check for DF and triple faults in the kvm_queue_exception functions too. Does the attached patch fix the problem (patch is against kvm-66). Joerg -- | AMD Saxony Limited Liability Company & Co. KG Operating | Wilschdorfer Landstr. 101, 01109 Dresden, Germany System | Register Court Dresden: HRA 4896 Research | General Partner authorized to represent: Center | AMD Saxony LLC (Wilmington, Delaware, US) | General Manager of AMD Saxony LLC: Dr. Hans-R. Deppe, Thomas McCoy --u3/rZRmxL6MmkK24 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="test-fix.patch" diff --git a/kernel/x86.c b/kernel/x86.c index ef2aba9..a4da0e8 100644 --- a/kernel/x86.c +++ b/kernel/x86.c @@ -144,9 +144,23 @@ void kvm_set_apic_base(struct kvm_vcpu *vcpu, u64 data) } EXPORT_SYMBOL_GPL(kvm_set_apic_base); +static void handle_multiple_faults(struct kvm_vcpu *vcpu) +{ + if (vcpu->arch.exception.nr != DF_VECTOR) { + printk(KERN_DEBUG "kvm: inject_page_fault:" + " double fault\n"); + vcpu->arch.exception.nr = DF_VECTOR; + vcpu->arch.exception.error_code = 0; + } else + set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests); +} + void kvm_queue_exception(struct kvm_vcpu *vcpu, unsigned nr) { - WARN_ON(vcpu->arch.exception.pending); + if (vcpu->arch.exception.pending) { + handle_multiple_faults(vcpu); + return; + } vcpu->arch.exception.pending = true; vcpu->arch.exception.has_error_code = false; vcpu->arch.exception.nr = nr; @@ -157,25 +171,16 @@ void kvm_inject_page_fault(struct kvm_vcpu *vcpu, unsigned long addr, u32 error_code) { ++vcpu->stat.pf_guest; - if (vcpu->arch.exception.pending) { - if (vcpu->arch.exception.nr == PF_VECTOR) { - printk(KERN_DEBUG "kvm: inject_page_fault:" - " double fault 0x%lx\n", addr); - vcpu->arch.exception.nr = DF_VECTOR; - vcpu->arch.exception.error_code = 0; - } else if (vcpu->arch.exception.nr == DF_VECTOR) { - /* triple fault -> shutdown */ - set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests); - } - return; - } vcpu->arch.cr2 = addr; kvm_queue_exception_e(vcpu, PF_VECTOR, error_code); } void kvm_queue_exception_e(struct kvm_vcpu *vcpu, unsigned nr, u32 error_code) { - WARN_ON(vcpu->arch.exception.pending); + if (vcpu->arch.exception.pending) { + handle_multiple_faults(vcpu); + return; + } vcpu->arch.exception.pending = true; vcpu->arch.exception.has_error_code = true; vcpu->arch.exception.nr = nr; --u3/rZRmxL6MmkK24 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone --u3/rZRmxL6MmkK24 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel --u3/rZRmxL6MmkK24--