Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp2799284pxp; Tue, 8 Mar 2022 01:58:57 -0800 (PST) X-Google-Smtp-Source: ABdhPJyScno1AHc7VhIK0q+fkqfEtiQDfcmlWzMUA0l4Zp6weTGDAci7VXn+IaMQoqops8XedrPN X-Received: by 2002:a05:6a00:1591:b0:4f0:ef0b:dc24 with SMTP id u17-20020a056a00159100b004f0ef0bdc24mr17467725pfk.2.1646733537433; Tue, 08 Mar 2022 01:58:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1646733537; cv=none; d=google.com; s=arc-20160816; b=nxQJP1ocg/niIQO7McqnXPzZX53pLLS2yCl07K3JAQF468vXSph9mm8OwmXjGCrlEU SCX9YfTn6Zu8wgTPSat6j0sXD9vBTM5D4rVC3Q+rQ11pJ0Hq18ShMU+q3Ll9xS0fOl0Y CbarkIe7wIrTa4g5VVHBl+bX8hH72pF3SAaBAUtcg/DGtNc+3Ta/Ph9YKqXlW+2pgQQa hQSFjFqXI/tEZJw8Ty9deSP2nGWVgohQLzSKQaBY3g8TONUrzLK39W4XztwCAMEbMWRI pHwMz3iz3qlw9pxJHjHc2hN4PeLjeicMnkwtx5urybOzxOLJthoXJzUA5EDY/lBsDa6I bTEw== 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:subject:cc:to:from:date; bh=SPOuVeQutaUQjSv3GD0dap0T5XyokLwXNVPJ2b8iado=; b=GecAlm4eebMdc1EO4n4tSZLL73c3CXJN8ID+419FtAu5D+bRJPQ37gbaO08wxvCDSV dnVHdKW7gg+fe/oDpsuCtHDAOyVzj5iJXhNpKt0cbOijq7+PCJwpXDvRAVe+3ZgYe4Jy i0Kra1stJfLzT8JQVYgQnCst8uKrIlT37SQkbfx3GupkUDmbgkg2Rqg5SrIx+nBzdj36 IJJrGUdUUg0fKuez+irYwOOOEBAIZiORsNkvLMaHxgVb27beREqYih4UzwrOVIEIuesP CTwgYTaZEtpK0a8LOWkJz+T0cfwjuX0Cxptfpe7rlrf5qWsjPleWKgMYQsdEvOp5FlGi I/Mw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 30-20020a63195e000000b00363402fc582si15230838pgz.372.2022.03.08.01.58.43; Tue, 08 Mar 2022 01:58:57 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240148AbiCGTOH (ORCPT + 99 others); Mon, 7 Mar 2022 14:14:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36672 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234144AbiCGTOG (ORCPT ); Mon, 7 Mar 2022 14:14:06 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D4793338BF; Mon, 7 Mar 2022 11:13:10 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 2E8B5B81678; Mon, 7 Mar 2022 19:13:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1CD1DC340F4; Mon, 7 Mar 2022 19:13:07 +0000 (UTC) Date: Mon, 7 Mar 2022 14:13:05 -0500 From: Steven Rostedt To: Jae Hyun Yoo Cc: Wolfram Sang , "Ingo Molnar" , Jamie Iles , Graeme Gregory , , Subject: Re: [PATCH] i2c: add tracepoints for I2C slave events Message-ID: <20220307141305.18f0c20b@gandalf.local.home> In-Reply-To: <20220307182049.3790905-1-quic_jaehyoo@quicinc.com> References: <20220307182049.3790905-1-quic_jaehyoo@quicinc.com> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-6.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_HI,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 7 Mar 2022 10:20:49 -0800 Jae Hyun Yoo wrote: > I2C slave events tracepoints can be enabled by: > > echo 1 > /sys/kernel/tracing/events/i2c_slave/enable > > and logs in /sys/kernel/tracing/trace will look like: > > ... i2c_slave: i2c-0 a=010 WR_REQ [] > ... i2c_slave: i2c-0 a=010 WR_RCV [02] > ... i2c_slave: i2c-0 a=010 WR_RCV [0c] > ... i2c_slave: i2c-0 a=010 STOP [] > ... i2c_slave: i2c-0 a=010 RD_REQ [04] > ... i2c_slave: i2c-0 a=010 RD_PRO [b4] > ... i2c_slave: i2c-0 a=010 STOP [] > > formatted as: > > i2c- > a= > > [] > > trace printings can be selected by adding a filter like: > > echo adapter_nr==1 >/sys/kernel/tracing/events/i2c_slave/filter > > Signed-off-by: Jae Hyun Yoo > --- > drivers/i2c/i2c-core-slave.c | 15 +++++++++ > include/linux/i2c.h | 8 ++--- > include/trace/events/i2c_slave.h | 57 ++++++++++++++++++++++++++++++++ > 3 files changed, 74 insertions(+), 6 deletions(-) > create mode 100644 include/trace/events/i2c_slave.h > > diff --git a/drivers/i2c/i2c-core-slave.c b/drivers/i2c/i2c-core-slave.c > index 1589179d5eb9..4968a17328b3 100644 > --- a/drivers/i2c/i2c-core-slave.c > +++ b/drivers/i2c/i2c-core-slave.c > @@ -14,6 +14,9 @@ > > #include "i2c-core.h" > > +#define CREATE_TRACE_POINTS > +#include > + > int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb) > { > int ret; > @@ -79,6 +82,18 @@ int i2c_slave_unregister(struct i2c_client *client) > } > EXPORT_SYMBOL_GPL(i2c_slave_unregister); > > +int i2c_slave_event(struct i2c_client *client, > + enum i2c_slave_event event, u8 *val) > +{ > + int ret = client->slave_cb(client, event, val); > + > + if (!ret) You can make the above into: if (trace_i2c_slave_enabled() && !ret) to make this conditional compare only happen if the tracepoint is enabled. As the trace_i2c_slave_enabled() is a static branch (non-conditional jump). > + trace_i2c_slave(client, event, val); > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(i2c_slave_event); > + > /** > * i2c_detect_slave_mode - detect operation mode > * @dev: The device owning the bus > diff --git a/include/linux/i2c.h b/include/linux/i2c.h > index 7d4f52ceb7b5..fbda5ada2afc 100644 > --- a/include/linux/i2c.h > +++ b/include/linux/i2c.h > @@ -392,12 +392,8 @@ enum i2c_slave_event { > int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb); > int i2c_slave_unregister(struct i2c_client *client); > bool i2c_detect_slave_mode(struct device *dev); > - > -static inline int i2c_slave_event(struct i2c_client *client, > - enum i2c_slave_event event, u8 *val) > -{ > - return client->slave_cb(client, event, val); > -} > +int i2c_slave_event(struct i2c_client *client, > + enum i2c_slave_event event, u8 *val); > #else > static inline bool i2c_detect_slave_mode(struct device *dev) { return false; } > #endif > diff --git a/include/trace/events/i2c_slave.h b/include/trace/events/i2c_slave.h > new file mode 100644 > index 000000000000..1f0c1cfbf2ef > --- /dev/null > +++ b/include/trace/events/i2c_slave.h > @@ -0,0 +1,57 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * I2C slave tracepoints > + * > + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. > + */ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM i2c_slave > + > +#if !defined(_TRACE_I2C_SLAVE_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _TRACE_I2C_SLAVE_H > + > +#include > +#include > + > +TRACE_EVENT(i2c_slave, > + TP_PROTO(const struct i2c_client *client, enum i2c_slave_event event, > + __u8 *val), > + TP_ARGS(client, event, val), > + TP_STRUCT__entry( > + __field(int, adapter_nr ) > + __field(__u16, addr ) > + __field(enum i2c_slave_event, event ) > + __field(__u16, len ) I would keep the u16 together: __field(int, adapter_nr ) __field(__u16, addr ) __field(__u16, len ) __field(enum i2c_slave_event, event ) Otherwise you will likely have a hole in the event, which wastes space on the ring buffer. > + __dynamic_array(__u8, buf, 1) ), > + > + TP_fast_assign( > + __entry->adapter_nr = client->adapter->nr; > + __entry->addr = client->addr; > + __entry->event = event; > + switch (event) { > + case I2C_SLAVE_READ_REQUESTED: > + case I2C_SLAVE_READ_PROCESSED: > + case I2C_SLAVE_WRITE_RECEIVED: > + __entry->len = 1; > + memcpy(__get_dynamic_array(buf), val, __entry->len); Why the dynamic event, if it is always the size of 1? Why not make it an array. It will save space, as the dynamic meta data has to live on the event which is 4 bytes big. Just make it: __array(__u8, buf, 1); It's faster and saves space. -- Steve > + break; > + default: > + __entry->len = 0; > + break; > + } > + ), > + TP_printk("i2c-%d a=%03x %s [%*phD]", > + __entry->adapter_nr, __entry->addr, > + __print_symbolic(__entry->event, > + { I2C_SLAVE_READ_REQUESTED, "RD_REQ" }, > + { I2C_SLAVE_WRITE_REQUESTED, "WR_REQ" }, > + { I2C_SLAVE_READ_PROCESSED, "RD_PRO" }, > + { I2C_SLAVE_WRITE_RECEIVED, "WR_RCV" }, > + { I2C_SLAVE_STOP, " STOP" }), > + __entry->len, __get_dynamic_array(buf) > + )); > + > +#endif /* _TRACE_I2C_SLAVE_H */ > + > +/* This part must be outside protection */ > +#include