Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 363647
b: refs/heads/master
c: 53413e7
h: refs/heads/master
i:
  363645: 9ce1789
  363643: fb6cc90
  363639: 778fa24
  363631: 640cb30
  363615: d5765ff
  363583: 37c753e
  363519: 6ef3bf2
v: v3
  • Loading branch information
Mirsal Ennaime authored and Greg Kroah-Hartman committed Mar 25, 2013
1 parent 989c5e4 commit ebd7047
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 008fa749e0fe5b2fffd20b7fe4891bb80d072c6a
refs/heads/master: 53413e7dcba9c5e931352f0588fc3bb95b700f15
32 changes: 22 additions & 10 deletions trunk/drivers/staging/android/binder.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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;
Expand All @@ -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++;
}
Expand All @@ -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]);
Expand Down

0 comments on commit ebd7047

Please sign in to comment.