From patchwork Tue Aug 10 12:26:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 12428805 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,URIBL_BLOCKED,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 44278C432BE for ; Tue, 10 Aug 2021 12:27:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 27D9460F56 for ; Tue, 10 Aug 2021 12:27:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238492AbhHJM1f (ORCPT ); Tue, 10 Aug 2021 08:27:35 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34918 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238426AbhHJM1f (ORCPT ); Tue, 10 Aug 2021 08:27:35 -0400 Received: from mail-ej1-x629.google.com (mail-ej1-x629.google.com [IPv6:2a00:1450:4864:20::629]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0B07CC0613D3 for ; Tue, 10 Aug 2021 05:27:13 -0700 (PDT) Received: by mail-ej1-x629.google.com with SMTP id u3so35150705ejz.1 for ; Tue, 10 Aug 2021 05:27:12 -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=i2H4wpRx0wJUzv3eEjGTSHgcJ1CIjxFeb0CK+qzl27A=; b=lZel7iOhiETUwMBaYNiTP7jO5tqq0KkdPSWNQjPo6UcJGC1CGe6XULDCNWgbseAZCJ mXi313164o6PsrpGjDkeOV7NNdWsRlOTY7suyZqm1jL5QItToCNLJbxQUXoy/Lu6PsE5 SBpqwHBAJNTrHvBRn1RvMqLxZfhMTxd3WM+bASIQVKZ5dyamDISND6kAznayRaGgll38 cPm4LiCyRbjSf1Hf9QNh06ZlS2IdzVBtIQC3S0DJvL3QdiG/6bMYzxxNeB86mreYWvJl HrXAwsKPqY0xKT0a7EYo7Jb02eH3L3/bulZ0Wn5MmP73V+QSfp04LDjJVmTHaM4Xwm/b eYaA== 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=i2H4wpRx0wJUzv3eEjGTSHgcJ1CIjxFeb0CK+qzl27A=; b=LHfoALQZZcaJNoPQgJOYXEepBcFsAMEacTo7URyLLh1xjGljHvc6CD/+KRC9/2kX8V G2r5g2HXe8RjV1RpWqroIcMcv242vRK2BxObWLTwEeQwZB0mF+WO+Zl1cI3UABB05cRC NwvlZKibZw3ZZzP33A4b6IpfyqnCtugaFxVoAmSCgqOeekhsDuYmO9ipqm4Opt7AWJRa tGrwJ0tCUy/zDltvKvcrlSBW9DOA0Z2mGTJbv3ZvTUQ+bOvsxR0ivItALg046ErQkiaw H/M68ruufBcgomUwU35n3dsGdgpqVS05I7FLU3f5Va4vE5DHYPnfa3sNE+BOg6RjLPF+ N+zg== X-Gm-Message-State: AOAM530PN+tLCeWBnnYo9Ms6xA/4idqPjPqse9NkXE3ko6fptQNTu7mN W620Gcwh8lBHPZNFM/IwsPU= X-Google-Smtp-Source: ABdhPJzokxbZhKOVOGv3nRzBuPo7Q8fVwLEYqgDC1BxzhlxVU6pGHudjarqCsISrS7kMunR3+Qw3jw== X-Received: by 2002:a17:906:2809:: with SMTP id r9mr27239456ejc.463.1628598431566; Tue, 10 Aug 2021 05:27:11 -0700 (PDT) Received: from crow.. ([95.87.199.76]) by smtp.gmail.com with ESMTPSA id ks20sm1074501ejb.101.2021.08.10.05.27.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 05:27:11 -0700 (PDT) From: "Yordan Karadzhov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org, "Yordan Karadzhov (VMware)" Subject: [PATCH v4 1/5] libtraceevent: Add dynamic_offset() Date: Tue, 10 Aug 2021 15:26:55 +0300 Message-Id: <20210810122659.145759-2-y.karadz@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210810122659.145759-1-y.karadz@gmail.com> References: <20210810122659.145759-1-y.karadz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org The total allocated length of the dynamic array is stored in the top half of the corresponding 32 bit field and the offset is in the bottom half of the same field. Since the decoding of the length and offset is performed in multiple locations is the code, we define a static helper function to replace/cleanup the existing open coded conversions. Suggested-by: Steven Rostedt Signed-off-by: Yordan Karadzhov (VMware) --- src/event-parse.c | 134 ++++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 71 deletions(-) diff --git a/src/event-parse.c b/src/event-parse.c index f42ae38..fd6d916 100644 --- a/src/event-parse.c +++ b/src/event-parse.c @@ -3858,6 +3858,36 @@ static unsigned long long test_for_symbol(struct tep_handle *tep, return val; } +#define TEP_OFFSET_LEN_MASK 0xffff +#define TEP_LEN_SHIFT 16 + +static void dynamic_offset(struct tep_handle *tep, int size, void *data, + unsigned int *offset, unsigned int *len) +{ + unsigned long long val; + + /* + * The total allocated length of the dynamic array is + * stored in the top half of the field and the offset + * is in the bottom half of the 32 bit field. + */ + val = tep_read_number(tep, data, size); + + if (offset) + *offset = (unsigned int)(val & TEP_OFFSET_LEN_MASK); + if (len) + *len = (unsigned int)((val >> TEP_LEN_SHIFT) & TEP_OFFSET_LEN_MASK); +} + +static inline void dynamic_offset_field(struct tep_handle *tep, + struct tep_format_field *field, + void *data, + unsigned int *offset, + unsigned int *len) +{ + dynamic_offset(tep, field->size, data + field->offset, offset, len); +} + static unsigned long long eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg) { @@ -3866,7 +3896,7 @@ eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg unsigned long long left, right; struct tep_print_arg *typearg = NULL; struct tep_print_arg *larg; - unsigned long offset; + unsigned int offset; unsigned int field_size; switch (arg->type) { @@ -3930,18 +3960,11 @@ eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg switch (larg->type) { case TEP_PRINT_DYNAMIC_ARRAY: - offset = tep_read_number(tep, - data + larg->dynarray.field->offset, - larg->dynarray.field->size); + dynamic_offset_field(tep, larg->dynarray.field, data, + &offset, NULL); + offset += right; if (larg->dynarray.field->elementsize) field_size = larg->dynarray.field->elementsize; - /* - * The actual length of the dynamic array is stored - * in the top half of the field, and the offset - * is in the bottom half of the 32 bit field. - */ - offset &= 0xffff; - offset += right; break; case TEP_PRINT_FIELD: if (!larg->field.field) { @@ -4060,27 +4083,14 @@ eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg } break; case TEP_PRINT_DYNAMIC_ARRAY_LEN: - offset = tep_read_number(tep, - data + arg->dynarray.field->offset, - arg->dynarray.field->size); - /* - * The total allocated length of the dynamic array is - * stored in the top half of the field, and the offset - * is in the bottom half of the 32 bit field. - */ - val = (unsigned long long)(offset >> 16); + dynamic_offset_field(tep, arg->dynarray.field, data, + NULL, &field_size); + val = (unsigned long long) field_size; break; case TEP_PRINT_DYNAMIC_ARRAY: /* Without [], we pass the address to the dynamic data */ - offset = tep_read_number(tep, - data + arg->dynarray.field->offset, - arg->dynarray.field->size); - /* - * The total allocated length of the dynamic array is - * stored in the top half of the field, and the offset - * is in the bottom half of the 32 bit field. - */ - offset &= 0xffff; + dynamic_offset_field(tep, arg->dynarray.field, data, + &offset, NULL); val = (unsigned long long)((unsigned long)data + offset); break; default: /* not sure what to do there */ @@ -4209,12 +4219,13 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, struct tep_print_flag_sym *flag; struct tep_format_field *field; struct printk_map *printk; + unsigned int offset, len; long long val, fval; unsigned long long addr; char *str; unsigned char *hex; int print; - int i, len; + int i; switch (arg->type) { case TEP_PRINT_NULL: @@ -4318,11 +4329,9 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, case TEP_PRINT_HEX: case TEP_PRINT_HEX_STR: if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) { - unsigned long offset; - offset = tep_read_number(tep, - data + arg->hex.field->dynarray.field->offset, - arg->hex.field->dynarray.field->size); - hex = data + (offset & 0xffff); + dynamic_offset_field(tep, arg->hex.field->dynarray.field, data, + &offset, NULL); + hex = data + offset; } else { field = arg->hex.field->field.field; if (!field) { @@ -4347,13 +4356,9 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, int el_size; if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) { - unsigned long offset; - struct tep_format_field *field = - arg->int_array.field->dynarray.field; - offset = tep_read_number(tep, - data + field->offset, - field->size); - num = data + (offset & 0xffff); + dynamic_offset_field(tep, arg->int_array.field->dynarray.field, data, + &offset, NULL); + num = data + offset; } else { field = arg->int_array.field->field.field; if (!field) { @@ -4393,42 +4398,33 @@ static void print_str_arg(struct trace_seq *s, void *data, int size, case TEP_PRINT_TYPE: break; case TEP_PRINT_STRING: { - int str_offset; - int len; - if (arg->string.offset == -1) { struct tep_format_field *f; f = tep_find_any_field(event, arg->string.string); arg->string.offset = f->offset; } - str_offset = data2host4(tep, *(unsigned int *)(data + arg->string.offset)); - len = (str_offset >> 16) & 0xffff; + dynamic_offset(tep, 4, data + arg->string.offset, &offset, &len); /* Do not attempt to save zero length dynamic strings */ if (!len) break; - str_offset &= 0xffff; - print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset); + offset &= TEP_OFFSET_LEN_MASK; + print_str_to_seq(s, format, len_arg, ((char *)data) + offset); break; } case TEP_PRINT_BSTRING: print_str_to_seq(s, format, len_arg, arg->string.string); break; case TEP_PRINT_BITMASK: { - int bitmask_offset; - int bitmask_size; - if (arg->bitmask.offset == -1) { struct tep_format_field *f; f = tep_find_any_field(event, arg->bitmask.bitmask); arg->bitmask.offset = f->offset; } - bitmask_offset = data2host4(tep, *(unsigned int *)(data + arg->bitmask.offset)); - bitmask_size = bitmask_offset >> 16; - bitmask_offset &= 0xffff; + dynamic_offset(tep, 4, data + arg->bitmask.offset, &offset, &len); print_bitmask_to_seq(tep, s, format, len_arg, - data + bitmask_offset, bitmask_size); + data + offset, len); break; } case TEP_PRINT_OP: @@ -5271,13 +5267,12 @@ static int print_raw_buff_arg(struct trace_seq *s, const char *ptr, void *data, int size, struct tep_event *event, struct tep_print_arg *arg, int print_len) { + unsigned int offset, arr_len; int plen = print_len; char *delim = " "; int ret = 0; char *buf; int i; - unsigned long offset; - int arr_len; switch (*(ptr + 1)) { case 'C': @@ -5304,11 +5299,9 @@ static int print_raw_buff_arg(struct trace_seq *s, const char *ptr, return ret; } - offset = tep_read_number(event->tep, - data + arg->dynarray.field->offset, - arg->dynarray.field->size); - arr_len = (unsigned long long)(offset >> 16); - buf = data + (offset & 0xffff); + dynamic_offset_field(event->tep, arg->dynarray.field, data, + &offset, &arr_len); + buf = data + offset; if (arr_len < plen) plen = arr_len; @@ -5336,19 +5329,18 @@ static int is_printable_array(char *p, unsigned int len) void tep_print_field(struct trace_seq *s, void *data, struct tep_format_field *field) { - unsigned long long val; - unsigned int offset, len, i; struct tep_handle *tep = field->event->tep; + unsigned int offset, len, i; + unsigned long long val; if (field->flags & TEP_FIELD_IS_ARRAY) { - offset = field->offset; - len = field->size; if (field->flags & TEP_FIELD_IS_DYNAMIC) { - val = tep_read_number(tep, data + offset, len); - offset = val; - len = offset >> 16; - offset &= 0xffff; + dynamic_offset_field(tep, field, data, &offset, &len); + } else { + offset = field->offset; + len = field->size; } + if (field->flags & TEP_FIELD_IS_STRING && is_printable_array(data + offset, len)) { trace_seq_printf(s, "%s", (char *)data + offset); From patchwork Tue Aug 10 12:26:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 12428807 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,URIBL_BLOCKED,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 C7BA8C4320E for ; Tue, 10 Aug 2021 12:27:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AA59560EFF for ; Tue, 10 Aug 2021 12:27:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238539AbhHJM1g (ORCPT ); Tue, 10 Aug 2021 08:27:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34922 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238426AbhHJM1f (ORCPT ); Tue, 10 Aug 2021 08:27:35 -0400 Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C09E4C0613D3 for ; Tue, 10 Aug 2021 05:27:13 -0700 (PDT) Received: by mail-ed1-x530.google.com with SMTP id f13so29916344edq.13 for ; Tue, 10 Aug 2021 05:27:13 -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=xVHdHGYjX9UVBzG4KqE24R9p9HjA9/m50lIgXZE/w7M=; b=KkxGZuU0slxyjs7O2O1Vqk7OrNep9X+1dx8fKOjokuTwIoHCcMLJKlVUthWmyNFdKw FXlPRi20S9n/xVw+svpRVUwbnAu8fofFSzN6s7+d/2gcvyZ7vGRG6R7fUoPWvSDWX/1o infOUPQgYFws75rb97cFqX0rI+czou28raL7fN8wTuOmjOtC2qDPaEWLdLaLXk21rNdW rsyLIGTKwMEX/Gg4XsBd2up6oE5t20Cr+h1JEjfZCdYWZnIy5hGbItRkVkmWw7dym7P0 C0usWcMNJq0mFlf5Ajl+p3DJgdKtdRbkPazTtBZsUtB8SQ/mV0rMg9lkdM6iIRVX1MBB 4tZw== 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=xVHdHGYjX9UVBzG4KqE24R9p9HjA9/m50lIgXZE/w7M=; b=ti3pJgtM3D1fNhKHUsqdX6gk5HWkLfucabQF1lknkz1gmWEIZu3DHNkmXWH6wT3F5A JgsG3oRn3Y4rfvrWXyqnjZepySBMks3mCfJUNKlKR3211S0b3JCQGuGvLLBEdIid1ytV VN6GBHOZvCpBtx0AuHFLJYTNhZEqoCunCjkgtwbBWLNBe+VabM6AM49lffxBETaViH0+ ErBoRmOsNyXsUrMUwWnzBwThuXJSh5Tz25mUzxVl3zYLrV3zdoYF8o4DKR39bq3OTf83 gJFLMtgx30XRDZ3y5Jfob5RWceL6LC/DPshqVRNpoLaqslpXu0ytYpcoBBXW9MyWivnZ Y+2Q== X-Gm-Message-State: AOAM5302dsck3c+aP/PBAx3ZnQ8CgDCIx1evk1GYJuO9JXtla0vgjQXn YxQ2iAQqUKApjtmC4iUmLoU= X-Google-Smtp-Source: ABdhPJxuAS0iT+Js0icQXexgEYJBEXjXnLKtwlFr/IPfur5NxBxqaS/WJQk79UtZs0MyJ0Sn5azoVA== X-Received: by 2002:aa7:d4da:: with SMTP id t26mr4619848edr.42.1628598432427; Tue, 10 Aug 2021 05:27:12 -0700 (PDT) Received: from crow.. ([95.87.199.76]) by smtp.gmail.com with ESMTPSA id ks20sm1074501ejb.101.2021.08.10.05.27.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 05:27:11 -0700 (PDT) From: "Yordan Karadzhov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org, "Yordan Karadzhov (VMware)" Subject: [PATCH v4 2/5] libtraceevent: Have all field args point to the field they represent Date: Tue, 10 Aug 2021 15:26:56 +0300 Message-Id: <20210810122659.145759-3-y.karadz@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210810122659.145759-1-y.karadz@gmail.com> References: <20210810122659.145759-1-y.karadz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org From: Steven Rostedt In order to have tep_print_field() print the field closer to the way it is printed via the "pretty_print" method, all field args, must keep a pointer to the field it represents. Signed-off-by: Steven Rostedt (VMware) --- src/event-parse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/event-parse.c b/src/event-parse.c index fd6d916..1a8cc54 100644 --- a/src/event-parse.c +++ b/src/event-parse.c @@ -2334,12 +2334,12 @@ process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg, arg->type = TEP_PRINT_FIELD; arg->field.name = field; + arg->field.field = tep_find_any_field(event, arg->field.name); + if (is_flag_field) { - arg->field.field = tep_find_any_field(event, arg->field.name); arg->field.field->flags |= TEP_FIELD_IS_FLAG; is_flag_field = 0; } else if (is_symbolic_field) { - arg->field.field = tep_find_any_field(event, arg->field.name); arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC; is_symbolic_field = 0; } From patchwork Tue Aug 10 12:26:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 12428809 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,URIBL_BLOCKED,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 A8700C4338F for ; Tue, 10 Aug 2021 12:27:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 8DF8460EFF for ; Tue, 10 Aug 2021 12:27:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238554AbhHJM1g (ORCPT ); Tue, 10 Aug 2021 08:27:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34926 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238426AbhHJM1g (ORCPT ); Tue, 10 Aug 2021 08:27:36 -0400 Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8BF66C0613D3 for ; Tue, 10 Aug 2021 05:27:14 -0700 (PDT) Received: by mail-ed1-x52e.google.com with SMTP id x14so7418201edr.12 for ; Tue, 10 Aug 2021 05:27:14 -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=neJ0xz0p2IS59Gud5ojL4LMOc7U15Rrk/m7vcJ8w8oM=; b=lucSAFHIdqptXSafhAASMkwdgIcHz0rjWJZm7zpejQj6hVyXFGPZVYt26jj8HeNSUO uLmX/sNdUj599gc1wKrLQvdVDzWk4ytcgkNTH2kxaQxIDsGiub2eBKnSI/YDxepZ/TJa 3PTXr2BsctOpPpMDZoUGdK8X4MKJQ/f3o8PVq+VCSzZdhaz7MuTHkm1Sb8sb5FlL4m3g 0wUP8ch6GxsGYJxCFvntmHm3IK8LTTuLX1eZa8UgZ17fxsnWJe75XEdKwe7FtRV0H+FW Ak+x2EpStDDEqdWkMAjfq95YOTnapJ5KwoR0e5mnzeZIBPUYpEqUsffhNh6/S4zsIU5a AC6w== 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=neJ0xz0p2IS59Gud5ojL4LMOc7U15Rrk/m7vcJ8w8oM=; b=ctHne5WoSt+TQsmkIYYUbELpydGJC4Wi1dj9PKu1wwMlfimZuM1w+WQ7FEj9DtSNi5 qJ7SjkKqg5fgkHKNlzky8AU9fSq6fq7LZn4BKPH8u12dS0YFMv58q/POvhZDaqkErbZQ 1C5qo70VIKuyhsgvBVp85Jc92dPKQHaegwQ8ezlPaiueJU4+WGDoB2/o4+x8ujzw73Cp HOh8llJ9dYCgcw5KXzf7NJ4jNtB7CF+P3y4+aSZY2Q+jDKHGP7Z1iB6OiqZTtFHdLPJz 9q4HlAcwDTKD7CdzUb1EILyA6PrwNimGWeaxIix/1aZDyGtVvE9CZRSzWFB7qiCOh/Bn AHPg== X-Gm-Message-State: AOAM53274Ara3GqxbcvJ6nnQdZy0gJZon42rC5EgoK403r4hd3IsIgxZ mTJB78lmfdof7VVVh5GcpAs= X-Google-Smtp-Source: ABdhPJyxKty9SUmnoUYaoVQmshMPdwiAckHql4GvK4kI6wJMBQruc+0xRRZyt+EpVOLRtT3j24DT4Q== X-Received: by 2002:a05:6402:2749:: with SMTP id z9mr4568909edd.58.1628598433133; Tue, 10 Aug 2021 05:27:13 -0700 (PDT) Received: from crow.. ([95.87.199.76]) by smtp.gmail.com with ESMTPSA id ks20sm1074501ejb.101.2021.08.10.05.27.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 05:27:12 -0700 (PDT) From: "Yordan Karadzhov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org, "Yordan Karadzhov (VMware)" Subject: [PATCH v4 3/5] libtraceevent: Improve tep_print_field() Date: Tue, 10 Aug 2021 15:26:57 +0300 Message-Id: <20210810122659.145759-4-y.karadz@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210810122659.145759-1-y.karadz@gmail.com> References: <20210810122659.145759-1-y.karadz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org The existing method tep_print_fields() gets upgraded to use the printing formats provided by the tokens. Suggested-by: Steven Rostedt Signed-off-by: Yordan Karadzhov (VMware) --- src/event-parse.c | 118 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 90 insertions(+), 28 deletions(-) diff --git a/src/event-parse.c b/src/event-parse.c index 1a8cc54..4b5e98b 100644 --- a/src/event-parse.c +++ b/src/event-parse.c @@ -3913,7 +3913,6 @@ eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg arg->field.field = tep_find_any_field(event, arg->field.name); if (!arg->field.field) goto out_warning_field; - } /* must be a number */ val = tep_read_number(tep, data + arg->field.field->offset, @@ -5326,8 +5325,8 @@ static int is_printable_array(char *p, unsigned int len) return 1; } -void tep_print_field(struct trace_seq *s, void *data, - struct tep_format_field *field) +static void tep_print_field_raw(struct trace_seq *s, void *data, + struct tep_format_field *field) { struct tep_handle *tep = field->event->tep; unsigned int offset, len, i; @@ -5390,6 +5389,59 @@ void tep_print_field(struct trace_seq *s, void *data, } } +static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s, + void *data, int size, struct tep_event *event); + +void tep_print_field(struct trace_seq *s, void *data, + struct tep_format_field *field) +{ + struct tep_event *event = field->event; + struct tep_print_parse *parse; + bool has_0x; + + parse = event->print_fmt.print_cache; + + if (event->flags & TEP_EVENT_FL_FAILED) + goto out; + + if (field->flags & (TEP_FIELD_IS_ARRAY || TEP_FIELD_IS_STRING)) + goto out; + + for (;parse; parse = parse->next) { + if (parse->type == PRINT_FMT_STRING) { + int len = strlen(parse->format); + + if (len > 1 && + strcmp(parse->format + (len -2), "0x") == 0) + has_0x = true; + else + has_0x = false; + + continue; + } + + if (!parse->arg || + parse->arg->type != TEP_PRINT_FIELD || + parse->arg->field.field != field) { + has_0x = false; + continue; + } + + if (has_0x) + trace_seq_puts(s, "0x"); + + print_parse_data(parse, s, + data + field->offset, + field->size, + event); + return; + } + + out: + /* Not found. */ + tep_print_field_raw(s, data, field); +} + void tep_print_fields(struct trace_seq *s, void *data, int size __maybe_unused, struct tep_event *event) { @@ -5909,35 +5961,45 @@ parse_args(struct tep_event *event, const char *format, struct tep_print_arg *ar return parse_ret; } -static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s, - void *data, int size, struct tep_event *event) +static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s, + void *data, int size, struct tep_event *event) { int len_arg; + if (parse->len_as_arg) + len_arg = eval_num_arg(data, size, event, parse->len_as_arg); + + switch (parse->type) { + case PRINT_FMT_ARG_DIGIT: + print_arg_number(s, parse->format, + parse->len_as_arg ? len_arg : -1, data, + size, parse->ls, event, parse->arg); + break; + case PRINT_FMT_ARG_POINTER: + print_arg_pointer(s, parse->format, + parse->len_as_arg ? len_arg : 1, + data, size, event, parse->arg); + break; + case PRINT_FMT_ARG_STRING: + print_arg_string(s, parse->format, + parse->len_as_arg ? len_arg : -1, + data, size, event, parse->arg); + break; + case PRINT_FMT_STRING: + default: + trace_seq_printf(s, "%s", parse->format); + /* Return 1 on non field. */ + return 1; + } + /* Return 0 on field being processed. */ + return 0; +} + +static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s, + void *data, int size, struct tep_event *event) +{ while (parse) { - if (parse->len_as_arg) - len_arg = eval_num_arg(data, size, event, parse->len_as_arg); - switch (parse->type) { - case PRINT_FMT_ARG_DIGIT: - print_arg_number(s, parse->format, - parse->len_as_arg ? len_arg : -1, data, - size, parse->ls, event, parse->arg); - break; - case PRINT_FMT_ARG_POINTER: - print_arg_pointer(s, parse->format, - parse->len_as_arg ? len_arg : 1, - data, size, event, parse->arg); - break; - case PRINT_FMT_ARG_STRING: - print_arg_string(s, parse->format, - parse->len_as_arg ? len_arg : -1, - data, size, event, parse->arg); - break; - case PRINT_FMT_STRING: - default: - trace_seq_printf(s, "%s", parse->format); - break; - } + print_parse_data(parse, s, data, size, event); parse = parse->next; } } From patchwork Tue Aug 10 12:26:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 12428811 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.8 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 C3226C4338F for ; Tue, 10 Aug 2021 12:27:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AA07360F56 for ; Tue, 10 Aug 2021 12:27:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238889AbhHJM1j (ORCPT ); Tue, 10 Aug 2021 08:27:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238426AbhHJM1h (ORCPT ); Tue, 10 Aug 2021 08:27:37 -0400 Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38EACC0613D3 for ; Tue, 10 Aug 2021 05:27:15 -0700 (PDT) Received: by mail-ed1-x530.google.com with SMTP id b7so29994814edu.3 for ; Tue, 10 Aug 2021 05:27:15 -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=5FIdexv8kIQpY7C2sYTCUCSotp6gwupoLczMRISVSL0=; b=K1PfbdH0jrlqCamFD2kEKuj8s7jEVwwJudSGjFKV3xeA/wlqp2qKdebcNwfIyK0S9C ddc6ROft2yJV7N8vSsRJMwt9GFFC8pbRJyOtGLk4kEpXdkTvCy2Ubic2hyJJmjC+0xwQ gBJnYJ8E91a7DhYt0wAiIWgc8t3LWOt48ZW2Zw/YjxfePIZolWWAl2CT18cfNvqdUyG+ 7J+JLaZJW4apDorFkaO8VRxCSpyZYZUxSqpai+G344TZrPWP1jmbXNtNpaMjnfgNJd8o 5ekKbn7PdrBOz3AE4FNmofTnD6F+/Q1pFRyC2QsGu6m0qhAK5RXkmGp6EGWWxIi3F6xM We/g== 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=5FIdexv8kIQpY7C2sYTCUCSotp6gwupoLczMRISVSL0=; b=VSk4OExmgS5m1RpC9/2IlXr/dPseMzsBnEJIXXP7osqd+J/RxacqVF4HGuu0JDDcD2 2GXPB6C9wZsHMaVJvadsngmEt00HiEXMj0wZ75TR87xXuKWJoJ4IKSFvJInusszufg81 IYkESbIqsWWHDL/MFJ3CerUia1bi32/b4g3Wv1Y+qj8xhqbsww4ItYhQEwtnRnOACqlb 6Dyya9u3z29Rk/buCslzCIeD3JZVEQFhSWvntvv7rMh3JKUcCV3Ou3BcgJfdD7QRxfLP W460MkgBK3iMmYX1QFWQOS/PS6sn0fqvNiQlQCFJ2ScdUVk9GLN6qdphY+D47SQEuiHk DmSA== X-Gm-Message-State: AOAM531lFu42hSStW2XOMJke3WCmR1mWNIAcJrizc4KfJdM6LbU/7wH5 jAOtgCl9H4pGPPYVCXJC/XU= X-Google-Smtp-Source: ABdhPJyrlD7x2LYaMY119PUQJDEVipbf62gFbMv/byK1TYkallRxh7TbCkORHX+L05FZJllZuhMhQg== X-Received: by 2002:aa7:c2d4:: with SMTP id m20mr4678896edp.368.1628598433877; Tue, 10 Aug 2021 05:27:13 -0700 (PDT) Received: from crow.. ([95.87.199.76]) by smtp.gmail.com with ESMTPSA id ks20sm1074501ejb.101.2021.08.10.05.27.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 05:27:13 -0700 (PDT) From: "Yordan Karadzhov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org, "Yordan Karadzhov (VMware)" Subject: [PATCH v4 4/5] libtraceevent: Optimize tep_print_fields() Date: Tue, 10 Aug 2021 15:26:58 +0300 Message-Id: <20210810122659.145759-5-y.karadz@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210810122659.145759-1-y.karadz@gmail.com> References: <20210810122659.145759-1-y.karadz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org The current implementation of tep_print_fields() loops over all individual fields of the event and calls tep_print_field() for each one. In the same time inside tep_print_field() we loop over the list of all tokens of the printing format descriptor in order to determine how the current field must be printed (its own appropriate printing format). The problem is that in this second loop over the tokens we always start from the very first token and this can be quite inefficient for example in a case of a kprobe that has a large number of fields. This patch optimizes tep_print_fields(), allowing the traverse of the list of tokens to continue from the place reached when we searched for the format of the previous field. Signed-off-by: Yordan Karadzhov (VMware) --- src/event-parse.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/event-parse.c b/src/event-parse.c index 4b5e98b..c7043ec 100644 --- a/src/event-parse.c +++ b/src/event-parse.c @@ -5392,14 +5392,15 @@ static void tep_print_field_raw(struct trace_seq *s, void *data, static int print_parse_data(struct tep_print_parse *parse, struct trace_seq *s, void *data, int size, struct tep_event *event); -void tep_print_field(struct trace_seq *s, void *data, - struct tep_format_field *field) +void _tep_print_field(struct trace_seq *s, void *data, + struct tep_format_field *field, + struct tep_print_parse **parse_ptr) { struct tep_event *event = field->event; struct tep_print_parse *parse; bool has_0x; - parse = event->print_fmt.print_cache; + parse = parse_ptr ? *parse_ptr : event->print_fmt.print_cache; if (event->flags & TEP_EVENT_FL_FAILED) goto out; @@ -5434,6 +5435,10 @@ void tep_print_field(struct trace_seq *s, void *data, data + field->offset, field->size, event); + + if (parse_ptr) + *parse_ptr = parse->next; + return; } @@ -5442,15 +5447,22 @@ void tep_print_field(struct trace_seq *s, void *data, tep_print_field_raw(s, data, field); } +void tep_print_field(struct trace_seq *s, void *data, + struct tep_format_field *field) +{ + _tep_print_field(s, data, field, NULL); +} + void tep_print_fields(struct trace_seq *s, void *data, int size __maybe_unused, struct tep_event *event) { + struct tep_print_parse *parse = event->print_fmt.print_cache; struct tep_format_field *field; field = event->format.fields; while (field) { trace_seq_printf(s, " %s=", field->name); - tep_print_field(s, data, field); + _tep_print_field(s, data, field, &parse); field = field->next; } } From patchwork Tue Aug 10 12:26:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yordan Karadzhov X-Patchwork-Id: 12428813 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.8 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 83308C432BE for ; Tue, 10 Aug 2021 12:27:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 668D560EFF for ; Tue, 10 Aug 2021 12:27:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238426AbhHJM1k (ORCPT ); Tue, 10 Aug 2021 08:27:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238569AbhHJM1i (ORCPT ); Tue, 10 Aug 2021 08:27:38 -0400 Received: from mail-ej1-x62c.google.com (mail-ej1-x62c.google.com [IPv6:2a00:1450:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F40A1C061798 for ; Tue, 10 Aug 2021 05:27:15 -0700 (PDT) Received: by mail-ej1-x62c.google.com with SMTP id gs8so35018087ejc.13 for ; Tue, 10 Aug 2021 05:27:15 -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=ImsrmsEqDUTvMFQimgbLeDRfz8nF2nNQfxQWuqrQWgc=; b=oEAotYf+XEgk7/NIJcshlEYDOXSkk4l3kwhyhbqB8ZfeqoO9sCWf6KpHx0SUW/IE3F XhvhnUEQ5M4DanxQ0kpuiXVX2YZ4JQxZvutJfjAuHBRrrFUJykOL2ZtWoAZZWQwVcZEg I7sc0XJl8qOdA48M8wJZKMlKB/pwvWTI0sqBXHblIffQdXlPbsnuaKx/PFVD12v3QJit 9M0ojtiCKuuJckCFRuIS+0Al0OV2f3PzVNRnsf0JjY0YYGbrL8MIxFu5Mxy8NboR7RRk 57rKWpvHX+IQJJsBgBLNfkwcYXVolDEKdzN4qBprVbT49kpArEcnmpQJbH9QRzVPbToW XC5Q== 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=ImsrmsEqDUTvMFQimgbLeDRfz8nF2nNQfxQWuqrQWgc=; b=NQpKz8i5HAgrRVMR3b5r7wrPhRHmu1dbBaV5POnOEBoarl813lNRfoxJUW+wQ0+sKq gApHTIzHRItQHDQU83qdGDORL0gpoyVNZwXDdbK4KfYcJcnJq4ozv/0w5JsP4zxOXOL7 Ygr7VWVbctfN/Quz5f8lqKyt811QPepCCzF9NmY5ejan+AW6cWQt/ALn9I+P0iJLPd8P OAJngnmJAOIXti5goh4rXv+z+BB06wPuxOJnN2ILp2vZz0FWbT6sLLihklmE268kc4Y4 nwYa8r4sW8TgLGQVoEUEBNrr4ElYL6R+ltdWXBYXzAEIxtpMmWa6KPlRqXoevU7/+U4k QPWg== X-Gm-Message-State: AOAM5315CFVUHZL8y2kTISDFRsvh/mphQNB6oyfSQHEkMEStPBEBNmr6 Ia4XCOdWmz9mcbDvht8v7vY= X-Google-Smtp-Source: ABdhPJydT1CfnLwrQx/59fcWINYrbLJg5NDxL+G46ue8qVJ/uSmKqXrnmJmr7EJZY8lFJlxqI0qtQA== X-Received: by 2002:a17:906:180a:: with SMTP id v10mr27224450eje.112.1628598434648; Tue, 10 Aug 2021 05:27:14 -0700 (PDT) Received: from crow.. ([95.87.199.76]) by smtp.gmail.com with ESMTPSA id ks20sm1074501ejb.101.2021.08.10.05.27.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Aug 2021 05:27:14 -0700 (PDT) From: "Yordan Karadzhov (VMware)" To: rostedt@goodmis.org Cc: linux-trace-devel@vger.kernel.org, "Yordan Karadzhov (VMware)" Subject: [PATCH v4 5/5] libtraceevent: Add tep_print_selected_fields() Date: Tue, 10 Aug 2021 15:26:59 +0300 Message-Id: <20210810122659.145759-6-y.karadz@gmail.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210810122659.145759-1-y.karadz@gmail.com> References: <20210810122659.145759-1-y.karadz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-trace-devel@vger.kernel.org The new method can print only a subset of the unique data fields of the trace event. The print format is derived from the parsing tokens (tep_print_parse objects) of the event. Signed-off-by: Yordan Karadzhov (VMware) --- src/event-parse.c | 18 ++++++++++++++---- src/event-parse.h | 3 +++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/event-parse.c b/src/event-parse.c index c7043ec..bc03daf 100644 --- a/src/event-parse.c +++ b/src/event-parse.c @@ -5453,20 +5453,30 @@ void tep_print_field(struct trace_seq *s, void *data, _tep_print_field(s, data, field, NULL); } -void tep_print_fields(struct trace_seq *s, void *data, - int size __maybe_unused, struct tep_event *event) +void tep_print_selected_fields(struct trace_seq *s, void *data, + struct tep_event *event, + int ignore_mask) { struct tep_print_parse *parse = event->print_fmt.print_cache; struct tep_format_field *field; + int field_mask = 1; field = event->format.fields; - while (field) { + for (;field; field = field->next, field_mask *= 2) { + if (field_mask & ignore_mask) + continue; + trace_seq_printf(s, " %s=", field->name); _tep_print_field(s, data, field, &parse); - field = field->next; } } +void tep_print_fields(struct trace_seq *s, void *data, + int size __maybe_unused, struct tep_event *event) +{ + tep_print_selected_fields(s, data, event, 0); +} + static int print_function(struct trace_seq *s, const char *format, void *data, int size, struct tep_event *event, struct tep_print_arg *arg) diff --git a/src/event-parse.h b/src/event-parse.h index d4a876f..c8f3251 100644 --- a/src/event-parse.h +++ b/src/event-parse.h @@ -545,6 +545,9 @@ int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline); void tep_print_field(struct trace_seq *s, void *data, struct tep_format_field *field); +void tep_print_selected_fields(struct trace_seq *s, void *data, + struct tep_event *event, + int ignore_mask); void tep_print_fields(struct trace_seq *s, void *data, int size __maybe_unused, struct tep_event *event); int tep_strerror(struct tep_handle *tep, enum tep_errno errnum,