Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26a50744 authored by Tom Zanussi's avatar Tom Zanussi Committed by Ingo Molnar
Browse files

tracing/events: Add 'signed' field to format files



The sign info used for filters in the kernel is also useful to
applications that process the trace stream.  Add it to the format
files and make it available to userspace.

Signed-off-by: default avatarTom Zanussi <tzanussi@gmail.com>
Acked-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: rostedt@goodmis.org
Cc: lizf@cn.fujitsu.com
Cc: hch@infradead.org
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <1254809398-8078-2-git-send-email-tzanussi@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent d9b2002c
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -120,9 +120,10 @@
#undef __field
#define __field(type, item)					\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t"	\
			       "offset:%u;\tsize:%u;\n",		\
			       "offset:%u;\tsize:%u;\tsigned:%u;\n",	\
			       (unsigned int)offsetof(typeof(field), item), \
			       (unsigned int)sizeof(field.item));	\
			       (unsigned int)sizeof(field.item),	\
			       (unsigned int)is_signed_type(type));	\
	if (!ret)							\
		return 0;

@@ -132,19 +133,21 @@
#undef __array
#define __array(type, item, len)						\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t"	\
			       "offset:%u;\tsize:%u;\n",		\
			       "offset:%u;\tsize:%u;\tsigned:%u;\n",	\
			       (unsigned int)offsetof(typeof(field), item), \
			       (unsigned int)sizeof(field.item));	\
			       (unsigned int)sizeof(field.item),	\
			       (unsigned int)is_signed_type(type));	\
	if (!ret)							\
		return 0;

#undef __dynamic_array
#define __dynamic_array(type, item, len)				       \
	ret = trace_seq_printf(s, "\tfield:__data_loc " #type "[] " #item ";\t"\
			       "offset:%u;\tsize:%u;\n",		       \
			       "offset:%u;\tsize:%u;\tsigned:%u;\n",	       \
			       (unsigned int)offsetof(typeof(field),	       \
					__data_loc_##item),		       \
			       (unsigned int)sizeof(field.__data_loc_##item)); \
			       (unsigned int)sizeof(field.__data_loc_##item), \
			       (unsigned int)is_signed_type(type));	\
	if (!ret)							       \
		return 0;

+9 −6
Original line number Diff line number Diff line
@@ -397,18 +397,21 @@ int ring_buffer_print_page_header(struct trace_seq *s)
	int ret;

	ret = trace_seq_printf(s, "\tfield: u64 timestamp;\t"
			       "offset:0;\tsize:%u;\n",
			       (unsigned int)sizeof(field.time_stamp));
			       "offset:0;\tsize:%u;\tsigned:%u;\n",
			       (unsigned int)sizeof(field.time_stamp),
			       (unsigned int)is_signed_type(u64));

	ret = trace_seq_printf(s, "\tfield: local_t commit;\t"
			       "offset:%u;\tsize:%u;\n",
			       "offset:%u;\tsize:%u;\tsigned:%u;\n",
			       (unsigned int)offsetof(typeof(field), commit),
			       (unsigned int)sizeof(field.commit));
			       (unsigned int)sizeof(field.commit),
			       (unsigned int)is_signed_type(long));

	ret = trace_seq_printf(s, "\tfield: char data;\t"
			       "offset:%u;\tsize:%u;\n",
			       "offset:%u;\tsize:%u;\tsigned:%u;\n",
			       (unsigned int)offsetof(typeof(field), data),
			       (unsigned int)BUF_PAGE_SIZE);
			       (unsigned int)BUF_PAGE_SIZE,
			       (unsigned int)is_signed_type(char));

	return ret;
}
+12 −12
Original line number Diff line number Diff line
@@ -507,7 +507,7 @@ extern char *__bad_type_size(void);
#define FIELD(type, name)						\
	sizeof(type) != sizeof(field.name) ? __bad_type_size() :	\
	#type, "common_" #name, offsetof(typeof(field), name),		\
		sizeof(field.name)
		sizeof(field.name), is_signed_type(type)

static int trace_write_header(struct trace_seq *s)
{
@@ -515,11 +515,11 @@ static int trace_write_header(struct trace_seq *s)

	/* struct trace_entry */
	return trace_seq_printf(s,
				"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n"
				"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n"
				"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n"
				"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n"
				"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n"
			"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n"
			"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n"
			"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n"
			"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n"
			"\tfield:%s %s;\toffset:%zu;\tsize:%zu;\tsigned:%u;\n"
			"\n",
			FIELD(unsigned short, type),
			FIELD(unsigned char, flags),
+14 −11
Original line number Diff line number Diff line
@@ -66,44 +66,47 @@ static void __used ____ftrace_check_##name(void) \
#undef __field
#define __field(type, item)						\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t"	\
			       "offset:%zu;\tsize:%zu;\n",		\
			       "offset:%zu;\tsize:%zu;\tsigned:%u;\n",	\
			       offsetof(typeof(field), item),		\
			       sizeof(field.item));			\
			       sizeof(field.item), is_signed_type(type)); \
	if (!ret)							\
		return 0;

