From 6ea221519e0c726e28935a2e8d16d555027878ee Mon Sep 17 00:00:00 2001 From: Vivek Goyal Date: Thu, 19 May 2011 15:38:29 -0400 Subject: [PATCH] --- yaml --- r: 251159 b: refs/heads/master c: 575969a0dd3fe65c6556bcb8f87c42303326ea55 h: refs/heads/master i: 251157: 730f3610c2b973149c3cef2886b40744655e22dc 251155: e7d8ed992f031a80b8aa0de6546809fb27a0844b 251151: 4a8cdebc14f356a5aac13699f5cebe9e2794662e v: v3 --- [refs] | 2 +- trunk/block/blk-cgroup.c | 27 ++++++++++++++++++++++----- trunk/block/blk-cgroup.h | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index f759c5210832..f5a3a4fb02ec 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5624a4e445e2ec27582984b068d7bf7f127cee10 +refs/heads/master: 575969a0dd3fe65c6556bcb8f87c42303326ea55 diff --git a/trunk/block/blk-cgroup.c b/trunk/block/blk-cgroup.c index 34bfcefdd924..3622518e1c23 100644 --- a/trunk/block/blk-cgroup.c +++ b/trunk/block/blk-cgroup.c @@ -400,14 +400,25 @@ void blkiocg_update_dispatch_stats(struct blkio_group *blkg, uint64_t bytes, bool direction, bool sync) { struct blkio_group_stats_cpu *stats_cpu; + unsigned long flags; + + /* + * Disabling interrupts to provide mutual exclusion between two + * writes on same cpu. It probably is not needed for 64bit. Not + * optimizing that case yet. + */ + local_irq_save(flags); stats_cpu = this_cpu_ptr(blkg->stats_cpu); + u64_stats_update_begin(&stats_cpu->syncp); stats_cpu->sectors += bytes >> 9; blkio_add_stat(stats_cpu->stat_arr_cpu[BLKIO_STAT_CPU_SERVICED], 1, direction, sync); blkio_add_stat(stats_cpu->stat_arr_cpu[BLKIO_STAT_CPU_SERVICE_BYTES], bytes, direction, sync); + u64_stats_update_end(&stats_cpu->syncp); + local_irq_restore(flags); } EXPORT_SYMBOL_GPL(blkiocg_update_dispatch_stats); @@ -622,15 +633,21 @@ static uint64_t blkio_read_stat_cpu(struct blkio_group *blkg, { int cpu; struct blkio_group_stats_cpu *stats_cpu; - uint64_t val = 0; + u64 val = 0, tval; for_each_possible_cpu(cpu) { + unsigned int start; stats_cpu = per_cpu_ptr(blkg->stats_cpu, cpu); - if (type == BLKIO_STAT_CPU_SECTORS) - val += stats_cpu->sectors; - else - val += stats_cpu->stat_arr_cpu[type][sub_type]; + do { + start = u64_stats_fetch_begin(&stats_cpu->syncp); + if (type == BLKIO_STAT_CPU_SECTORS) + tval = stats_cpu->sectors; + else + tval = stats_cpu->stat_arr_cpu[type][sub_type]; + } while(u64_stats_fetch_retry(&stats_cpu->syncp, start)); + + val += tval; } return val; diff --git a/trunk/block/blk-cgroup.h b/trunk/block/blk-cgroup.h index fd730a24b491..262226798093 100644 --- a/trunk/block/blk-cgroup.h +++ b/trunk/block/blk-cgroup.h @@ -14,6 +14,7 @@ */ #include +#include enum blkio_policy_id { BLKIO_POLICY_PROP = 0, /* Proportional Bandwidth division */ @@ -154,6 +155,7 @@ struct blkio_group_stats { struct blkio_group_stats_cpu { uint64_t sectors; uint64_t stat_arr_cpu[BLKIO_STAT_CPU_NR][BLKIO_STAT_TOTAL]; + struct u64_stats_sync syncp; }; struct blkio_group {