Re: [PATCH] trace-cmd: add trace_hash_find_reverse
From: Steven Rostedt
Date: Tue Feb 23 2016 - 17:26:16 EST
On Tue, 15 Dec 2015 11:13:24 -0500
Josef Bacik <jbacik@xxxxxx> wrote:
> Sometimes we want to FIFO identical entries in the hash table, so add
> trace_hash_find_reverse, which will cycle through the hash list in reverse.
> This is helpful in our case where we are monitoring block request issues to
> match with their corresponding completes, if we issue multiple times to the same
> block we want to be able to match them with the correct completes (more or less
> anyway). Thanks,
>
> Signed-off-by: Josef Bacik <jbacik@xxxxxx>
> ---
> list.h | 5 +++++
> trace-hash.c | 22 ++++++++++++++++++++++
> 2 files changed, 27 insertions(+)
>
> diff --git a/list.h b/list.h
> index 9817871..93c64f5 100644
> --- a/list.h
> +++ b/list.h
> @@ -79,4 +79,9 @@ static inline int list_empty(struct list_head *list)
> &(p)->field != list; \
> p = n, n = container_of((p)->field.next, typeof(*p), field))
>
> +#define list_for_each_entry_reverse(p, list, field) \
> + for (p = container_of((list)->prev, typeof(*p), field); \
> + &p->field != list; \
> + p = container_of((p)->field.prev, typeof(*p), field))
> +
> #endif /* __LIST_H */
> diff --git a/trace-hash.c b/trace-hash.c
> index 5ffe61c..0dc4f73 100644
> --- a/trace-hash.c
> +++ b/trace-hash.c
> @@ -94,3 +94,25 @@ trace_hash_find(struct trace_hash *hash, unsigned long long key,
>
> return NULL;
> }
> +
> +struct trace_hash_item *
> +trace_hash_find_reverse(struct trace_hash *hash, unsigned long long key,
> + trace_hash_func match, void *data)
> +{
> + struct trace_hash_item *item;
> + struct list_head *bucket;
> + int bucket_nr = hash->power ? key & hash->power :
> + key % hash->nr_buckets;
> +
> + bucket = hash->buckets + bucket_nr;
> + list_for_each_entry_reverse(item, bucket, list) {
Strange, this doesn't compile.
"struct trace_hash_item has no member named list"
-- Steve
> + if (item->key == key) {
> + if (!match)
> + return item;
> + if (match(item, data))
> + return item;
> + }
> + }
> +
> + return NULL;
> +}