From patchwork Thu Oct 27 04:38:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 9398883 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 72176600BA for ; Thu, 27 Oct 2016 04:39:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3C96429F73 for ; Thu, 27 Oct 2016 04:39:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 311C429F95; Thu, 27 Oct 2016 04:39:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,FREEMAIL_FROM,RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A583429F73 for ; Thu, 27 Oct 2016 04:39:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754268AbcJ0EjC (ORCPT ); Thu, 27 Oct 2016 00:39:02 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:35969 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751166AbcJ0Ei7 (ORCPT ); Thu, 27 Oct 2016 00:38:59 -0400 Received: by mail-pf0-f194.google.com with SMTP id n85so1375961pfi.3; Wed, 26 Oct 2016 21:38:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=V/UXQRp42YTK7Q6Rx5YeBIk2ESJzSq+KxXWe+eVtwxU=; b=yZ5drRNaWFPZXe8WNQBMps3mXz3Eetm2DSiTdgZ3OloxoJ9PttJx+XSqhOCNkBrcaO 3N0vhTDmn7Z7Drsdi0Zys5uchKiwQF4TlJOtVRSWKTxdyU7cQ0fwJw1e1R5DP7nxMWho hsC0NvTw+akravRnsRPc4IhGUfZX4+UE1a0vdMOBa6C5nZg8NA3z95DG0mz3GnYI62UJ mJK7n/jz5vdbrZDO/2tQjAJz/39mdTKiEClvldb2ij6RivGfG+Z/xJ9Hu54ay+p5nT0r KAhsLVlFR7hk5qERk4cbg1oI0ljJX+xuWgaQKS7ohEVch7RW9vbUQCQBMOf2oBUiSUi9 MwmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=V/UXQRp42YTK7Q6Rx5YeBIk2ESJzSq+KxXWe+eVtwxU=; b=ZeP8DgqEKmYZHUajSgbIY92JkAIczN8AuG/sBG042XelMTIJjAPYyVhssoXhBj3QZv YZa0uRqti8HW8ghyDgk0pDNCIn64wOWM4dtoMdnQwo57tLhXoSh2Xn+mioweBuJkWZ/n cHexVmVkBaXslqK8H2fQ1zs6B7NJCxEL4kWEDWvZxhuT9v9PjhWpw0lxEoMkLkZAEHp3 4bO4yCCriInoDvPiKTL+GdQUi9MTr+BgfsK27mRM+TX8w3KmU6vnfIwB45qH0noEs2wJ 0jWGEdc20a3krc+TL3XzGFqmPr80Ky2kQbPaMTyexhBR42iNvcGUHsauhotsVHKO719G F0iw== X-Gm-Message-State: ABUngveOoGfMDV4X3NefuRff+2Yr78OoIztgalu/SRniWWwRHnkt7cMno1m34H6WJs0fHQ== X-Received: by 10.98.192.24 with SMTP id x24mr10629086pff.118.1477543138515; Wed, 26 Oct 2016 21:38:58 -0700 (PDT) Received: from kernel.kingsoft.cn ([114.255.44.132]) by smtp.gmail.com with ESMTPSA id jz5sm7600904pad.10.2016.10.26.21.38.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Oct 2016 21:38:57 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Ingo Molnar , Mike Galbraith , Peter Zijlstra , Thomas Gleixner , Paolo Bonzini , Borislav Petkov , Wanpeng Li Subject: [PATCH v6 2/2] x86/apic: x2apic write eoi msr notrace Date: Thu, 27 Oct 2016 12:38:42 +0800 Message-Id: <1477543122-4908-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477543122-4908-1-git-send-email-wanpeng.li@hotmail.com> References: <1477543122-4908-1-git-send-email-wanpeng.li@hotmail.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wanpeng Li | RCU used illegally from idle CPU! | rcu_scheduler_active = 1, debug_locks = 0 | RCU used illegally from extended quiescent state! | no locks held by swapper/1/0. | | [] do_trace_write_msr+0x135/0x140 | [] native_write_msr+0x20/0x30 | [] native_apic_msr_eoi_write+0x1d/0x30 | [] smp_reschedule_interrupt+0x1d/0x30 | [] reschedule_interrupt+0x96/0xa0 Reschedule interrupt may be called in cpu idle state. This causes lockdep check warning above. As Peterz pointed out: | So now we're making a very frequent interrupt slower because of debug | code. | | The thing is, many many smp_reschedule_interrupt() invocations don't | actually execute anything much at all and are only send to tickle the | return to user path (which does the actual preemption). | | Having to do the whole irq_enter/irq_exit dance just for this unlikely | debug case totally blows. This patch converts x2apic write eoi msr to notrace to avoid the debug codes splash and reverts irq_enter/irq_exit dance to avoid to make a very frequent interrupt slower because of debug code. Suggested-by: Peter Zijlstra Suggested-by: Paolo Bonzini Cc: Ingo Molnar Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Paolo Bonzini Cc: Borislav Petkov Signed-off-by: Wanpeng Li --- arch/x86/include/asm/apic.h | 3 ++- arch/x86/kernel/apic/apic.c | 1 + arch/x86/kernel/kvm.c | 4 ++-- arch/x86/kernel/smp.c | 2 -- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index f5aaf6c..a5a0bcf 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h @@ -196,7 +196,7 @@ static inline void native_apic_msr_write(u32 reg, u32 v) static inline void native_apic_msr_eoi_write(u32 reg, u32 v) { - wrmsr(APIC_BASE_MSR + (APIC_EOI >> 4), APIC_EOI_ACK, 0); + wrmsr_notrace(APIC_BASE_MSR + (APIC_EOI >> 4), APIC_EOI_ACK, 0); } static inline u32 native_apic_msr_read(u32 reg) @@ -332,6 +332,7 @@ struct apic { * on write for EOI. */ void (*eoi_write)(u32 reg, u32 v); + void (*native_eoi_write)(u32 reg, u32 v); u64 (*icr_read)(void); void (*icr_write)(u32 low, u32 high); void (*wait_icr_idle)(void); diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index 88c657b..2686894 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -2263,6 +2263,7 @@ void __init apic_set_eoi_write(void (*eoi_write)(u32 reg, u32 v)) for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) { /* Should happen once for each apic */ WARN_ON((*drv)->eoi_write == eoi_write); + (*drv)->native_eoi_write = (*drv)->eoi_write; (*drv)->eoi_write = eoi_write; } } diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index edbbfc8..d230513 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c @@ -308,7 +308,7 @@ static void kvm_register_steal_time(void) static DEFINE_PER_CPU(unsigned long, kvm_apic_eoi) = KVM_PV_EOI_DISABLED; -static void kvm_guest_apic_eoi_write(u32 reg, u32 val) +notrace static void kvm_guest_apic_eoi_write(u32 reg, u32 val) { /** * This relies on __test_and_clear_bit to modify the memory @@ -319,7 +319,7 @@ static void kvm_guest_apic_eoi_write(u32 reg, u32 val) */ if (__test_and_clear_bit(KVM_PV_EOI_BIT, this_cpu_ptr(&kvm_apic_eoi))) return; - apic_write(APIC_EOI, APIC_EOI_ACK); + apic->native_eoi_write(APIC_EOI, APIC_EOI_ACK); } static void kvm_guest_cpu_init(void) diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index c00cb64..68f8cc2 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -261,10 +261,8 @@ static inline void __smp_reschedule_interrupt(void) __visible void smp_reschedule_interrupt(struct pt_regs *regs) { - irq_enter(); ack_APIC_irq(); __smp_reschedule_interrupt(); - irq_exit(); /* * KVM uses this interrupt to force a cpu out of guest mode */