Received: by 2002:a25:86ce:0:0:0:0:0 with SMTP id y14csp2183492ybm; Thu, 23 May 2019 12:44:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqxK4MuNVFcXRB3u0F++LF1nqmGnThE1eWUMj+LKazZ5w8XDNuY4wn2CNuyZ3uUCDKI30IlI X-Received: by 2002:a63:ff0f:: with SMTP id k15mr98658020pgi.407.1558640659704; Thu, 23 May 2019 12:44:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558640659; cv=none; d=google.com; s=arc-20160816; b=StQqgwLsjEjG0nVVPvkeNL+IqF7l02h2kgsUgEn71Qe7kZEKD9kIhbd6JWAqrkTyUh huUWmXOWUZmalFideRLqYuj2Y4+dcuexzi6e7aPcMVQm34GbAuL/two/GHToqanalrrH bnDYFQO2QzmJTv/LrlCbyu1X+s+3AUaNxhAHnznKes891kensNdiyHsB1xxSevjjG7gw uUj1BCyd00fBR9YRJnUeQ5Lm8RcI+xUm4nGacORRdFPKLCWzzdQEfvkCinOCCITHUSel mRnmWNigyN8Y8C3HLIIV4bspTlP/xTfrLWgqlq0KgaqHdgmPkQTWWxCsUsr+r9vX/GS/ HCxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=JjhvJe0CFCu6FVeW5/S/N85/yHkDQ8ol3aqVKFAI144=; b=yQNV8I/8lw9Y12bUTmw4pvOhJl/3w+VnVfFJlUakeYJWs/JYYpOcQHup4TAie4zXsS vfyWXi9Je37JQbxSC+UFf/d/je3JTP8Il/MC29ADdOfj1sI37KyKZeyuWF1vfNXpwASd 9nVVPpDGMVSa9AtFrJbhpqzDADlEVjEnmJ+qs+RyE/ZMFkdN5h/jQL+KOD2tI4IBtyel SqB+T7ctZXAQzkYNmlikPxxUcdtiXlslFW+VgF1DwReHc8Tji6ZEbG3A1i0XIWN6e4tk tuoprwr7AUyu5eEcllwIsEVjwKAGvM7GWE7hQzEuWk6eevre1iEf36mgfCeN7Fzix6w6 L6Mg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=VtsI00ZT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d4si463412plr.297.2019.05.23.12.44.04; Thu, 23 May 2019 12:44:19 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=VtsI00ZT; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389775AbfEWTTS (ORCPT + 99 others); Thu, 23 May 2019 15:19:18 -0400 Received: from mail.kernel.org ([198.145.29.99]:55184 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388977AbfEWTTQ (ORCPT ); Thu, 23 May 2019 15:19:16 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6AC722133D; Thu, 23 May 2019 19:19:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558639155; bh=bRb71DgIwaKU9E1FlAcEhiJKsv7N3o3aG9uJBnOiaik=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=VtsI00ZTJkcF/sT5KrRbHbBGbxUnmY4VFMMPIdGBde/sEb0PRucnOmSSeUGFQUcc0 FiM47npwyjoSwnyY6IRvD18+PewZD2ZoLdrNh7mZdXgsk0isWL/hf9mL6oL1DRn5bF skz5NNVqTmmq4n9CWqYzP0kDHVYRkapVeZ4YkqtU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jiri Olsa , Alexander Shishkin , Arnaldo Carvalho de Melo , David Arcari , Jiri Olsa , Lendacky Thomas , Linus Torvalds , Peter Zijlstra , Stephane Eranian , Thomas Gleixner , Vince Weaver , Ingo Molnar , Sasha Levin Subject: [PATCH 4.19 107/114] perf/x86/intel: Fix race in intel_pmu_disable_event() Date: Thu, 23 May 2019 21:06:46 +0200 Message-Id: <20190523181740.591800976@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190523181731.372074275@linuxfoundation.org> References: <20190523181731.372074275@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [ Upstream commit 6f55967ad9d9752813e36de6d5fdbd19741adfc7 ] New race in x86_pmu_stop() was introduced by replacing the atomic __test_and_clear_bit() of cpuc->active_mask by separate test_bit() and __clear_bit() calls in the following commit: 3966c3feca3f ("x86/perf/amd: Remove need to check "running" bit in NMI handler") The race causes panic for PEBS events with enabled callchains: BUG: unable to handle kernel NULL pointer dereference at 0000000000000000 ... RIP: 0010:perf_prepare_sample+0x8c/0x530 Call Trace: perf_event_output_forward+0x2a/0x80 __perf_event_overflow+0x51/0xe0 handle_pmi_common+0x19e/0x240 intel_pmu_handle_irq+0xad/0x170 perf_event_nmi_handler+0x2e/0x50 nmi_handle+0x69/0x110 default_do_nmi+0x3e/0x100 do_nmi+0x11a/0x180 end_repeat_nmi+0x16/0x1a RIP: 0010:native_write_msr+0x6/0x20 ... intel_pmu_disable_event+0x98/0xf0 x86_pmu_stop+0x6e/0xb0 x86_pmu_del+0x46/0x140 event_sched_out.isra.97+0x7e/0x160 ... The event is configured to make samples from PEBS drain code, but when it's disabled, we'll go through NMI path instead, where data->callchain will not get allocated and we'll crash: x86_pmu_stop test_bit(hwc->idx, cpuc->active_mask) intel_pmu_disable_event(event) { ... intel_pmu_pebs_disable(event); ... EVENT OVERFLOW -> intel_pmu_handle_irq handle_pmi_common TEST PASSES -> test_bit(bit, cpuc->active_mask)) perf_event_overflow perf_prepare_sample { ... if (!(sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY)) data->callchain = perf_callchain(event, regs); CRASH -> size += data->callchain->nr; } ... x86_pmu_disable_event(event) } __clear_bit(hwc->idx, cpuc->active_mask); Fixing this by disabling the event itself before setting off the PEBS bit. Signed-off-by: Jiri Olsa Cc: Alexander Shishkin Cc: Arnaldo Carvalho de Melo Cc: David Arcari Cc: Jiri Olsa Cc: Lendacky Thomas Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Stephane Eranian Cc: Thomas Gleixner Cc: Vince Weaver Fixes: 3966c3feca3f ("x86/perf/amd: Remove need to check "running" bit in NMI handler") Link: http://lkml.kernel.org/r/20190504151556.31031-1-jolsa@kernel.org Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin --- arch/x86/events/intel/core.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index a759e59990fbd..09c53bcbd497d 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -2074,15 +2074,19 @@ static void intel_pmu_disable_event(struct perf_event *event) cpuc->intel_ctrl_host_mask &= ~(1ull << hwc->idx); cpuc->intel_cp_status &= ~(1ull << hwc->idx); - if (unlikely(event->attr.precise_ip)) - intel_pmu_pebs_disable(event); - if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) { intel_pmu_disable_fixed(hwc); return; } x86_pmu_disable_event(event); + + /* + * Needs to be called after x86_pmu_disable_event, + * so we don't trigger the event without PEBS bit set. + */ + if (unlikely(event->attr.precise_ip)) + intel_pmu_pebs_disable(event); } static void intel_pmu_del_event(struct perf_event *event) -- 2.20.1