Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752722AbdHDMfu (ORCPT ); Fri, 4 Aug 2017 08:35:50 -0400 Received: from merlin.infradead.org ([205.233.59.134]:51222 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752522AbdHDMfs (ORCPT ); Fri, 4 Aug 2017 08:35:48 -0400 Date: Fri, 4 Aug 2017 14:35:34 +0200 From: Peter Zijlstra To: Alexey Budankov Cc: Ingo Molnar , Arnaldo Carvalho de Melo , Alexander Shishkin , Andi Kleen , Kan Liang , Dmitri Prokhorov , Valery Cherepennikov , Mark Rutland , Stephane Eranian , David Carrillo-Cisneros , linux-kernel Subject: Re: [PATCH v6 2/3]: perf/core: use context tstamp_data for skipped events on mux interrupt Message-ID: <20170804123534.bcej4vblurz3stqb@hirez.programming.kicks-ass.net> References: <96c7776f-1f17-a39e-23e9-658596216d6b@linux.intel.com> <20170803150052.za2vofyqfgarukdr@hirez.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170609 (1.8.3) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1996 Lines: 75 On Thu, Aug 03, 2017 at 09:47:56PM +0300, Alexey Budankov wrote: > On 03.08.2017 18:00, Peter Zijlstra wrote: > > Are the magic spots, right? And I'm not convinced its right. > > > > Suppose I have two events in my context, and I created them 1 minute > > apart. Then their respective tstamp_enabled are 1 minute apart as well. > > But the above doesn't seem to preserve that difference. > > > > A similar argument can be made for running I think. That is a per event > > value and cannot be passed along to the ctx and back. > > Aww, I see your point and it challenges my initial assumptions. > Let me think thru the case more. There must be some solution. Thanks! So the sensible thing is probably to rewrite the entire time tracking to make more sense. OTOH that's also the riskiest. Something like: __update_state_and_time(event, new_state) { u64 delta, now = perf_event_time(event); int old_state = event->state; event->tstamp = now; event->state = new_state; delta = now - event->tstamp; switch (state) { case STATE_ACTIVE: WARN_ON_ONCE(old_state != STATE_INACTIVE); event->total_time_enabled += delta; break; case STATE_INACTIVE: switch (old_state) { case STATE_OFF: /* ignore the OFF -> INACTIVE period */ break; case STATE_ACTIVE: event->total_time_enabled += delta; event->total_time_running += delta; break; default: WARN_ONCE(); } break; case STATE_OFF: WARN_ON_ONCE(old_state != STATE_INACTIVE) event->total_time_enabled += delta; break; } } __read_curent_times(event, u64 *enabled, u64 *running) { u64 delta, now = perf_event_time(event); delta = now - event->tstamp; *enabled = event->total_time_enabled; if (event->state >= STATE_INACTIVE) *enabled += delta; *running = event->total_time_running if (event->state == STATE_ACTIVE) *running += delta; } perhaps? That instantly solves the problem I think, because now we don't need to update inactive events. But maybe I missed some, could you verify?