Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp527026pxb; Mon, 25 Oct 2021 13:04:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJye221kYUq9lENCSrp4CHahtP6uufnapijcJTvpfSJrtSk6oAE2CJ0SFmEwdsVRTg4plH77 X-Received: by 2002:a17:906:d1d1:: with SMTP id bs17mr23977763ejb.198.1635192260363; Mon, 25 Oct 2021 13:04:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635192260; cv=none; d=google.com; s=arc-20160816; b=WgqGW48bU7yDmbu4qa6w+boSYX6I9dwRUB11ldBlJ/ISYza4R6J/K01qhBnsfAJfez t+RoLq6PNqxIHbD+waJG/rknfEOmkZWKRQbbmrpwLBGSEwuns+/A9TpnSw8Rbatr/Dyr HnKZ1czfixp3d/vw6V6zBjnbpvbRlPA7oC4SE+1ewh2w7nAjIBtM3h1Q1dHQhVQlg+jv XT81sjf7qlhFDRTkNyASmZoPUDhAEtb5sq/MMJX1pCVxiuzTY+VHu+jjXRH4Czl5xHy6 UjnjXXu9PNs9M8A8hydBW+I1Vn1Y4PniHQB9zWrqb+RLp8PQh1h69lARNKciskCzjv+4 7zXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:cc:from:subject:references:mime-version :message-id:in-reply-to:date:dkim-signature; bh=+/27iLcVwsoRtZBbebC5PI/8sCrYV9o5nqqwoDvFwLQ=; b=oePFAbetJoizg/H294wX1b+cUkN5kaJ6HNrGThSMgI0l5mmR8tTF3PDnE/Lfugv4/R WjPAVUaGbYlKe8LvhwXHN0NihjnTAEpSUCsWoYz8uUy5RKYazB1fqZblsSOMMPo4EBMN 74Mp1EDAgeJ0+kMR1Gs1KirU2mxChbCKwRSMbqOObsy84Zjm1P7fVu5JzC4duNeuJfo3 2aazVYlCDuv6MoYdU4SAHWKWVjr7Ia90hp7goeSx3rVu4ukWUWF0dXFO3QGUXxcFSsDg ecLW9RGf9UHuBh6Yrg2oYOGHGS/Gmv6rrc7XoH4OLII7zDOp5KaWejqb1kOO5WNITaWw xOmQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b=iJyBPNBy; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id h10si22537422edf.379.2021.10.25.13.03.55; Mon, 25 Oct 2021 13:04:20 -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=@google.com header.s=20210112 header.b=iJyBPNBy; 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=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240335AbhJYUAU (ORCPT + 99 others); Mon, 25 Oct 2021 16:00:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57938 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238219AbhJYT4Z (ORCPT ); Mon, 25 Oct 2021 15:56:25 -0400 Received: from mail-yb1-xb4a.google.com (mail-yb1-xb4a.google.com [IPv6:2607:f8b0:4864:20::b4a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 11A5EC110F26 for ; Mon, 25 Oct 2021 12:24:09 -0700 (PDT) Received: by mail-yb1-xb4a.google.com with SMTP id m81-20020a252654000000b005c135d4efdeso16999694ybm.22 for ; Mon, 25 Oct 2021 12:24:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:cc; bh=+/27iLcVwsoRtZBbebC5PI/8sCrYV9o5nqqwoDvFwLQ=; b=iJyBPNByASMp+w6u1OkWWEXPmlY+xuxhMQCry00NkR6CZi5U11wQfoXyJgPVnrdsN5 l1jlpID4yAeJ6DA9F5o77Qmt4Csbolwyo+aERKpL88HbbqOxBzalYfHIK6EUn34ingcM 9ulqgmaEh9+s8F/utYRhLzwDCF4f7Vhbd/MkFGip8zQUYpVh+9+IKxarCXs1aecowlls uDja4f+k3tDJ3CTj/p4GefB9//lhLSLWJr/t8VwkLvNLZbOkqBmJ7pmvCWpSIVKkpcN0 lC9d5sRZYXXm/r8DN7C9JO8C5G7Q3ApBIa4JlH9p/h1E9mbny8IvZVVQ2FqzyJBZ3lyr YX3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:cc; bh=+/27iLcVwsoRtZBbebC5PI/8sCrYV9o5nqqwoDvFwLQ=; b=u73zoAnOizw5iCEtvTs6T1kp5nMD3Cevan6Hyf8wI0MfTVQf46tmGbnnf4cC3D7N5X G/YVpX9qbEetIxEFXuVOtkgs70cGQgreY9N2c0ivZJ6pVDepaw1PTnNuD7RCXExlQAuX hour3lnUKmk6nr3xIXd7l/Tmz4rzn6mD0jv1a5go68m5b8vD3HFECXhMLEGwb0hspbTv JSxY3Xou2LYBRczt1GL8Jfbd+fb2O2CifKn/YKkkXnGn/om1qUdQLw37gGkbrKQ8tdBi 00l1Dl52hNU17qllFIaZAXLkRBcX2bgTHU1/o09Id1Nnq1+c5tWSfTce9WKAdYb/Ubjf DwgA== X-Gm-Message-State: AOAM533j6/24z/Q2rD+2bSkwyDhZsrlpSeiffIDA5MC83OsK8HW96isM sU6wUGND8jSZ8wG19AWClcl/nl2IxQrHduRQgg== X-Received: from kaleshsingh.mtv.corp.google.com ([2620:15c:211:200:b783:5702:523e:d435]) (user=kaleshsingh job=sendgmr) by 2002:a05:6902:501:: with SMTP id x1mr19798810ybs.217.1635189848312; Mon, 25 Oct 2021 12:24:08 -0700 (PDT) Date: Mon, 25 Oct 2021 12:23:13 -0700 In-Reply-To: <20211025192330.2992076-1-kaleshsingh@google.com> Message-Id: <20211025192330.2992076-3-kaleshsingh@google.com> Mime-Version: 1.0 References: <20211025192330.2992076-1-kaleshsingh@google.com> X-Mailer: git-send-email 2.33.0.1079.g6e70778dc9-goog Subject: [PATCH v3 2/8] tracing: Add division and multiplication support for hist triggers From: Kalesh Singh Cc: surenb@google.com, hridya@google.com, namhyung@kernel.org, kernel-team@android.com, Kalesh Singh , Jonathan Corbet , Steven Rostedt , Ingo Molnar , Shuah Khan , Masami Hiramatsu , Tom Zanussi , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org Content-Type: text/plain; charset="UTF-8" To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adds basic support for division and multiplication operations for hist trigger variable expressions. For simplicity this patch only supports, division and multiplication for a single operation expression (e.g. x=$a/$b), as currently expressions are always evaluated right to left. This can lead to some incorrect results: e.g. echo 'hist:keys=common_pid:x=8-4-2' >> event/trigger 8-4-2 should evaluate to 2 i.e. (8-4)-2 but currently x evaluate to 6 i.e. 8-(4-2) Multiplication and division in sub-expressions will work correctly, once correct operator precedence support is added (See next patch in this series). For the undefined case of division by 0, the histogram expression evaluates to (u64)(-1). Since this cannot be detected when the expression is created, it is the responsibility of the user to be aware and account for this possibility. Examples: echo 'hist:keys=common_pid:a=8,b=4,x=$a/$b' \ >> event/trigger echo 'hist:keys=common_pid:y=5*$b' \ >> event/trigger Signed-off-by: Kalesh Singh --- Changes in v2: - Use div64 helper in hist_field_div() to avoid faults on x86 32-bit machines, per Steven Rostedt kernel/trace/trace_events_hist.c | 72 +++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 28f711224944..522355a06f58 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -97,6 +97,8 @@ enum field_op_id { FIELD_OP_PLUS, FIELD_OP_MINUS, FIELD_OP_UNARY_MINUS, + FIELD_OP_DIV, + FIELD_OP_MULT, }; /* @@ -285,6 +287,40 @@ static u64 hist_field_minus(struct hist_field *hist_field, return val1 - val2; } +static u64 hist_field_div(struct hist_field *hist_field, + struct tracing_map_elt *elt, + struct trace_buffer *buffer, + struct ring_buffer_event *rbe, + void *event) +{ + struct hist_field *operand1 = hist_field->operands[0]; + struct hist_field *operand2 = hist_field->operands[1]; + + u64 val1 = operand1->fn(operand1, elt, buffer, rbe, event); + u64 val2 = operand2->fn(operand2, elt, buffer, rbe, event); + + /* Return -1 for the undefined case */ + if (!val2) + return -1; + + return div64_u64(val1, val2); +} + +static u64 hist_field_mult(struct hist_field *hist_field, + struct tracing_map_elt *elt, + struct trace_buffer *buffer, + struct ring_buffer_event *rbe, + void *event) +{ + struct hist_field *operand1 = hist_field->operands[0]; + struct hist_field *operand2 = hist_field->operands[1]; + + u64 val1 = operand1->fn(operand1, elt, buffer, rbe, event); + u64 val2 = operand2->fn(operand2, elt, buffer, rbe, event); + + return val1 * val2; +} + static u64 hist_field_unary_minus(struct hist_field *hist_field, struct tracing_map_elt *elt, struct trace_buffer *buffer, @@ -1592,6 +1628,12 @@ static char *expr_str(struct hist_field *field, unsigned int level) case FIELD_OP_PLUS: strcat(expr, "+"); break; + case FIELD_OP_DIV: + strcat(expr, "/"); + break; + case FIELD_OP_MULT: + strcat(expr, "*"); + break; default: kfree(expr); return NULL; @@ -1607,7 +1649,7 @@ static int contains_operator(char *str) enum field_op_id field_op = FIELD_OP_NONE; char *op; - op = strpbrk(str, "+-"); + op = strpbrk(str, "+-/*"); if (!op) return FIELD_OP_NONE; @@ -1628,6 +1670,12 @@ static int contains_operator(char *str) case '+': field_op = FIELD_OP_PLUS; break; + case '/': + field_op = FIELD_OP_DIV; + break; + case '*': + field_op = FIELD_OP_MULT; + break; default: break; } @@ -2361,10 +2409,26 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, case FIELD_OP_PLUS: sep = "+"; break; + case FIELD_OP_DIV: + sep = "/"; + break; + case FIELD_OP_MULT: + sep = "*"; + break; default: goto free; } + /* + * Multiplication and division are only supported in single operator + * expressions, since the expression is always evaluated from right + * to left. + */ + if ((field_op == FIELD_OP_DIV || field_op == FIELD_OP_MULT) && level > 0) { + hist_err(file->tr, HIST_ERR_TOO_MANY_SUBEXPR, errpos(str)); + return ERR_PTR(-EINVAL); + } + operand1_str = strsep(&str, sep); if (!operand1_str || !str) goto free; @@ -2436,6 +2500,12 @@ static struct hist_field *parse_expr(struct hist_trigger_data *hist_data, case FIELD_OP_PLUS: expr->fn = hist_field_plus; break; + case FIELD_OP_DIV: + expr->fn = hist_field_div; + break; + case FIELD_OP_MULT: + expr->fn = hist_field_mult; + break; default: ret = -EINVAL; goto free; -- 2.33.0.1079.g6e70778dc9-goog