Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp576626pxj; Fri, 28 May 2021 10:17:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxCrhsQtDIHmLU8UPT/XTrZEenUSw5siqiLFOxMk4Xsm+ybqU2MNLHMY9hn4asT6yQ+KL4t X-Received: by 2002:a50:cc0c:: with SMTP id m12mr11100831edi.141.1622222267298; Fri, 28 May 2021 10:17:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622222267; cv=none; d=google.com; s=arc-20160816; b=zDMSBiRiKPq0VUp4zPnGNYvhojAtOx8OfdS+MTT+oL/+2jHdRu5QGCl++miTFLZ2qC 56/UFZlEhKk3nv+0Fda7c05mlifv2cWcF3lakKrOKw9eG8JGAmFkosJC4GPhs8f3RP97 ZImfebOWH6jubJxwSqgOY5qX4icEjgYc77u8IvPcsvIoB9CYBOljbRfEglbgHNhpyGFt nWMHIX9zkIfJtn0krggcVTynSau+wJ1t5NOi1hCIXoyeteWptUKNLmKK+BW1iAf1wJQ1 3/skRauJWAAlp2WWywrve/hhHbRoPTumyDetLpzLVi+/sWam2Db8QTS5q+85rDJxL1D4 4IKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=y/uR6UFjy823T9h1mlTve3racnPLNFNFuE+dPsqOMg0=; b=sHo2GAQKeV1PJ/QPFq7d/AuSxSIdikWdBlGMXbPo3U2ETzEzH/PBl85nECh7Shj4uy FuXe+YTtSE93dKskQQAgzf9r7s2qeJs+hPt1zL8A6FTs5CDB5MJaMk/idp1SopcMp8GS 4adHtn5k3op1Mg1e6diI8uXorr4k//QoiEj2YdGiBlIexLkc6I1P875wUgqf3fWvSQht HM2SLMzH7L3mGx7c2VnIjBJfiSNJ+a4PvUktbgLnXAySgxnYnmAeYl+0kFo3r1iCRW4i XTAzyYU/+ujT3WZoOXFLxvPiBTTkK6BfbFflBMncxpbiN9+ybxPiIa2LFRKvGP9qNtIt Xvsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=rLZdoGDa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id l21si5327835ejn.568.2021.05.28.10.17.18; Fri, 28 May 2021 10:17:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=rLZdoGDa; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236854AbhE1QRz (ORCPT + 99 others); Fri, 28 May 2021 12:17:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57146 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236673AbhE1QRs (ORCPT ); Fri, 28 May 2021 12:17:48 -0400 Received: from mail-pg1-x52f.google.com (mail-pg1-x52f.google.com [IPv6:2607:f8b0:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A4B0C061574 for ; Fri, 28 May 2021 09:16:12 -0700 (PDT) Received: by mail-pg1-x52f.google.com with SMTP id l70so2917762pga.1 for ; Fri, 28 May 2021 09:16:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=y/uR6UFjy823T9h1mlTve3racnPLNFNFuE+dPsqOMg0=; b=rLZdoGDa22YFMNbVWyy1ldrXjbW2JYyYk4cZBwQOu1kGE/UxQM1uuewC52PpIaskGh XH+ueTHtVwVHg53MLkzr6N1ekbvnDY3cgGIN/xQrdHepkPF1L444UxwHfhjjtBnWHG2C S7ItZCkTTAopN1RCOTMAqroGu8bghVgOy9XZOhfyQZvAb5303lv3j+T5xyrN2MqMQwWP g4h6tadBZBpYfohNEwqrzENLTnZ8++xfmQqpx3sk1mtgA4zZWALsjlsp4K+JMZO8c/TP pDU/FMbfoxp1FWCS/Xp90rjkQkeF9yXEQYzE8PFBEMz0ZFcSEiOTZd76U28fZl1JJsdE t5Fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=y/uR6UFjy823T9h1mlTve3racnPLNFNFuE+dPsqOMg0=; b=keMHFMd+RZUmIZBQH7jt7QZwW3K80fDjqVHNQIovHsobtpqw6H0sWjKTjiMLQWEkoK UUMYxKpPKJhG1zvJ0Idg+DWi4FJOd2wAFKqWQkfDo6vxc2iaH6JyWubPRYkLOJaetqnn hz25pSKcZ1F5kxx9g7oxTZBPOz12V/tNpRylgB5kkbsmYfHMYSt8SOEgIu/rqD9Yk7CU 8beMvg3/q1TXQCC+VtWfbktNXkV0TOtuyKjrNxrib2dH80VsCHu26VOVjbxAtY2L8wRi GbxPdJ1oCsjCTu4UdFejxp293vrAaB4OAqtAVk1IhPCwIoL1vwaBOlBPnM0sbct61Ayj vOMg== X-Gm-Message-State: AOAM533JMDrag0EjPV/iyr84E4Ap6fELsHJDK5JzwzU/tli65AqaRaLI Pw8zpzEChe5VK3Uf8r6sJsbu8Q== X-Received: by 2002:a63:d213:: with SMTP id a19mr9803271pgg.28.1622218571827; Fri, 28 May 2021 09:16:11 -0700 (PDT) Received: from localhost ([103.207.71.35]) by smtp.gmail.com with ESMTPSA id k20sm4809997pgl.72.2021.05.28.09.16.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 May 2021 09:16:11 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , Mathieu Poirier , Suzuki K Poulose , Mike Leach , Alexander Shishkin , John Garry , Will Deacon , Peter Zijlstra , Ingo Molnar , Jiri Olsa , Namhyung Kim , Daniel Kiss , Denis Nikitin , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 3/3] perf cs-etm: Remove callback cs_etm_find_snapshot() Date: Sat, 29 May 2021 00:15:52 +0800 Message-Id: <20210528161552.654907-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210528161552.654907-1-leo.yan@linaro.org> References: <20210528161552.654907-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The callback cs_etm_find_snapshot() is invoked for snapshot mode, its main purpose is to find the correct AUX trace data and returns "head" and "old" (we can call "old" as "old head") to the caller, the caller __auxtrace_mmap__read() uses these two pointers to decide the AUX trace data size. cs_etm_find_snapshot() should be removed with below reasons: - The first thing in cs_etm_find_snapshot() is to check if the head has wrapped around, if it is not, directly bails out. The checking is pointless, this is because the "head" and "old" pointers both are monotonical increasing so they never wrap around. - cs_etm_find_snapshot() adjusts the "head" and "old" pointers and assumes the AUX ring buffer is fully filled with the hardware trace data, so it always calculates the difference "mm->len" between "head" and "old". Let's imagine the snapshot is taken in very short interval, the tracers only fill a small chunk of the trace data into the AUX ring buffer, in this case, it's wrongly to copy the whole the AUX ring buffer to perf file. - As the "head" and "old" pointers are monotonically increased, the function __auxtrace_mmap__read() handles these two pointers properly. It calculates the reminders for these two pointers, and the size is clamped to be never more than "snapshot_size". We can simply reply on the function __auxtrace_mmap__read() to calculate the correct result for data copying, it's not necessary to add Arm CoreSight specific callback. Signed-off-by: Leo Yan --- tools/perf/arch/arm/util/cs-etm.c | 133 ------------------------------ 1 file changed, 133 deletions(-) diff --git a/tools/perf/arch/arm/util/cs-etm.c b/tools/perf/arch/arm/util/cs-etm.c index d942f118d32c..85168d87b2d7 100644 --- a/tools/perf/arch/arm/util/cs-etm.c +++ b/tools/perf/arch/arm/util/cs-etm.c @@ -38,8 +38,6 @@ struct cs_etm_recording { struct auxtrace_record itr; struct perf_pmu *cs_etm_pmu; struct evlist *evlist; - int wrapped_cnt; - bool *wrapped; bool snapshot_mode; size_t snapshot_size; }; @@ -734,135 +732,6 @@ static int cs_etm_info_fill(struct auxtrace_record *itr, return 0; } -static int cs_etm_alloc_wrapped_array(struct cs_etm_recording *ptr, int idx) -{ - bool *wrapped; - int cnt = ptr->wrapped_cnt; - - /* Make @ptr->wrapped as big as @idx */ - while (cnt <= idx) - cnt++; - - /* - * Free'ed in cs_etm_recording_free(). Using realloc() to avoid - * cross compilation problems where the host's system supports - * reallocarray() but not the target. - */ - wrapped = realloc(ptr->wrapped, cnt * sizeof(bool)); - if (!wrapped) - return -ENOMEM; - - wrapped[cnt - 1] = false; - ptr->wrapped_cnt = cnt; - ptr->wrapped = wrapped; - - return 0; -} - -static bool cs_etm_buffer_has_wrapped(unsigned char *buffer, - size_t buffer_size, u64 head) -{ - u64 i, watermark; - u64 *buf = (u64 *)buffer; - size_t buf_size = buffer_size; - - /* - * We want to look the very last 512 byte (chosen arbitrarily) in - * the ring buffer. - */ - watermark = buf_size - 512; - - /* - * @head is continuously increasing - if its value is equal or greater - * than the size of the ring buffer, it has wrapped around. - */ - if (head >= buffer_size) - return true; - - /* - * The value of @head is somewhere within the size of the ring buffer. - * This can be that there hasn't been enough data to fill the ring - * buffer yet or the trace time was so long that @head has numerically - * wrapped around. To find we need to check if we have data at the very - * end of the ring buffer. We can reliably do this because mmap'ed - * pages are zeroed out and there is a fresh mapping with every new - * session. - */ - - /* @head is less than 512 byte from the end of the ring buffer */ - if (head > watermark) - watermark = head; - - /* - * Speed things up by using 64 bit transactions (see "u64 *buf" above) - */ - watermark >>= 3; - buf_size >>= 3; - - /* - * If we find trace data at the end of the ring buffer, @head has - * been there and has numerically wrapped around at least once. - */ - for (i = watermark; i < buf_size; i++) - if (buf[i]) - return true; - - return false; -} - -static int cs_etm_find_snapshot(struct auxtrace_record *itr, - int idx, struct auxtrace_mmap *mm, - unsigned char *data, - u64 *head, u64 *old) -{ - int err; - bool wrapped; - struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); - - /* - * Allocate memory to keep track of wrapping if this is the first - * time we deal with this *mm. - */ - if (idx >= ptr->wrapped_cnt) { - err = cs_etm_alloc_wrapped_array(ptr, idx); - if (err) - return err; - } - - /* - * Check to see if *head has wrapped around. If it hasn't only the - * amount of data between *head and *old is snapshot'ed to avoid - * bloating the perf.data file with zeros. But as soon as *head has - * wrapped around the entire size of the AUX ring buffer it taken. - */ - wrapped = ptr->wrapped[idx]; - if (!wrapped && cs_etm_buffer_has_wrapped(data, mm->len, *head)) { - wrapped = true; - ptr->wrapped[idx] = true; - } - - pr_debug3("%s: mmap index %d old head %zu new head %zu size %zu\n", - __func__, idx, (size_t)*old, (size_t)*head, mm->len); - - /* No wrap has occurred, we can just use *head and *old. */ - if (!wrapped) - return 0; - - /* - * *head has wrapped around - adjust *head and *old to pickup the - * entire content of the AUX buffer. - */ - if (*head >= mm->len) { - *old = *head - mm->len; - } else { - *head += mm->len; - *old = *head - mm->len; - } - - return 0; -} - static int cs_etm_snapshot_start(struct auxtrace_record *itr) { struct cs_etm_recording *ptr = @@ -900,7 +769,6 @@ static void cs_etm_recording_free(struct auxtrace_record *itr) struct cs_etm_recording *ptr = container_of(itr, struct cs_etm_recording, itr); - zfree(&ptr->wrapped); free(ptr); } @@ -928,7 +796,6 @@ struct auxtrace_record *cs_etm_record_init(int *err) ptr->itr.recording_options = cs_etm_recording_options; ptr->itr.info_priv_size = cs_etm_info_priv_size; ptr->itr.info_fill = cs_etm_info_fill; - ptr->itr.find_snapshot = cs_etm_find_snapshot; ptr->itr.snapshot_start = cs_etm_snapshot_start; ptr->itr.snapshot_finish = cs_etm_snapshot_finish; ptr->itr.reference = cs_etm_reference; -- 2.25.1