Files
twx-linux/sound/core/pcm_trace.h
Sugar Zhang 73a2042551 ALSA: pcm: Add support trace for applptr-start
This patch add trace 'applptr_start' for analyse R/W whether
it's blocked by user or kernel space.

CONFIG_FUNCTION_TRACER
CONFIG_FUNCTION_GRAPH_TRACER
CONFIG_STACK_TRACER
CONFIG_DYNAMIC_FTRACE

/# cd /sys/kernel/debug/tracing
/# echo "snd_pcm:applptr" >> set_event
/# echo "snd_pcm:applptr_start" >> set_event
/# echo "snd_pcm:hwptr" >> set_event
/# echo "snd_pcm:xrun" >> set_event
/# echo 1 > tracing_on
/# cat trace_pipe > trace.txt

149.773314: applptr_start: pcmC1D0c/sub0: size=4096
149.794870: applptr: pcmC1D0c/sub0: prev=0, curr=1024, avail=0, period=1024, buf=4096
149.816192: applptr: pcmC1D0c/sub0: prev=1024, curr=2048, avail=0, period=1024, buf=4096
149.837526: applptr: pcmC1D0c/sub0: prev=2048, curr=3072, avail=0, period=1024, buf=4096
149.858859: applptr: pcmC1D0c/sub0: prev=3072, curr=4096, avail=0, period=1024, buf=4096
149.858871: applptr_start: pcmC1D0c/sub0: size=4096
149.880192: applptr: pcmC1D0c/sub0: prev=4096, curr=5120, avail=0, period=1024, buf=4096
149.901523: applptr: pcmC1D0c/sub0: prev=5120, curr=6144, avail=0, period=1024, buf=4096
149.922857: applptr: pcmC1D0c/sub0: prev=6144, curr=7168, avail=0, period=1024, buf=4096
149.944192: applptr: pcmC1D0c/sub0: prev=7168, curr=8192, avail=0, period=1024, buf=4096
149.944202: applptr_start: pcmC1D0c/sub0: size=4096
149.965524: applptr: pcmC1D0c/sub0: prev=8192, curr=9216, avail=0, period=1024, buf=4096
149.986858: applptr: pcmC1D0c/sub0: prev=9216, curr=10240, avail=0, period=1024, buf=4096
150.008191: applptr: pcmC1D0c/sub0: prev=10240, curr=11264, avail=0, period=1024, buf=4096
150.029529: applptr: pcmC1D0c/sub0: prev=11264, curr=12288, avail=0, period=1024, buf=4096
150.029539: applptr_start: pcmC1D0c/sub0: size=4096
150.050859: applptr: pcmC1D0c/sub0: prev=12288, curr=13312, avail=0, period=1024, buf=4096
150.072191: applptr: pcmC1D0c/sub0: prev=13312, curr=14336, avail=0, period=1024, buf=4096
150.093524: applptr: pcmC1D0c/sub0: prev=14336, curr=15360, avail=0, period=1024, buf=4096
150.114859: applptr: pcmC1D0c/sub0: prev=15360, curr=16384, avail=0, period=1024, buf=4096

Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
Change-Id: I66dad75dc183d887ee413539e3df6d77a90a70f6
2022-08-22 17:42:55 +08:00

