|
@@ -25,7 +25,6 @@
|
|
#include <linux/time.h>
|
|
#include <linux/time.h>
|
|
#include <asm/uaccess.h>
|
|
#include <asm/uaccess.h>
|
|
|
|
|
|
-static DEFINE_PER_CPU(unsigned long long, blk_trace_cpu_offset) = { 0, };
|
|
|
|
static unsigned int blktrace_seq __read_mostly = 1;
|
|
static unsigned int blktrace_seq __read_mostly = 1;
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -41,7 +40,7 @@ static void trace_note(struct blk_trace *bt, pid_t pid, int action,
|
|
const int cpu = smp_processor_id();
|
|
const int cpu = smp_processor_id();
|
|
|
|
|
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
|
- t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
|
|
|
|
|
|
+ t->time = ktime_to_ns(ktime_get());
|
|
t->device = bt->dev;
|
|
t->device = bt->dev;
|
|
t->action = action;
|
|
t->action = action;
|
|
t->pid = pid;
|
|
t->pid = pid;
|
|
@@ -159,7 +158,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
|
|
|
|
|
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
|
t->magic = BLK_IO_TRACE_MAGIC | BLK_IO_TRACE_VERSION;
|
|
t->sequence = ++(*sequence);
|
|
t->sequence = ++(*sequence);
|
|
- t->time = cpu_clock(cpu) - per_cpu(blk_trace_cpu_offset, cpu);
|
|
|
|
|
|
+ t->time = ktime_to_ns(ktime_get());
|
|
t->sector = sector;
|
|
t->sector = sector;
|
|
t->bytes = bytes;
|
|
t->bytes = bytes;
|
|
t->action = what;
|
|
t->action = what;
|
|
@@ -179,7 +178,7 @@ void __blk_add_trace(struct blk_trace *bt, sector_t sector, int bytes,
|
|
EXPORT_SYMBOL_GPL(__blk_add_trace);
|
|
EXPORT_SYMBOL_GPL(__blk_add_trace);
|
|
|
|
|
|
static struct dentry *blk_tree_root;
|
|
static struct dentry *blk_tree_root;
|
|
-static struct mutex blk_tree_mutex;
|
|
|
|
|
|
+static DEFINE_MUTEX(blk_tree_mutex);
|
|
static unsigned int root_users;
|
|
static unsigned int root_users;
|
|
|
|
|
|
static inline void blk_remove_root(void)
|
|
static inline void blk_remove_root(void)
|
|
@@ -505,77 +504,3 @@ void blk_trace_shutdown(struct request_queue *q)
|
|
blk_trace_remove(q);
|
|
blk_trace_remove(q);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Average offset over two calls to cpu_clock() with a gettimeofday()
|
|
|
|
- * in the middle
|
|
|
|
- */
|
|
|
|
-static void blk_check_time(unsigned long long *t, int this_cpu)
|
|
|
|
-{
|
|
|
|
- unsigned long long a, b;
|
|
|
|
- struct timeval tv;
|
|
|
|
-
|
|
|
|
- a = cpu_clock(this_cpu);
|
|
|
|
- do_gettimeofday(&tv);
|
|
|
|
- b = cpu_clock(this_cpu);
|
|
|
|
-
|
|
|
|
- *t = tv.tv_sec * 1000000000 + tv.tv_usec * 1000;
|
|
|
|
- *t -= (a + b) / 2;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * calibrate our inter-CPU timings
|
|
|
|
- */
|
|
|
|
-static void blk_trace_check_cpu_time(void *data)
|
|
|
|
-{
|
|
|
|
- unsigned long long *t;
|
|
|
|
- int this_cpu = get_cpu();
|
|
|
|
-
|
|
|
|
- t = &per_cpu(blk_trace_cpu_offset, this_cpu);
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Just call it twice, hopefully the second call will be cache hot
|
|
|
|
- * and a little more precise
|
|
|
|
- */
|
|
|
|
- blk_check_time(t, this_cpu);
|
|
|
|
- blk_check_time(t, this_cpu);
|
|
|
|
-
|
|
|
|
- put_cpu();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void blk_trace_set_ht_offsets(void)
|
|
|
|
-{
|
|
|
|
-#if defined(CONFIG_SCHED_SMT)
|
|
|
|
- int cpu, i;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * now make sure HT siblings have the same time offset
|
|
|
|
- */
|
|
|
|
- preempt_disable();
|
|
|
|
- for_each_online_cpu(cpu) {
|
|
|
|
- unsigned long long *cpu_off, *sibling_off;
|
|
|
|
-
|
|
|
|
- for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu)) {
|
|
|
|
- if (i == cpu)
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- cpu_off = &per_cpu(blk_trace_cpu_offset, cpu);
|
|
|
|
- sibling_off = &per_cpu(blk_trace_cpu_offset, i);
|
|
|
|
- *sibling_off = *cpu_off;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- preempt_enable();
|
|
|
|
-#endif
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static __init int blk_trace_init(void)
|
|
|
|
-{
|
|
|
|
- mutex_init(&blk_tree_mutex);
|
|
|
|
- on_each_cpu(blk_trace_check_cpu_time, NULL, 1, 1);
|
|
|
|
- blk_trace_set_ht_offsets();
|
|
|
|
-
|
|
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-module_init(blk_trace_init);
|
|
|
|
-
|
|
|