Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp449836ybg; Wed, 23 Oct 2019 00:17:19 -0700 (PDT) X-Google-Smtp-Source: APXvYqzJnXs2EmrVtksDAlBtW82h7NeTEEDvZUkNXKmsHIjsNnp5BfY53KdaIlJnzBQdWQLrOq99 X-Received: by 2002:a17:906:c28c:: with SMTP id r12mr10943236ejz.163.1571815039747; Wed, 23 Oct 2019 00:17:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571815039; cv=none; d=google.com; s=arc-20160816; b=xIJL8BV0OXYrg7tp1TxQkyiyNVGtppVvFOFTRNfl14IrE+SwRfKklRlxQaTEk0wR3o T1+ELnzGR1o0rYavbYcWbyLLFaqBYhXTYORlqS6S5ZBeHaDiiWJe8+4E9iA1LNWQzJ3+ cONNUgJH/rLmZAVXlOuuVUqDaH/KGUziVr6RTurxE4AshHOTk0yzstOdYNDmk9wejdoG SwcP7ksYm/cwZWmXuQx126PFFpCoeJ16PeMk++4+9lQr6+2nkfOHksim+g74bVp91ynl sXk5CTs1MOwBX5vPeae3DT0H7SdgfnDce51oL0YUG8AUxELLz+biIpEw85yUvUwQ7k6c 1sMQ== 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 :content-language:in-reply-to:mime-version:user-agent:date :message-id:organization:references:cc:to:from:subject; bh=tj+qvzQJ5kAVkAukVOhoj7OR061001iwA9BRBQJsGgo=; b=cduYJmAWyg0DoNSmHiUOaG6D7cAJn23n/0aCZbHHoLNPh9Y2piSkCIRdT4b6Qkaeh4 FR82l01LHAFdqZBWyFJ4RdHLOVjR0A2wpbD9w2OjYW3xILKJ/TEMzrCymlEjTyxGmrYL z9rQ0Q12wJwbqpMaN+1vMP524GTUoOxrnEB8y7kZidXBo5VWHoH18UyjGv6zKTHN9UY5 NclH/481s+3jp1dMpV0V45baDyOa7FxMuzvHzrC9ZkR3HmxRpS9RHRJPPSfwUVXLlXG8 tSljx2NH1Lo47AQWgHY0Wk9zzJVtNghUf8Yvch0jLvCVV1o6Kj1bsItqul0vN2YzA/dI okGw== ARC-Authentication-Results: i=1; mx.google.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d6si6864109ede.119.2019.10.23.00.16.56; Wed, 23 Oct 2019 00:17: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; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389812AbfJWHNA (ORCPT + 99 others); Wed, 23 Oct 2019 03:13:00 -0400 Received: from mga12.intel.com ([192.55.52.136]:5193 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732481AbfJWHNA (ORCPT ); Wed, 23 Oct 2019 03:13:00 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Oct 2019 00:13:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,219,1569308400"; d="scan'208";a="372790689" Received: from linux.intel.com ([10.54.29.200]) by orsmga005.jf.intel.com with ESMTP; 23 Oct 2019 00:12:59 -0700 Received: from [10.249.230.188] (abudanko-mobl.ccr.corp.intel.com [10.249.230.188]) by linux.intel.com (Postfix) with ESMTP id 3557B58048F; Wed, 23 Oct 2019 00:12:55 -0700 (PDT) Subject: [PATCH v5 3/4] perf/x86/intel: implement LBR callstacks context synchronization From: Alexey Budankov To: Peter Zijlstra Cc: Arnaldo Carvalho de Melo , Ingo Molnar , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Andi Kleen , Kan Liang , Stephane Eranian , Ian Rogers , Song Liu , linux-kernel References: Organization: Intel Corp. Message-ID: <261ac742-9022-c3f4-5885-1eae7415b091@linux.intel.com> Date: Wed, 23 Oct 2019 10:12:54 +0300 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Implement intel_pmu_lbr_swap_task_ctx() method updating counters of the events that requested LBR callstack data on a sample. The counter can be zero for the case when task context belongs to a thread that has just come from a block on a futex and the context contains saved (lbr_stack_state == LBR_VALID) LBR register values. For the values to be restored at LBR registers on the next thread's switch-in event it swaps the counter value with the one that is expected to be non zero at the previous equivalent task perf event context. Swap operation type ensures the previous task perf event context stays consistent with the amount of events that requested LBR callstack data on a sample. Signed-off-by: Alexey Budankov --- arch/x86/events/intel/lbr.c | 23 +++++++++++++++++++++++ arch/x86/events/perf_event.h | 3 +++ 2 files changed, 26 insertions(+) diff --git a/arch/x86/events/intel/lbr.c b/arch/x86/events/intel/lbr.c index ea54634eabf3..534c76606049 100644 --- a/arch/x86/events/intel/lbr.c +++ b/arch/x86/events/intel/lbr.c @@ -417,6 +417,29 @@ static void __intel_pmu_lbr_save(struct x86_perf_task_context *task_ctx) cpuc->last_log_id = ++task_ctx->log_id; } +void intel_pmu_lbr_swap_task_ctx(struct perf_event_context *prev, + struct perf_event_context *next) +{ + struct x86_perf_task_context *prev_ctx_data, *next_ctx_data; + + swap(prev->task_ctx_data, next->task_ctx_data); + + /* + * Architecture specific synchronization makes sense in + * case both prev->task_ctx_data and next->task_ctx_data + * pointers are allocated. + */ + + prev_ctx_data = next->task_ctx_data; + next_ctx_data = prev->task_ctx_data; + + if (!prev_ctx_data || !next_ctx_data) + return; + + swap(prev_ctx_data->lbr_callstack_users, + next_ctx_data->lbr_callstack_users); +} + void intel_pmu_lbr_sched_task(struct perf_event_context *ctx, bool sched_in) { struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h index 5384317eaa16..930611db8f9a 100644 --- a/arch/x86/events/perf_event.h +++ b/arch/x86/events/perf_event.h @@ -1024,6 +1024,9 @@ void intel_pmu_store_pebs_lbrs(struct pebs_lbr *lbr); void intel_ds_init(void); +void intel_pmu_lbr_swap_task_ctx(struct perf_event_context *prev, + struct perf_event_context *next); + void intel_pmu_lbr_sched_task(struct perf_event_context *ctx, bool sched_in); u64 lbr_from_signext_quirk_wr(u64 val); -- 2.20.1