From ebd7047863765109b7ddc20aba27685a210e09f8 Mon Sep 17 00:00:00 2001 From: Mirsal Ennaime Date: Tue, 12 Mar 2013 11:42:00 +0100 Subject: [PATCH] --- yaml --- r: 363647 b: refs/heads/master c: 53413e7dcba9c5e931352f0588fc3bb95b700f15 h: refs/heads/master i: 363645: 9ce178964b74c98dfa41dfa732ea99c762539294 363643: fb6cc905e958369003ac4bd089476b15b32e873e 363639: 778fa249ef77717a9b17a95f02fd08429cb5914d 363631: 640cb3052807d538c7d3db9859aabc5b70867060 363615: d5765ff8f9b77916d36e9cbb466670cc26ce541d 363583: 37c753ed6b5955e01e9161c577299305695e3bc1 363519: 6ef3bf2c2872fd85e054f16fa04a3a4d40e83713 v: v3 --- [refs] | 2 +- trunk/drivers/staging/android/binder.c | 32 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 17ba8d3a66a1..bcfbfb1454ab 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 008fa749e0fe5b2fffd20b7fe4891bb80d072c6a +refs/heads/master: 53413e7dcba9c5e931352f0588fc3bb95b700f15 diff --git a/trunk/drivers/staging/android/binder.c b/trunk/drivers/staging/android/binder.c index 9180a5b1f54d..ccf3087100e8 100644 --- a/trunk/drivers/staging/android/binder.c +++ b/trunk/drivers/staging/android/binder.c @@ -2927,12 +2927,14 @@ static void binder_deferred_release(struct binder_proc *proc) { struct binder_transaction *t; struct rb_node *n; - int threads, nodes, incoming_refs, outgoing_refs, buffers, active_transactions, page_count; + int threads, nodes, incoming_refs, outgoing_refs, buffers, + active_transactions, page_count; BUG_ON(proc->vma); BUG_ON(proc->files); hlist_del(&proc->proc_node); + if (binder_context_mgr_node && binder_context_mgr_node->proc == proc) { binder_debug(BINDER_DEBUG_DEAD_BINDER, "binder_release: %d context_mgr_node gone\n", @@ -2943,33 +2945,42 @@ static void binder_deferred_release(struct binder_proc *proc) threads = 0; active_transactions = 0; while ((n = rb_first(&proc->threads))) { - struct binder_thread *thread = rb_entry(n, struct binder_thread, rb_node); + struct binder_thread *thread; + + thread = rb_entry(n, struct binder_thread, rb_node); threads++; active_transactions += binder_free_thread(proc, thread); } + nodes = 0; incoming_refs = 0; while ((n = rb_first(&proc->nodes))) { - struct binder_node *node = rb_entry(n, struct binder_node, rb_node); + struct binder_node *node; + node = rb_entry(n, struct binder_node, rb_node); nodes++; rb_erase(&node->rb_node, &proc->nodes); incoming_refs = binder_node_release(node, incoming_refs); } + outgoing_refs = 0; while ((n = rb_first(&proc->refs_by_desc))) { - struct binder_ref *ref = rb_entry(n, struct binder_ref, - rb_node_desc); + struct binder_ref *ref; + + ref = rb_entry(n, struct binder_ref, rb_node_desc); outgoing_refs++; binder_delete_ref(ref); } + binder_release_work(&proc->todo); binder_release_work(&proc->delivered_death); - buffers = 0; + buffers = 0; while ((n = rb_first(&proc->allocated_buffers))) { - struct binder_buffer *buffer = rb_entry(n, struct binder_buffer, - rb_node); + struct binder_buffer *buffer; + + buffer = rb_entry(n, struct binder_buffer, rb_node); + t = buffer->transaction; if (t) { t->buffer = NULL; @@ -2978,6 +2989,7 @@ static void binder_deferred_release(struct binder_proc *proc) proc->pid, t->debug_id); /*BUG();*/ } + binder_free_buf(proc, buffer); buffers++; } @@ -2987,13 +2999,13 @@ static void binder_deferred_release(struct binder_proc *proc) page_count = 0; if (proc->pages) { int i; + for (i = 0; i < proc->buffer_size / PAGE_SIZE; i++) { if (proc->pages[i]) { void *page_addr = proc->buffer + i * PAGE_SIZE; binder_debug(BINDER_DEBUG_BUFFER_ALLOC, "binder_release: %d: page %d at %p not freed\n", - proc->pid, i, - page_addr); + proc->pid, i, page_addr); unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); __free_page(proc->pages[i]);