diff options
author | Drew Richardson <drew.richardson@arm.com> | 2012-10-13 12:00:00 -0700 |
---|---|---|
committer | Drew Richardson <drew.richardson@arm.com> | 2014-12-19 15:31:23 -0800 |
commit | b04e8aefeed42f23955e88c7aa1611e49bdf5909 (patch) | |
tree | eeee0f97880889c93457dfe96bdc96e487864506 /driver/gator_events_block.c | |
parent | 5f9955b9c65967a7a62f7860295d8ac187c9ec11 (diff) |
gator: Version 5.125.12
Signed-off-by: Drew Richardson <drew.richardson@arm.com>
Diffstat (limited to 'driver/gator_events_block.c')
-rw-r--r-- | driver/gator_events_block.c | 70 |
1 files changed, 27 insertions, 43 deletions
diff --git a/driver/gator_events_block.c b/driver/gator_events_block.c index a8b8114..b18c3ca 100644 --- a/driver/gator_events_block.c +++ b/driver/gator_events_block.c @@ -25,15 +25,13 @@ static ulong block_rq_wr_enabled; static ulong block_rq_rd_enabled; static ulong block_rq_wr_key; static ulong block_rq_rd_key; -static DEFINE_PER_CPU(int[BLOCK_TOTAL], blockCnt); -static DEFINE_PER_CPU(int[BLOCK_TOTAL * 4], blockGet); -static DEFINE_PER_CPU(bool, new_data_avail); +static atomic_t blockCnt[BLOCK_TOTAL]; +static int blockGet[BLOCK_TOTAL * 4]; GATOR_DEFINE_PROBE(block_rq_complete, TP_PROTO(struct request_queue *q, struct request *rq)) { unsigned long flags; int write, size; - int cpu = smp_processor_id(); if (!rq) return; @@ -47,13 +45,16 @@ GATOR_DEFINE_PROBE(block_rq_complete, TP_PROTO(struct request_queue *q, struct r // disable interrupts to synchronize with gator_events_block_read() // spinlocks not needed since percpu buffers are used local_irq_save(flags); - if (write) - per_cpu(blockCnt, cpu)[BLOCK_RQ_WR] += size; - else - per_cpu(blockCnt, cpu)[BLOCK_RQ_RD] += size; + if (write) { + if (block_rq_wr_enabled) { + atomic_add(size, &blockCnt[BLOCK_RQ_WR]); + } + } else { + if (block_rq_rd_enabled) { + atomic_add(size, &blockCnt[BLOCK_RQ_RD]); + } + } local_irq_restore(flags); - - per_cpu(new_data_avail, cpu) = true; } static int gator_events_block_create_files(struct super_block *sb, struct dentry *root) @@ -81,11 +82,6 @@ static int gator_events_block_create_files(struct super_block *sb, struct dentry static int gator_events_block_start(void) { - int cpu; - - for_each_present_cpu(cpu) - per_cpu(new_data_avail, cpu) = true; - // register tracepoints if (block_rq_wr_enabled || block_rq_rd_enabled) if (GATOR_REGISTER_TRACE(block_rq_complete)) @@ -113,44 +109,32 @@ static void gator_events_block_stop(void) static int gator_events_block_read(int **buffer) { - unsigned long flags; - int len, value, cpu, data = 0; - cpu = smp_processor_id(); + int len, value, data = 0; - if (per_cpu(new_data_avail, cpu) == false) + if (smp_processor_id() != 0) { return 0; - - per_cpu(new_data_avail, cpu) = false; + } len = 0; - if (block_rq_wr_enabled) { - local_irq_save(flags); - value = per_cpu(blockCnt, cpu)[BLOCK_RQ_WR]; - per_cpu(blockCnt, cpu)[BLOCK_RQ_WR] = 0; - local_irq_restore(flags); - per_cpu(blockGet, cpu)[len++] = block_rq_wr_key; - per_cpu(blockGet, cpu)[len++] = 0; // indicates to Streamline that value bytes were written now, not since the last message - per_cpu(blockGet, cpu)[len++] = block_rq_wr_key; - per_cpu(blockGet, cpu)[len++] = value; + if (block_rq_wr_enabled && (value = atomic_read(&blockCnt[BLOCK_RQ_WR])) > 0) { + atomic_sub(value, &blockCnt[BLOCK_RQ_WR]); + blockGet[len++] = block_rq_wr_key; + blockGet[len++] = 0; // indicates to Streamline that value bytes were written now, not since the last message + blockGet[len++] = block_rq_wr_key; + blockGet[len++] = value; data += value; } - if (block_rq_rd_enabled) { - local_irq_save(flags); - value = per_cpu(blockCnt, cpu)[BLOCK_RQ_RD]; - per_cpu(blockCnt, cpu)[BLOCK_RQ_RD] = 0; - local_irq_restore(flags); - per_cpu(blockGet, cpu)[len++] = block_rq_rd_key; - per_cpu(blockGet, cpu)[len++] = 0; // indicates to Streamline that value bytes were read now, not since the last message - per_cpu(blockGet, cpu)[len++] = block_rq_rd_key; - per_cpu(blockGet, cpu)[len++] = value; + if (block_rq_rd_enabled && (value = atomic_read(&blockCnt[BLOCK_RQ_RD])) > 0) { + atomic_sub(value, &blockCnt[BLOCK_RQ_RD]); + blockGet[len++] = block_rq_rd_key; + blockGet[len++] = 0; // indicates to Streamline that value bytes were read now, not since the last message + blockGet[len++] = block_rq_rd_key; + blockGet[len++] = value; data += value; } - if (data != 0) - per_cpu(new_data_avail, cpu) = true; - if (buffer) - *buffer = per_cpu(blockGet, cpu); + *buffer = blockGet; return len; } |