Messages in this thread | | | Date | Tue, 23 Feb 2016 17:26:07 -0500 | From | Steven Rostedt <> | Subject | Re: [PATCH] trace-cmd: add trace_hash_find_reverse |
| |
On Tue, 15 Dec 2015 11:13:24 -0500 Josef Bacik <jbacik@fb.com> 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@fb.com> > --- > 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; > +}
| |