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

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

tracing/filters: distinguish between signed and unsigned fields



The new filter comparison ops need to be able to distinguish between
signed and unsigned field types, so add an is_signed flag/param to the
event field struct/trace_define_fields().  Also define a simple macro,
is_signed_type() to determine the signedness at compile time, used in the
trace macros.  If the is_signed_type() macro won't work with a specific
type, a new slightly modified version of TRACE_FIELD() called
TRACE_FIELD_SIGN(), allows the signedness to be set explicitly.

[ Impact: extend trace-filter code for new feature ]

Signed-off-by: default avatarTom Zanussi <tzanussi@gmail.com>
Acked-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Cc: fweisbec@gmail.com
Cc: Li Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <1240905893.6416.120.camel@tropicana>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 30e673b2
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -122,8 +122,9 @@ extern int filter_current_check_discard(struct ftrace_event_call *call,
					struct ring_buffer_event *event);

extern int trace_define_field(struct ftrace_event_call *call, char *type,
			      char *name, int offset, int size);
			      char *name, int offset, int size, int is_signed);

#define is_signed_type(type)	(((type)(-1)) < 0)

/*
 * The double __builtin_constant_p is because gcc will give us an error
@@ -144,10 +145,10 @@ do { \
		__trace_printk(ip, fmt, ##args);			\
} while (0)

#define __common_field(type, item)					\
#define __common_field(type, item, is_signed)				\
	ret = trace_define_field(event_call, #type, "common_" #item,	\
				 offsetof(typeof(field.ent), item),	\
				 sizeof(field.ent.item));		\
				 sizeof(field.ent.item), is_signed);	\
	if (ret)							\
		return ret;

+8 −8
Original line number Diff line number Diff line
@@ -225,7 +225,7 @@ ftrace_format_##call(struct trace_seq *s) \
#define __field(type, item)						\
	ret = trace_define_field(event_call, #type, #item,		\
				 offsetof(typeof(field), item),		\
				 sizeof(field.item));			\
				 sizeof(field.item), is_signed_type(type));	\
	if (ret)							\
		return ret;

@@ -234,7 +234,7 @@ ftrace_format_##call(struct trace_seq *s) \
	BUILD_BUG_ON(len > MAX_FILTER_STR_VAL);				\
	ret = trace_define_field(event_call, #type "[" #len "]", #item,	\
				 offsetof(typeof(field), item),		\
				 sizeof(field.item));			\
				 sizeof(field.item), 0);		\
	if (ret)							\
		return ret;

@@ -242,7 +242,7 @@ ftrace_format_##call(struct trace_seq *s) \
#define __string(item, src)						       \
	ret = trace_define_field(event_call, "__str_loc", #item,	       \
				offsetof(typeof(field), __str_loc_##item),     \
				sizeof(field.__str_loc_##item));
				 sizeof(field.__str_loc_##item), 0);

#undef TRACE_EVENT
#define TRACE_EVENT(call, proto, args, tstruct, func, print)		\
@@ -253,11 +253,11 @@ ftrace_define_fields_##call(void) \
	struct ftrace_event_call *event_call = &event_##call;		\
	int ret;							\
									\
	__common_field(int, type);					\
	__common_field(unsigned char, flags);				\
	__common_field(unsigned char, preempt_count);			\
	__common_field(int, pid);					\
	__common_field(int, tgid);					\
	__common_field(int, type, 1);					\
	__common_field(unsigned char, flags, 0);			\
	__common_field(unsigned char, preempt_count, 0);		\
	__common_field(int, pid, 1);					\
	__common_field(int, tgid, 1);					\
									\
	tstruct;							\
									\
+1 −0
Original line number Diff line number Diff line
@@ -729,6 +729,7 @@ struct ftrace_event_field {
	char			*type;
	int			offset;
	int			size;
	int			is_signed;
};

struct event_filter {
+2 −2
Original line number Diff line number Diff line
@@ -141,8 +141,8 @@ TRACE_EVENT_FORMAT(hw_branch, TRACE_HW_BRANCHES, hw_branch_entry, ignore,

TRACE_EVENT_FORMAT(power, TRACE_POWER, trace_power, ignore,
	TRACE_STRUCT(
		TRACE_FIELD(ktime_t, state_data.stamp, stamp)
		TRACE_FIELD(ktime_t, state_data.end, end)
		TRACE_FIELD_SIGN(ktime_t, state_data.stamp, stamp, 1)
		TRACE_FIELD_SIGN(ktime_t, state_data.end, end, 1)
		TRACE_FIELD(int, state_data.type, type)
		TRACE_FIELD(int, state_data.state, state)
	),
+2 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ static DEFINE_MUTEX(event_mutex);
LIST_HEAD(ftrace_events);

int trace_define_field(struct ftrace_event_call *call, char *type,
		       char *name, int offset, int size)
		       char *name, int offset, int size, int is_signed)
{
	struct ftrace_event_field *field;

@@ -44,6 +44,7 @@ int trace_define_field(struct ftrace_event_call *call, char *type,

	field->offset = offset;
	field->size = size;
	field->is_signed = is_signed;
	list_add(&field->link, &call->fields);

	return 0;
Loading