lkml.org 
[lkml]   [2011]   [Aug]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv2 08/10] tracing/filter: Change fold_pred function to use walk_pred_tree
    Date
    Changing fold_pred_tree function to use unified predicates tree
    processing.

    Signed-off-by: Jiri Olsa <jolsa@redhat.com>
    ---
    kernel/trace/trace_events_filter.c | 68 +++++++++++++++++------------------
    1 files changed, 33 insertions(+), 35 deletions(-)

    diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
    index d8aa100..f44e68b 100644
    --- a/kernel/trace/trace_events_filter.c
    +++ b/kernel/trace/trace_events_filter.c
    @@ -1439,13 +1439,40 @@ static int count_leafs(struct filter_pred *preds, struct filter_pred *root)
    return count;
    }

    +struct fold_pred_data {
    + struct filter_pred *root;
    + int count;
    + int children;
    +};
    +
    +static int fold_pred_cb(enum move_type move, struct filter_pred *pred,
    + int *err, void *data)
    +{
    + struct fold_pred_data *d = data;
    + struct filter_pred *root = d->root;
    +
    + if (move != MOVE_DOWN)
    + return WALK_PRED_DEFAULT;
    + if (pred->left != FILTER_PRED_INVALID)
    + return WALK_PRED_DEFAULT;
    +
    + if (WARN_ON(d->count == d->children)) {
    + *err = -EINVAL;
    + return WALK_PRED_ABORT;
    + }
    +
    + pred->index &= ~FILTER_PRED_FOLD;
    + root->ops[d->count++] = pred->index;
    + return WALK_PRED_DEFAULT;
    +}
    +
    static int fold_pred(struct filter_pred *preds, struct filter_pred *root)
    {
    - struct filter_pred *pred;
    - enum move_type move = MOVE_DOWN;
    - int count = 0;
    + struct fold_pred_data data = {
    + .root = root,
    + .count = 0,
    + };
    int children;
    - int done = 0;

    /* No need to keep the fold flag */
    root->index &= ~FILTER_PRED_FOLD;
    @@ -1463,37 +1490,8 @@ static int fold_pred(struct filter_pred *preds, struct filter_pred *root)
    return -ENOMEM;

    root->val = children;
    -
    - pred = root;
    - do {
    - switch (move) {
    - case MOVE_DOWN:
    - if (pred->left != FILTER_PRED_INVALID) {
    - pred = &preds[pred->left];
    - continue;
    - }
    - if (WARN_ON(count == children))
    - return -EINVAL;
    - pred->index &= ~FILTER_PRED_FOLD;
    - root->ops[count++] = pred->index;
    - pred = get_pred_parent(pred, preds,
    - pred->parent, &move);
    - continue;
    - case MOVE_UP_FROM_LEFT:
    - pred = &preds[pred->right];
    - move = MOVE_DOWN;
    - continue;
    - case MOVE_UP_FROM_RIGHT:
    - if (pred == root)
    - break;
    - pred = get_pred_parent(pred, preds,
    - pred->parent, &move);
    - continue;
    - }
    - done = 1;
    - } while (!done);
    -
    - return 0;
    + data.children = children;
    + return walk_pred_tree(preds, root, fold_pred_cb, &data);
    }

    static int fold_pred_tree_cb(enum move_type move, struct filter_pred *pred,
    --
    1.7.1


    \
     
     \ /
      Last update: 2011-08-11 16:29    [W:6.599 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site