aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/android/binder.c
diff options
context:
space:
mode:
authorBadhri Jagan Sridharan <Badhri@google.com>2017-06-29 15:01:44 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-07-17 08:47:29 -0400
commit0953c7976c36ce06a4e92b9a23cfb8f1bbe2321f (patch)
treee73393908dfe054216ca6cbe87a96b21a8773734 /drivers/android/binder.c
parentc44b1231ff1170971c1f27fc33a8cc3188de99cb (diff)
binder: change binder_stats to atomics
Use atomics for stats to avoid needing to lock for increments/decrements Signed-off-by: Todd Kjos <tkjos@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/android/binder.c')
-rw-r--r--drivers/android/binder.c48
1 files changed, 28 insertions, 20 deletions
diff --git a/drivers/android/binder.c b/drivers/android/binder.c
index fb484c6acd3e..cd4191d027e1 100644
--- a/drivers/android/binder.c
+++ b/drivers/android/binder.c
@@ -167,22 +167,22 @@ enum binder_stat_types {
167}; 167};
168 168
169struct binder_stats { 169struct binder_stats {
170 int br[_IOC_NR(BR_FAILED_REPLY) + 1]; 170 atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1];
171 int bc[_IOC_NR(BC_REPLY_SG) + 1]; 171 atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1];
172 int obj_created[BINDER_STAT_COUNT]; 172 atomic_t obj_created[BINDER_STAT_COUNT];
173 int obj_deleted[BINDER_STAT_COUNT]; 173 atomic_t obj_deleted[BINDER_STAT_COUNT];
174}; 174};
175 175
176static struct binder_stats binder_stats; 176static struct binder_stats binder_stats;
177 177
178static inline void binder_stats_deleted(enum binder_stat_types type) 178static inline void binder_stats_deleted(enum binder_stat_types type)
179{ 179{
180 binder_stats.obj_deleted[type]++; 180 atomic_inc(&binder_stats.obj_deleted[type]);
181} 181}
182 182
183static inline void binder_stats_created(enum binder_stat_types type) 183static inline void binder_stats_created(enum binder_stat_types type)
184{ 184{
185 binder_stats.obj_created[type]++; 185 atomic_inc(&binder_stats.obj_created[type]);
186} 186}
187 187
188struct binder_transaction_log_entry { 188struct binder_transaction_log_entry {
@@ -1825,9 +1825,9 @@ static int binder_thread_write(struct binder_proc *proc,
1825 ptr += sizeof(uint32_t); 1825 ptr += sizeof(uint32_t);
1826 trace_binder_command(cmd); 1826 trace_binder_command(cmd);
1827 if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.bc)) { 1827 if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.bc)) {
1828 binder_stats.bc[_IOC_NR(cmd)]++; 1828 atomic_inc(&binder_stats.bc[_IOC_NR(cmd)]);
1829 proc->stats.bc[_IOC_NR(cmd)]++; 1829 atomic_inc(&proc->stats.bc[_IOC_NR(cmd)]);
1830 thread->stats.bc[_IOC_NR(cmd)]++; 1830 atomic_inc(&thread->stats.bc[_IOC_NR(cmd)]);
1831 } 1831 }
1832 switch (cmd) { 1832 switch (cmd) {
1833 case BC_INCREFS: 1833 case BC_INCREFS:
@@ -2201,9 +2201,9 @@ static void binder_stat_br(struct binder_proc *proc,
2201{ 2201{
2202 trace_binder_return(cmd); 2202 trace_binder_return(cmd);
2203 if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.br)) { 2203 if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.br)) {
2204 binder_stats.br[_IOC_NR(cmd)]++; 2204 atomic_inc(&binder_stats.br[_IOC_NR(cmd)]);
2205 proc->stats.br[_IOC_NR(cmd)]++; 2205 atomic_inc(&proc->stats.br[_IOC_NR(cmd)]);
2206 thread->stats.br[_IOC_NR(cmd)]++; 2206 atomic_inc(&thread->stats.br[_IOC_NR(cmd)]);
2207 } 2207 }
2208} 2208}
2209 2209
@@ -3453,17 +3453,21 @@ static void print_binder_stats(struct seq_file *m, const char *prefix,
3453 BUILD_BUG_ON(ARRAY_SIZE(stats->bc) != 3453 BUILD_BUG_ON(ARRAY_SIZE(stats->bc) !=
3454 ARRAY_SIZE(binder_command_strings)); 3454 ARRAY_SIZE(binder_command_strings));
3455 for (i = 0; i < ARRAY_SIZE(stats->bc); i++) { 3455 for (i = 0; i < ARRAY_SIZE(stats->bc); i++) {
3456 if (stats->bc[i]) 3456 int temp = atomic_read(&stats->bc[i]);
3457
3458 if (temp)
3457 seq_printf(m, "%s%s: %d\n", prefix, 3459 seq_printf(m, "%s%s: %d\n", prefix,
3458 binder_command_strings[i], stats->bc[i]); 3460 binder_command_strings[i], temp);
3459 } 3461 }
3460 3462
3461 BUILD_BUG_ON(ARRAY_SIZE(stats->br) != 3463 BUILD_BUG_ON(ARRAY_SIZE(stats->br) !=
3462 ARRAY_SIZE(binder_return_strings)); 3464 ARRAY_SIZE(binder_return_strings));
3463 for (i = 0; i < ARRAY_SIZE(stats->br); i++) { 3465 for (i = 0; i < ARRAY_SIZE(stats->br); i++) {
3464 if (stats->br[i]) 3466 int temp = atomic_read(&stats->br[i]);
3467
3468 if (temp)
3465 seq_printf(m, "%s%s: %d\n", prefix, 3469 seq_printf(m, "%s%s: %d\n", prefix,
3466 binder_return_strings[i], stats->br[i]); 3470 binder_return_strings[i], temp);
3467 } 3471 }
3468 3472
3469 BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) != 3473 BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) !=
@@ -3471,11 +3475,15 @@ static void print_binder_stats(struct seq_file *m, const char *prefix,
3471 BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) != 3475 BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) !=
3472 ARRAY_SIZE(stats->obj_deleted)); 3476 ARRAY_SIZE(stats->obj_deleted));
3473 for (i = 0; i < ARRAY_SIZE(stats->obj_created); i++) { 3477 for (i = 0; i < ARRAY_SIZE(stats->obj_created); i++) {
3474 if (stats->obj_created[i] || stats->obj_deleted[i]) 3478 int created = atomic_read(&stats->obj_created[i]);
3475 seq_printf(m, "%s%s: active %d total %d\n", prefix, 3479 int deleted = atomic_read(&stats->obj_deleted[i]);
3480
3481 if (created || deleted)
3482 seq_printf(m, "%s%s: active %d total %d\n",
3483 prefix,
3476 binder_objstat_strings[i], 3484 binder_objstat_strings[i],
3477 stats->obj_created[i] - stats->obj_deleted[i], 3485 created - deleted,
3478 stats->obj_created[i]); 3486 created);
3479 } 3487 }
3480} 3488}
3481 3489