176 lines
5.7 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM snd_pcm
#define TRACE_INCLUDE_FILE pcm_trace
#if !defined(_PCM_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
#define _PCM_TRACE_H
#include <linux/tracepoint.h>
TRACE_EVENT(hwptr,
TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t pos, bool irq),
TP_ARGS(substream, pos, irq),
TP_STRUCT__entry(
__field( bool, in_interrupt )
__field( unsigned int, card )
__field( unsigned int, device )
__field( unsigned int, number )
__field( unsigned int, stream )
__field( snd_pcm_uframes_t, pos )
__field( snd_pcm_uframes_t, period_size )
__field( snd_pcm_uframes_t, buffer_size )
__field( snd_pcm_uframes_t, old_hw_ptr )
__field( snd_pcm_uframes_t, hw_ptr_base )
),
TP_fast_assign(
__entry->in_interrupt = (irq);
__entry->card = (substream)->pcm->card->number;
__entry->device = (substream)->pcm->device;
__entry->number = (substream)->number;
__entry->stream = (substream)->stream;
__entry->pos = (pos);
__entry->period_size = (substream)->runtime->period_size;
__entry->buffer_size = (substream)->runtime->buffer_size;
__entry->old_hw_ptr = (substream)->runtime->status->hw_ptr;
__entry->hw_ptr_base = (substream)->runtime->hw_ptr_base;
),
TP_printk("pcmC%dD%d%s/sub%d: %s: pos=%lu, old=%lu, base=%lu, period=%lu, buf=%lu",
__entry->card, __entry->device,
__entry->stream == SNDRV_PCM_STREAM_PLAYBACK ? "p" : "c",
__entry->number,
__entry->in_interrupt ? "IRQ" : "POS",
(unsigned long)__entry->pos,
(unsigned long)__entry->old_hw_ptr,
(unsigned long)__entry->hw_ptr_base,
(unsigned long)__entry->period_size,
(unsigned long)__entry->buffer_size)
);
TRACE_EVENT(xrun,
TP_PROTO(struct snd_pcm_substream *substream),
TP_ARGS(substream),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( unsigned int, device )
__field( unsigned int, number )
__field( unsigned int, stream )
__field( snd_pcm_uframes_t, period_size )
__field( snd_pcm_uframes_t, buffer_size )
__field( snd_pcm_uframes_t, old_hw_ptr )
__field( snd_pcm_uframes_t, hw_ptr_base )
),
TP_fast_assign(
__entry->card = (substream)->pcm->card->number;
__entry->device = (substream)->pcm->device;
__entry->number = (substream)->number;
__entry->stream = (substream)->stream;
__entry->period_size = (substream)->runtime->period_size;
__entry->buffer_size = (substream)->runtime->buffer_size;
__entry->old_hw_ptr = (substream)->runtime->status->hw_ptr;
__entry->hw_ptr_base = (substream)->runtime->hw_ptr_base;
),
TP_printk("pcmC%dD%d%s/sub%d: XRUN: old=%lu, base=%lu, period=%lu, buf=%lu",
__entry->card, __entry->device,
__entry->stream == SNDRV_PCM_STREAM_PLAYBACK ? "p" : "c",
__entry->number,
(unsigned long)__entry->old_hw_ptr,
(unsigned long)__entry->hw_ptr_base,
(unsigned long)__entry->period_size,
(unsigned long)__entry->buffer_size)
);
TRACE_EVENT(hw_ptr_error,
TP_PROTO(struct snd_pcm_substream *substream, const char *why),
TP_ARGS(substream, why),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( unsigned int, device )
__field( unsigned int, number )
__field( unsigned int, stream )
__field( const char *, reason )
),
TP_fast_assign(
__entry->card = (substream)->pcm->card->number;
__entry->device = (substream)->pcm->device;
__entry->number = (substream)->number;
__entry->stream = (substream)->stream;
__entry->reason = (why);
),
TP_printk("pcmC%dD%d%s/sub%d: ERROR: %s",
__entry->card, __entry->device,
__entry->stream == SNDRV_PCM_STREAM_PLAYBACK ? "p" : "c",
__entry->number, __entry->reason)
);
TRACE_EVENT(applptr,
TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t prev, snd_pcm_uframes_t curr),
TP_ARGS(substream, prev, curr),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( unsigned int, device )
__field( unsigned int, number )
__field( unsigned int, stream )
__field( snd_pcm_uframes_t, prev )
__field( snd_pcm_uframes_t, curr )
__field( snd_pcm_uframes_t, avail )
__field( snd_pcm_uframes_t, period_size )
__field( snd_pcm_uframes_t, buffer_size )
),
TP_fast_assign(
__entry->card = (substream)->pcm->card->number;
__entry->device = (substream)->pcm->device;
__entry->number = (substream)->number;
__entry->stream = (substream)->stream;
__entry->prev = (prev);
__entry->curr = (curr);
__entry->avail = (substream)->stream ? snd_pcm_capture_avail(substream->runtime) : snd_pcm_playback_avail(substream->runtime);
__entry->period_size = (substream)->runtime->period_size;
__entry->buffer_size = (substream)->runtime->buffer_size;
),
TP_printk("pcmC%dD%d%s/sub%d: prev=%lu, curr=%lu, avail=%lu, period=%lu, buf=%lu",
__entry->card,
__entry->device,
__entry->stream ? "c" : "p",
__entry->number,
__entry->prev,
__entry->curr,
__entry->avail,
__entry->period_size,
__entry->buffer_size
)
);
TRACE_EVENT(applptr_start,
TP_PROTO(struct snd_pcm_substream *substream, snd_pcm_uframes_t size),
TP_ARGS(substream, size),
TP_STRUCT__entry(
__field( unsigned int, card )
__field( unsigned int, device )
__field( unsigned int, number )
__field( unsigned int, stream )
__field( snd_pcm_uframes_t, size )
),
TP_fast_assign(
__entry->card = (substream)->pcm->card->number;
__entry->device = (substream)->pcm->device;
__entry->number = (substream)->number;
__entry->stream = (substream)->stream;
__entry->size = (size);
),
TP_printk("pcmC%dD%d%s/sub%d: size=%lu",
__entry->card,
__entry->device,
__entry->stream ? "c" : "p",
__entry->number,
__entry->size
)
);
#endif /* _PCM_TRACE_H */
/* This part must be outside protection */
#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#include <trace/define_trace.h>