From: Colin Cross Date: Wed, 21 Aug 2013 18:23:12 +0000 (-0700) Subject: ion: index client->handles rbtree by buffer X-Git-Tag: firefly_0821_release~4090^2~505 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=002119eeb221cf1efd7afda836da768ff1cd0ad9;p=firefly-linux-kernel-4.4.55.git ion: index client->handles rbtree by buffer The only remaining users of the client->handles rbtree are iterating through it like a list. Keep the rbtree, but change its index to be the buffer address instead of the handle address, which makes ion_handle_lookup a fast rbtree search. Change-Id: Ie7d974b3a5d9831c0d664de85ddae8db3c3abdf9 Signed-off-by: Colin Cross --- diff --git a/drivers/gpu/ion/ion.c b/drivers/gpu/ion/ion.c index 8d43ad12ea6d..9f73052c3920 100644 --- a/drivers/gpu/ion/ion.c +++ b/drivers/gpu/ion/ion.c @@ -388,13 +388,16 @@ static int ion_handle_put(struct ion_handle *handle) static struct ion_handle *ion_handle_lookup(struct ion_client *client, struct ion_buffer *buffer) { - struct rb_node *n; - - for (n = rb_first(&client->handles); n; n = rb_next(n)) { - struct ion_handle *handle = rb_entry(n, struct ion_handle, - node); - if (handle->buffer == buffer) - return handle; + struct rb_node *n = client->handles.rb_node; + + while (n) { + struct ion_handle *entry = rb_entry(n, struct ion_handle, node); + if (buffer < entry->buffer) + n = n->rb_left; + else if (buffer > entry->buffer) + n = n->rb_right; + else + return entry; } return ERR_PTR(-EINVAL); } @@ -432,9 +435,9 @@ static int ion_handle_add(struct ion_client *client, struct ion_handle *handle) parent = *p; entry = rb_entry(parent, struct ion_handle, node); - if (handle < entry) + if (handle->buffer < entry->buffer) p = &(*p)->rb_left; - else if (handle > entry) + else if (handle->buffer > entry->buffer) p = &(*p)->rb_right; else WARN(1, "%s: buffer already found.", __func__);