#undef __field_desc
#define __field_desc(type, container, item)				\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t"	\
			       "offset:%zu;\tsize:%zu;\n",		\
			       "offset:%zu;\tsize:%zu;\tsigned:%u;\n",	\
			       offsetof(typeof(field), container.item),	\
			       sizeof(field.container.item));		\
			       sizeof(field.container.item),		\
			       is_signed_type(type));			\
	if (!ret)							\
		return 0;

#undef __array
#define __array(type, item, len)					\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \
			       "offset:%zu;\tsize:%zu;\n",		\
			       "offset:%zu;\tsize:%zu;\tsigned:%u;\n",	\
			       offsetof(typeof(field), item),		\
			       sizeof(field.item));		\
			       sizeof(field.item), is_signed_type(type)); \
	if (!ret)							\
		return 0;

#undef __array_desc
#define __array_desc(type, container, item, len)			\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item "[" #len "];\t" \
			       "offset:%zu;\tsize:%zu;\n",		\
			       "offset:%zu;\tsize:%zu;\tsigned:%u;\n",	\
			       offsetof(typeof(field), container.item),	\
			       sizeof(field.container.item));		\
			       sizeof(field.container.item),		\
			       is_signed_type(type));			\
	if (!ret)							\
		return 0;

#undef __dynamic_array
#define __dynamic_array(type, item)					\
	ret = trace_seq_printf(s, "\tfield:" #type " " #item ";\t"	\
			       "offset:%zu;\tsize:0;\n",		\
			       offsetof(typeof(field), item));		\
			       "offset:%zu;\tsize:0;\tsigned:%u;\n",	\
			       offsetof(typeof(field), item),		\
			       is_signed_type(type));			\
	if (!ret)							\
		return 0;

+13 −7
Original line number Diff line number Diff line
@@ -103,7 +103,8 @@ extern char *__bad_type_size(void);
#define SYSCALL_FIELD(type, name)					\
	sizeof(type) != sizeof(trace.name) ?				\
		__bad_type_size() :					\
		#type, #name, offsetof(typeof(trace), name), sizeof(trace.name)
		#type, #name, offsetof(typeof(trace), name),		\
		sizeof(trace.name), is_signed_type(type)

int syscall_enter_format(struct ftrace_event_call *call, struct trace_seq *s)
{
@@ -120,7 +121,8 @@ int syscall_enter_format(struct ftrace_event_call *call, struct trace_seq *s)
	if (!entry)
		return 0;

	ret = trace_seq_printf(s, "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n",
	ret = trace_seq_printf(s, "\tfield:%s %s;\toffset:%zu;\tsize:%zu;"
			       "\tsigned:%u;\n",
			       SYSCALL_FIELD(int, nr));
	if (!ret)
		return 0;
@@ -130,8 +132,10 @@ int syscall_enter_format(struct ftrace_event_call *call, struct trace_seq *s)
				        entry->args[i]);
		if (!ret)
			return 0;
		ret = trace_seq_printf(s, "\toffset:%d;\tsize:%zu;\n", offset,
				       sizeof(unsigned long));
		ret = trace_seq_printf(s, "\toffset:%d;\tsize:%zu;"
				       "\tsigned:%u;\n", offset,
				       sizeof(unsigned long),
				       is_signed_type(unsigned long));
		if (!ret)
			return 0;
		offset += sizeof(unsigned long);
@@ -163,8 +167,10 @@ int syscall_exit_format(struct ftrace_event_call *call, struct trace_seq *s)
	struct syscall_trace_exit trace;

	ret = trace_seq_printf(s,
			       "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n"
			       "\tfield:%s %s;\toffset:%zu;\tsize:%zu;\n",
			       "\tfield:%s %s;\toffset:%zu;\tsize:%zu;"
			       "\tsigned:%u;\n"
			       "\tfield:%s %s;\toffset:%zu;\tsize:%zu;"
			       "\tsigned:%u;\n",
			       SYSCALL_FIELD(int, nr),
			       SYSCALL_FIELD(long, ret));
	if (!ret)
@@ -212,7 +218,7 @@ int syscall_exit_define_fields(struct ftrace_event_call *call)
	if (ret)
		return ret;

	ret = trace_define_field(call, SYSCALL_FIELD(long, ret), 0,
	ret = trace_define_field(call, SYSCALL_FIELD(long, ret),
				 FILTER_OTHER);

	return ret;
Loading