Received: by 10.223.176.5 with SMTP id f5csp950710wra; Tue, 6 Feb 2018 10:00:13 -0800 (PST) X-Google-Smtp-Source: AH8x226V5jNZNz3Zxoc/9nO1tk0JJeAKIKW+7iHwyuzP+WODLjEB7OK5XuzmwDb4qcYXlKNWK7z5 X-Received: by 2002:a17:902:2803:: with SMTP id e3-v6mr3140797plb.447.1517940013536; Tue, 06 Feb 2018 10:00:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517940013; cv=none; d=google.com; s=arc-20160816; b=hSIABYU1/DwKyfKO0hsQK8HKxHH/rB75n4WURJh6v8j41Ec9YLuaL014wvcEOI9xu0 8B60SBzp2eCaJtm/7KwsnWs00rTfRiv7McRnwIDFQUePTpPc3bpVvSiVzgpWGINyzr3I dfW4bVzGz5mIANv7PeD0MvIsS8tT9mGJ4lRb804y3QHWSk5clTUYDyGnEjNHQVKUjptz XwWZ1OrIk3B5T6DEOdxTtIBK6WrgQVB5zcEglGA4+eFZT1XwcYpNeUTcYk6UhoMTpM2+ 7pNn5pG2nl3axz0DpQHKuseMmI1Zx5w8Vew5G0e/xIyt1ZnqIJ2qZdHIlkOffbjE44LS TiXA== 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:from:references:cc:to:subject:arc-authentication-results; bh=n75JK1ESAhtbl+Ax7NrD8GeBK4brB/3zWOT/blURSK8=; b=VcG0UE8AmSjqIqXa0JI+42TSPiFLyQoeQ9G51jlP2ir1e3nCNOL0+elbVyysSd2+Mb yyz+fMEkDtMLJ6V4f5aWH8jGaHr2CRXiz5xqvpYrIREkUINy2NZi89hCM3veAi2lEB6K p02Ejxgf/Mx6sgmqeUw3DyLH0gdc/1T++O+p4uCDYNM52aYXCxStfV137h+L1BsEfPZw UY4LhzsXZynW2ojb9Y21mK8XGAN507WCtiUPkB7Tv9PVeODP5DD+4xBK0AjnLH+1o40q fKRZFZSVl3OCQFHAPbgp+P7q0kUKrM4I5sTWIzbB8qnpNXe0Nu645B3qpAdyzl3TD/UB 3eRA== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r81si2011196pfi.239.2018.02.06.09.59.59; Tue, 06 Feb 2018 10:00:13 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753105AbeBFR6t (ORCPT + 99 others); Tue, 6 Feb 2018 12:58:49 -0500 Received: from mga07.intel.com ([134.134.136.100]:32852 "EHLO mga07.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752736AbeBFR62 (ORCPT ); Tue, 6 Feb 2018 12:58:28 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Feb 2018 09:58:27 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,469,1511856000"; d="scan'208";a="27802179" Received: from linux.intel.com ([10.54.29.200]) by fmsmga004.fm.intel.com with ESMTP; 06 Feb 2018 09:58:26 -0800 Received: from [10.254.71.86] (kliang2-mobl1.ccr.corp.intel.com [10.254.71.86]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by linux.intel.com (Postfix) with ESMTPS id 19ACA5801E1; Tue, 6 Feb 2018 09:58:25 -0800 (PST) Subject: Re: [PATCH V3 1/5] perf/x86/intel: fix event update for auto-reload To: Peter Zijlstra Cc: mingo@redhat.com, linux-kernel@vger.kernel.org, acme@kernel.org, tglx@linutronix.de, jolsa@redhat.com, eranian@google.com, ak@linux.intel.com References: <1517243373-355481-1-git-send-email-kan.liang@linux.intel.com> <1517243373-355481-2-git-send-email-kan.liang@linux.intel.com> <20180206150648.GK2249@hirez.programming.kicks-ass.net> From: "Liang, Kan" Message-ID: Date: Tue, 6 Feb 2018 12:58:23 -0500 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180206150648.GK2249@hirez.programming.kicks-ass.net> Content-Type: text/plain; charset=utf-8; format=flowed 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 > With the exception of handling 'empty' buffers, I ended up with the > below. Please try again. > There are two small errors. After fixing them, the patch works well. > --- > --- a/arch/x86/events/core.c > +++ b/arch/x86/events/core.c > @@ -1156,16 +1156,13 @@ int x86_perf_event_set_period(struct per > > per_cpu(pmc_prev_left[idx], smp_processor_id()) = left; > > - if (!(hwc->flags & PERF_X86_EVENT_AUTO_RELOAD) || > - local64_read(&hwc->prev_count) != (u64)-left) { > - /* > - * The hw event starts counting from this event offset, > - * mark it to be able to extra future deltas: > - */ > - local64_set(&hwc->prev_count, (u64)-left); > + /* > + * The hw event starts counting from this event offset, > + * mark it to be able to extra future deltas: > + */ > + local64_set(&hwc->prev_count, (u64)-left); > > - wrmsrl(hwc->event_base, (u64)(-left) & x86_pmu.cntval_mask); > - } > + wrmsrl(hwc->event_base, (u64)(-left) & x86_pmu.cntval_mask); > > /* > * Due to erratum on certan cpu we need > --- a/arch/x86/events/intel/ds.c > +++ b/arch/x86/events/intel/ds.c > @@ -1306,17 +1306,89 @@ get_next_pebs_record_by_bit(void *base, > return NULL; > } > > +/* > + * Special variant of intel_pmu_save_and_restart() for auto-reload. > + */ > +static int > +intel_pmu_save_and_restart_reload(struct perf_event *event, int count) > +{ > + struct hw_perf_event *hwc = &event->hw; > + int shift = 64 - x86_pmu.cntval_bits; > + u64 period = hwc->sample_period; > + u64 prev_raw_count, new_raw_count; > + u64 delta; > + > + WARN_ON(!period); > + > + /* > + * drain_pebs() only happens when the PMU is disabled. > + */ > + WARN_ON(this_cpu_read(cpu_hw_events.enabled)); > + > + prev_raw_count = local64_read(&hwc->prev_count); > + rdpmcl(hwc->event_base_rdpmc, new_raw_count); > + local64_set(&hwx->prev_count, new_raw_count); Here is a typo. It should be &hwc->prev_count. > + > + /* > + * Careful, not all hw sign-extends above the physical width > + * of the counter. > + */ > + delta = (new_raw_count << shift) - (prev_raw_count << shift); > + delta >>= shift; new_raw_count could be smaller than prev_raw_count. The sign bit will be set. The delta>> could be wrong. I think we can add a period here to prevent it. + delta = (period << shift) + (new_raw_count << shift) - + (prev_raw_count << shift); + delta >>= shift; ...... + local64_add(delta + period * (count - 1), &event->count); Thanks, Kan > + > + /* > + * Since the counter increments a negative counter value and > + * overflows on the sign switch, giving the interval: > + * > + * [-period, 0] > + * > + * the difference between two consequtive reads is: > + * > + * A) value2 - value1; > + * when no overflows have happened in between, > + * > + * B) (0 - value1) + (value2 - (-period)); > + * when one overflow happened in between, > + * > + * C) (0 - value1) + (n - 1) * (period) + (value2 - (-period)); > + * when @n overflows happened in between. > + * > + * Here A) is the obvious difference, B) is the extention to the > + * discrete interval, where the first term is to the top of the > + * interval and the second term is from the bottom of the next > + * interval and 3) the extention to multiple intervals, where the > + * middle term is the whole intervals covered. > + * > + * An equivalent of C, by reduction, is: > + * > + * value2 - value1 + n * period > + */ > + local64_add(delta + period * count, &event->count); > + > + perf_event_update_userpage(event); > + > + return 0; > +} > + > static void __intel_pmu_pebs_event(struct perf_event *event, > struct pt_regs *iregs, > void *base, void *top, > int bit, int count) > { > + struct hw_perf_event *hwc = &event->hw; > struct perf_sample_data data; > struct pt_regs regs; > void *at = get_next_pebs_record_by_bit(base, top, bit); > > - if (!intel_pmu_save_and_restart(event) && > - !(event->hw.flags & PERF_X86_EVENT_AUTO_RELOAD)) > + if (hwc->flags & PERF_X86_EVENT_AUTO_RELOAD) { > + /* > + * Now, auto-reload is only enabled in fixed period mode. > + * The reload value is always hwc->sample_period. > + * May need to change it, if auto-reload is enabled in > + * freq mode later. > + */ > + intel_pmu_save_and_restart_reload(event, count); > + } else if (!intel_pmu_save_and_restart(event)) > return; > > while (count > 1) { >