From patchwork Mon Oct 31 01:37:02 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wanpeng Li X-Patchwork-Id: 9404955 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 B99EE60588 for ; Mon, 31 Oct 2016 01:39:48 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A7CFB28DF6 for ; Mon, 31 Oct 2016 01:39:48 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9B77A28E3A; Mon, 31 Oct 2016 01:39:48 +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.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, 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 2078728DF6 for ; Mon, 31 Oct 2016 01:39:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757685AbcJaBiw (ORCPT ); Sun, 30 Oct 2016 21:38:52 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:32935 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757653AbcJaBhQ (ORCPT ); Sun, 30 Oct 2016 21:37:16 -0400 Received: by mail-pf0-f196.google.com with SMTP id a136so3896992pfa.0; Sun, 30 Oct 2016 18:37:15 -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=LR3sbTRJ+5LSQfScOdVKKSm7O0Q2y9IZBcZPxGXayec=; b=oukdFkWF1tH3t1fNhhk9LoTQc1eJwd5457A3bQir/J0jeD7rVGN3Zpg8Mr93Nw8f/4 TMS5yKv0PZoiI+XJrcht0aulSQhM9wVNAnzA8CjWYoHGzJ2Dp+KKeMs/5xFZ3y3ws+La Dd163Lou2z9R/eUaqiSVW0+Mj9L1ML6EOpDbaeJ1R2+ge6Q2lmA00BNA9M1Tc9VEVfWB laDKDC6dT33ZZUaJMQIcxC4Yu8a+3QRX8ceqzPkE9EJ4g2Hcj9kUJmxOMslmDYwdI2wl XCSkY31uAgpVN9F7HOOmdTw1e9hcskoDYXle62yqpitM9iWzpvzcXRVFbITJcE8bUcEY MFEA== 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=LR3sbTRJ+5LSQfScOdVKKSm7O0Q2y9IZBcZPxGXayec=; b=Od5FNU2dWMHLlGvsY7sNtVYKPKo3IR7AUbQY+vSQGWwncpyujgThD1wA7M9e9TRfcU GruL6/NuTUYe36McLs5UG4obw/squAai/Tcm7G1Id2UW6q/uTbbF4S9OTVmNCssa8Byd N/Xxa7kT87CKTs+TvabTS3ZtuFP1mEqqLi8txIjff02Pt1Z78GZOQbhG3wphfqySq97s tlpJqu252PqFrDw/kZsEZmL0bPfxhuVuMVkhrM+mAqIRlKvbhIkoCRwaoNcP/DYbaVaa AbnNGPeeZrblLHqkLC1tVLJBv+LUQpmWETwxzHgnx++naWinM0tTkbgtYqALaDRehcRs jDPg== X-Gm-Message-State: ABUngveihtRgLAR2LvfxLM7XErp2MwyoT3WKY6hZCUfx/Ym6jjYJ5yOum26O2oY/Fx3UCw== X-Received: by 10.98.34.7 with SMTP id i7mr44529772pfi.145.1477877835303; Sun, 30 Oct 2016 18:37:15 -0700 (PDT) Received: from kernel.kingsoft.cn ([114.255.44.132]) by smtp.gmail.com with ESMTPSA id bz12sm9369804pac.13.2016.10.30.18.37.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 30 Oct 2016 18:37:14 -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 v7 2/2] x86/apic: x2apic write eoi msr notrace Date: Mon, 31 Oct 2016 09:37:02 +0800 Message-Id: <1477877822-4437-3-git-send-email-wanpeng.li@hotmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477877822-4437-1-git-send-email-wanpeng.li@hotmail.com> References: <1477877822-4437-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 Acked-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) +static notrace 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 */