From: Simon Marchi Date: Tue, 4 Oct 2016 21:07:05 +0000 (-0400) Subject: Add support for i2c tracepoints X-Git-Tag: v2.9.0-rc1~5 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=2ca394649a5fb4135bfbe541f090b06ef933a63b;p=lttng-modules.git Add support for i2c tracepoints This patch teaches lttng-modules about the i2c tracepoints in the Linux kernel. It contains the following tracepoints: * i2c_write * i2c_read * i2c_reply * i2c_result I translated the fields and assignments from the kernel's include/trace/events/i2c.h as well as I could. I also tried building this module against a kernel without CONFIG_I2C, and it built fine (the required types are unconditionally defined). So I don't think any "#if CONFIG_I2C" or similar are required. A module parameter (extract_sensitive_payload) controls the extraction of possibly sensitive data from events. [ With edit by Mathieu Desnoyers. ] Signed-off-by: Simon Marchi Signed-off-by: Mathieu Desnoyers --- diff --git a/instrumentation/events/lttng-module/i2c.h b/instrumentation/events/lttng-module/i2c.h new file mode 100644 index 00000000..4088b60e --- /dev/null +++ b/instrumentation/events/lttng-module/i2c.h @@ -0,0 +1,119 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM i2c + +#if !defined(LTTNG_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ) +#define LTTNG_TRACE_I2C_H + +#include + +/* + * __i2c_transfer() write request + */ +LTTNG_TRACEPOINT_EVENT_CODE(i2c_write, + + TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, + int num), + + TP_ARGS(adap, msg, num), + + TP_locvar( + int extract_sensitive_payload; + ), + + TP_code_pre( + tp_locvar->extract_sensitive_payload = + ACCESS_ONCE(extract_sensitive_payload); + ), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, msg_nr, num) + ctf_integer(__u16, addr, msg->addr) + ctf_integer(__u16, flags, msg->flags) + ctf_integer(__u16, len, msg->len) + ctf_sequence_hex(__u8, buf, + tp_locvar->extract_sensitive_payload ? + msg->buf : NULL, + __u16, + tp_locvar->extract_sensitive_payload ? + msg->len : 0) + ), + + TP_code_post() +) + +/* + * __i2c_transfer() read request + */ +LTTNG_TRACEPOINT_EVENT(i2c_read, + + TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, + int num), + + TP_ARGS(adap, msg, num), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, msg_nr, num) + ctf_integer(__u16, addr, msg->addr) + ctf_integer(__u16, flags, msg->flags) + ctf_integer(__u16, len, msg->len) + ) +) + +/* + * __i2c_transfer() read reply + */ +LTTNG_TRACEPOINT_EVENT_CODE(i2c_reply, + + TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, + int num), + + TP_ARGS(adap, msg, num), + + TP_locvar( + int extract_sensitive_payload; + ), + + TP_code_pre( + tp_locvar->extract_sensitive_payload = + ACCESS_ONCE(extract_sensitive_payload); + ), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, msg_nr, num) + ctf_integer(__u16, addr, msg->addr) + ctf_integer(__u16, flags, msg->flags) + ctf_integer(__u16, len, msg->len) + ctf_sequence_hex(__u8, buf, + tp_locvar->extract_sensitive_payload ? + msg->buf : NULL, + __u16, + tp_locvar->extract_sensitive_payload ? + msg->len : 0) + ), + + TP_code_post() +) + +/* + * __i2c_transfer() result + */ +LTTNG_TRACEPOINT_EVENT(i2c_result, + + TP_PROTO(const struct i2c_adapter *adap, int num, int ret), + + TP_ARGS(adap, num, ret), + + TP_FIELDS( + ctf_integer(int, adapter_nr, adap->nr) + ctf_integer(__u16, nr_msgs, num) + ctf_integer(__s16, ret, ret) + ) +) + +#endif /* LTTNG_TRACE_I2C_H */ + +/* This part must be outside protection */ +#include diff --git a/probes/Kbuild b/probes/Kbuild index afa3076e..bd35bd75 100644 --- a/probes/Kbuild +++ b/probes/Kbuild @@ -5,6 +5,7 @@ include $(TOP_LTTNG_MODULES_DIR)/Makefile.ABI.workarounds ccflags-y += -I$(TOP_LTTNG_MODULES_DIR) obj-$(CONFIG_LTTNG) += lttng-probe-sched.o +obj-$(CONFIG_LTTNG) += lttng-probe-i2c.o obj-$(CONFIG_LTTNG) += lttng-probe-irq.o obj-$(CONFIG_LTTNG) += lttng-probe-timer.o obj-$(CONFIG_LTTNG) += lttng-probe-kmem.o diff --git a/probes/lttng-probe-i2c.c b/probes/lttng-probe-i2c.c new file mode 100644 index 00000000..d1c1e099 --- /dev/null +++ b/probes/lttng-probe-i2c.c @@ -0,0 +1,55 @@ +/* + * probes/lttng-probe-i2c.c + * + * LTTng i2c probes. + * + * Copyright (C) 2012 Mathieu Desnoyers + * Copyright (C) 2016 Simon Marchi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +/* + * Create the tracepoint static inlines from the kernel to validate that our + * trace event macros match the kernel we run on. + */ +#include + +/* + * Create LTTng tracepoint probes. + */ +#define LTTNG_PACKAGE_BUILD +#define CREATE_TRACE_POINTS +#define TRACE_INCLUDE_PATH instrumentation/events/lttng-module + +static int extract_sensitive_payload; +module_param(extract_sensitive_payload, int, 0644); +MODULE_PARM_DESC(extract_sensitive_payload, + "Whether to extract possibly sensitive data from events (i2c " + "buffer contents) or not (1 or 0, default: 0)."); + +#include + +MODULE_LICENSE("GPL and additional rights"); +MODULE_AUTHOR("Simon Marchi "); +MODULE_DESCRIPTION("LTTng i2c probes"); +MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "." + __stringify(LTTNG_MODULES_MINOR_VERSION) "." + __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION) + LTTNG_MODULES_EXTRAVERSION);