5 class Jdb_kern_info_bench : public Jdb_kern_info_module
8 static Unsigned64 get_time_now();
9 static void show_arch();
12 //---------------------------------------------------------------------------
15 static Jdb_kern_info_bench k_a INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
18 Jdb_kern_info_bench::Jdb_kern_info_bench()
19 : Jdb_kern_info_module('b', "Benchmark privileged instructions")
21 Jdb_kern_info::register_subcmd(this);
26 Jdb_kern_info_bench::show()
32 //---------------------------------------------------------------------------
37 Jdb_kern_info_bench::do_mp_benchmark()
40 //---------------------------------------------------------------------------
41 IMPLEMENTATION [mp && (ia32 || amd64)]:
47 Jdb_kern_info_bench::stop_timer()
49 Timer_tick::set_vectors_stop();
52 //---------------------------------------------------------------------------
53 IMPLEMENTATION [mp && !(ia32 || amd64)]:
57 Jdb_kern_info_bench::stop_timer()
60 //---------------------------------------------------------------------------
65 static int volatile ipi_bench_spin_done;
70 Jdb_kern_info_bench::wait_for_ipi(Cpu_number cpu)
72 Jdb::restore_irqs(cpu);
76 while (!ipi_bench_spin_done)
80 Jdb::save_disable_irqs(cpu);
85 Jdb_kern_info_bench::empty_func(Cpu_number, void *)
92 Jdb_kern_info_bench::do_ipi_bench(Cpu_number my_cpu, Cpu_number partner)
98 Rounds = (1 << Runs2) + Warmup,
105 for (i = 0; i < Warmup; ++i)
106 Jdb::remote_work_ipi(my_cpu, partner, empty_func, 0, true);
108 time = get_time_now();
109 for (i = 0; i < (1 << Runs2); i++)
110 Jdb::remote_work_ipi(my_cpu, partner, empty_func, 0, true);
112 printf(" %2u:%8llu", cxx::int_value<Cpu_number>(partner),
113 (get_time_now() - time) >> Runs2);
115 if (ipi_cnt != Rounds)
116 printf("\nCounter mismatch: cnt=%d v %d\n", ipi_cnt, Rounds);
118 ipi_bench_spin_done = 1;
124 Jdb_kern_info_bench::do_mp_benchmark()
127 printf("IPI round-trips:\n");
128 for (Cpu_number u = Cpu_number::first(); u < Config::max_num_cpus(); ++u)
131 printf("l%2u: ", cxx::int_value<Cpu_number>(u));
133 for (Cpu_number v = Cpu_number::first(); v < Config::max_num_cpus(); ++v)
137 printf(" %2u:%8s", cxx::int_value<Cpu_number>(u), "X");
140 ipi_bench_spin_done = 0;
142 // v is waiting for IPIs
143 if (v != Cpu_number::boot_cpu())
144 Jdb::remote_work(v, wait_for_ipi, false);
146 // u is doing benchmark
147 if (u == Cpu_number::boot_cpu())
148 do_ipi_bench(Cpu_number::boot_cpu(), v);
150 Jdb::remote_work(u, [this, v](Cpu_number cpu){ do_ipi_bench(cpu, v); }, false);
152 // v is waiting for IPIs
153 if (v == Cpu_number::boot_cpu())
154 wait_for_ipi(Cpu_number::boot_cpu());
158 while (!ipi_bench_spin_done)