summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-01-27 23:12:05 -0500
committerSteven Rostedt <rostedt@goodmis.org>2011-02-07 20:56:19 -0500
commit55719274188f13cff9e3bd11fdd4c0e7617cd03d (patch)
treee9291f7b720e9a1723f94b69ec381360ca275ce2
parent61e9dea20e1ada886cc49a9ec6fe3c6ac0de7324 (diff)
downloadlinux-stable-55719274188f13cff9e3bd11fdd4c0e7617cd03d.tar.gz
linux-stable-55719274188f13cff9e3bd11fdd4c0e7617cd03d.tar.bz2
linux-stable-55719274188f13cff9e3bd11fdd4c0e7617cd03d.zip
tracing/filter: Optimize short ciruit check
The test if we should break out early for OR and AND operations can be optimized by comparing the current result with (pred->op == OP_OR) That is if the result is true and the op is an OP_OR, or if the result is false and the op is not an OP_OR (thus an OP_AND) we can break out early in either case. Otherwise we continue processing. Cc: Tom Zanussi <tzanussi@gmail.com> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kernel/trace/trace_events_filter.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 10390491b6d0..0a3e0502b507 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -426,9 +426,15 @@ int filter_match_preds(struct event_filter *filter, void *rec)
pred->parent, &move);
continue;
case MOVE_UP_FROM_LEFT:
- /* Check for short circuits */
- if ((match && pred->op == OP_OR) ||
- (!match && pred->op == OP_AND)) {
+ /*
+ * Check for short circuits.
+ *
+ * Optimization: !!match == (pred->op == OP_OR)
+ * is the same as:
+ * if ((match && pred->op == OP_OR) ||
+ * (!match && pred->op == OP_AND))
+ */
+ if (!!match == (pred->op == OP_OR)) {
if (pred == root)
break;
pred = get_pred_parent(pred, preds,