Some clean ups and small fixes, but the biggest change is the addition
of the TRACE_DEFINE_ENUM() macro that can be used by tracepoints. Tracepoints have helper functions for the TP_printk() called __print_symbolic() and __print_flags() that lets a numeric number be displayed as a a human comprehensible text. What is placed in the TP_printk() is also shown in the tracepoint format file such that user space tools like perf and trace-cmd can parse the binary data and express the values too. Unfortunately, the way the TRACE_EVENT() macro works, anything placed in the TP_printk() will be shown pretty much exactly as is. The problem arises when enums are used. That's because unlike macros, enums will not be changed into their values by the C pre-processor. Thus, the enum string is exported to the format file, and this makes it useless for user space tools. The TRACE_DEFINE_ENUM() solves this by converting the enum strings in the TP_printk() format into their number, and that is what is shown to user space. For example, the tracepoint tlb_flush currently has this in its format file: __print_symbolic(REC->reason, { TLB_FLUSH_ON_TASK_SWITCH, "flush on task switch" }, { TLB_REMOTE_SHOOTDOWN, "remote shootdown" }, { TLB_LOCAL_SHOOTDOWN, "local shootdown" }, { TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" }) After adding: TRACE_DEFINE_ENUM(TLB_FLUSH_ON_TASK_SWITCH); TRACE_DEFINE_ENUM(TLB_REMOTE_SHOOTDOWN); TRACE_DEFINE_ENUM(TLB_LOCAL_SHOOTDOWN); TRACE_DEFINE_ENUM(TLB_LOCAL_MM_SHOOTDOWN); Its format file will contain this: __print_symbolic(REC->reason, { 0, "flush on task switch" }, { 1, "remote shootdown" }, { 2, "local shootdown" }, { 3, "local mm shootdown" }) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJVLBTuAAoJEEjnJuOKh9ldjHMIALdRS755TXCZGOf0r7O2akOR wMPeum7C+ae1mH+jCsJKUC0/jUfQKaMt/UxoHlipDgcGg8kD2jtGnGCw4Xlwvdsr y4rFmcTRSl1mo0zDSsg6ujoupHlVYN0+JPjrd7S3cv/llJoY49zcanNLF7S2XLeM dZCtWRLWYpBiWO68ai6AqJTnE/eGFIqBI048qb5Eg8dbK243SSeSIf9Ywhb+VsA+ aq6F7cWI/H6j4tbeza8tAN19dcwenDro5EfCDY8ARQHJu1f6Y3+DLf2imjkd6Aiu JVAoGIjHIpI+djwCZC1u4gi4urjfOqYartrM3Q54tb3YWYqHeNqP2ASI2a4EpYk= =Ixwt -----END PGP SIGNATURE----- Merge tag 'trace-v4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace Pull tracing updates from Steven Rostedt: "Some clean ups and small fixes, but the biggest change is the addition of the TRACE_DEFINE_ENUM() macro that can be used by tracepoints. Tracepoints have helper functions for the TP_printk() called __print_symbolic() and __print_flags() that lets a numeric number be displayed as a a human comprehensible text. What is placed in the TP_printk() is also shown in the tracepoint format file such that user space tools like perf and trace-cmd can parse the binary data and express the values too. Unfortunately, the way the TRACE_EVENT() macro works, anything placed in the TP_printk() will be shown pretty much exactly as is. The problem arises when enums are used. That's because unlike macros, enums will not be changed into their values by the C pre-processor. Thus, the enum string is exported to the format file, and this makes it useless for user space tools. The TRACE_DEFINE_ENUM() solves this by converting the enum strings in the TP_printk() format into their number, and that is what is shown to user space. For example, the tracepoint tlb_flush currently has this in its format file: __print_symbolic(REC->reason, { TLB_FLUSH_ON_TASK_SWITCH, "flush on task switch" }, { TLB_REMOTE_SHOOTDOWN, "remote shootdown" }, { TLB_LOCAL_SHOOTDOWN, "local shootdown" }, { TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" }) After adding: TRACE_DEFINE_ENUM(TLB_FLUSH_ON_TASK_SWITCH); TRACE_DEFINE_ENUM(TLB_REMOTE_SHOOTDOWN); TRACE_DEFINE_ENUM(TLB_LOCAL_SHOOTDOWN); TRACE_DEFINE_ENUM(TLB_LOCAL_MM_SHOOTDOWN); Its format file will contain this: __print_symbolic(REC->reason, { 0, "flush on task switch" }, { 1, "remote shootdown" }, { 2, "local shootdown" }, { 3, "local mm shootdown" })" * tag 'trace-v4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: (27 commits) tracing: Add enum_map file to show enums that have been mapped writeback: Export enums used by tracepoint to user space v4l: Export enums used by tracepoints to user space SUNRPC: Export enums in tracepoints to user space mm: tracing: Export enums in tracepoints to user space irq/tracing: Export enums in tracepoints to user space f2fs: Export the enums in the tracepoints to userspace net/9p/tracing: Export enums in tracepoints to userspace x86/tlb/trace: Export enums in used by tlb_flush tracepoint tracing/samples: Update the trace-event-sample.h with TRACE_DEFINE_ENUM() tracing: Allow for modules to convert their enums to values tracing: Add TRACE_DEFINE_ENUM() macro to map enums to their values tracing: Update trace-event-sample with TRACE_SYSTEM_VAR documentation tracing: Give system name a pointer brcmsmac: Move each system tracepoints to their own header iwlwifi: Move each system tracepoints to their own header mac80211: Move message tracepoints to their own header tracing: Add TRACE_SYSTEM_VAR to xhci-hcd tracing: Add TRACE_SYSTEM_VAR to kvm-s390 tracing: Add TRACE_SYSTEM_VAR to intel-sst ...
This commit is contained in:
commit
eeee78cf77
|
@ -9,6 +9,13 @@
|
|||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE trace-s390
|
||||
|
||||
/*
|
||||
* The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a
|
||||
* legitimate C variable. It is not exported to user space.
|
||||
*/
|
||||
#undef TRACE_SYSTEM_VAR
|
||||
#define TRACE_SYSTEM_VAR kvm_s390
|
||||
|
||||
/*
|
||||
* Trace point for the creation of the kvm instance.
|
||||
*/
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM drm
|
||||
#define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM)
|
||||
#define TRACE_INCLUDE_FILE drm_trace
|
||||
|
||||
TRACE_EVENT(drm_vblank_event,
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM i915
|
||||
#define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM)
|
||||
#define TRACE_INCLUDE_FILE i915_trace
|
||||
|
||||
/* pipe updates */
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM radeon
|
||||
#define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM)
|
||||
#define TRACE_INCLUDE_FILE radeon_trace
|
||||
|
||||
TRACE_EVENT(radeon_bo_create,
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
/*
|
||||
* Copyright (c) 2011 Broadcom Corporation
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__TRACE_BRCMSMAC_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __TRACE_BRCMSMAC_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM brcmsmac
|
||||
|
||||
/*
|
||||
* We define a tracepoint, its arguments, its printk format and its
|
||||
* 'fast binary record' layout.
|
||||
*/
|
||||
TRACE_EVENT(brcms_timer,
|
||||
/* TPPROTO is the prototype of the function called by this tracepoint */
|
||||
TP_PROTO(struct brcms_timer *t),
|
||||
/*
|
||||
* TPARGS(firstarg, p) are the parameters names, same as found in the
|
||||
* prototype.
|
||||
*/
|
||||
TP_ARGS(t),
|
||||
/*
|
||||
* Fast binary tracing: define the trace record via TP_STRUCT__entry().
|
||||
* You can think about it like a regular C structure local variable
|
||||
* definition.
|
||||
*/
|
||||
TP_STRUCT__entry(
|
||||
__field(uint, ms)
|
||||
__field(uint, set)
|
||||
__field(uint, periodic)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->ms = t->ms;
|
||||
__entry->set = t->set;
|
||||
__entry->periodic = t->periodic;
|
||||
),
|
||||
TP_printk(
|
||||
"ms=%u set=%u periodic=%u",
|
||||
__entry->ms, __entry->set, __entry->periodic
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_dpc,
|
||||
TP_PROTO(unsigned long data),
|
||||
TP_ARGS(data),
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, data)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->data = data;
|
||||
),
|
||||
TP_printk(
|
||||
"data=%p",
|
||||
(void *)__entry->data
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_macintstatus,
|
||||
TP_PROTO(const struct device *dev, int in_isr, u32 macintstatus,
|
||||
u32 mask),
|
||||
TP_ARGS(dev, in_isr, macintstatus, mask),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__field(int, in_isr)
|
||||
__field(u32, macintstatus)
|
||||
__field(u32, mask)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
__entry->in_isr = in_isr;
|
||||
__entry->macintstatus = macintstatus;
|
||||
__entry->mask = mask;
|
||||
),
|
||||
TP_printk("[%s] in_isr=%d macintstatus=%#x mask=%#x", __get_str(dev),
|
||||
__entry->in_isr, __entry->macintstatus, __entry->mask)
|
||||
);
|
||||
#endif /* __TRACE_BRCMSMAC_H */
|
||||
|
||||
#ifdef CONFIG_BRCM_TRACING
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE brcms_trace_brcmsmac
|
||||
#include <trace/define_trace.h>
|
||||
|
||||
#endif /* CONFIG_BRCM_TRACING */
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Copyright (c) 2011 Broadcom Corporation
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__TRACE_BRCMSMAC_MSG_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __TRACE_BRCMSMAC_MSG_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM brcmsmac_msg
|
||||
|
||||
#define MAX_MSG_LEN 100
|
||||
|
||||
DECLARE_EVENT_CLASS(brcms_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf),
|
||||
TP_STRUCT__entry(
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_info,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_warn,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_err,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_crit,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_dbg,
|
||||
TP_PROTO(u32 level, const char *func, struct va_format *vaf),
|
||||
TP_ARGS(level, func, vaf),
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, level)
|
||||
__string(func, func)
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->level = level;
|
||||
__assign_str(func, func);
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s: %s", __get_str(func), __get_str(msg))
|
||||
);
|
||||
#endif /* __TRACE_BRCMSMAC_MSG_H */
|
||||
|
||||
#ifdef CONFIG_BRCM_TRACING
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE brcms_trace_brcmsmac_msg
|
||||
#include <trace/define_trace.h>
|
||||
|
||||
#endif /* CONFIG_BRCM_TRACING */
|
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* Copyright (c) 2011 Broadcom Corporation
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__TRACE_BRCMSMAC_TX_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __TRACE_BRCMSMAC_TX_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM brcmsmac_tx
|
||||
|
||||
TRACE_EVENT(brcms_txdesc,
|
||||
TP_PROTO(const struct device *dev,
|
||||
void *txh, size_t txh_len),
|
||||
TP_ARGS(dev, txh, txh_len),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__dynamic_array(u8, txh, txh_len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
memcpy(__get_dynamic_array(txh), txh, txh_len);
|
||||
),
|
||||
TP_printk("[%s] txdesc", __get_str(dev))
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_txstatus,
|
||||
TP_PROTO(const struct device *dev, u16 framelen, u16 frameid,
|
||||
u16 status, u16 lasttxtime, u16 sequence, u16 phyerr,
|
||||
u16 ackphyrxsh),
|
||||
TP_ARGS(dev, framelen, frameid, status, lasttxtime, sequence, phyerr,
|
||||
ackphyrxsh),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__field(u16, framelen)
|
||||
__field(u16, frameid)
|
||||
__field(u16, status)
|
||||
__field(u16, lasttxtime)
|
||||
__field(u16, sequence)
|
||||
__field(u16, phyerr)
|
||||
__field(u16, ackphyrxsh)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
__entry->framelen = framelen;
|
||||
__entry->frameid = frameid;
|
||||
__entry->status = status;
|
||||
__entry->lasttxtime = lasttxtime;
|
||||
__entry->sequence = sequence;
|
||||
__entry->phyerr = phyerr;
|
||||
__entry->ackphyrxsh = ackphyrxsh;
|
||||
),
|
||||
TP_printk("[%s] FrameId %#04x TxStatus %#04x LastTxTime %#04x "
|
||||
"Seq %#04x PHYTxStatus %#04x RxAck %#04x",
|
||||
__get_str(dev), __entry->frameid, __entry->status,
|
||||
__entry->lasttxtime, __entry->sequence, __entry->phyerr,
|
||||
__entry->ackphyrxsh)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_ampdu_session,
|
||||
TP_PROTO(const struct device *dev, unsigned max_ampdu_len,
|
||||
u16 max_ampdu_frames, u16 ampdu_len, u16 ampdu_frames,
|
||||
u16 dma_len),
|
||||
TP_ARGS(dev, max_ampdu_len, max_ampdu_frames, ampdu_len, ampdu_frames,
|
||||
dma_len),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__field(unsigned, max_ampdu_len)
|
||||
__field(u16, max_ampdu_frames)
|
||||
__field(u16, ampdu_len)
|
||||
__field(u16, ampdu_frames)
|
||||
__field(u16, dma_len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
__entry->max_ampdu_len = max_ampdu_len;
|
||||
__entry->max_ampdu_frames = max_ampdu_frames;
|
||||
__entry->ampdu_len = ampdu_len;
|
||||
__entry->ampdu_frames = ampdu_frames;
|
||||
__entry->dma_len = dma_len;
|
||||
),
|
||||
TP_printk("[%s] ampdu session max_len=%u max_frames=%u len=%u frames=%u dma_len=%u",
|
||||
__get_str(dev), __entry->max_ampdu_len,
|
||||
__entry->max_ampdu_frames, __entry->ampdu_len,
|
||||
__entry->ampdu_frames, __entry->dma_len)
|
||||
);
|
||||
#endif /* __TRACE_BRCMSMAC_TX_H */
|
||||
|
||||
#ifdef CONFIG_BRCM_TRACING
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE brcms_trace_brcmsmac_tx
|
||||
#include <trace/define_trace.h>
|
||||
|
||||
#endif /* CONFIG_BRCM_TRACING */
|
|
@ -14,9 +14,8 @@
|
|||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__TRACE_BRCMSMAC_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
|
||||
#define __TRACE_BRCMSMAC_H
|
||||
#ifndef __BRCMS_TRACE_EVENTS_H
|
||||
#define __BRCMS_TRACE_EVENTS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -34,222 +33,8 @@ static inline void trace_ ## name(proto) {}
|
|||
static inline void trace_ ## name(proto) {}
|
||||
#endif
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM brcmsmac
|
||||
|
||||
/*
|
||||
* We define a tracepoint, its arguments, its printk format and its
|
||||
* 'fast binary record' layout.
|
||||
*/
|
||||
TRACE_EVENT(brcms_timer,
|
||||
/* TPPROTO is the prototype of the function called by this tracepoint */
|
||||
TP_PROTO(struct brcms_timer *t),
|
||||
/*
|
||||
* TPARGS(firstarg, p) are the parameters names, same as found in the
|
||||
* prototype.
|
||||
*/
|
||||
TP_ARGS(t),
|
||||
/*
|
||||
* Fast binary tracing: define the trace record via TP_STRUCT__entry().
|
||||
* You can think about it like a regular C structure local variable
|
||||
* definition.
|
||||
*/
|
||||
TP_STRUCT__entry(
|
||||
__field(uint, ms)
|
||||
__field(uint, set)
|
||||
__field(uint, periodic)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->ms = t->ms;
|
||||
__entry->set = t->set;
|
||||
__entry->periodic = t->periodic;
|
||||
),
|
||||
TP_printk(
|
||||
"ms=%u set=%u periodic=%u",
|
||||
__entry->ms, __entry->set, __entry->periodic
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_dpc,
|
||||
TP_PROTO(unsigned long data),
|
||||
TP_ARGS(data),
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, data)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->data = data;
|
||||
),
|
||||
TP_printk(
|
||||
"data=%p",
|
||||
(void *)__entry->data
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_macintstatus,
|
||||
TP_PROTO(const struct device *dev, int in_isr, u32 macintstatus,
|
||||
u32 mask),
|
||||
TP_ARGS(dev, in_isr, macintstatus, mask),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__field(int, in_isr)
|
||||
__field(u32, macintstatus)
|
||||
__field(u32, mask)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
__entry->in_isr = in_isr;
|
||||
__entry->macintstatus = macintstatus;
|
||||
__entry->mask = mask;
|
||||
),
|
||||
TP_printk("[%s] in_isr=%d macintstatus=%#x mask=%#x", __get_str(dev),
|
||||
__entry->in_isr, __entry->macintstatus, __entry->mask)
|
||||
);
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM brcmsmac_tx
|
||||
|
||||
TRACE_EVENT(brcms_txdesc,
|
||||
TP_PROTO(const struct device *dev,
|
||||
void *txh, size_t txh_len),
|
||||
TP_ARGS(dev, txh, txh_len),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__dynamic_array(u8, txh, txh_len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
memcpy(__get_dynamic_array(txh), txh, txh_len);
|
||||
),
|
||||
TP_printk("[%s] txdesc", __get_str(dev))
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_txstatus,
|
||||
TP_PROTO(const struct device *dev, u16 framelen, u16 frameid,
|
||||
u16 status, u16 lasttxtime, u16 sequence, u16 phyerr,
|
||||
u16 ackphyrxsh),
|
||||
TP_ARGS(dev, framelen, frameid, status, lasttxtime, sequence, phyerr,
|
||||
ackphyrxsh),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__field(u16, framelen)
|
||||
__field(u16, frameid)
|
||||
__field(u16, status)
|
||||
__field(u16, lasttxtime)
|
||||
__field(u16, sequence)
|
||||
__field(u16, phyerr)
|
||||
__field(u16, ackphyrxsh)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
__entry->framelen = framelen;
|
||||
__entry->frameid = frameid;
|
||||
__entry->status = status;
|
||||
__entry->lasttxtime = lasttxtime;
|
||||
__entry->sequence = sequence;
|
||||
__entry->phyerr = phyerr;
|
||||
__entry->ackphyrxsh = ackphyrxsh;
|
||||
),
|
||||
TP_printk("[%s] FrameId %#04x TxStatus %#04x LastTxTime %#04x "
|
||||
"Seq %#04x PHYTxStatus %#04x RxAck %#04x",
|
||||
__get_str(dev), __entry->frameid, __entry->status,
|
||||
__entry->lasttxtime, __entry->sequence, __entry->phyerr,
|
||||
__entry->ackphyrxsh)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_ampdu_session,
|
||||
TP_PROTO(const struct device *dev, unsigned max_ampdu_len,
|
||||
u16 max_ampdu_frames, u16 ampdu_len, u16 ampdu_frames,
|
||||
u16 dma_len),
|
||||
TP_ARGS(dev, max_ampdu_len, max_ampdu_frames, ampdu_len, ampdu_frames,
|
||||
dma_len),
|
||||
TP_STRUCT__entry(
|
||||
__string(dev, dev_name(dev))
|
||||
__field(unsigned, max_ampdu_len)
|
||||
__field(u16, max_ampdu_frames)
|
||||
__field(u16, ampdu_len)
|
||||
__field(u16, ampdu_frames)
|
||||
__field(u16, dma_len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__assign_str(dev, dev_name(dev));
|
||||
__entry->max_ampdu_len = max_ampdu_len;
|
||||
__entry->max_ampdu_frames = max_ampdu_frames;
|
||||
__entry->ampdu_len = ampdu_len;
|
||||
__entry->ampdu_frames = ampdu_frames;
|
||||
__entry->dma_len = dma_len;
|
||||
),
|
||||
TP_printk("[%s] ampdu session max_len=%u max_frames=%u len=%u frames=%u dma_len=%u",
|
||||
__get_str(dev), __entry->max_ampdu_len,
|
||||
__entry->max_ampdu_frames, __entry->ampdu_len,
|
||||
__entry->ampdu_frames, __entry->dma_len)
|
||||
);
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM brcmsmac_msg
|
||||
|
||||
#define MAX_MSG_LEN 100
|
||||
|
||||
DECLARE_EVENT_CLASS(brcms_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf),
|
||||
TP_STRUCT__entry(
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_info,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_warn,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_err,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(brcms_msg_event, brcms_crit,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(brcms_dbg,
|
||||
TP_PROTO(u32 level, const char *func, struct va_format *vaf),
|
||||
TP_ARGS(level, func, vaf),
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, level)
|
||||
__string(func, func)
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->level = level;
|
||||
__assign_str(func, func);
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s: %s", __get_str(func), __get_str(msg))
|
||||
);
|
||||
#include "brcms_trace_brcmsmac.h"
|
||||
#include "brcms_trace_brcmsmac_tx.h"
|
||||
#include "brcms_trace_brcmsmac_msg.h"
|
||||
|
||||
#endif /* __TRACE_BRCMSMAC_H */
|
||||
|
||||
#ifdef CONFIG_BRCM_TRACING
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE brcms_trace_events
|
||||
|
||||
#include <trace/define_trace.h>
|
||||
|
||||
#endif /* CONFIG_BRCM_TRACING */
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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 General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if !defined(__IWLWIFI_DEVICE_TRACE_DATA) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __IWLWIFI_DEVICE_TRACE_DATA
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_data
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_tx_data,
|
||||
TP_PROTO(const struct device *dev,
|
||||
struct sk_buff *skb,
|
||||
void *data, size_t data_len),
|
||||
TP_ARGS(dev, skb, data, data_len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__dynamic_array(u8, data, iwl_trace_data(skb) ? data_len : 0)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
if (iwl_trace_data(skb))
|
||||
memcpy(__get_dynamic_array(data), data, data_len);
|
||||
),
|
||||
TP_printk("[%s] TX frame data", __get_str(dev))
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_rx_data,
|
||||
TP_PROTO(const struct device *dev,
|
||||
const struct iwl_trans *trans,
|
||||
void *rxbuf, size_t len),
|
||||
TP_ARGS(dev, trans, rxbuf, len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__dynamic_array(u8, data,
|
||||
len - iwl_rx_trace_len(trans, rxbuf, len))
|
||||
),
|
||||
TP_fast_assign(
|
||||
size_t offs = iwl_rx_trace_len(trans, rxbuf, len);
|
||||
DEV_ASSIGN;
|
||||
if (offs < len)
|
||||
memcpy(__get_dynamic_array(data),
|
||||
((u8 *)rxbuf) + offs, len - offs);
|
||||
),
|
||||
TP_printk("[%s] RX frame data", __get_str(dev))
|
||||
);
|
||||
#endif /* __IWLWIFI_DEVICE_TRACE_DATA */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE iwl-devtrace-data
|
||||
#include <trace/define_trace.h>
|
|
@ -0,0 +1,155 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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 General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if !defined(__IWLWIFI_DEVICE_TRACE_IO) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __IWLWIFI_DEVICE_TRACE_IO
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_io
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ioread32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] read io[%#x] = %#x",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_iowrite8,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u8 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u8, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] write io[%#x] = %#x)",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_iowrite32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] write io[%#x] = %#x)",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_iowrite_prph32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] write PRPH[%#x] = %#x)",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ioread_prph32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] read PRPH[%#x] = %#x",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_irq,
|
||||
TP_PROTO(const struct device *dev),
|
||||
TP_ARGS(dev),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
),
|
||||
/* TP_printk("") doesn't compile */
|
||||
TP_printk("%d", 0)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ict_read,
|
||||
TP_PROTO(const struct device *dev, u32 index, u32 value),
|
||||
TP_ARGS(dev, index, value),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, index)
|
||||
__field(u32, value)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->index = index;
|
||||
__entry->value = value;
|
||||
),
|
||||
TP_printk("[%s] read ict[%d] = %#.8x",
|
||||
__get_str(dev), __entry->index, __entry->value)
|
||||
);
|
||||
#endif /* __IWLWIFI_DEVICE_TRACE_IO */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE iwl-devtrace-io
|
||||
#include <trace/define_trace.h>
|
|
@ -0,0 +1,200 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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 General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if !defined(__IWLWIFI_DEVICE_TRACE_IWLWIFI) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __IWLWIFI_DEVICE_TRACE_IWLWIFI
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_hcmd,
|
||||
TP_PROTO(const struct device *dev,
|
||||
struct iwl_host_cmd *cmd, u16 total_size,
|
||||
struct iwl_cmd_header *hdr),
|
||||
TP_ARGS(dev, cmd, total_size, hdr),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__dynamic_array(u8, hcmd, total_size)
|
||||
__field(u32, flags)
|
||||
),
|
||||
TP_fast_assign(
|
||||
int i, offset = sizeof(*hdr);
|
||||
|
||||
DEV_ASSIGN;
|
||||
__entry->flags = cmd->flags;
|
||||
memcpy(__get_dynamic_array(hcmd), hdr, sizeof(*hdr));
|
||||
|
||||
for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) {
|
||||
if (!cmd->len[i])
|
||||
continue;
|
||||
memcpy((u8 *)__get_dynamic_array(hcmd) + offset,
|
||||
cmd->data[i], cmd->len[i]);
|
||||
offset += cmd->len[i];
|
||||
}
|
||||
),
|
||||
TP_printk("[%s] hcmd %#.2x (%ssync)",
|
||||
__get_str(dev), ((u8 *)__get_dynamic_array(hcmd))[0],
|
||||
__entry->flags & CMD_ASYNC ? "a" : "")
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_rx,
|
||||
TP_PROTO(const struct device *dev, const struct iwl_trans *trans,
|
||||
void *rxbuf, size_t len),
|
||||
TP_ARGS(dev, trans, rxbuf, len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__dynamic_array(u8, rxbuf, iwl_rx_trace_len(trans, rxbuf, len))
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
memcpy(__get_dynamic_array(rxbuf), rxbuf,
|
||||
iwl_rx_trace_len(trans, rxbuf, len));
|
||||
),
|
||||
TP_printk("[%s] RX cmd %#.2x",
|
||||
__get_str(dev), ((u8 *)__get_dynamic_array(rxbuf))[4])
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_tx,
|
||||
TP_PROTO(const struct device *dev, struct sk_buff *skb,
|
||||
void *tfd, size_t tfdlen,
|
||||
void *buf0, size_t buf0_len,
|
||||
void *buf1, size_t buf1_len),
|
||||
TP_ARGS(dev, skb, tfd, tfdlen, buf0, buf0_len, buf1, buf1_len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(size_t, framelen)
|
||||
__dynamic_array(u8, tfd, tfdlen)
|
||||
|
||||
/*
|
||||
* Do not insert between or below these items,
|
||||
* we want to keep the frame together (except
|
||||
* for the possible padding).
|
||||
*/
|
||||
__dynamic_array(u8, buf0, buf0_len)
|
||||
__dynamic_array(u8, buf1, iwl_trace_data(skb) ? 0 : buf1_len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->framelen = buf0_len + buf1_len;
|
||||
memcpy(__get_dynamic_array(tfd), tfd, tfdlen);
|
||||
memcpy(__get_dynamic_array(buf0), buf0, buf0_len);
|
||||
if (!iwl_trace_data(skb))
|
||||
memcpy(__get_dynamic_array(buf1), buf1, buf1_len);
|
||||
),
|
||||
TP_printk("[%s] TX %.2x (%zu bytes)",
|
||||
__get_str(dev), ((u8 *)__get_dynamic_array(buf0))[0],
|
||||
__entry->framelen)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_error,
|
||||
TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
|
||||
u32 data1, u32 data2, u32 line, u32 blink1,
|
||||
u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time,
|
||||
u32 gp1, u32 gp2, u32 gp3, u32 ucode_ver, u32 hw_ver,
|
||||
u32 brd_ver),
|
||||
TP_ARGS(dev, desc, tsf_low, data1, data2, line,
|
||||
blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2,
|
||||
gp3, ucode_ver, hw_ver, brd_ver),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, desc)
|
||||
__field(u32, tsf_low)
|
||||
__field(u32, data1)
|
||||
__field(u32, data2)
|
||||
__field(u32, line)
|
||||
__field(u32, blink1)
|
||||
__field(u32, blink2)
|
||||
__field(u32, ilink1)
|
||||
__field(u32, ilink2)
|
||||
__field(u32, bcon_time)
|
||||
__field(u32, gp1)
|
||||
__field(u32, gp2)
|
||||
__field(u32, gp3)
|
||||
__field(u32, ucode_ver)
|
||||
__field(u32, hw_ver)
|
||||
__field(u32, brd_ver)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->desc = desc;
|
||||
__entry->tsf_low = tsf_low;
|
||||
__entry->data1 = data1;
|
||||
__entry->data2 = data2;
|
||||
__entry->line = line;
|
||||
__entry->blink1 = blink1;
|
||||
__entry->blink2 = blink2;
|
||||
__entry->ilink1 = ilink1;
|
||||
__entry->ilink2 = ilink2;
|
||||
__entry->bcon_time = bcon_time;
|
||||
__entry->gp1 = gp1;
|
||||
__entry->gp2 = gp2;
|
||||
__entry->gp3 = gp3;
|
||||
__entry->ucode_ver = ucode_ver;
|
||||
__entry->hw_ver = hw_ver;
|
||||
__entry->brd_ver = brd_ver;
|
||||
),
|
||||
TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, "
|
||||
"blink 0x%05X 0x%05X ilink 0x%05X 0x%05X "
|
||||
"bcon_tm %010u gp 0x%08X 0x%08X 0x%08X uCode 0x%08X "
|
||||
"hw 0x%08X brd 0x%08X",
|
||||
__get_str(dev), __entry->desc, __entry->tsf_low,
|
||||
__entry->data1,
|
||||
__entry->data2, __entry->line, __entry->blink1,
|
||||
__entry->blink2, __entry->ilink1, __entry->ilink2,
|
||||
__entry->bcon_time, __entry->gp1, __entry->gp2,
|
||||
__entry->gp3, __entry->ucode_ver, __entry->hw_ver,
|
||||
__entry->brd_ver)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_event,
|
||||
TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
|
||||
TP_ARGS(dev, time, data, ev),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(u32, time)
|
||||
__field(u32, data)
|
||||
__field(u32, ev)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->time = time;
|
||||
__entry->data = data;
|
||||
__entry->ev = ev;
|
||||
),
|
||||
TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
|
||||
__get_str(dev), __entry->time, __entry->data, __entry->ev)
|
||||
);
|
||||
#endif /* __IWLWIFI_DEVICE_TRACE_IWLWIFI */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE iwl-devtrace-iwlwifi
|
||||
#include <trace/define_trace.h>
|
|
@ -0,0 +1,97 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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 General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if !defined(__IWLWIFI_DEVICE_TRACE_MSG) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __IWLWIFI_DEVICE_TRACE_MSG
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_msg
|
||||
|
||||
#define MAX_MSG_LEN 110
|
||||
|
||||
DECLARE_EVENT_CLASS(iwlwifi_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf),
|
||||
TP_STRUCT__entry(
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_err,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_warn,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_info,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_crit,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dbg,
|
||||
TP_PROTO(u32 level, bool in_interrupt, const char *function,
|
||||
struct va_format *vaf),
|
||||
TP_ARGS(level, in_interrupt, function, vaf),
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, level)
|
||||
__field(u8, in_interrupt)
|
||||
__string(function, function)
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->level = level;
|
||||
__entry->in_interrupt = in_interrupt;
|
||||
__assign_str(function, function);
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
#endif /* __IWLWIFI_DEVICE_TRACE_MSG */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE iwl-devtrace-msg
|
||||
#include <trace/define_trace.h>
|
|
@ -0,0 +1,81 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009 - 2014 Intel Corporation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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 General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if !defined(__IWLWIFI_DEVICE_TRACE_UCODE) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __IWLWIFI_DEVICE_TRACE_UCODE
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_ucode
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_cont_event,
|
||||
TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
|
||||
TP_ARGS(dev, time, data, ev),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(u32, time)
|
||||
__field(u32, data)
|
||||
__field(u32, ev)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->time = time;
|
||||
__entry->data = data;
|
||||
__entry->ev = ev;
|
||||
),
|
||||
TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
|
||||
__get_str(dev), __entry->time, __entry->data, __entry->ev)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_wrap_event,
|
||||
TP_PROTO(const struct device *dev, u32 wraps, u32 n_entry, u32 p_entry),
|
||||
TP_ARGS(dev, wraps, n_entry, p_entry),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(u32, wraps)
|
||||
__field(u32, n_entry)
|
||||
__field(u32, p_entry)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->wraps = wraps;
|
||||
__entry->n_entry = n_entry;
|
||||
__entry->p_entry = p_entry;
|
||||
),
|
||||
TP_printk("[%s] wraps=#%02d n=0x%X p=0x%X",
|
||||
__get_str(dev), __entry->wraps, __entry->n_entry,
|
||||
__entry->p_entry)
|
||||
);
|
||||
#endif /* __IWLWIFI_DEVICE_TRACE_UCODE */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE iwl-devtrace-ucode
|
||||
#include <trace/define_trace.h>
|
|
@ -24,7 +24,7 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if !defined(__IWLWIFI_DEVICE_TRACE) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#ifndef __IWLWIFI_DEVICE_TRACE
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/cfg80211.h>
|
||||
|
@ -80,436 +80,10 @@ static inline void trace_ ## name(proto) {}
|
|||
#define DEV_ENTRY __string(dev, dev_name(dev))
|
||||
#define DEV_ASSIGN __assign_str(dev, dev_name(dev))
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_io
|
||||
#include "iwl-devtrace-io.h"
|
||||
#include "iwl-devtrace-ucode.h"
|
||||
#include "iwl-devtrace-msg.h"
|
||||
#include "iwl-devtrace-data.h"
|
||||
#include "iwl-devtrace-iwlwifi.h"
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ioread32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] read io[%#x] = %#x",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_iowrite8,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u8 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u8, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] write io[%#x] = %#x)",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_iowrite32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] write io[%#x] = %#x)",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_iowrite_prph32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] write PRPH[%#x] = %#x)",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ioread_prph32,
|
||||
TP_PROTO(const struct device *dev, u32 offs, u32 val),
|
||||
TP_ARGS(dev, offs, val),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, offs)
|
||||
__field(u32, val)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->offs = offs;
|
||||
__entry->val = val;
|
||||
),
|
||||
TP_printk("[%s] read PRPH[%#x] = %#x",
|
||||
__get_str(dev), __entry->offs, __entry->val)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_irq,
|
||||
TP_PROTO(const struct device *dev),
|
||||
TP_ARGS(dev),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
),
|
||||
/* TP_printk("") doesn't compile */
|
||||
TP_printk("%d", 0)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ict_read,
|
||||
TP_PROTO(const struct device *dev, u32 index, u32 value),
|
||||
TP_ARGS(dev, index, value),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, index)
|
||||
__field(u32, value)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->index = index;
|
||||
__entry->value = value;
|
||||
),
|
||||
TP_printk("[%s] read ict[%d] = %#.8x",
|
||||
__get_str(dev), __entry->index, __entry->value)
|
||||
);
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_ucode
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_cont_event,
|
||||
TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
|
||||
TP_ARGS(dev, time, data, ev),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(u32, time)
|
||||
__field(u32, data)
|
||||
__field(u32, ev)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->time = time;
|
||||
__entry->data = data;
|
||||
__entry->ev = ev;
|
||||
),
|
||||
TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
|
||||
__get_str(dev), __entry->time, __entry->data, __entry->ev)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_wrap_event,
|
||||
TP_PROTO(const struct device *dev, u32 wraps, u32 n_entry, u32 p_entry),
|
||||
TP_ARGS(dev, wraps, n_entry, p_entry),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(u32, wraps)
|
||||
__field(u32, n_entry)
|
||||
__field(u32, p_entry)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->wraps = wraps;
|
||||
__entry->n_entry = n_entry;
|
||||
__entry->p_entry = p_entry;
|
||||
),
|
||||
TP_printk("[%s] wraps=#%02d n=0x%X p=0x%X",
|
||||
__get_str(dev), __entry->wraps, __entry->n_entry,
|
||||
__entry->p_entry)
|
||||
);
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_msg
|
||||
|
||||
#define MAX_MSG_LEN 110
|
||||
|
||||
DECLARE_EVENT_CLASS(iwlwifi_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf),
|
||||
TP_STRUCT__entry(
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_err,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_warn,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_info,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(iwlwifi_msg_event, iwlwifi_crit,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dbg,
|
||||
TP_PROTO(u32 level, bool in_interrupt, const char *function,
|
||||
struct va_format *vaf),
|
||||
TP_ARGS(level, in_interrupt, function, vaf),
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, level)
|
||||
__field(u8, in_interrupt)
|
||||
__string(function, function)
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->level = level;
|
||||
__entry->in_interrupt = in_interrupt;
|
||||
__assign_str(function, function);
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi_data
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_tx_data,
|
||||
TP_PROTO(const struct device *dev,
|
||||
struct sk_buff *skb,
|
||||
void *data, size_t data_len),
|
||||
TP_ARGS(dev, skb, data, data_len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__dynamic_array(u8, data, iwl_trace_data(skb) ? data_len : 0)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
if (iwl_trace_data(skb))
|
||||
memcpy(__get_dynamic_array(data), data, data_len);
|
||||
),
|
||||
TP_printk("[%s] TX frame data", __get_str(dev))
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_rx_data,
|
||||
TP_PROTO(const struct device *dev,
|
||||
const struct iwl_trans *trans,
|
||||
void *rxbuf, size_t len),
|
||||
TP_ARGS(dev, trans, rxbuf, len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__dynamic_array(u8, data,
|
||||
len - iwl_rx_trace_len(trans, rxbuf, len))
|
||||
),
|
||||
TP_fast_assign(
|
||||
size_t offs = iwl_rx_trace_len(trans, rxbuf, len);
|
||||
DEV_ASSIGN;
|
||||
if (offs < len)
|
||||
memcpy(__get_dynamic_array(data),
|
||||
((u8 *)rxbuf) + offs, len - offs);
|
||||
),
|
||||
TP_printk("[%s] RX frame data", __get_str(dev))
|
||||
);
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM iwlwifi
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_hcmd,
|
||||
TP_PROTO(const struct device *dev,
|
||||
struct iwl_host_cmd *cmd, u16 total_size,
|
||||
struct iwl_cmd_header *hdr),
|
||||
TP_ARGS(dev, cmd, total_size, hdr),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__dynamic_array(u8, hcmd, total_size)
|
||||
__field(u32, flags)
|
||||
),
|
||||
TP_fast_assign(
|
||||
int i, offset = sizeof(*hdr);
|
||||
|
||||
DEV_ASSIGN;
|
||||
__entry->flags = cmd->flags;
|
||||
memcpy(__get_dynamic_array(hcmd), hdr, sizeof(*hdr));
|
||||
|
||||
for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) {
|
||||
if (!cmd->len[i])
|
||||
continue;
|
||||
memcpy((u8 *)__get_dynamic_array(hcmd) + offset,
|
||||
cmd->data[i], cmd->len[i]);
|
||||
offset += cmd->len[i];
|
||||
}
|
||||
),
|
||||
TP_printk("[%s] hcmd %#.2x (%ssync)",
|
||||
__get_str(dev), ((u8 *)__get_dynamic_array(hcmd))[0],
|
||||
__entry->flags & CMD_ASYNC ? "a" : "")
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_rx,
|
||||
TP_PROTO(const struct device *dev, const struct iwl_trans *trans,
|
||||
void *rxbuf, size_t len),
|
||||
TP_ARGS(dev, trans, rxbuf, len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__dynamic_array(u8, rxbuf, iwl_rx_trace_len(trans, rxbuf, len))
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
memcpy(__get_dynamic_array(rxbuf), rxbuf,
|
||||
iwl_rx_trace_len(trans, rxbuf, len));
|
||||
),
|
||||
TP_printk("[%s] RX cmd %#.2x",
|
||||
__get_str(dev), ((u8 *)__get_dynamic_array(rxbuf))[4])
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_tx,
|
||||
TP_PROTO(const struct device *dev, struct sk_buff *skb,
|
||||
void *tfd, size_t tfdlen,
|
||||
void *buf0, size_t buf0_len,
|
||||
void *buf1, size_t buf1_len),
|
||||
TP_ARGS(dev, skb, tfd, tfdlen, buf0, buf0_len, buf1, buf1_len),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(size_t, framelen)
|
||||
__dynamic_array(u8, tfd, tfdlen)
|
||||
|
||||
/*
|
||||
* Do not insert between or below these items,
|
||||
* we want to keep the frame together (except
|
||||
* for the possible padding).
|
||||
*/
|
||||
__dynamic_array(u8, buf0, buf0_len)
|
||||
__dynamic_array(u8, buf1, iwl_trace_data(skb) ? 0 : buf1_len)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->framelen = buf0_len + buf1_len;
|
||||
memcpy(__get_dynamic_array(tfd), tfd, tfdlen);
|
||||
memcpy(__get_dynamic_array(buf0), buf0, buf0_len);
|
||||
if (!iwl_trace_data(skb))
|
||||
memcpy(__get_dynamic_array(buf1), buf1, buf1_len);
|
||||
),
|
||||
TP_printk("[%s] TX %.2x (%zu bytes)",
|
||||
__get_str(dev), ((u8 *)__get_dynamic_array(buf0))[0],
|
||||
__entry->framelen)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_error,
|
||||
TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
|
||||
u32 data1, u32 data2, u32 line, u32 blink1,
|
||||
u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time,
|
||||
u32 gp1, u32 gp2, u32 gp3, u32 ucode_ver, u32 hw_ver,
|
||||
u32 brd_ver),
|
||||
TP_ARGS(dev, desc, tsf_low, data1, data2, line,
|
||||
blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2,
|
||||
gp3, ucode_ver, hw_ver, brd_ver),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
__field(u32, desc)
|
||||
__field(u32, tsf_low)
|
||||
__field(u32, data1)
|
||||
__field(u32, data2)
|
||||
__field(u32, line)
|
||||
__field(u32, blink1)
|
||||
__field(u32, blink2)
|
||||
__field(u32, ilink1)
|
||||
__field(u32, ilink2)
|
||||
__field(u32, bcon_time)
|
||||
__field(u32, gp1)
|
||||
__field(u32, gp2)
|
||||
__field(u32, gp3)
|
||||
__field(u32, ucode_ver)
|
||||
__field(u32, hw_ver)
|
||||
__field(u32, brd_ver)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->desc = desc;
|
||||
__entry->tsf_low = tsf_low;
|
||||
__entry->data1 = data1;
|
||||
__entry->data2 = data2;
|
||||
__entry->line = line;
|
||||
__entry->blink1 = blink1;
|
||||
__entry->blink2 = blink2;
|
||||
__entry->ilink1 = ilink1;
|
||||
__entry->ilink2 = ilink2;
|
||||
__entry->bcon_time = bcon_time;
|
||||
__entry->gp1 = gp1;
|
||||
__entry->gp2 = gp2;
|
||||
__entry->gp3 = gp3;
|
||||
__entry->ucode_ver = ucode_ver;
|
||||
__entry->hw_ver = hw_ver;
|
||||
__entry->brd_ver = brd_ver;
|
||||
),
|
||||
TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, "
|
||||
"blink 0x%05X 0x%05X ilink 0x%05X 0x%05X "
|
||||
"bcon_tm %010u gp 0x%08X 0x%08X 0x%08X uCode 0x%08X "
|
||||
"hw 0x%08X brd 0x%08X",
|
||||
__get_str(dev), __entry->desc, __entry->tsf_low,
|
||||
__entry->data1,
|
||||
__entry->data2, __entry->line, __entry->blink1,
|
||||
__entry->blink2, __entry->ilink1, __entry->ilink2,
|
||||
__entry->bcon_time, __entry->gp1, __entry->gp2,
|
||||
__entry->gp3, __entry->ucode_ver, __entry->hw_ver,
|
||||
__entry->brd_ver)
|
||||
);
|
||||
|
||||
TRACE_EVENT(iwlwifi_dev_ucode_event,
|
||||
TP_PROTO(const struct device *dev, u32 time, u32 data, u32 ev),
|
||||
TP_ARGS(dev, time, data, ev),
|
||||
TP_STRUCT__entry(
|
||||
DEV_ENTRY
|
||||
|
||||
__field(u32, time)
|
||||
__field(u32, data)
|
||||
__field(u32, ev)
|
||||
),
|
||||
TP_fast_assign(
|
||||
DEV_ASSIGN;
|
||||
__entry->time = time;
|
||||
__entry->data = data;
|
||||
__entry->ev = ev;
|
||||
),
|
||||
TP_printk("[%s] EVT_LOGT:%010u:0x%08x:%04u",
|
||||
__get_str(dev), __entry->time, __entry->data, __entry->ev)
|
||||
);
|
||||
#endif /* __IWLWIFI_DEVICE_TRACE */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE iwl-devtrace
|
||||
#include <trace/define_trace.h>
|
||||
|
|
|
@ -14,6 +14,13 @@
|
|||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM xhci-hcd
|
||||
|
||||
/*
|
||||
* The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a
|
||||
* legitimate C variable. It is not exported to user space.
|
||||
*/
|
||||
#undef TRACE_SYSTEM_VAR
|
||||
#define TRACE_SYSTEM_VAR xhci_hcd
|
||||
|
||||
#if !defined(__XHCI_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __XHCI_TRACE_H
|
||||
|
||||
|
|
|
@ -124,7 +124,10 @@
|
|||
#define FTRACE_EVENTS() . = ALIGN(8); \
|
||||
VMLINUX_SYMBOL(__start_ftrace_events) = .; \
|
||||
*(_ftrace_events) \
|
||||
VMLINUX_SYMBOL(__stop_ftrace_events) = .;
|
||||
VMLINUX_SYMBOL(__stop_ftrace_events) = .; \
|
||||
VMLINUX_SYMBOL(__start_ftrace_enum_maps) = .; \
|
||||
*(_ftrace_enum_map) \
|
||||
VMLINUX_SYMBOL(__stop_ftrace_enum_maps) = .;
|
||||
#else
|
||||
#define FTRACE_EVENTS()
|
||||
#endif
|
||||
|
|
|
@ -202,7 +202,7 @@ enum trace_reg {
|
|||
struct ftrace_event_call;
|
||||
|
||||
struct ftrace_event_class {
|
||||
char *system;
|
||||
const char *system;
|
||||
void *probe;
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
void *perf_probe;
|
||||
|
@ -285,7 +285,7 @@ struct ftrace_event_call {
|
|||
struct tracepoint *tp;
|
||||
};
|
||||
struct trace_event event;
|
||||
const char *print_fmt;
|
||||
char *print_fmt;
|
||||
struct event_filter *filter;
|
||||
void *mod;
|
||||
void *data;
|
||||
|
|
|
@ -338,6 +338,8 @@ struct module {
|
|||
#ifdef CONFIG_EVENT_TRACING
|
||||
struct ftrace_event_call **trace_events;
|
||||
unsigned int num_trace_events;
|
||||
struct trace_enum_map **trace_enums;
|
||||
unsigned int num_trace_enums;
|
||||
#endif
|
||||
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
|
||||
unsigned int num_ftrace_callsites;
|
||||
|
|
|
@ -36,6 +36,12 @@ struct tracepoint {
|
|||
struct tracepoint_func __rcu *funcs;
|
||||
};
|
||||
|
||||
struct trace_enum_map {
|
||||
const char *system;
|
||||
const char *enum_string;
|
||||
unsigned long enum_value;
|
||||
};
|
||||
|
||||
extern int
|
||||
tracepoint_probe_register(struct tracepoint *tp, void *probe, void *data);
|
||||
extern int
|
||||
|
@ -87,6 +93,8 @@ extern void syscall_unregfunc(void);
|
|||
|
||||
#define PARAMS(args...) args
|
||||
|
||||
#define TRACE_DEFINE_ENUM(x)
|
||||
|
||||
#endif /* _LINUX_TRACEPOINT_H */
|
||||
|
||||
/*
|
||||
|
|
|
@ -6,76 +6,95 @@
|
|||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#define P9_MSG_T \
|
||||
EM( P9_TLERROR, "P9_TLERROR" ) \
|
||||
EM( P9_RLERROR, "P9_RLERROR" ) \
|
||||
EM( P9_TSTATFS, "P9_TSTATFS" ) \
|
||||
EM( P9_RSTATFS, "P9_RSTATFS" ) \
|
||||
EM( P9_TLOPEN, "P9_TLOPEN" ) \
|
||||
EM( P9_RLOPEN, "P9_RLOPEN" ) \
|
||||
EM( P9_TLCREATE, "P9_TLCREATE" ) \
|
||||
EM( P9_RLCREATE, "P9_RLCREATE" ) \
|
||||
EM( P9_TSYMLINK, "P9_TSYMLINK" ) \
|
||||
EM( P9_RSYMLINK, "P9_RSYMLINK" ) \
|
||||
EM( P9_TMKNOD, "P9_TMKNOD" ) \
|
||||
EM( P9_RMKNOD, "P9_RMKNOD" ) \
|
||||
EM( P9_TRENAME, "P9_TRENAME" ) \
|
||||
EM( P9_RRENAME, "P9_RRENAME" ) \
|
||||
EM( P9_TREADLINK, "P9_TREADLINK" ) \
|
||||
EM( P9_RREADLINK, "P9_RREADLINK" ) \
|
||||
EM( P9_TGETATTR, "P9_TGETATTR" ) \
|
||||
EM( P9_RGETATTR, "P9_RGETATTR" ) \
|
||||
EM( P9_TSETATTR, "P9_TSETATTR" ) \
|
||||
EM( P9_RSETATTR, "P9_RSETATTR" ) \
|
||||
EM( P9_TXATTRWALK, "P9_TXATTRWALK" ) \
|
||||
EM( P9_RXATTRWALK, "P9_RXATTRWALK" ) \
|
||||
EM( P9_TXATTRCREATE, "P9_TXATTRCREATE" ) \
|
||||
EM( P9_RXATTRCREATE, "P9_RXATTRCREATE" ) \
|
||||
EM( P9_TREADDIR, "P9_TREADDIR" ) \
|
||||
EM( P9_RREADDIR, "P9_RREADDIR" ) \
|
||||
EM( P9_TFSYNC, "P9_TFSYNC" ) \
|
||||
EM( P9_RFSYNC, "P9_RFSYNC" ) \
|
||||
EM( P9_TLOCK, "P9_TLOCK" ) \
|
||||
EM( P9_RLOCK, "P9_RLOCK" ) \
|
||||
EM( P9_TGETLOCK, "P9_TGETLOCK" ) \
|
||||
EM( P9_RGETLOCK, "P9_RGETLOCK" ) \
|
||||
EM( P9_TLINK, "P9_TLINK" ) \
|
||||
EM( P9_RLINK, "P9_RLINK" ) \
|
||||
EM( P9_TMKDIR, "P9_TMKDIR" ) \
|
||||
EM( P9_RMKDIR, "P9_RMKDIR" ) \
|
||||
EM( P9_TRENAMEAT, "P9_TRENAMEAT" ) \
|
||||
EM( P9_RRENAMEAT, "P9_RRENAMEAT" ) \
|
||||
EM( P9_TUNLINKAT, "P9_TUNLINKAT" ) \
|
||||
EM( P9_RUNLINKAT, "P9_RUNLINKAT" ) \
|
||||
EM( P9_TVERSION, "P9_TVERSION" ) \
|
||||
EM( P9_RVERSION, "P9_RVERSION" ) \
|
||||
EM( P9_TAUTH, "P9_TAUTH" ) \
|
||||
EM( P9_RAUTH, "P9_RAUTH" ) \
|
||||
EM( P9_TATTACH, "P9_TATTACH" ) \
|
||||
EM( P9_RATTACH, "P9_RATTACH" ) \
|
||||
EM( P9_TERROR, "P9_TERROR" ) \
|
||||
EM( P9_RERROR, "P9_RERROR" ) \
|
||||
EM( P9_TFLUSH, "P9_TFLUSH" ) \
|
||||
EM( P9_RFLUSH, "P9_RFLUSH" ) \
|
||||
EM( P9_TWALK, "P9_TWALK" ) \
|
||||
EM( P9_RWALK, "P9_RWALK" ) \
|
||||
EM( P9_TOPEN, "P9_TOPEN" ) \
|
||||
EM( P9_ROPEN, "P9_ROPEN" ) \
|
||||
EM( P9_TCREATE, "P9_TCREATE" ) \
|
||||
EM( P9_RCREATE, "P9_RCREATE" ) \
|
||||
EM( P9_TREAD, "P9_TREAD" ) \
|
||||
EM( P9_RREAD, "P9_RREAD" ) \
|
||||
EM( P9_TWRITE, "P9_TWRITE" ) \
|
||||
EM( P9_RWRITE, "P9_RWRITE" ) \
|
||||
EM( P9_TCLUNK, "P9_TCLUNK" ) \
|
||||
EM( P9_RCLUNK, "P9_RCLUNK" ) \
|
||||
EM( P9_TREMOVE, "P9_TREMOVE" ) \
|
||||
EM( P9_RREMOVE, "P9_RREMOVE" ) \
|
||||
EM( P9_TSTAT, "P9_TSTAT" ) \
|
||||
EM( P9_RSTAT, "P9_RSTAT" ) \
|
||||
EM( P9_TWSTAT, "P9_TWSTAT" ) \
|
||||
EMe(P9_RWSTAT, "P9_RWSTAT" )
|
||||
|
||||
/* Define EM() to export the enums to userspace via TRACE_DEFINE_ENUM() */
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
||||
#define EMe(a, b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
P9_MSG_T
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and EMe() macros to map the enums to the strings
|
||||
* that will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) { a, b },
|
||||
#define EMe(a, b) { a, b }
|
||||
|
||||
#define show_9p_op(type) \
|
||||
__print_symbolic(type, \
|
||||
{ P9_TLERROR, "P9_TLERROR" }, \
|
||||
{ P9_RLERROR, "P9_RLERROR" }, \
|
||||
{ P9_TSTATFS, "P9_TSTATFS" }, \
|
||||
{ P9_RSTATFS, "P9_RSTATFS" }, \
|
||||
{ P9_TLOPEN, "P9_TLOPEN" }, \
|
||||
{ P9_RLOPEN, "P9_RLOPEN" }, \
|
||||
{ P9_TLCREATE, "P9_TLCREATE" }, \
|
||||
{ P9_RLCREATE, "P9_RLCREATE" }, \
|
||||
{ P9_TSYMLINK, "P9_TSYMLINK" }, \
|
||||
{ P9_RSYMLINK, "P9_RSYMLINK" }, \
|
||||
{ P9_TMKNOD, "P9_TMKNOD" }, \
|
||||
{ P9_RMKNOD, "P9_RMKNOD" }, \
|
||||
{ P9_TRENAME, "P9_TRENAME" }, \
|
||||
{ P9_RRENAME, "P9_RRENAME" }, \
|
||||
{ P9_TREADLINK, "P9_TREADLINK" }, \
|
||||
{ P9_RREADLINK, "P9_RREADLINK" }, \
|
||||
{ P9_TGETATTR, "P9_TGETATTR" }, \
|
||||
{ P9_RGETATTR, "P9_RGETATTR" }, \
|
||||
{ P9_TSETATTR, "P9_TSETATTR" }, \
|
||||
{ P9_RSETATTR, "P9_RSETATTR" }, \
|
||||
{ P9_TXATTRWALK, "P9_TXATTRWALK" }, \
|
||||
{ P9_RXATTRWALK, "P9_RXATTRWALK" }, \
|
||||
{ P9_TXATTRCREATE, "P9_TXATTRCREATE" }, \
|
||||
{ P9_RXATTRCREATE, "P9_RXATTRCREATE" }, \
|
||||
{ P9_TREADDIR, "P9_TREADDIR" }, \
|
||||
{ P9_RREADDIR, "P9_RREADDIR" }, \
|
||||
{ P9_TFSYNC, "P9_TFSYNC" }, \
|
||||
{ P9_RFSYNC, "P9_RFSYNC" }, \
|
||||
{ P9_TLOCK, "P9_TLOCK" }, \
|
||||
{ P9_RLOCK, "P9_RLOCK" }, \
|
||||
{ P9_TGETLOCK, "P9_TGETLOCK" }, \
|
||||
{ P9_RGETLOCK, "P9_RGETLOCK" }, \
|
||||
{ P9_TLINK, "P9_TLINK" }, \
|
||||
{ P9_RLINK, "P9_RLINK" }, \
|
||||
{ P9_TMKDIR, "P9_TMKDIR" }, \
|
||||
{ P9_RMKDIR, "P9_RMKDIR" }, \
|
||||
{ P9_TRENAMEAT, "P9_TRENAMEAT" }, \
|
||||
{ P9_RRENAMEAT, "P9_RRENAMEAT" }, \
|
||||
{ P9_TUNLINKAT, "P9_TUNLINKAT" }, \
|
||||
{ P9_RUNLINKAT, "P9_RUNLINKAT" }, \
|
||||
{ P9_TVERSION, "P9_TVERSION" }, \
|
||||
{ P9_RVERSION, "P9_RVERSION" }, \
|
||||
{ P9_TAUTH, "P9_TAUTH" }, \
|
||||
{ P9_RAUTH, "P9_RAUTH" }, \
|
||||
{ P9_TATTACH, "P9_TATTACH" }, \
|
||||
{ P9_RATTACH, "P9_RATTACH" }, \
|
||||
{ P9_TERROR, "P9_TERROR" }, \
|
||||
{ P9_RERROR, "P9_RERROR" }, \
|
||||
{ P9_TFLUSH, "P9_TFLUSH" }, \
|
||||
{ P9_RFLUSH, "P9_RFLUSH" }, \
|
||||
{ P9_TWALK, "P9_TWALK" }, \
|
||||
{ P9_RWALK, "P9_RWALK" }, \
|
||||
{ P9_TOPEN, "P9_TOPEN" }, \
|
||||
{ P9_ROPEN, "P9_ROPEN" }, \
|
||||
{ P9_TCREATE, "P9_TCREATE" }, \
|
||||
{ P9_RCREATE, "P9_RCREATE" }, \
|
||||
{ P9_TREAD, "P9_TREAD" }, \
|
||||
{ P9_RREAD, "P9_RREAD" }, \
|
||||
{ P9_TWRITE, "P9_TWRITE" }, \
|
||||
{ P9_RWRITE, "P9_RWRITE" }, \
|
||||
{ P9_TCLUNK, "P9_TCLUNK" }, \
|
||||
{ P9_RCLUNK, "P9_RCLUNK" }, \
|
||||
{ P9_TREMOVE, "P9_TREMOVE" }, \
|
||||
{ P9_RREMOVE, "P9_RREMOVE" }, \
|
||||
{ P9_TSTAT, "P9_TSTAT" }, \
|
||||
{ P9_RSTAT, "P9_RSTAT" }, \
|
||||
{ P9_TWSTAT, "P9_TWSTAT" }, \
|
||||
{ P9_RWSTAT, "P9_RWSTAT" })
|
||||
__print_symbolic(type, P9_MSG_T)
|
||||
|
||||
TRACE_EVENT(9p_client_req,
|
||||
TP_PROTO(struct p9_client *clnt, int8_t type, int tag),
|
||||
|
|
|
@ -962,7 +962,7 @@ TRACE_EVENT(alloc_extent_state,
|
|||
__entry->ip = IP
|
||||
),
|
||||
|
||||
TP_printk("state=%p; mask = %s; caller = %pF", __entry->state,
|
||||
TP_printk("state=%p; mask = %s; caller = %pS", __entry->state,
|
||||
show_gfp_flags(__entry->mask), (void *)__entry->ip)
|
||||
);
|
||||
|
||||
|
@ -982,7 +982,7 @@ TRACE_EVENT(free_extent_state,
|
|||
__entry->ip = IP
|
||||
),
|
||||
|
||||
TP_printk(" state=%p; caller = %pF", __entry->state,
|
||||
TP_printk(" state=%p; caller = %pS", __entry->state,
|
||||
(void *)__entry->ip)
|
||||
);
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ TRACE_EVENT(ext3_mark_inode_dirty,
|
|||
__entry->ip = IP;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d ino %lu caller %pF",
|
||||
TP_printk("dev %d,%d ino %lu caller %pS",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long) __entry->ino, (void *)__entry->ip)
|
||||
);
|
||||
|
|
|
@ -240,7 +240,7 @@ TRACE_EVENT(ext4_mark_inode_dirty,
|
|||
__entry->ip = IP;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d ino %lu caller %pF",
|
||||
TP_printk("dev %d,%d ino %lu caller %pS",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
(unsigned long) __entry->ino, (void *)__entry->ip)
|
||||
);
|
||||
|
@ -1762,7 +1762,7 @@ TRACE_EVENT(ext4_journal_start,
|
|||
__entry->rsv_blocks = rsv_blocks;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d blocks, %d rsv_blocks, %d caller %pF",
|
||||
TP_printk("dev %d,%d blocks, %d rsv_blocks, %d caller %pS",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
__entry->blocks, __entry->rsv_blocks, (void *)__entry->ip)
|
||||
);
|
||||
|
@ -1784,7 +1784,7 @@ TRACE_EVENT(ext4_journal_start_reserved,
|
|||
__entry->blocks = blocks;
|
||||
),
|
||||
|
||||
TP_printk("dev %d,%d blocks, %d caller %pF",
|
||||
TP_printk("dev %d,%d blocks, %d caller %pS",
|
||||
MAJOR(__entry->dev), MINOR(__entry->dev),
|
||||
__entry->blocks, (void *)__entry->ip)
|
||||
);
|
||||
|
|
|
@ -9,6 +9,36 @@
|
|||
#define show_dev(entry) MAJOR(entry->dev), MINOR(entry->dev)
|
||||
#define show_dev_ino(entry) show_dev(entry), (unsigned long)entry->ino
|
||||
|
||||
TRACE_DEFINE_ENUM(NODE);
|
||||
TRACE_DEFINE_ENUM(DATA);
|
||||
TRACE_DEFINE_ENUM(META);
|
||||
TRACE_DEFINE_ENUM(META_FLUSH);
|
||||
TRACE_DEFINE_ENUM(CURSEG_HOT_DATA);
|
||||
TRACE_DEFINE_ENUM(CURSEG_WARM_DATA);
|
||||
TRACE_DEFINE_ENUM(CURSEG_COLD_DATA);
|
||||
TRACE_DEFINE_ENUM(CURSEG_HOT_NODE);
|
||||
TRACE_DEFINE_ENUM(CURSEG_WARM_NODE);
|
||||
TRACE_DEFINE_ENUM(CURSEG_COLD_NODE);
|
||||
TRACE_DEFINE_ENUM(NO_CHECK_TYPE);
|
||||
TRACE_DEFINE_ENUM(GC_GREEDY);
|
||||
TRACE_DEFINE_ENUM(GC_CB);
|
||||
TRACE_DEFINE_ENUM(FG_GC);
|
||||
TRACE_DEFINE_ENUM(BG_GC);
|
||||
TRACE_DEFINE_ENUM(LFS);
|
||||
TRACE_DEFINE_ENUM(SSR);
|
||||
TRACE_DEFINE_ENUM(__REQ_RAHEAD);
|
||||
TRACE_DEFINE_ENUM(__REQ_WRITE);
|
||||
TRACE_DEFINE_ENUM(__REQ_SYNC);
|
||||
TRACE_DEFINE_ENUM(__REQ_NOIDLE);
|
||||
TRACE_DEFINE_ENUM(__REQ_FLUSH);
|
||||
TRACE_DEFINE_ENUM(__REQ_FUA);
|
||||
TRACE_DEFINE_ENUM(__REQ_PRIO);
|
||||
TRACE_DEFINE_ENUM(__REQ_META);
|
||||
TRACE_DEFINE_ENUM(CP_UMOUNT);
|
||||
TRACE_DEFINE_ENUM(CP_FASTBOOT);
|
||||
TRACE_DEFINE_ENUM(CP_SYNC);
|
||||
TRACE_DEFINE_ENUM(CP_DISCARD);
|
||||
|
||||
#define show_block_type(type) \
|
||||
__print_symbolic(type, \
|
||||
{ NODE, "NODE" }, \
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM intel-sst
|
||||
|
||||
/*
|
||||
* The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a
|
||||
* legitimate C variable. It is not exported to user space.
|
||||
*/
|
||||
#undef TRACE_SYSTEM_VAR
|
||||
#define TRACE_SYSTEM_VAR intel_sst
|
||||
|
||||
#if !defined(_TRACE_INTEL_SST_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_INTEL_SST_H
|
||||
|
||||
|
|
|
@ -9,19 +9,34 @@
|
|||
struct irqaction;
|
||||
struct softirq_action;
|
||||
|
||||
#define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq }
|
||||
#define SOFTIRQ_NAME_LIST \
|
||||
softirq_name(HI) \
|
||||
softirq_name(TIMER) \
|
||||
softirq_name(NET_TX) \
|
||||
softirq_name(NET_RX) \
|
||||
softirq_name(BLOCK) \
|
||||
softirq_name(BLOCK_IOPOLL) \
|
||||
softirq_name(TASKLET) \
|
||||
softirq_name(SCHED) \
|
||||
softirq_name(HRTIMER) \
|
||||
softirq_name_end(RCU)
|
||||
|
||||
#undef softirq_name
|
||||
#undef softirq_name_end
|
||||
|
||||
#define softirq_name(sirq) TRACE_DEFINE_ENUM(sirq##_SOFTIRQ);
|
||||
#define softirq_name_end(sirq) TRACE_DEFINE_ENUM(sirq##_SOFTIRQ);
|
||||
|
||||
SOFTIRQ_NAME_LIST
|
||||
|
||||
#undef softirq_name
|
||||
#undef softirq_name_end
|
||||
|
||||
#define softirq_name(sirq) { sirq##_SOFTIRQ, #sirq },
|
||||
#define softirq_name_end(sirq) { sirq##_SOFTIRQ, #sirq }
|
||||
|
||||
#define show_softirq_name(val) \
|
||||
__print_symbolic(val, \
|
||||
softirq_name(HI), \
|
||||
softirq_name(TIMER), \
|
||||
softirq_name(NET_TX), \
|
||||
softirq_name(NET_RX), \
|
||||
softirq_name(BLOCK), \
|
||||
softirq_name(BLOCK_IOPOLL), \
|
||||
softirq_name(TASKLET), \
|
||||
softirq_name(SCHED), \
|
||||
softirq_name(HRTIMER), \
|
||||
softirq_name(RCU))
|
||||
__print_symbolic(val, SOFTIRQ_NAME_LIST)
|
||||
|
||||
/**
|
||||
* irq_handler_entry - called immediately before the irq action handler
|
||||
|
|
|
@ -7,18 +7,40 @@
|
|||
#include <linux/tracepoint.h>
|
||||
|
||||
#define MIGRATE_MODE \
|
||||
{MIGRATE_ASYNC, "MIGRATE_ASYNC"}, \
|
||||
{MIGRATE_SYNC_LIGHT, "MIGRATE_SYNC_LIGHT"}, \
|
||||
{MIGRATE_SYNC, "MIGRATE_SYNC"}
|
||||
EM( MIGRATE_ASYNC, "MIGRATE_ASYNC") \
|
||||
EM( MIGRATE_SYNC_LIGHT, "MIGRATE_SYNC_LIGHT") \
|
||||
EMe(MIGRATE_SYNC, "MIGRATE_SYNC")
|
||||
|
||||
|
||||
#define MIGRATE_REASON \
|
||||
{MR_COMPACTION, "compaction"}, \
|
||||
{MR_MEMORY_FAILURE, "memory_failure"}, \
|
||||
{MR_MEMORY_HOTPLUG, "memory_hotplug"}, \
|
||||
{MR_SYSCALL, "syscall_or_cpuset"}, \
|
||||
{MR_MEMPOLICY_MBIND, "mempolicy_mbind"}, \
|
||||
{MR_NUMA_MISPLACED, "numa_misplaced"}, \
|
||||
{MR_CMA, "cma"}
|
||||
EM( MR_COMPACTION, "compaction") \
|
||||
EM( MR_MEMORY_FAILURE, "memory_failure") \
|
||||
EM( MR_MEMORY_HOTPLUG, "memory_hotplug") \
|
||||
EM( MR_SYSCALL, "syscall_or_cpuset") \
|
||||
EM( MR_MEMPOLICY_MBIND, "mempolicy_mbind") \
|
||||
EM( MR_NUMA_MISPLACED, "numa_misplaced") \
|
||||
EMe(MR_CMA, "cma")
|
||||
|
||||
/*
|
||||
* First define the enums in the above macros to be exported to userspace
|
||||
* via TRACE_DEFINE_ENUM().
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
||||
#define EMe(a, b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
MIGRATE_MODE
|
||||
MIGRATE_REASON
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and EMe() macros to map the enums to the strings
|
||||
* that will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) {a, b},
|
||||
#define EMe(a, b) {a, b}
|
||||
|
||||
TRACE_EVENT(mm_migrate_pages,
|
||||
|
||||
|
|
|
@ -84,7 +84,7 @@ DECLARE_EVENT_CLASS(module_refcnt,
|
|||
__assign_str(name, mod->name);
|
||||
),
|
||||
|
||||
TP_printk("%s call_site=%pf refcnt=%d",
|
||||
TP_printk("%s call_site=%ps refcnt=%d",
|
||||
__get_str(name), (void *)__entry->ip, __entry->refcnt)
|
||||
);
|
||||
|
||||
|
@ -121,7 +121,7 @@ TRACE_EVENT(module_request,
|
|||
__assign_str(name, name);
|
||||
),
|
||||
|
||||
TP_printk("%s wait=%d call_site=%pf",
|
||||
TP_printk("%s wait=%d call_site=%ps",
|
||||
__get_str(name), (int)__entry->wait, (void *)__entry->ip)
|
||||
);
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ TRACE_EVENT(add_device_randomness,
|
|||
__entry->IP = IP;
|
||||
),
|
||||
|
||||
TP_printk("bytes %d caller %pF",
|
||||
TP_printk("bytes %d caller %pS",
|
||||
__entry->bytes, (void *)__entry->IP)
|
||||
);
|
||||
|
||||
|
@ -43,7 +43,7 @@ DECLARE_EVENT_CLASS(random__mix_pool_bytes,
|
|||
__entry->IP = IP;
|
||||
),
|
||||
|
||||
TP_printk("%s pool: bytes %d caller %pF",
|
||||
TP_printk("%s pool: bytes %d caller %pS",
|
||||
__entry->pool_name, __entry->bytes, (void *)__entry->IP)
|
||||
);
|
||||
|
||||
|
@ -82,7 +82,7 @@ TRACE_EVENT(credit_entropy_bits,
|
|||
),
|
||||
|
||||
TP_printk("%s pool: bits %d entropy_count %d entropy_total %d "
|
||||
"caller %pF", __entry->pool_name, __entry->bits,
|
||||
"caller %pS", __entry->pool_name, __entry->bits,
|
||||
__entry->entropy_count, __entry->entropy_total,
|
||||
(void *)__entry->IP)
|
||||
);
|
||||
|
@ -207,7 +207,7 @@ DECLARE_EVENT_CLASS(random__get_random_bytes,
|
|||
__entry->IP = IP;
|
||||
),
|
||||
|
||||
TP_printk("nbytes %d caller %pF", __entry->nbytes, (void *)__entry->IP)
|
||||
TP_printk("nbytes %d caller %pS", __entry->nbytes, (void *)__entry->IP)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(random__get_random_bytes, get_random_bytes,
|
||||
|
@ -242,7 +242,7 @@ DECLARE_EVENT_CLASS(random__extract_entropy,
|
|||
__entry->IP = IP;
|
||||
),
|
||||
|
||||
TP_printk("%s pool: nbytes %d entropy_count %d caller %pF",
|
||||
TP_printk("%s pool: nbytes %d entropy_count %d caller %pS",
|
||||
__entry->pool_name, __entry->nbytes, __entry->entropy_count,
|
||||
(void *)__entry->IP)
|
||||
);
|
||||
|
|
|
@ -179,27 +179,53 @@ DEFINE_EVENT(rpc_task_queued, rpc_task_wakeup,
|
|||
|
||||
);
|
||||
|
||||
/*
|
||||
* First define the enums in the below macros to be exported to userspace
|
||||
* via TRACE_DEFINE_ENUM().
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
||||
#define EMe(a, b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
#define RPC_SHOW_SOCKET \
|
||||
EM( SS_FREE, "FREE" ) \
|
||||
EM( SS_UNCONNECTED, "UNCONNECTED" ) \
|
||||
EM( SS_CONNECTING, "CONNECTING," ) \
|
||||
EM( SS_CONNECTED, "CONNECTED," ) \
|
||||
EMe(SS_DISCONNECTING, "DISCONNECTING" )
|
||||
|
||||
#define rpc_show_socket_state(state) \
|
||||
__print_symbolic(state, \
|
||||
{ SS_FREE, "FREE" }, \
|
||||
{ SS_UNCONNECTED, "UNCONNECTED" }, \
|
||||
{ SS_CONNECTING, "CONNECTING," }, \
|
||||
{ SS_CONNECTED, "CONNECTED," }, \
|
||||
{ SS_DISCONNECTING, "DISCONNECTING" })
|
||||
__print_symbolic(state, RPC_SHOW_SOCKET)
|
||||
|
||||
RPC_SHOW_SOCKET
|
||||
|
||||
#define RPC_SHOW_SOCK \
|
||||
EM( TCP_ESTABLISHED, "ESTABLISHED" ) \
|
||||
EM( TCP_SYN_SENT, "SYN_SENT" ) \
|
||||
EM( TCP_SYN_RECV, "SYN_RECV" ) \
|
||||
EM( TCP_FIN_WAIT1, "FIN_WAIT1" ) \
|
||||
EM( TCP_FIN_WAIT2, "FIN_WAIT2" ) \
|
||||
EM( TCP_TIME_WAIT, "TIME_WAIT" ) \
|
||||
EM( TCP_CLOSE, "CLOSE" ) \
|
||||
EM( TCP_CLOSE_WAIT, "CLOSE_WAIT" ) \
|
||||
EM( TCP_LAST_ACK, "LAST_ACK" ) \
|
||||
EM( TCP_LISTEN, "LISTEN" ) \
|
||||
EMe( TCP_CLOSING, "CLOSING" )
|
||||
|
||||
#define rpc_show_sock_state(state) \
|
||||
__print_symbolic(state, \
|
||||
{ TCP_ESTABLISHED, "ESTABLISHED" }, \
|
||||
{ TCP_SYN_SENT, "SYN_SENT" }, \
|
||||
{ TCP_SYN_RECV, "SYN_RECV" }, \
|
||||
{ TCP_FIN_WAIT1, "FIN_WAIT1" }, \
|
||||
{ TCP_FIN_WAIT2, "FIN_WAIT2" }, \
|
||||
{ TCP_TIME_WAIT, "TIME_WAIT" }, \
|
||||
{ TCP_CLOSE, "CLOSE" }, \
|
||||
{ TCP_CLOSE_WAIT, "CLOSE_WAIT" }, \
|
||||
{ TCP_LAST_ACK, "LAST_ACK" }, \
|
||||
{ TCP_LISTEN, "LISTEN" }, \
|
||||
{ TCP_CLOSING, "CLOSING" })
|
||||
__print_symbolic(state, RPC_SHOW_SOCK)
|
||||
|
||||
RPC_SHOW_SOCK
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and EMe() macros to map the enums to the strings
|
||||
* that will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) {a, b},
|
||||
#define EMe(a, b) {a, b}
|
||||
|
||||
DECLARE_EVENT_CLASS(xs_socket_event,
|
||||
|
||||
|
|
|
@ -8,10 +8,30 @@
|
|||
#include <linux/tracepoint.h>
|
||||
|
||||
#define TLB_FLUSH_REASON \
|
||||
{ TLB_FLUSH_ON_TASK_SWITCH, "flush on task switch" }, \
|
||||
{ TLB_REMOTE_SHOOTDOWN, "remote shootdown" }, \
|
||||
{ TLB_LOCAL_SHOOTDOWN, "local shootdown" }, \
|
||||
{ TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" }
|
||||
EM( TLB_FLUSH_ON_TASK_SWITCH, "flush on task switch" ) \
|
||||
EM( TLB_REMOTE_SHOOTDOWN, "remote shootdown" ) \
|
||||
EM( TLB_LOCAL_SHOOTDOWN, "local shootdown" ) \
|
||||
EMe( TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" )
|
||||
|
||||
/*
|
||||
* First define the enums in TLB_FLUSH_REASON to be exported to userspace
|
||||
* via TRACE_DEFINE_ENUM().
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a,b) TRACE_DEFINE_ENUM(a);
|
||||
#define EMe(a,b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
TLB_FLUSH_REASON
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and EMe() macros to map the enums to the strings
|
||||
* that will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a,b) { a, b },
|
||||
#define EMe(a,b) { a, b }
|
||||
|
||||
TRACE_EVENT_CONDITION(tlb_flush,
|
||||
|
||||
|
|
|
@ -6,33 +6,58 @@
|
|||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
/* Enums require being exported to userspace, for user tool parsing */
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) TRACE_DEFINE_ENUM(a);
|
||||
#define EMe(a, b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
#define show_type(type) \
|
||||
__print_symbolic(type, \
|
||||
{ V4L2_BUF_TYPE_VIDEO_CAPTURE, "VIDEO_CAPTURE" }, \
|
||||
{ V4L2_BUF_TYPE_VIDEO_OUTPUT, "VIDEO_OUTPUT" }, \
|
||||
{ V4L2_BUF_TYPE_VIDEO_OVERLAY, "VIDEO_OVERLAY" }, \
|
||||
{ V4L2_BUF_TYPE_VBI_CAPTURE, "VBI_CAPTURE" }, \
|
||||
{ V4L2_BUF_TYPE_VBI_OUTPUT, "VBI_OUTPUT" }, \
|
||||
{ V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, "SLICED_VBI_CAPTURE" }, \
|
||||
{ V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, "SLICED_VBI_OUTPUT" }, \
|
||||
{ V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, "VIDEO_OUTPUT_OVERLAY" },\
|
||||
{ V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, "VIDEO_CAPTURE_MPLANE" },\
|
||||
{ V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, "VIDEO_OUTPUT_MPLANE" }, \
|
||||
{ V4L2_BUF_TYPE_SDR_CAPTURE, "SDR_CAPTURE" }, \
|
||||
{ V4L2_BUF_TYPE_PRIVATE, "PRIVATE" })
|
||||
__print_symbolic(type, SHOW_TYPE)
|
||||
|
||||
#define SHOW_TYPE \
|
||||
EM( V4L2_BUF_TYPE_VIDEO_CAPTURE, "VIDEO_CAPTURE" ) \
|
||||
EM( V4L2_BUF_TYPE_VIDEO_OUTPUT, "VIDEO_OUTPUT" ) \
|
||||
EM( V4L2_BUF_TYPE_VIDEO_OVERLAY, "VIDEO_OVERLAY" ) \
|
||||
EM( V4L2_BUF_TYPE_VBI_CAPTURE, "VBI_CAPTURE" ) \
|
||||
EM( V4L2_BUF_TYPE_VBI_OUTPUT, "VBI_OUTPUT" ) \
|
||||
EM( V4L2_BUF_TYPE_SLICED_VBI_CAPTURE, "SLICED_VBI_CAPTURE" ) \
|
||||
EM( V4L2_BUF_TYPE_SLICED_VBI_OUTPUT, "SLICED_VBI_OUTPUT" ) \
|
||||
EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY, "VIDEO_OUTPUT_OVERLAY" ) \
|
||||
EM( V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, "VIDEO_CAPTURE_MPLANE" ) \
|
||||
EM( V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, "VIDEO_OUTPUT_MPLANE" ) \
|
||||
EM( V4L2_BUF_TYPE_SDR_CAPTURE, "SDR_CAPTURE" ) \
|
||||
EMe(V4L2_BUF_TYPE_PRIVATE, "PRIVATE" )
|
||||
|
||||
SHOW_TYPE
|
||||
|
||||
#define show_field(field) \
|
||||
__print_symbolic(field, \
|
||||
{ V4L2_FIELD_ANY, "ANY" }, \
|
||||
{ V4L2_FIELD_NONE, "NONE" }, \
|
||||
{ V4L2_FIELD_TOP, "TOP" }, \
|
||||
{ V4L2_FIELD_BOTTOM, "BOTTOM" }, \
|
||||
{ V4L2_FIELD_INTERLACED, "INTERLACED" }, \
|
||||
{ V4L2_FIELD_SEQ_TB, "SEQ_TB" }, \
|
||||
{ V4L2_FIELD_SEQ_BT, "SEQ_BT" }, \
|
||||
{ V4L2_FIELD_ALTERNATE, "ALTERNATE" }, \
|
||||
{ V4L2_FIELD_INTERLACED_TB, "INTERLACED_TB" }, \
|
||||
{ V4L2_FIELD_INTERLACED_BT, "INTERLACED_BT" })
|
||||
__print_symbolic(field, SHOW_FIELD)
|
||||
|
||||
#define SHOW_FIELD \
|
||||
EM( V4L2_FIELD_ANY, "ANY" ) \
|
||||
EM( V4L2_FIELD_NONE, "NONE" ) \
|
||||
EM( V4L2_FIELD_TOP, "TOP" ) \
|
||||
EM( V4L2_FIELD_BOTTOM, "BOTTOM" ) \
|
||||
EM( V4L2_FIELD_INTERLACED, "INTERLACED" ) \
|
||||
EM( V4L2_FIELD_SEQ_TB, "SEQ_TB" ) \
|
||||
EM( V4L2_FIELD_SEQ_BT, "SEQ_BT" ) \
|
||||
EM( V4L2_FIELD_ALTERNATE, "ALTERNATE" ) \
|
||||
EM( V4L2_FIELD_INTERLACED_TB, "INTERLACED_TB" ) \
|
||||
EMe( V4L2_FIELD_INTERLACED_BT, "INTERLACED_BT" )
|
||||
|
||||
SHOW_FIELD
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and EMe() macros to map the enums to the strings
|
||||
* that will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a, b) {a, b},
|
||||
#define EMe(a, b) {a, b}
|
||||
|
||||
/* V4L2_TC_TYPE_* are macros, not defines, they do not need processing */
|
||||
|
||||
#define show_timecode_type(type) \
|
||||
__print_symbolic(type, \
|
||||
|
|
|
@ -23,15 +23,32 @@
|
|||
{I_REFERENCED, "I_REFERENCED"} \
|
||||
)
|
||||
|
||||
/* enums need to be exported to user space */
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a,b) TRACE_DEFINE_ENUM(a);
|
||||
#define EMe(a,b) TRACE_DEFINE_ENUM(a);
|
||||
|
||||
#define WB_WORK_REASON \
|
||||
{WB_REASON_BACKGROUND, "background"}, \
|
||||
{WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages"}, \
|
||||
{WB_REASON_SYNC, "sync"}, \
|
||||
{WB_REASON_PERIODIC, "periodic"}, \
|
||||
{WB_REASON_LAPTOP_TIMER, "laptop_timer"}, \
|
||||
{WB_REASON_FREE_MORE_MEM, "free_more_memory"}, \
|
||||
{WB_REASON_FS_FREE_SPACE, "fs_free_space"}, \
|
||||
{WB_REASON_FORKER_THREAD, "forker_thread"}
|
||||
EM( WB_REASON_BACKGROUND, "background") \
|
||||
EM( WB_REASON_TRY_TO_FREE_PAGES, "try_to_free_pages") \
|
||||
EM( WB_REASON_SYNC, "sync") \
|
||||
EM( WB_REASON_PERIODIC, "periodic") \
|
||||
EM( WB_REASON_LAPTOP_TIMER, "laptop_timer") \
|
||||
EM( WB_REASON_FREE_MORE_MEM, "free_more_memory") \
|
||||
EM( WB_REASON_FS_FREE_SPACE, "fs_free_space") \
|
||||
EMe(WB_REASON_FORKER_THREAD, "forker_thread")
|
||||
|
||||
WB_WORK_REASON
|
||||
|
||||
/*
|
||||
* Now redefine the EM() and EMe() macros to map the enums to the strings
|
||||
* that will be printed in the output.
|
||||
*/
|
||||
#undef EM
|
||||
#undef EMe
|
||||
#define EM(a,b) { a, b },
|
||||
#define EMe(a,b) { a, b }
|
||||
|
||||
struct wb_writeback_work;
|
||||
|
||||
|
|
|
@ -18,6 +18,34 @@
|
|||
|
||||
#include <linux/ftrace_event.h>
|
||||
|
||||
#ifndef TRACE_SYSTEM_VAR
|
||||
#define TRACE_SYSTEM_VAR TRACE_SYSTEM
|
||||
#endif
|
||||
|
||||
#define __app__(x, y) str__##x##y
|
||||
#define __app(x, y) __app__(x, y)
|
||||
|
||||
#define TRACE_SYSTEM_STRING __app(TRACE_SYSTEM_VAR,__trace_system_name)
|
||||
|
||||
#define TRACE_MAKE_SYSTEM_STR() \
|
||||
static const char TRACE_SYSTEM_STRING[] = \
|
||||
__stringify(TRACE_SYSTEM)
|
||||
|
||||
TRACE_MAKE_SYSTEM_STR();
|
||||
|
||||
#undef TRACE_DEFINE_ENUM
|
||||
#define TRACE_DEFINE_ENUM(a) \
|
||||
static struct trace_enum_map __used __initdata \
|
||||
__##TRACE_SYSTEM##_##a = \
|
||||
{ \
|
||||
.system = TRACE_SYSTEM_STRING, \
|
||||
.enum_string = #a, \
|
||||
.enum_value = a \
|
||||
}; \
|
||||
static struct trace_enum_map __used \
|
||||
__attribute__((section("_ftrace_enum_map"))) \
|
||||
*TRACE_SYSTEM##_##a = &__##TRACE_SYSTEM##_##a
|
||||
|
||||
/*
|
||||
* DECLARE_EVENT_CLASS can be used to add a generic function
|
||||
* handlers for events. That is, if all events have the same
|
||||
|
@ -105,7 +133,6 @@
|
|||
|
||||
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
|
||||
|
||||
|
||||
/*
|
||||
* Stage 2 of the trace events.
|
||||
*
|
||||
|
@ -122,6 +149,9 @@
|
|||
* The size of an array is also encoded, in the higher 16 bits of <item>.
|
||||
*/
|
||||
|
||||
#undef TRACE_DEFINE_ENUM
|
||||
#define TRACE_DEFINE_ENUM(a)
|
||||
|
||||
#undef __field
|
||||
#define __field(type, item)
|
||||
|
||||
|
@ -539,7 +569,7 @@ static inline notrace int ftrace_get_offsets_##call( \
|
|||
* .trace = ftrace_raw_output_<call>, <-- stage 2
|
||||
* };
|
||||
*
|
||||
* static const char print_fmt_<call>[] = <TP_printk>;
|
||||
* static char print_fmt_<call>[] = <TP_printk>;
|
||||
*
|
||||
* static struct ftrace_event_class __used event_class_<template> = {
|
||||
* .system = "<system>",
|
||||
|
@ -690,9 +720,9 @@ static inline void ftrace_test_probe_##call(void) \
|
|||
#undef DECLARE_EVENT_CLASS
|
||||
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
|
||||
_TRACE_PERF_PROTO(call, PARAMS(proto)); \
|
||||
static const char print_fmt_##call[] = print; \
|
||||
static char print_fmt_##call[] = print; \
|
||||
static struct ftrace_event_class __used __refdata event_class_##call = { \
|
||||
.system = __stringify(TRACE_SYSTEM), \
|
||||
.system = TRACE_SYSTEM_STRING, \
|
||||
.define_fields = ftrace_define_fields_##call, \
|
||||
.fields = LIST_HEAD_INIT(event_class_##call.fields),\
|
||||
.raw_init = trace_event_raw_init, \
|
||||
|
@ -719,7 +749,7 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
|
|||
#undef DEFINE_EVENT_PRINT
|
||||
#define DEFINE_EVENT_PRINT(template, call, proto, args, print) \
|
||||
\
|
||||
static const char print_fmt_##call[] = print; \
|
||||
static char print_fmt_##call[] = print; \
|
||||
\
|
||||
static struct ftrace_event_call __used event_##call = { \
|
||||
.class = &event_class_##template, \
|
||||
|
@ -735,6 +765,7 @@ __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call
|
|||
|
||||
#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
|
||||
|
||||
#undef TRACE_SYSTEM_VAR
|
||||
|
||||
#ifdef CONFIG_PERF_EVENTS
|
||||
|
||||
|
|
|
@ -2770,6 +2770,9 @@ static int find_module_sections(struct module *mod, struct load_info *info)
|
|||
mod->trace_events = section_objs(info, "_ftrace_events",
|
||||
sizeof(*mod->trace_events),
|
||||
&mod->num_trace_events);
|
||||
mod->trace_enums = section_objs(info, "_ftrace_enum_map",
|
||||
sizeof(*mod->trace_enums),
|
||||
&mod->num_trace_enums);
|
||||
#endif
|
||||
#ifdef CONFIG_TRACING
|
||||
mod->trace_bprintk_fmt_start = section_objs(info, "__trace_printk_fmt",
|
||||
|
|
|
@ -599,6 +599,34 @@ config RING_BUFFER_STARTUP_TEST
|
|||
|
||||
If unsure, say N
|
||||
|
||||
config TRACE_ENUM_MAP_FILE
|
||||
bool "Show enum mappings for trace events"
|
||||
depends on TRACING
|
||||
help
|
||||
The "print fmt" of the trace events will show the enum names instead
|
||||
of their values. This can cause problems for user space tools that
|
||||
use this string to parse the raw data as user space does not know
|
||||
how to convert the string to its value.
|
||||
|
||||
To fix this, there's a special macro in the kernel that can be used
|
||||
to convert the enum into its value. If this macro is used, then the
|
||||
print fmt strings will have the enums converted to their values.
|
||||
|
||||
If something does not get converted properly, this option can be
|
||||
used to show what enums the kernel tried to convert.
|
||||
|
||||
This option is for debugging the enum conversions. A file is created
|
||||
in the tracing directory called "enum_map" that will show the enum
|
||||
names matched with their values and what trace event system they
|
||||
belong too.
|
||||
|
||||
Normally, the mapping of the strings to values will be freed after
|
||||
boot up or module load. With this option, they will not be freed, as
|
||||
they are needed for the "enum_map" file. Enabling this option will
|
||||
increase the memory footprint of the running kernel.
|
||||
|
||||
If unsure, say N
|
||||
|
||||
endif # FTRACE
|
||||
|
||||
endif # TRACING_SUPPORT
|
||||
|
|
|
@ -249,6 +249,19 @@ static void update_function_graph_func(void);
|
|||
static inline void update_function_graph_func(void) { }
|
||||
#endif
|
||||
|
||||
|
||||
static ftrace_func_t ftrace_ops_get_list_func(struct ftrace_ops *ops)
|
||||
{
|
||||
/*
|
||||
* If this is a dynamic ops or we force list func,
|
||||
* then it needs to call the list anyway.
|
||||
*/
|
||||
if (ops->flags & FTRACE_OPS_FL_DYNAMIC || FTRACE_FORCE_LIST_FUNC)
|
||||
return ftrace_ops_list_func;
|
||||
|
||||
return ftrace_ops_get_func(ops);
|
||||
}
|
||||
|
||||
static void update_ftrace_function(void)
|
||||
{
|
||||
ftrace_func_t func;
|
||||
|
@ -270,7 +283,7 @@ static void update_ftrace_function(void)
|
|||
* then have the mcount trampoline call the function directly.
|
||||
*/
|
||||
} else if (ftrace_ops_list->next == &ftrace_list_end) {
|
||||
func = ftrace_ops_get_func(ftrace_ops_list);
|
||||
func = ftrace_ops_get_list_func(ftrace_ops_list);
|
||||
|
||||
} else {
|
||||
/* Just use the default ftrace_ops */
|
||||
|
@ -5208,13 +5221,6 @@ static void ftrace_ops_recurs_func(unsigned long ip, unsigned long parent_ip,
|
|||
*/
|
||||
ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops)
|
||||
{
|
||||
/*
|
||||
* If this is a dynamic ops or we force list func,
|
||||
* then it needs to call the list anyway.
|
||||
*/
|
||||
if (ops->flags & FTRACE_OPS_FL_DYNAMIC || FTRACE_FORCE_LIST_FUNC)
|
||||
return ftrace_ops_list_func;
|
||||
|
||||
/*
|
||||
* If the func handles its own recursion, call it directly.
|
||||
* Otherwise call the recursion protected function that
|
||||
|
|
|
@ -2679,7 +2679,7 @@ static DEFINE_PER_CPU(unsigned int, current_context);
|
|||
|
||||
static __always_inline int trace_recursive_lock(void)
|
||||
{
|
||||
unsigned int val = this_cpu_read(current_context);
|
||||
unsigned int val = __this_cpu_read(current_context);
|
||||
int bit;
|
||||
|
||||
if (in_interrupt()) {
|
||||
|
@ -2696,18 +2696,14 @@ static __always_inline int trace_recursive_lock(void)
|
|||
return 1;
|
||||
|
||||
val |= (1 << bit);
|
||||
this_cpu_write(current_context, val);
|
||||
__this_cpu_write(current_context, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __always_inline void trace_recursive_unlock(void)
|
||||
{
|
||||
unsigned int val = this_cpu_read(current_context);
|
||||
|
||||
val--;
|
||||
val &= this_cpu_read(current_context);
|
||||
this_cpu_write(current_context, val);
|
||||
__this_cpu_and(current_context, __this_cpu_read(current_context) - 1);
|
||||
}
|
||||
|
||||
#else
|
||||
|
|
|
@ -125,6 +125,42 @@ enum ftrace_dump_mode ftrace_dump_on_oops;
|
|||
/* When set, tracing will stop when a WARN*() is hit */
|
||||
int __disable_trace_on_warning;
|
||||
|
||||
#ifdef CONFIG_TRACE_ENUM_MAP_FILE
|
||||
/* Map of enums to their values, for "enum_map" file */
|
||||
struct trace_enum_map_head {
|
||||
struct module *mod;
|
||||
unsigned long length;
|
||||
};
|
||||
|
||||
union trace_enum_map_item;
|
||||
|
||||
struct trace_enum_map_tail {
|
||||
/*
|
||||
* "end" is first and points to NULL as it must be different
|
||||
* than "mod" or "enum_string"
|
||||
*/
|
||||
union trace_enum_map_item *next;
|
||||
const char *end; /* points to NULL */
|
||||
};
|
||||
|
||||
static DEFINE_MUTEX(trace_enum_mutex);
|
||||
|
||||
/*
|
||||
* The trace_enum_maps are saved in an array with two extra elements,
|
||||
* one at the beginning, and one at the end. The beginning item contains
|
||||
* the count of the saved maps (head.length), and the module they
|
||||
* belong to if not built in (head.mod). The ending item contains a
|
||||
* pointer to the next array of saved enum_map items.
|
||||
*/
|
||||
union trace_enum_map_item {
|
||||
struct trace_enum_map map;
|
||||
struct trace_enum_map_head head;
|
||||
struct trace_enum_map_tail tail;
|
||||
};
|
||||
|
||||
static union trace_enum_map_item *trace_enum_maps;
|
||||
#endif /* CONFIG_TRACE_ENUM_MAP_FILE */
|
||||
|
||||
static int tracing_set_tracer(struct trace_array *tr, const char *buf);
|
||||
|
||||
#define MAX_TRACER_SIZE 100
|
||||
|
@ -3910,6 +3946,182 @@ static const struct file_operations tracing_saved_cmdlines_size_fops = {
|
|||
.write = tracing_saved_cmdlines_size_write,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_TRACE_ENUM_MAP_FILE
|
||||
static union trace_enum_map_item *
|
||||
update_enum_map(union trace_enum_map_item *ptr)
|
||||
{
|
||||
if (!ptr->map.enum_string) {
|
||||
if (ptr->tail.next) {
|
||||
ptr = ptr->tail.next;
|
||||
/* Set ptr to the next real item (skip head) */
|
||||
ptr++;
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void *enum_map_next(struct seq_file *m, void *v, loff_t *pos)
|
||||
{
|
||||
union trace_enum_map_item *ptr = v;
|
||||
|
||||
/*
|
||||
* Paranoid! If ptr points to end, we don't want to increment past it.
|
||||
* This really should never happen.
|
||||
*/
|
||||
ptr = update_enum_map(ptr);
|
||||
if (WARN_ON_ONCE(!ptr))
|
||||
return NULL;
|
||||
|
||||
ptr++;
|
||||
|
||||
(*pos)++;
|
||||
|
||||
ptr = update_enum_map(ptr);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static void *enum_map_start(struct seq_file *m, loff_t *pos)
|
||||
{
|
||||
union trace_enum_map_item *v;
|
||||
loff_t l = 0;
|
||||
|
||||
mutex_lock(&trace_enum_mutex);
|
||||
|
||||
v = trace_enum_maps;
|
||||
if (v)
|
||||
v++;
|
||||
|
||||
while (v && l < *pos) {
|
||||
v = enum_map_next(m, v, &l);
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
static void enum_map_stop(struct seq_file *m, void *v)
|
||||
{
|
||||
mutex_unlock(&trace_enum_mutex);
|
||||
}
|
||||
|
||||
static int enum_map_show(struct seq_file *m, void *v)
|
||||
{
|
||||
union trace_enum_map_item *ptr = v;
|
||||
|
||||
seq_printf(m, "%s %ld (%s)\n",
|
||||
ptr->map.enum_string, ptr->map.enum_value,
|
||||
ptr->map.system);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct seq_operations tracing_enum_map_seq_ops = {
|
||||
.start = enum_map_start,
|
||||
.next = enum_map_next,
|
||||
.stop = enum_map_stop,
|
||||
.show = enum_map_show,
|
||||
};
|
||||
|
||||
static int tracing_enum_map_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
if (tracing_disabled)
|
||||
return -ENODEV;
|
||||
|
||||
return seq_open(filp, &tracing_enum_map_seq_ops);
|
||||
}
|
||||
|
||||
static const struct file_operations tracing_enum_map_fops = {
|
||||
.open = tracing_enum_map_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release,
|
||||
};
|
||||
|
||||
static inline union trace_enum_map_item *
|
||||
trace_enum_jmp_to_tail(union trace_enum_map_item *ptr)
|
||||
{
|
||||
/* Return tail of array given the head */
|
||||
return ptr + ptr->head.length + 1;
|
||||
}
|
||||
|
||||
static void
|
||||
trace_insert_enum_map_file(struct module *mod, struct trace_enum_map **start,
|
||||
int len)
|
||||
{
|
||||
struct trace_enum_map **stop;
|
||||
struct trace_enum_map **map;
|
||||
union trace_enum_map_item *map_array;
|
||||
union trace_enum_map_item *ptr;
|
||||
|
||||
stop = start + len;
|
||||
|
||||
/*
|
||||
* The trace_enum_maps contains the map plus a head and tail item,
|
||||
* where the head holds the module and length of array, and the
|
||||
* tail holds a pointer to the next list.
|
||||
*/
|
||||
map_array = kmalloc(sizeof(*map_array) * (len + 2), GFP_KERNEL);
|
||||
if (!map_array) {
|
||||
pr_warning("Unable to allocate trace enum mapping\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&trace_enum_mutex);
|
||||
|
||||
if (!trace_enum_maps)
|
||||
trace_enum_maps = map_array;
|
||||
else {
|
||||
ptr = trace_enum_maps;
|
||||
for (;;) {
|
||||
ptr = trace_enum_jmp_to_tail(ptr);
|
||||
if (!ptr->tail.next)
|
||||
break;
|
||||
ptr = ptr->tail.next;
|
||||
|
||||
}
|
||||
ptr->tail.next = map_array;
|
||||
}
|
||||
map_array->head.mod = mod;
|
||||
map_array->head.length = len;
|
||||
map_array++;
|
||||
|
||||
for (map = start; (unsigned long)map < (unsigned long)stop; map++) {
|
||||
map_array->map = **map;
|
||||
map_array++;
|
||||
}
|
||||
memset(map_array, 0, sizeof(*map_array));
|
||||
|
||||
mutex_unlock(&trace_enum_mutex);
|
||||
}
|
||||
|
||||
static void trace_create_enum_file(struct dentry *d_tracer)
|
||||
{
|
||||
trace_create_file("enum_map", 0444, d_tracer,
|
||||
NULL, &tracing_enum_map_fops);
|
||||
}
|
||||
|
||||
#else /* CONFIG_TRACE_ENUM_MAP_FILE */
|
||||
static inline void trace_create_enum_file(struct dentry *d_tracer) { }
|
||||
static inline void trace_insert_enum_map_file(struct module *mod,
|
||||
struct trace_enum_map **start, int len) { }
|
||||
#endif /* !CONFIG_TRACE_ENUM_MAP_FILE */
|
||||
|
||||
static void trace_insert_enum_map(struct module *mod,
|
||||
struct trace_enum_map **start, int len)
|
||||
{
|
||||
struct trace_enum_map **map;
|
||||
|
||||
if (len <= 0)
|
||||
return;
|
||||
|
||||
map = start;
|
||||
|
||||
trace_event_enum_update(map, len);
|
||||
|
||||
trace_insert_enum_map_file(mod, start, len);
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
tracing_set_trace_read(struct file *filp, char __user *ubuf,
|
||||
size_t cnt, loff_t *ppos)
|
||||
|
@ -6527,6 +6739,88 @@ struct dentry *tracing_init_dentry(void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
extern struct trace_enum_map *__start_ftrace_enum_maps[];
|
||||
extern struct trace_enum_map *__stop_ftrace_enum_maps[];
|
||||
|
||||
static void __init trace_enum_init(void)
|
||||
{
|
||||
int len;
|
||||
|
||||
len = __stop_ftrace_enum_maps - __start_ftrace_enum_maps;
|
||||
trace_insert_enum_map(NULL, __start_ftrace_enum_maps, len);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
static void trace_module_add_enums(struct module *mod)
|
||||
{
|
||||
if (!mod->num_trace_enums)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Modules with bad taint do not have events created, do
|
||||
* not bother with enums either.
|
||||
*/
|
||||
if (trace_module_has_bad_taint(mod))
|
||||
return;
|
||||
|
||||
trace_insert_enum_map(mod, mod->trace_enums, mod->num_trace_enums);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRACE_ENUM_MAP_FILE
|
||||
static void trace_module_remove_enums(struct module *mod)
|
||||
{
|
||||
union trace_enum_map_item *map;
|
||||
union trace_enum_map_item **last = &trace_enum_maps;
|
||||
|
||||
if (!mod->num_trace_enums)
|
||||
return;
|
||||
|
||||
mutex_lock(&trace_enum_mutex);
|
||||
|
||||
map = trace_enum_maps;
|
||||
|
||||
while (map) {
|
||||
if (map->head.mod == mod)
|
||||
break;
|
||||
map = trace_enum_jmp_to_tail(map);
|
||||
last = &map->tail.next;
|
||||
map = map->tail.next;
|
||||
}
|
||||
if (!map)
|
||||
goto out;
|
||||
|
||||
*last = trace_enum_jmp_to_tail(map)->tail.next;
|
||||
kfree(map);
|
||||
out:
|
||||
mutex_unlock(&trace_enum_mutex);
|
||||
}
|
||||
#else
|
||||
static inline void trace_module_remove_enums(struct module *mod) { }
|
||||
#endif /* CONFIG_TRACE_ENUM_MAP_FILE */
|
||||
|
||||
static int trace_module_notify(struct notifier_block *self,
|
||||
unsigned long val, void *data)
|
||||
{
|
||||
struct module *mod = data;
|
||||
|
||||
switch (val) {
|
||||
case MODULE_STATE_COMING:
|
||||
trace_module_add_enums(mod);
|
||||
break;
|
||||
case MODULE_STATE_GOING:
|
||||
trace_module_remove_enums(mod);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct notifier_block trace_module_nb = {
|
||||
.notifier_call = trace_module_notify,
|
||||
.priority = 0,
|
||||
};
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
static __init int tracer_init_tracefs(void)
|
||||
{
|
||||
struct dentry *d_tracer;
|
||||
|
@ -6551,6 +6845,14 @@ static __init int tracer_init_tracefs(void)
|
|||
trace_create_file("saved_cmdlines_size", 0644, d_tracer,
|
||||
NULL, &tracing_saved_cmdlines_size_fops);
|
||||
|
||||
trace_enum_init();
|
||||
|
||||
trace_create_enum_file(d_tracer);
|
||||
|
||||
#ifdef CONFIG_MODULES
|
||||
register_module_notifier(&trace_module_nb);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
trace_create_file("dyn_ftrace_total_info", 0444, d_tracer,
|
||||
&ftrace_update_tot_cnt, &tracing_dyn_info_fops);
|
||||
|
|
|
@ -1309,8 +1309,10 @@ static inline void init_ftrace_syscalls(void) { }
|
|||
|
||||
#ifdef CONFIG_EVENT_TRACING
|
||||
void trace_event_init(void);
|
||||
void trace_event_enum_update(struct trace_enum_map **map, int len);
|
||||
#else
|
||||
static inline void __init trace_event_init(void) { }
|
||||
static inlin void trace_event_enum_update(struct trace_enum_map **map, int len) { }
|
||||
#endif
|
||||
|
||||
extern struct trace_iterator *tracepoint_print_iter;
|
||||
|
|
|
@ -223,7 +223,7 @@ FTRACE_ENTRY(bprint, bprint_entry,
|
|||
__dynamic_array( u32, buf )
|
||||
),
|
||||
|
||||
F_printk("%pf: %s",
|
||||
F_printk("%ps: %s",
|
||||
(void *)__entry->ip, __entry->fmt),
|
||||
|
||||
FILTER_OTHER
|
||||
|
@ -238,7 +238,7 @@ FTRACE_ENTRY(print, print_entry,
|
|||
__dynamic_array( char, buf )
|
||||
),
|
||||
|
||||
F_printk("%pf: %s",
|
||||
F_printk("%ps: %s",
|
||||
(void *)__entry->ip, __entry->buf),
|
||||
|
||||
FILTER_OTHER
|
||||
|
@ -253,7 +253,7 @@ FTRACE_ENTRY(bputs, bputs_entry,
|
|||
__field( const char *, str )
|
||||
),
|
||||
|
||||
F_printk("%pf: %s",
|
||||
F_printk("%ps: %s",
|
||||
(void *)__entry->ip, __entry->str),
|
||||
|
||||
FILTER_OTHER
|
||||
|
|
|
@ -1704,6 +1704,125 @@ __register_event(struct ftrace_event_call *call, struct module *mod)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static char *enum_replace(char *ptr, struct trace_enum_map *map, int len)
|
||||
{
|
||||
int rlen;
|
||||
int elen;
|
||||
|
||||
/* Find the length of the enum value as a string */
|
||||
elen = snprintf(ptr, 0, "%ld", map->enum_value);
|
||||
/* Make sure there's enough room to replace the string with the value */
|
||||
if (len < elen)
|
||||
return NULL;
|
||||
|
||||
snprintf(ptr, elen + 1, "%ld", map->enum_value);
|
||||
|
||||
/* Get the rest of the string of ptr */
|
||||
rlen = strlen(ptr + len);
|
||||
memmove(ptr + elen, ptr + len, rlen);
|
||||
/* Make sure we end the new string */
|
||||
ptr[elen + rlen] = 0;
|
||||
|
||||
return ptr + elen;
|
||||
}
|
||||
|
||||
static void update_event_printk(struct ftrace_event_call *call,
|
||||
struct trace_enum_map *map)
|
||||
{
|
||||
char *ptr;
|
||||
int quote = 0;
|
||||
int len = strlen(map->enum_string);
|
||||
|
||||
for (ptr = call->print_fmt; *ptr; ptr++) {
|
||||
if (*ptr == '\\') {
|
||||
ptr++;
|
||||
/* paranoid */
|
||||
if (!*ptr)
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
if (*ptr == '"') {
|
||||
quote ^= 1;
|
||||
continue;
|
||||
}
|
||||
if (quote)
|
||||
continue;
|
||||
if (isdigit(*ptr)) {
|
||||
/* skip numbers */
|
||||
do {
|
||||
ptr++;
|
||||
/* Check for alpha chars like ULL */
|
||||
} while (isalnum(*ptr));
|
||||
/*
|
||||
* A number must have some kind of delimiter after
|
||||
* it, and we can ignore that too.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
if (isalpha(*ptr) || *ptr == '_') {
|
||||
if (strncmp(map->enum_string, ptr, len) == 0 &&
|
||||
!isalnum(ptr[len]) && ptr[len] != '_') {
|
||||
ptr = enum_replace(ptr, map, len);
|
||||
/* Hmm, enum string smaller than value */
|
||||
if (WARN_ON_ONCE(!ptr))
|
||||
return;
|
||||
/*
|
||||
* No need to decrement here, as enum_replace()
|
||||
* returns the pointer to the character passed
|
||||
* the enum, and two enums can not be placed
|
||||
* back to back without something in between.
|
||||
* We can skip that something in between.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
skip_more:
|
||||
do {
|
||||
ptr++;
|
||||
} while (isalnum(*ptr) || *ptr == '_');
|
||||
/*
|
||||
* If what comes after this variable is a '.' or
|
||||
* '->' then we can continue to ignore that string.
|
||||
*/
|
||||
if (*ptr == '.' || (ptr[0] == '-' && ptr[1] == '>')) {
|
||||
ptr += *ptr == '.' ? 1 : 2;
|
||||
goto skip_more;
|
||||
}
|
||||
/*
|
||||
* Once again, we can skip the delimiter that came
|
||||
* after the string.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void trace_event_enum_update(struct trace_enum_map **map, int len)
|
||||
{
|
||||
struct ftrace_event_call *call, *p;
|
||||
const char *last_system = NULL;
|
||||
int last_i;
|
||||
int i;
|
||||
|
||||
down_write(&trace_event_sem);
|
||||
list_for_each_entry_safe(call, p, &ftrace_events, list) {
|
||||
/* events are usually grouped together with systems */
|
||||
if (!last_system || call->class->system != last_system) {
|
||||
last_i = 0;
|
||||
last_system = call->class->system;
|
||||
}
|
||||
|
||||
for (i = last_i; i < len; i++) {
|
||||
if (call->class->system == map[i]->system) {
|
||||
/* Save the first system if need be */
|
||||
if (!last_i)
|
||||
last_i = i;
|
||||
update_event_printk(call, map[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
up_write(&trace_event_sem);
|
||||
}
|
||||
|
||||
static struct ftrace_event_file *
|
||||
trace_create_new_event(struct ftrace_event_call *call,
|
||||
struct trace_array *tr)
|
||||
|
@ -1915,7 +2034,7 @@ static int trace_module_notify(struct notifier_block *self,
|
|||
|
||||
static struct notifier_block trace_module_nb = {
|
||||
.notifier_call = trace_module_notify,
|
||||
.priority = 0,
|
||||
.priority = 1, /* higher than trace.c module notify */
|
||||
};
|
||||
#endif /* CONFIG_MODULES */
|
||||
|
||||
|
|
|
@ -177,7 +177,7 @@ struct ftrace_event_call __used event_##call = { \
|
|||
}, \
|
||||
.event.type = etype, \
|
||||
.print_fmt = print, \
|
||||
.flags = TRACE_EVENT_FL_IGNORE_ENABLE | TRACE_EVENT_FL_USE_CALL_FILTER, \
|
||||
.flags = TRACE_EVENT_FL_IGNORE_ENABLE, \
|
||||
}; \
|
||||
struct ftrace_event_call __used \
|
||||
__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
|
||||
|
|
|
@ -250,7 +250,7 @@ DEFINE_FETCH_symbol(string_size)
|
|||
#define fetch_file_offset_string_size NULL
|
||||
|
||||
/* Fetch type information table */
|
||||
const struct fetch_type kprobes_fetch_type_table[] = {
|
||||
static const struct fetch_type kprobes_fetch_type_table[] = {
|
||||
/* Special types */
|
||||
[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
|
||||
sizeof(u32), 1, "__data_loc char[]"),
|
||||
|
@ -760,7 +760,8 @@ static int create_trace_kprobe(int argc, char **argv)
|
|||
|
||||
/* Parse fetch argument */
|
||||
ret = traceprobe_parse_probe_arg(arg, &tk->tp.size, parg,
|
||||
is_return, true);
|
||||
is_return, true,
|
||||
kprobes_fetch_type_table);
|
||||
if (ret) {
|
||||
pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
|
||||
goto error;
|
||||
|
|
|
@ -356,17 +356,14 @@ static int parse_probe_vars(char *arg, const struct fetch_type *t,
|
|||
|
||||
/* Recursive argument parser */
|
||||
static int parse_probe_arg(char *arg, const struct fetch_type *t,
|
||||
struct fetch_param *f, bool is_return, bool is_kprobe)
|
||||
struct fetch_param *f, bool is_return, bool is_kprobe,
|
||||
const struct fetch_type *ftbl)
|
||||
{
|
||||
const struct fetch_type *ftbl;
|
||||
unsigned long param;
|
||||
long offset;
|
||||
char *tmp;
|
||||
int ret = 0;
|
||||
|
||||
ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
|
||||
BUG_ON(ftbl == NULL);
|
||||
|
||||
switch (arg[0]) {
|
||||
case '$':
|
||||
ret = parse_probe_vars(arg + 1, t, f, is_return, is_kprobe);
|
||||
|
@ -447,7 +444,7 @@ static int parse_probe_arg(char *arg, const struct fetch_type *t,
|
|||
dprm->fetch_size = get_fetch_size_function(t,
|
||||
dprm->fetch, ftbl);
|
||||
ret = parse_probe_arg(arg, t2, &dprm->orig, is_return,
|
||||
is_kprobe);
|
||||
is_kprobe, ftbl);
|
||||
if (ret)
|
||||
kfree(dprm);
|
||||
else {
|
||||
|
@ -505,15 +502,12 @@ static int __parse_bitfield_probe_arg(const char *bf,
|
|||
|
||||
/* String length checking wrapper */
|
||||
int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
||||
struct probe_arg *parg, bool is_return, bool is_kprobe)
|
||||
struct probe_arg *parg, bool is_return, bool is_kprobe,
|
||||
const struct fetch_type *ftbl)
|
||||
{
|
||||
const struct fetch_type *ftbl;
|
||||
const char *t;
|
||||
int ret;
|
||||
|
||||
ftbl = is_kprobe ? kprobes_fetch_type_table : uprobes_fetch_type_table;
|
||||
BUG_ON(ftbl == NULL);
|
||||
|
||||
if (strlen(arg) > MAX_ARGSTR_LEN) {
|
||||
pr_info("Argument is too long.: %s\n", arg);
|
||||
return -ENOSPC;
|
||||
|
@ -535,7 +529,8 @@ int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
|||
}
|
||||
parg->offset = *size;
|
||||
*size += parg->type->size;
|
||||
ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return, is_kprobe);
|
||||
ret = parse_probe_arg(arg, parg->type, &parg->fetch, is_return,
|
||||
is_kprobe, ftbl);
|
||||
|
||||
if (ret >= 0 && t != NULL)
|
||||
ret = __parse_bitfield_probe_arg(t, parg->type, &parg->fetch);
|
||||
|
|
|
@ -229,13 +229,6 @@ ASSIGN_FETCH_FUNC(file_offset, ftype), \
|
|||
#define FETCH_TYPE_STRING 0
|
||||
#define FETCH_TYPE_STRSIZE 1
|
||||
|
||||
/*
|
||||
* Fetch type information table.
|
||||
* It's declared as a weak symbol due to conditional compilation.
|
||||
*/
|
||||
extern __weak const struct fetch_type kprobes_fetch_type_table[];
|
||||
extern __weak const struct fetch_type uprobes_fetch_type_table[];
|
||||
|
||||
#ifdef CONFIG_KPROBE_EVENT
|
||||
struct symbol_cache;
|
||||
unsigned long update_symbol_cache(struct symbol_cache *sc);
|
||||
|
@ -333,7 +326,8 @@ find_event_file_link(struct trace_probe *tp, struct ftrace_event_file *file)
|
|||
}
|
||||
|
||||
extern int traceprobe_parse_probe_arg(char *arg, ssize_t *size,
|
||||
struct probe_arg *parg, bool is_return, bool is_kprobe);
|
||||
struct probe_arg *parg, bool is_return, bool is_kprobe,
|
||||
const struct fetch_type *ftbl);
|
||||
|
||||
extern int traceprobe_conflict_field_name(const char *name,
|
||||
struct probe_arg *args, int narg);
|
||||
|
|
|
@ -196,7 +196,7 @@ DEFINE_FETCH_file_offset(string)
|
|||
DEFINE_FETCH_file_offset(string_size)
|
||||
|
||||
/* Fetch type information table */
|
||||
const struct fetch_type uprobes_fetch_type_table[] = {
|
||||
static const struct fetch_type uprobes_fetch_type_table[] = {
|
||||
/* Special types */
|
||||
[FETCH_TYPE_STRING] = __ASSIGN_FETCH_TYPE("string", string, string,
|
||||
sizeof(u32), 1, "__data_loc char[]"),
|
||||
|
@ -535,7 +535,8 @@ static int create_trace_uprobe(int argc, char **argv)
|
|||
|
||||
/* Parse fetch argument */
|
||||
ret = traceprobe_parse_probe_arg(arg, &tu->tp.size, parg,
|
||||
is_return, false);
|
||||
is_return, false,
|
||||
uprobes_fetch_type_table);
|
||||
if (ret) {
|
||||
pr_info("Parse error at argument[%d]. (%d)\n", i, ret);
|
||||
goto error;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include "debug.h"
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "trace.h"
|
||||
#include "trace_msg.h"
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESSAGE_TRACING
|
||||
void __sdata_info(const char *fmt, ...)
|
||||
|
|
|
@ -2312,44 +2312,6 @@ TRACE_EVENT(drv_tdls_recv_channel_switch,
|
|||
)
|
||||
);
|
||||
|
||||
#ifdef CONFIG_MAC80211_MESSAGE_TRACING
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM mac80211_msg
|
||||
|
||||
#define MAX_MSG_LEN 100
|
||||
|
||||
DECLARE_EVENT_CLASS(mac80211_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
|
||||
TP_ARGS(vaf),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(mac80211_msg_event, mac80211_info,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
DEFINE_EVENT(mac80211_msg_event, mac80211_dbg,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
DEFINE_EVENT(mac80211_msg_event, mac80211_err,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
#endif
|
||||
|
||||
#endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
#ifdef CONFIG_MAC80211_MESSAGE_TRACING
|
||||
|
||||
#if !defined(__MAC80211_MSG_DRIVER_TRACE) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define __MAC80211_MSG_DRIVER_TRACE
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
#include <net/mac80211.h>
|
||||
#include "ieee80211_i.h"
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM mac80211_msg
|
||||
|
||||
#define MAX_MSG_LEN 100
|
||||
|
||||
DECLARE_EVENT_CLASS(mac80211_msg_event,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
|
||||
TP_ARGS(vaf),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__dynamic_array(char, msg, MAX_MSG_LEN)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
|
||||
MAX_MSG_LEN, vaf->fmt,
|
||||
*vaf->va) >= MAX_MSG_LEN);
|
||||
),
|
||||
|
||||
TP_printk("%s", __get_str(msg))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(mac80211_msg_event, mac80211_info,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
DEFINE_EVENT(mac80211_msg_event, mac80211_dbg,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
DEFINE_EVENT(mac80211_msg_event, mac80211_err,
|
||||
TP_PROTO(struct va_format *vaf),
|
||||
TP_ARGS(vaf)
|
||||
);
|
||||
#endif /* !__MAC80211_MSG_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */
|
||||
|
||||
#undef TRACE_INCLUDE_PATH
|
||||
#define TRACE_INCLUDE_PATH .
|
||||
#undef TRACE_INCLUDE_FILE
|
||||
#define TRACE_INCLUDE_FILE trace_msg
|
||||
#include <trace/define_trace.h>
|
||||
|
||||
#endif
|
|
@ -22,7 +22,25 @@
|
|||
* protection, just like TRACE_INCLUDE_FILE.
|
||||
*/
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM sample
|
||||
#define TRACE_SYSTEM sample-trace
|
||||
|
||||
/*
|
||||
* TRACE_SYSTEM is expected to be a C valid variable (alpha-numeric
|
||||
* and underscore), although it may start with numbers. If for some
|
||||
* reason it is not, you need to add the following lines:
|
||||
*/
|
||||
#undef TRACE_SYSTEM_VAR
|
||||
#define TRACE_SYSTEM_VAR sample_trace
|
||||
/*
|
||||
* But the above is only needed if TRACE_SYSTEM is not alpha-numeric
|
||||
* and underscored. By default, TRACE_SYSTEM_VAR will be equal to
|
||||
* TRACE_SYSTEM. As TRACE_SYSTEM_VAR must be alpha-numeric, if
|
||||
* TRACE_SYSTEM is not, then TRACE_SYSTEM_VAR must be defined with
|
||||
* only alpha-numeric and underscores.
|
||||
*
|
||||
* The TRACE_SYSTEM_VAR is only used internally and not visible to
|
||||
* user space.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Notice that this file is not protected like a normal header.
|
||||
|
@ -180,8 +198,30 @@ static inline int __length_of(const int *list)
|
|||
;
|
||||
return i;
|
||||
}
|
||||
|
||||
enum {
|
||||
TRACE_SAMPLE_FOO = 2,
|
||||
TRACE_SAMPLE_BAR = 4,
|
||||
TRACE_SAMPLE_ZOO = 8,
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If enums are used in the TP_printk(), their names will be shown in
|
||||
* format files and not their values. This can cause problems with user
|
||||
* space programs that parse the format files to know how to translate
|
||||
* the raw binary trace output into human readable text.
|
||||
*
|
||||
* To help out user space programs, any enum that is used in the TP_printk()
|
||||
* should be defined by TRACE_DEFINE_ENUM() macro. All that is needed to
|
||||
* be done is to add this macro with the enum within it in the trace
|
||||
* header file, and it will be converted in the output.
|
||||
*/
|
||||
|
||||
TRACE_DEFINE_ENUM(TRACE_SAMPLE_FOO);
|
||||
TRACE_DEFINE_ENUM(TRACE_SAMPLE_BAR);
|
||||
TRACE_DEFINE_ENUM(TRACE_SAMPLE_ZOO);
|
||||
|
||||
TRACE_EVENT(foo_bar,
|
||||
|
||||
TP_PROTO(const char *foo, int bar, const int *lst,
|
||||
|
@ -206,7 +246,47 @@ TRACE_EVENT(foo_bar,
|
|||
__assign_bitmask(cpus, cpumask_bits(mask), num_possible_cpus());
|
||||
),
|
||||
|
||||
TP_printk("foo %s %d %s %s (%s)", __entry->foo, __entry->bar,
|
||||
TP_printk("foo %s %d %s %s %s %s (%s)", __entry->foo, __entry->bar,
|
||||
|
||||
/*
|
||||
* Notice here the use of some helper functions. This includes:
|
||||
*
|
||||
* __print_symbolic( variable, { value, "string" }, ... ),
|
||||
*
|
||||
* The variable is tested against each value of the { } pair. If
|
||||
* the variable matches one of the values, then it will print the
|
||||
* string in that pair. If non are matched, it returns a string
|
||||
* version of the number (if __entry->bar == 7 then "7" is returned).
|
||||
*/
|
||||
__print_symbolic(__entry->bar,
|
||||
{ 0, "zero" },
|
||||
{ TRACE_SAMPLE_FOO, "TWO" },
|
||||
{ TRACE_SAMPLE_BAR, "FOUR" },
|
||||
{ TRACE_SAMPLE_ZOO, "EIGHT" },
|
||||
{ 10, "TEN" }
|
||||
),
|
||||
|
||||
/*
|
||||
* __print_flags( variable, "delim", { value, "flag" }, ... ),
|
||||
*
|
||||
* This is similar to __print_symbolic, except that it tests the bits
|
||||
* of the value. If ((FLAG & variable) == FLAG) then the string is
|
||||
* printed. If more than one flag matches, then each one that does is
|
||||
* also printed with delim in between them.
|
||||
* If not all bits are accounted for, then the not found bits will be
|
||||
* added in hex format: 0x506 will show BIT2|BIT4|0x500
|
||||
*/
|
||||
__print_flags(__entry->bar, "|",
|
||||
{ 1, "BIT1" },
|
||||
{ 2, "BIT2" },
|
||||
{ 4, "BIT3" },
|
||||
{ 8, "BIT4" }
|
||||
),
|
||||
/*
|
||||
* __print_array( array, len, element_size )
|
||||
*
|
||||
* This prints out the array that is defined by __array in a nice format.
|
||||
*/
|
||||
__print_array(__get_dynamic_array(list),
|
||||
__get_dynamic_array_len(list),
|
||||
sizeof(int)),
|
||||
|
|
|
@ -3976,7 +3976,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
|
|||
if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
|
||||
goto out_free;
|
||||
|
||||
/* skip the first "%pf: " */
|
||||
/* skip the first "%ps: " */
|
||||
for (ptr = fmt + 5, bptr = data + field->offset;
|
||||
bptr < data + size && *ptr; ptr++) {
|
||||
int ls = 0;
|
||||
|
|
Loading…
Reference in New Issue