tracing/filter: Optimize short ciruit check
authorSteven Rostedt <srostedt@redhat.com>
Fri, 28 Jan 2011 04:12:05 +0000 (23:12 -0500)
committerSteven Rostedt <rostedt@goodmis.org>
Tue, 8 Feb 2011 01:56:19 +0000 (20:56 -0500)
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>
kernel/trace/trace_events_filter.c

index 1039049..0a3e050 100644 (file)
@@ -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,