From patchwork Tue Apr 6 04:19:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 12184139 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id F11D6C433B4 for ; Tue, 6 Apr 2021 04:20:06 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D483F613BC for ; Tue, 6 Apr 2021 04:20:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230090AbhDFEUN (ORCPT ); Tue, 6 Apr 2021 00:20:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51082 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233976AbhDFEUM (ORCPT ); Tue, 6 Apr 2021 00:20:12 -0400 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8BADCC06174A for ; Mon, 5 Apr 2021 21:20:05 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id i18so9199426wrm.5 for ; Mon, 05 Apr 2021 21:20:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iiC305vJEinBdTvxLqzXIsV0JmvXpG4EZ/R99DKfFpE=; b=ANkq0HdXIq8h+Tqn6TJepDi91bVvj+BrJUCaLLelAs+E95aJBhOb4S7MzFfuxAoINw 4iNmtMKWynAyRr9aT94jmTnzQMjpXkhW5fup9rLwRnhP+HKCnmwI6XLl13T6TurCMDDF v4W7OS+EXdbbjpTFCJxRJw7GBT1oltH5z21my+nVb8M373Ck2UUBAP4CvusYDjuFUUq4 tg2kvUk9DApBexoTj3BdNdDQyciw8Xe21qNfn68doQdHyC/uojf7/zJ9JBYAyHTI/8KY sJXZRojhyn6CRRy++DZXdMwHsfBblQsfSvR26Kne6ZnnzuaejWce4X+H8VCpytCmMZ0C 6V8w== 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=iiC305vJEinBdTvxLqzXIsV0JmvXpG4EZ/R99DKfFpE=; b=HnDFglAGudH8B97UN/AzIiNo4HrSUS3+icMAm3POcFwWYifADpKTPv6P+xcE4X4nEt C8LqwCWMt+3r6M7URoO6QIoreivWQiFnSnJPn/VXzIPtR+pqO22hUwsNWU16CniMi8Qv iw/4RNp0xS6s2hPTqdQQoYuqbGezTEPR/y6O81f6aeCS9cxTrzv3BVqYAkMSmid1pXjE YsvpL2EWzC29Fg56eHmnAqnZbv8u8s1X9w+phxDxa4taouf9a5DH5Q8Sf5+cIkEfLW3U xRiZuirh9G05OJOy3kfbcFdcVTMxZzT9k2WYxVD9TwlYD8NupHbBYrAbOvbsLuFHNJSi sncA== X-Gm-Message-State: AOAM531Yhtsmz8j4mauyrt6Ok8VmubDhIZptNz2RNZcyQT8LHPs/gDfv 81f4dXupo2PVKPeE/w4Alno= X-Google-Smtp-Source: ABdhPJwbD5cWddhTVUV/tZbDb0+YDfQEEQlpdt1NSEssBpNhkjy+QAYRLpiiXu7NXZJoMriWXY6pdg== X-Received: by 2002:a5d:6b86:: with SMTP id n6mr31943969wrx.52.1617682804257; Mon, 05 Apr 2021 21:20:04 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id j23sm1325337wmo.33.2021.04.05.21.20.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Apr 2021 21:20:03 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 1/4] libtracefs: Iterate over raw events in sorted order Date: Tue, 6 Apr 2021 07:19:58 +0300 Message-Id: <20210406042001.912544-2-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210406042001.912544-1-tz.stoyanov@gmail.com> References: <20210406042001.912544-1-tz.stoyanov@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org Changed the logic of tracefs_iterate_raw_events(): instead of iterating in CPU order, walk through the events from all CPU buffers and read the oldest first. Fixed the problem with cpu number in the record, passed to the callback - set the real CPU number instead of 0. Signed-off-by: Tzvetomir Stoyanov (VMware) --- src/tracefs-events.c | 246 +++++++++++++++++++++++++++---------------- 1 file changed, 156 insertions(+), 90 deletions(-) diff --git a/src/tracefs-events.c b/src/tracefs-events.c index 825f916..4095665 100644 --- a/src/tracefs-events.c +++ b/src/tracefs-events.c @@ -51,120 +51,130 @@ page_to_kbuf(struct tep_handle *tep, void *page, int size) return kbuf; } -static int read_kbuf_record(struct kbuffer *kbuf, struct tep_record *record) +struct cpu_iterate { + struct tep_record record; + struct tep_event *event; + struct kbuffer *kbuf; + void *page; + int psize; + int rsize; + int cpu; + int fd; +}; + +static int read_kbuf_record(struct cpu_iterate *cpu) { unsigned long long ts; void *ptr; - ptr = kbuffer_read_event(kbuf, &ts); - if (!ptr || !record) + if (!cpu || !cpu->kbuf) + return -1; + ptr = kbuffer_read_event(cpu->kbuf, &ts); + if (!ptr) return -1; - memset(record, 0, sizeof(*record)); - record->ts = ts; - record->size = kbuffer_event_size(kbuf); - record->record_size = kbuffer_curr_size(kbuf); - record->cpu = 0; - record->data = ptr; - record->ref_count = 1; + memset(&(cpu->record), 0, sizeof(cpu->record)); + cpu->record.ts = ts; + cpu->record.size = kbuffer_event_size(cpu->kbuf); + cpu->record.record_size = kbuffer_curr_size(cpu->kbuf); + cpu->record.cpu = cpu->cpu; + cpu->record.data = ptr; + cpu->record.ref_count = 1; - kbuffer_next_event(kbuf, NULL); + kbuffer_next_event(cpu->kbuf, NULL); return 0; } -static int -get_events_in_page(struct tep_handle *tep, void *page, - int size, int cpu, - int (*callback)(struct tep_event *, - struct tep_record *, - int, void *), - void *callback_context) +int read_next_page(struct tep_handle *tep, struct cpu_iterate *cpu) { - struct tep_record record; - struct tep_event *event; - struct kbuffer *kbuf; - int id, cnt = 0; + cpu->rsize = read(cpu->fd, cpu->page, cpu->psize); + if (cpu->rsize <= 0) + return -1; + + cpu->kbuf = page_to_kbuf(tep, cpu->page, cpu->rsize); + if (!cpu->kbuf) + return -1; + + return 0; +} + +int read_next_record(struct tep_handle *tep, struct cpu_iterate *cpu) +{ + int id; + + do { + while (!read_kbuf_record(cpu)) { + id = tep_data_type(tep, &(cpu->record)); + cpu->event = tep_find_event(tep, id); + if (cpu->event) + return 0; + } + } while (!read_next_page(tep, cpu)); + + return -1; +} + +static int read_cpu_pages(struct tep_handle *tep, struct cpu_iterate *cpus, int count, + int (*callback)(struct tep_event *, + struct tep_record *, + int, void *), + void *callback_context) +{ + bool has_data = false; int ret; + int i, j; - if (size <= 0) - return 0; + for (i = 0; i < count; i++) { + ret = read_next_record(tep, cpus + i); + if (!ret) + has_data = true; + } - kbuf = page_to_kbuf(tep, page, size); - if (!kbuf) - return 0; - - ret = read_kbuf_record(kbuf, &record); - while (!ret) { - id = tep_data_type(tep, &record); - event = tep_find_event(tep, id); - if (event) { - cnt++; + while (has_data) { + j = count; + for (i = 0; i < count; i++) { + if (!cpus[i].event) + continue; + if (j == count || cpus[j].record.ts > cpus[i].record.ts) + j = i; + } + if (j < count) { if (callback && - callback(event, &record, cpu, callback_context)) + callback(cpus[j].event, &(cpus[j].record), cpus[j].cpu, callback_context)) break; + cpus[j].event = NULL; + read_next_record(tep, cpus + j); + } else { + has_data = false; } - ret = read_kbuf_record(kbuf, &record); } - kbuffer_free(kbuf); - - return cnt; + return 0; } -/* - * tracefs_iterate_raw_events - Iterate through events in trace_pipe_raw, - * per CPU trace buffers - * @tep: a handle to the trace event parser context - * @instance: ftrace instance, can be NULL for the top instance - * @cpus: Iterate only through the buffers of CPUs, set in the mask. - * If NULL, iterate through all CPUs. - * @cpu_size: size of @cpus set - * @callback: A user function, called for each record from the file - * @callback_context: A custom context, passed to the user callback function - * - * If the @callback returns non-zero, the iteration stops - in that case all - * records from the current page will be lost from future reads - * - * Returns -1 in case of an error, or 0 otherwise - */ -int tracefs_iterate_raw_events(struct tep_handle *tep, - struct tracefs_instance *instance, - cpu_set_t *cpus, int cpu_size, - int (*callback)(struct tep_event *, - struct tep_record *, - int, void *), - void *callback_context) +static int open_cpu_fies(struct tracefs_instance *instance, cpu_set_t *cpus, + int cpu_size, struct cpu_iterate **all_cpus, int *count) { + struct cpu_iterate *tmp; unsigned int p_size; struct dirent *dent; char file[PATH_MAX]; - void *page = NULL; struct stat st; + int ret = -1; + int fd = -1; char *path; DIR *dir; - int ret; int cpu; - int fd; - int r; + int i = 0; - if (!tep || !callback) - return -1; - - p_size = getpagesize(); path = tracefs_instance_get_file(instance, "per_cpu"); if (!path) return -1; dir = opendir(path); - if (!dir) { - ret = -1; - goto error; - } - page = malloc(p_size); - if (!page) { - ret = -1; - goto error; - } + if (!dir) + goto out; + p_size = getpagesize(); while ((dent = readdir(dir))) { const char *name = dent->d_name; @@ -174,32 +184,88 @@ int tracefs_iterate_raw_events(struct tep_handle *tep, if (cpus && !CPU_ISSET_S(cpu, cpu_size, cpus)) continue; sprintf(file, "%s/%s", path, name); - ret = stat(file, &st); - if (ret < 0 || !S_ISDIR(st.st_mode)) + if (stat(file, &st) < 0 || !S_ISDIR(st.st_mode)) continue; sprintf(file, "%s/%s/trace_pipe_raw", path, name); fd = open(file, O_RDONLY | O_NONBLOCK); if (fd < 0) continue; - do { - r = read(fd, page, p_size); - if (r > 0) - get_events_in_page(tep, page, r, cpu, - callback, callback_context); - } while (r > 0); - close(fd); + tmp = realloc(*all_cpus, (i + 1) * sizeof(struct cpu_iterate)); + if (!tmp) { + close(fd); + goto out; + } + memset(tmp + i, 0, sizeof(struct cpu_iterate)); + tmp[i].fd = fd; + tmp[i].cpu = cpu; + tmp[i].page = malloc(p_size); + tmp[i].psize = p_size; + *all_cpus = tmp; + *count = i + 1; + if (!tmp[i++].page) + goto out; } + ret = 0; -error: +out: if (dir) closedir(dir); - free(page); tracefs_put_tracing_file(path); return ret; } +/* + * tracefs_iterate_raw_events - Iterate through events in trace_pipe_raw, + * per CPU trace buffers + * @tep: a handle to the trace event parser context + * @instance: ftrace instance, can be NULL for the top instance + * @cpus: Iterate only through the buffers of CPUs, set in the mask. + * If NULL, iterate through all CPUs. + * @cpu_size: size of @cpus set + * @callback: A user function, called for each record from the file + * @callback_context: A custom context, passed to the user callback function + * + * If the @callback returns non-zero, the iteration stops - in that case all + * records from the current page will be lost from future reads + * The events are iterated in sorted order, oldest first. + * + * Returns -1 in case of an error, or 0 otherwise + */ +int tracefs_iterate_raw_events(struct tep_handle *tep, + struct tracefs_instance *instance, + cpu_set_t *cpus, int cpu_size, + int (*callback)(struct tep_event *, + struct tep_record *, + int, void *), + void *callback_context) +{ + struct cpu_iterate *all_cpus = NULL; + int count = 0; + int ret; + int i; + + if (!tep || !callback) + return -1; + + ret = open_cpu_fies(instance, cpus, cpu_size, &all_cpus, &count); + if (ret < 0) + goto out; + ret = read_cpu_pages(tep, all_cpus, count, callback, callback_context); + +out: + if (all_cpus) { + for (i = 0; i < count; i++) { + close(all_cpus[i].fd); + free(all_cpus[i].page); + } + free(all_cpus); + } + + return ret; +} + static char **add_list_string(char **list, const char *name, int len) { if (!list) From patchwork Tue Apr 6 04:19:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 12184143 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC988C433B4 for ; Tue, 6 Apr 2021 04:20:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C46CF610E8 for ; Tue, 6 Apr 2021 04:20:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234142AbhDFEUQ (ORCPT ); Tue, 6 Apr 2021 00:20:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51090 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233976AbhDFEUP (ORCPT ); Tue, 6 Apr 2021 00:20:15 -0400 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EEDC1C061574 for ; Mon, 5 Apr 2021 21:20:06 -0700 (PDT) Received: by mail-wr1-x436.google.com with SMTP id j18so12649217wra.2 for ; Mon, 05 Apr 2021 21:20:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=jKf1WZ85dsSSiPEXRaAsFO5Kg/MZ0gSQmPkou2CkCVk=; b=d3i9Fd3Lxa82Iq5vUAFLu7HSp7DGq7G1AwzGnjpbmlrieVowLQVRWn9/RM+J4/9/VY cKBVFbKr4WNzq/0KPfAcMolJ+Nge22oRfzw1UvZU5pHLXY0G9+1obpEA6x+PwjyMzulz P014d8uRU4703LR3Nf+ZMqGtUb2fAijL9Wgf5AYhIhY3puHtUcEJrmGV96AjxSFhdX0o /upcv2hXzw/gTBZkiFZ4ZuGPNCOa/gSX+3KfO3R4QcNArtKiyDie4AlN4m5z0TFyQ14X mk6d7CdZQ7WaPjCCg7z9vn7agRCFoY0YURvzL2IJf0+RorqoKKtMwvEaCFVbdUJfo8GO gBpg== 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=jKf1WZ85dsSSiPEXRaAsFO5Kg/MZ0gSQmPkou2CkCVk=; b=EA6gy74SzRLtQZl6vMah0QyNby5JLSXxFZ/mAbYgvBwDieFAiJ0Ss4NCqZ87b5xx7y +jdWRsrZnsczkOupBLIGDeYr6dcrTecvjJ1FpCHRCM2c1JiCr9ypd3b3PBEd3r9NHpXn En0RNtPBjlruFewDu+by+27C4MS9cX3MPgVIBKFRpcK8rFSuFuwou8JoLZkXkfeuQpd3 Gku6p7CoFI4a0TjiX2KWqs/K8dl83o/OxLC2JGq6iuCueyoQSIOOLsSBx04NKB16hfRZ zXgG/GTT8Fxf5iKotAXA8y4wR6PjasuTQovutGP0iwt71+L1ckEYcO0mzC3BsFVPYZsZ G5lA== X-Gm-Message-State: AOAM530OLY9zc0ilMono+oWbQppUE26K1rUwyxDVpWIgZXYKuBbbyJ2w a28rQjoS1u5zJTcM07AS7dw= X-Google-Smtp-Source: ABdhPJw4IVAfpWK5y12wcdF7vlbKzkQagGExRNpf5WAKiqLJUx+Gffg1bxS2k/hzfceiA2DoN9QQwg== X-Received: by 2002:a05:6000:2a7:: with SMTP id l7mr32234225wry.30.1617682805245; Mon, 05 Apr 2021 21:20:05 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id j23sm1325337wmo.33.2021.04.05.21.20.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Apr 2021 21:20:04 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 2/4] libtracefs: Unit test for iterate over raw events in sorted order Date: Tue, 6 Apr 2021 07:19:59 +0300 Message-Id: <20210406042001.912544-3-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210406042001.912544-1-tz.stoyanov@gmail.com> References: <20210406042001.912544-1-tz.stoyanov@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org Enhanced the unit test of tracefs_iterate_raw_events() API to check if events are iterated in sorted order: latest first. Added a check for the correct CPU number in the record, passed to the callback. Signed-off-by: Tzvetomir Stoyanov (VMware) --- utest/tracefs-utest.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/utest/tracefs-utest.c b/utest/tracefs-utest.c index ed2693b..fea4e1f 100644 --- a/utest/tracefs-utest.c +++ b/utest/tracefs-utest.c @@ -20,7 +20,7 @@ #define TRACEFS_SUITE "trasefs library" #define TEST_INSTANCE_NAME "cunit_test_iter" #define TEST_TRACE_DIR "/tmp/trace_utest.XXXXXX" -#define TEST_ARRAY_SIZE 500 +#define TEST_ARRAY_SIZE 5000 #define ALL_TRACERS "available_tracers" #define CUR_TRACER "current_tracer" @@ -36,6 +36,7 @@ struct test_sample { }; static struct test_sample test_array[TEST_ARRAY_SIZE]; static int test_found; +static unsigned long long last_ts; static int test_callback(struct tep_event *event, struct tep_record *record, int cpu, void *context) @@ -45,8 +46,13 @@ static int test_callback(struct tep_event *event, struct tep_record *record, int *cpu_test = (int *)context; int i; + CU_TEST(last_ts <= record->ts); + last_ts = record->ts; + if (cpu_test && *cpu_test >= 0 && *cpu_test != cpu) return 0; + CU_TEST(cpu == record->cpu); + field = tep_find_field(event, "buf"); if (field) { sample = ((struct test_sample *)(record->data + field->offset)); @@ -136,6 +142,7 @@ static void test_instance_iter_raw_events(struct tracefs_instance *instance) ret = tracefs_iterate_raw_events(NULL, instance, NULL, 0, test_callback, NULL); CU_TEST(ret < 0); + last_ts = 0; ret = tracefs_iterate_raw_events(test_tep, NULL, NULL, 0, test_callback, NULL); CU_TEST(ret == 0); ret = tracefs_iterate_raw_events(test_tep, instance, NULL, 0, NULL, NULL); From patchwork Tue Apr 6 04:20:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 12184141 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD214C43460 for ; Tue, 6 Apr 2021 04:20:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7EDFE613B7 for ; Tue, 6 Apr 2021 04:20:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238819AbhDFEUO (ORCPT ); Tue, 6 Apr 2021 00:20:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51092 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234142AbhDFEUO (ORCPT ); Tue, 6 Apr 2021 00:20:14 -0400 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51588C06174A for ; Mon, 5 Apr 2021 21:20:07 -0700 (PDT) Received: by mail-wr1-x433.google.com with SMTP id f6so6564676wrv.12 for ; Mon, 05 Apr 2021 21:20:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uIyNlIOtluNrnYmSi6DquZO21hCTzvwo0SUqb4QYjNg=; b=Pxhs6rfoYmf4/d76TesXxCEmBuXYowm0qPid1hgyk5Jg+tKcFg9XQrvZyHPQ26KY1d 4KuYnlbZ3RpKtl2DPbSS1DdYZW8ABBrNgOzw4MVWL7YYk/Dj9SWRVWmxnCKoeN0MFtAt YSTI8Q0hCiks4JAdR0IyjKAYI+bEgcpDOBFVzo3/zKyQffrM/OmUZGmLvEAUlON/mRfQ bEvuWp2nHoz/UyyV90+S/llxXErfPRO7diiR7WO5PdEaBYqxwHzas+j1CsVhADO1kzc7 6BGuRllw57A8UNuSOXxP+qtuaHsRGD1J/OpoT5MABugTNm8MgDdLodLY+eFA2LbTtgwI rqOw== 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=uIyNlIOtluNrnYmSi6DquZO21hCTzvwo0SUqb4QYjNg=; b=ka1xaXJLYZnou3Y76xsFKSZDZ8TkwkZ2IeDaqQrZW+P8znS3oNxRm3AwukkBCjShG9 9U8jk3q7G7nT8pwkb+59zHBRBS4ZsJFkZnnYmH84HQ7cfOOfg457kXKIFLEKKyZjy/WL kfdshqyVH4vf+ngMbICyVKRn2evFQJvvS8gDUcoozzKP0kZGnTjp1wOGMWsgBDyhMWW7 zOOLtgY4TqIu+Fh3DdqAQAZT4S8faWoVVnUiUzJ8BD/WA40ulxlwMic+g7xAZjLRV1Iw O/Uc4HWln5nJTKyDx3gO6qGEKI0pjkISF4aUE6IDG6/LyzE1LxJoxJFMx0h7j41507CX phew== X-Gm-Message-State: AOAM530q+EbCLSVzjhr10JDrFnoePFQe9Y5XaRYu8Z5BtcI50Ib4LRN/ AnBmcId+uhYcQdiRtOR5gxg= X-Google-Smtp-Source: ABdhPJxP9IxxueGurOomGFDqDcDRw8lwWUXk1qXsOAbCg3VoSgIw9Zn/S4EvlH60XUEQtv+LrSf5uA== X-Received: by 2002:adf:f908:: with SMTP id b8mr31551643wrr.184.1617682806128; Mon, 05 Apr 2021 21:20:06 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id j23sm1325337wmo.33.2021.04.05.21.20.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Apr 2021 21:20:05 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 3/4] libtracefs: Unit test for iterate over raw events in selected CPUs Date: Tue, 6 Apr 2021 07:20:00 +0300 Message-Id: <20210406042001.912544-4-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210406042001.912544-1-tz.stoyanov@gmail.com> References: <20210406042001.912544-1-tz.stoyanov@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org Enhanced the unit test of tracefs_iterate_raw_events() API to walk through the selected CPUs only. Added some forgotten calls to CPU_FREE() for freeing used CPU sets. Signed-off-by: Tzvetomir Stoyanov (VMware) --- utest/tracefs-utest.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/utest/tracefs-utest.c b/utest/tracefs-utest.c index fea4e1f..f9441af 100644 --- a/utest/tracefs-utest.c +++ b/utest/tracefs-utest.c @@ -49,8 +49,9 @@ static int test_callback(struct tep_event *event, struct tep_record *record, CU_TEST(last_ts <= record->ts); last_ts = record->ts; - if (cpu_test && *cpu_test >= 0 && *cpu_test != cpu) - return 0; + if (cpu_test && *cpu_test >= 0) { + CU_TEST(*cpu_test == cpu); + } CU_TEST(cpu == record->cpu); field = tep_find_field(event, "buf"); @@ -105,18 +106,30 @@ static void test_iter_write(struct tracefs_instance *instance) sched_setaffinity(0, cpu_size, cpusave); close(fd); + CPU_FREE(cpuset); + CPU_FREE(cpusave); } static void iter_raw_events_on_cpu(struct tracefs_instance *instance, int cpu) { + int cpus = sysconf(_SC_NPROCESSORS_CONF); + cpu_set_t *cpuset = NULL; + int cpu_size = 0; int check = 0; int ret; int i; + if (cpu >= 0) { + cpuset = CPU_ALLOC(cpus); + cpu_size = CPU_ALLOC_SIZE(cpus); + CPU_ZERO_S(cpu_size, cpuset); + CPU_SET(cpu, cpuset); + } test_found = 0; + last_ts = 0; test_iter_write(instance); - ret = tracefs_iterate_raw_events(test_tep, instance, NULL, 0, + ret = tracefs_iterate_raw_events(test_tep, instance, cpuset, cpu_size, test_callback, &cpu); CU_TEST(ret == 0); if (cpu < 0) { @@ -132,6 +145,9 @@ static void iter_raw_events_on_cpu(struct tracefs_instance *instance, int cpu) } CU_TEST(test_found == check); } + + if (cpuset) + CPU_FREE(cpuset); } static void test_instance_iter_raw_events(struct tracefs_instance *instance) From patchwork Tue Apr 6 04:20:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Tzvetomir Stoyanov (VMware)" X-Patchwork-Id: 12184145 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52D94C433ED for ; Tue, 6 Apr 2021 04:20:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 297B9613B7 for ; Tue, 6 Apr 2021 04:20:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239386AbhDFEUR (ORCPT ); Tue, 6 Apr 2021 00:20:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51094 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233976AbhDFEUQ (ORCPT ); Tue, 6 Apr 2021 00:20:16 -0400 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 35C74C06174A for ; Mon, 5 Apr 2021 21:20:08 -0700 (PDT) Received: by mail-wr1-x430.google.com with SMTP id v11so12635952wro.7 for ; Mon, 05 Apr 2021 21:20:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=iTrrOjheyODyYOoClyjpDFGkqyffXuRBbUQv0pwSG5M=; b=VAfyNftp9VlZQKu9lHBz4mmxTVQSKagCPErsNlZZNPYE3G/+HH1AxKyJBoDNAfWaOw Z2IvjNz3BlVq3oDW/n+hCAdzVRBaDs8jsDbSxFl++1LPuvl2bugSnCxY84i+YyugRxX5 2P817ACEPDa/M7HfdQPRM6AldX5RyrMl/b1LFvB2Pcr968qMD9GGith3eKNm6beD+Psy kdBFfc7tre8TKePa2BHLypX5PbWiO8l7QZcuf7nWMAq08zaroS/qoA19zNV0VykfP2Zn UAAkvtahWg0OzuJefLpZXVEVdOupsCwHqYGvPlIJpbXQwIeu2o+3816qZnAx+dAeUFkL rpDQ== 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=iTrrOjheyODyYOoClyjpDFGkqyffXuRBbUQv0pwSG5M=; b=fjVRKCCKlmVa93WFZsFWLqVhmA5v4hPWSh9vD41djilsESqOfaPKm/72K8tzlZvdeB HzfJ8QCUt+0FrjbECWR+5FWiLvkM51DwSGvZl22ID8058Yf2pCd/vf+SzpkLYQL/+AQ9 GORObEgIG2b6Sg6/av8+QfhsOwsFrJT8gKkm3x0qgud+TfhjO1v+SFl/MsjhsrNguQLR Nn5qyHxx+itLewOiiQYOVOxGaYQbpwCAZaybRTrn0MP0yYT0KDfUJ8jq1H/D53gubnj3 bdYY6jtlk/Fv2fCi8GmdFUh9ioMpsVzJq46hWzwEG/j9Ygw7/VPEjfGVU6v/DWofJzmq HrYA== X-Gm-Message-State: AOAM533aPUSOZvzPyicgnJ3Qv7gsu++yEkD53N3zSIeG9reF7MFBUAXA gEEhqDLMVM/qXZV/v8ZEqUk= X-Google-Smtp-Source: ABdhPJz3AJNIHaqBckVWdcrnun4P9kwZBwSKvjR9TvXWxF/Wr4jd053lNXTax40QEargjK3iDs7zcg== X-Received: by 2002:a05:6000:14f:: with SMTP id r15mr8088363wrx.166.1617682806997; Mon, 05 Apr 2021 21:20:06 -0700 (PDT) Received: from oberon.zico.biz ([83.222.187.186]) by smtp.gmail.com with ESMTPSA id j23sm1325337wmo.33.2021.04.05.21.20.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Apr 2021 21:20:06 -0700 (PDT) From: "Tzvetomir Stoyanov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org Subject: [PATCH 4/4] libtracefs: tracefs_iterate_raw_events() documentation update Date: Tue, 6 Apr 2021 07:20:01 +0300 Message-Id: <20210406042001.912544-5-tz.stoyanov@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210406042001.912544-1-tz.stoyanov@gmail.com> References: <20210406042001.912544-1-tz.stoyanov@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org Updated the man page of tracefs_iterate_raw_events() API: - Fixed a typo in the function name. - Added a new sentence, describing the iteration in sorted order. Signed-off-by: Tzvetomir Stoyanov (VMware) --- Documentation/libtracefs-events.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Documentation/libtracefs-events.txt b/Documentation/libtracefs-events.txt index 9608a12..78c9834 100644 --- a/Documentation/libtracefs-events.txt +++ b/Documentation/libtracefs-events.txt @@ -37,14 +37,14 @@ local machine, or it may be a path to a copy of the tracefs directory from another machine. The last entry in the array as a NULL pointer. The array must be freed with _tracefs_list_free()_ API. -The _tracefs_interate_raw_events()_ function will read the tracefs raw +The _tracefs_iterate_raw_events()_ function will read the tracefs raw data buffers and call the specified _callback_ function for every event it -encounters. An initialized _tep_ handler is required (See -_tracefs_local_events_(3)). If _instance_ is NULL, then the toplevel -tracefs buffer is used, otherwise the buffer for the corresponding -_instance_ is read. To filter only on a subset of CPUs, _cpus_ and -_cpu_size_ may be set to only call _callback_ with events that occurred on -the CPUs specified, otherwise if _cpus_ is NULL then the _callback_ +encounters. Events are iterated in sorted order: oldest first. An initialized +_tep_ handler is required (See _tracefs_local_events_(3)). If _instance_ is +NULL, then the toplevel tracefs buffer is used, otherwise the buffer for +the corresponding _instance_ is read. To filter only on a subset of CPUs, +_cpus_ and _cpu_size_ may be set to only call _callback_ with events that +occurred on the CPUs specified, otherwise if _cpus_ is NULL then the _callback_ function will be called for all events, and _cpu_size_ is ignored. The _callback_ function will be called with the following parameters: A pointer to a struct tep_event that corresponds to the type of event the