android: binder: Add shrinker tracepoints
authorSherry Yang <sherryy@android.com>
Wed, 23 Aug 2017 15:46:43 +0000 (08:46 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 28 Aug 2017 14:47:17 +0000 (16:47 +0200)
Add tracepoints in binder transaction allocator to
record lru hits and alloc/free page.

Signed-off-by: Sherry Yang <sherryy@android.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/android/binder_alloc.c
drivers/android/binder_trace.h

index 11a08bf72bcce24892403265e7d9fc7d1f35a8d1..78c42c0d62b9a280fc591f36f1022f4049508cd6 100644 (file)
@@ -237,18 +237,25 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
        for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) {
                int ret;
                bool on_lru;
+               size_t index;
 
-               page = &alloc->pages[(page_addr - alloc->buffer) / PAGE_SIZE];
+               index = (page_addr - alloc->buffer) / PAGE_SIZE;
+               page = &alloc->pages[index];
 
                if (page->page_ptr) {
+                       trace_binder_alloc_lru_start(alloc, index);
+
                        on_lru = list_lru_del(&binder_alloc_lru, &page->lru);
                        WARN_ON(!on_lru);
+
+                       trace_binder_alloc_lru_end(alloc, index);
                        continue;
                }
 
                if (WARN_ON(!vma))
                        goto err_page_ptr_cleared;
 
+               trace_binder_alloc_page_start(alloc, index);
                page->page_ptr = alloc_page(GFP_KERNEL |
                                            __GFP_HIGHMEM |
                                            __GFP_ZERO);
@@ -278,6 +285,8 @@ static int binder_update_page_range(struct binder_alloc *alloc, int allocate,
                               alloc->pid, user_page_addr);
                        goto err_vm_insert_page_failed;
                }
+
+               trace_binder_alloc_page_end(alloc, index);
                /* vm_insert_page does not seem to increment the refcount */
        }
        if (mm) {
@@ -290,11 +299,17 @@ free_range:
        for (page_addr = end - PAGE_SIZE; page_addr >= start;
             page_addr -= PAGE_SIZE) {
                bool ret;
+               size_t index;
 
-               page = &alloc->pages[(page_addr - alloc->buffer) / PAGE_SIZE];
+               index = (page_addr - alloc->buffer) / PAGE_SIZE;
+               page = &alloc->pages[index];
+
+               trace_binder_free_lru_start(alloc, index);
 
                ret = list_lru_add(&binder_alloc_lru, &page->lru);
                WARN_ON(!ret);
+
+               trace_binder_free_lru_end(alloc, index);
                continue;
 
 err_vm_insert_page_failed:
@@ -888,18 +903,26 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
                if (!down_write_trylock(&mm->mmap_sem))
                        goto err_down_write_mmap_sem_failed;
 
+               trace_binder_unmap_user_start(alloc, index);
+
                zap_page_range(alloc->vma,
                               page_addr + alloc->user_buffer_offset,
                               PAGE_SIZE);
 
+               trace_binder_unmap_user_end(alloc, index);
+
                up_write(&mm->mmap_sem);
                mmput(mm);
        }
 
+       trace_binder_unmap_kernel_start(alloc, index);
+
        unmap_kernel_range(page_addr, PAGE_SIZE);
        __free_page(page->page_ptr);
        page->page_ptr = NULL;
 
+       trace_binder_unmap_kernel_end(alloc, index);
+
        list_lru_isolate(lru, item);
 
        mutex_unlock(&alloc->mutex);
index 7967db16ba5a653d898c097fd0323a23ec918bc0..76e3b9c8a8a291e60edb23b43b62ff8585c2befd 100644 (file)
@@ -291,6 +291,61 @@ TRACE_EVENT(binder_update_page_range,
                  __entry->offset, __entry->size)
 );
 
+DECLARE_EVENT_CLASS(binder_lru_page_class,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index),
+       TP_STRUCT__entry(
+               __field(int, proc)
+               __field(size_t, page_index)
+       ),
+       TP_fast_assign(
+               __entry->proc = alloc->pid;
+               __entry->page_index = page_index;
+       ),
+       TP_printk("proc=%d page_index=%zu",
+                 __entry->proc, __entry->page_index)
+);
+
+DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_start,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_end,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_free_lru_start,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_free_lru_end,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_start,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_end,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_start,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_end,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_start,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
+DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_end,
+       TP_PROTO(const struct binder_alloc *alloc, size_t page_index),
+       TP_ARGS(alloc, page_index));
+
 TRACE_EVENT(binder_command,
        TP_PROTO(uint32_t cmd),
        TP_ARGS(cmd),