Files
kernel-tenderloin-3.0/kernel
Steven Rostedt 61e9dea20e tracing/filter: Use a tree instead of stack for filter_match_preds()
Currently the filter_match_preds() requires a stack to push
and pop the preds to determine if the filter matches the record or not.
This has two drawbacks:

1) It requires a stack to store state information. As this is done
   in fast paths we can't allocate the storage for this stack, and
   we can't use a global as it must be re-entrant. The stack is stored
   on the kernel stack and this greatly limits how many preds we
   may allow.

2) All conditions are calculated even when a short circuit exists.
   a || b  will always calculate a and b even though a was determined
   to be true.

Using a tree we can walk a constant structure that will save
the state as we go. The algorithm is simply:

  pred = root;
  do {
	switch (move) {
	case MOVE_DOWN:
		if (OR or AND) {
			pred = left;
			continue;
		}
		if (pred == root)
			break;
		match = pred->fn();
		pred = pred->parent;
		move = left child ? MOVE_UP_FROM_LEFT : MOVE_UP_FROM_RIGHT;
		continue;

	case MOVE_UP_FROM_LEFT:
		/* Only OR or AND can be a parent */
		if (match && OR || !match && AND) {
			/* short circuit */
			if (pred == root)
				break;
			pred = pred->parent;
			move = left child ?
				MOVE_UP_FROM_LEFT :
				MOVE_UP_FROM_RIGHT;
			continue;
		}
		pred = pred->right;
		move = MOVE_DOWN;
		continue;

	case MOVE_UP_FROM_RIGHT:
		if (pred == root)
			break;
		pred = pred->parent;
		move = left child ? MOVE_UP_FROM_LEFT : MOVE_UP_FROM_RIGHT;
		continue;
	}
	done = 1;
  } while (!done);

This way there's no strict limit to how many preds we allow
and it also will short circuit the logical operations when possible.

Cc: Tom Zanussi <tzanussi@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
2011-02-07 20:56:19 -05:00
..
2010-12-22 18:57:02 +01:00
2010-08-09 16:48:42 -04:00
2010-07-14 11:29:46 +02:00
2010-10-30 01:42:19 -04:00
2010-11-03 13:49:58 -04:00
2010-10-30 01:42:19 -04:00
2010-10-30 08:45:43 -04:00
2010-10-29 04:17:06 -04:00
2011-01-13 17:32:43 -08:00
2010-12-16 11:36:43 +01:00
2010-11-01 15:38:34 -04:00
2010-10-01 10:50:58 -07:00
2010-08-19 17:18:02 -07:00
2010-11-18 13:27:46 +01:00
2011-02-03 12:21:33 +01:00
2011-01-31 13:01:27 +10:00
2010-12-29 11:31:38 -08:00