From: eeb Date: Mon, 15 Sep 2003 21:55:28 +0000 (+0000) Subject: * pruned LWT output to account for wrapped cpus X-Git-Tag: v1_7_0_51~2^7~536 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=0c1bda070cec43a05107b55054e4f103a076375e;p=fs%2Flustre-release.git * pruned LWT output to account for wrapped cpus * calculate get_cycles() offsets per-cpu --- diff --git a/lnet/libcfs/lwt.c b/lnet/libcfs/lwt.c index 6121687..533481e 100644 --- a/lnet/libcfs/lwt.c +++ b/lnet/libcfs/lwt.c @@ -99,7 +99,11 @@ lwt_control (int enable, int clear) lwt_enabled = enable; mb(); - + if (!enable) { + /* give people some time to stop adding traces */ + schedule_timeout(10); + } + return (0); } @@ -140,6 +144,128 @@ lwt_snapshot (int *ncpu, int *total_size, return (0); } +void +lwt_migrate_to (int cpu) +{ +#if 0 + current->cpus_allowed = 1UL << cpu; + while (smp_processor_id() != cpu) + schedule (); +#endif + set_cpus_allowed (current, 1UL << cpu); +} + +static volatile cycles_t helper_cycles; +static volatile int helper_control; + +#define LWT_HELPER_IDLE 0 +#define LWT_HELPER_GO 1 +#define LWT_HELPER_DONE 2 +#define LWT_HELPER_EXIT 3 +#define LWT_HELPER_EXITED 4 + +int +lwt_helper (void *arg) +{ + long cpu = (long)arg; + + kportal_daemonize ("lwt_helper"); + kportal_blockallsigs (); + + lwt_migrate_to (cpu); + + LASSERT (helper_control == LWT_HELPER_IDLE); + helper_control = LWT_HELPER_DONE; + mb(); + + for (;;) + switch (helper_control) { + default: LBUG(); + + case LWT_HELPER_DONE: + continue; + + case LWT_HELPER_GO: + helper_cycles = get_cycles(); + mb (); + helper_control = LWT_HELPER_DONE; + mb (); + continue; + + case LWT_HELPER_EXIT: + helper_control = LWT_HELPER_EXITED; + mb (); + return (0); + } +} + +long +lwt_get_cpu_cycles_offset1 (long cpu, long *diff) +{ + cycles_t tzero0; + cycles_t tzero1; + + LASSERT (cpu != 0); + + tzero0 = get_cycles(); + mb(); + + helper_control = LWT_HELPER_GO; + mb(); + + while (helper_control != LWT_HELPER_DONE) + ; + + tzero1 = get_cycles(); + + *diff = tzero1 - tzero0; + return (((tzero1 + tzero0) >> 1) - helper_cycles); +} + +long +lwt_get_cpu_cycles_offset (int cpu) +{ + long pid; + long elapsed; + long offset; + long min_elapsed; + long min_offset; + int i; + + LASSERT(cpu != 0); + + helper_control = LWT_HELPER_IDLE; + pid = kernel_thread (lwt_helper, (void *)cpu, 0); + if (pid < 0) { + CERROR ("Can't spawn helper: %ld\n", pid); + return (0); + } + + lwt_migrate_to(0); + + while (helper_control == LWT_HELPER_IDLE) + our_cond_resched(); + + offset = min_offset = lwt_get_cpu_cycles_offset1(cpu, &elapsed); + min_elapsed = elapsed; + + for (i = 0; i < 1024; i++) { + offset = lwt_get_cpu_cycles_offset1(cpu, &elapsed); + if (elapsed < min_elapsed) { + min_offset = offset; + min_elapsed = elapsed; + } + } + + helper_control = LWT_HELPER_EXIT; + mb(); + while (helper_control != LWT_HELPER_EXITED) + ; + + CDEBUG (D_INFO, "cycle offset %d: min %ld, offset %ld\n", cpu, min_elapsed, min_offset); + return (min_offset); +} + int lwt_init () { @@ -187,6 +313,10 @@ lwt_init () } } + lwt_cpus[0].lwtc_offset = 0; + for (i = 1; i < num_online_cpus(); i++) + lwt_cpus[i].lwtc_offset = lwt_get_cpu_cycles_offset(i); + lwt_enabled = 1; mb(); diff --git a/lustre/portals/libcfs/lwt.c b/lustre/portals/libcfs/lwt.c index 6121687..533481e 100644 --- a/lustre/portals/libcfs/lwt.c +++ b/lustre/portals/libcfs/lwt.c @@ -99,7 +99,11 @@ lwt_control (int enable, int clear) lwt_enabled = enable; mb(); - + if (!enable) { + /* give people some time to stop adding traces */ + schedule_timeout(10); + } + return (0); } @@ -140,6 +144,128 @@ lwt_snapshot (int *ncpu, int *total_size, return (0); } +void +lwt_migrate_to (int cpu) +{ +#if 0 + current->cpus_allowed = 1UL << cpu; + while (smp_processor_id() != cpu) + schedule (); +#endif + set_cpus_allowed (current, 1UL << cpu); +} + +static volatile cycles_t helper_cycles; +static volatile int helper_control; + +#define LWT_HELPER_IDLE 0 +#define LWT_HELPER_GO 1 +#define LWT_HELPER_DONE 2 +#define LWT_HELPER_EXIT 3 +#define LWT_HELPER_EXITED 4 + +int +lwt_helper (void *arg) +{ + long cpu = (long)arg; + + kportal_daemonize ("lwt_helper"); + kportal_blockallsigs (); + + lwt_migrate_to (cpu); + + LASSERT (helper_control == LWT_HELPER_IDLE); + helper_control = LWT_HELPER_DONE; + mb(); + + for (;;) + switch (helper_control) { + default: LBUG(); + + case LWT_HELPER_DONE: + continue; + + case LWT_HELPER_GO: + helper_cycles = get_cycles(); + mb (); + helper_control = LWT_HELPER_DONE; + mb (); + continue; + + case LWT_HELPER_EXIT: + helper_control = LWT_HELPER_EXITED; + mb (); + return (0); + } +} + +long +lwt_get_cpu_cycles_offset1 (long cpu, long *diff) +{ + cycles_t tzero0; + cycles_t tzero1; + + LASSERT (cpu != 0); + + tzero0 = get_cycles(); + mb(); + + helper_control = LWT_HELPER_GO; + mb(); + + while (helper_control != LWT_HELPER_DONE) + ; + + tzero1 = get_cycles(); + + *diff = tzero1 - tzero0; + return (((tzero1 + tzero0) >> 1) - helper_cycles); +} + +long +lwt_get_cpu_cycles_offset (int cpu) +{ + long pid; + long elapsed; + long offset; + long min_elapsed; + long min_offset; + int i; + + LASSERT(cpu != 0); + + helper_control = LWT_HELPER_IDLE; + pid = kernel_thread (lwt_helper, (void *)cpu, 0); + if (pid < 0) { + CERROR ("Can't spawn helper: %ld\n", pid); + return (0); + } + + lwt_migrate_to(0); + + while (helper_control == LWT_HELPER_IDLE) + our_cond_resched(); + + offset = min_offset = lwt_get_cpu_cycles_offset1(cpu, &elapsed); + min_elapsed = elapsed; + + for (i = 0; i < 1024; i++) { + offset = lwt_get_cpu_cycles_offset1(cpu, &elapsed); + if (elapsed < min_elapsed) { + min_offset = offset; + min_elapsed = elapsed; + } + } + + helper_control = LWT_HELPER_EXIT; + mb(); + while (helper_control != LWT_HELPER_EXITED) + ; + + CDEBUG (D_INFO, "cycle offset %d: min %ld, offset %ld\n", cpu, min_elapsed, min_offset); + return (min_offset); +} + int lwt_init () { @@ -187,6 +313,10 @@ lwt_init () } } + lwt_cpus[0].lwtc_offset = 0; + for (i = 1; i < num_online_cpus(); i++) + lwt_cpus[i].lwtc_offset = lwt_get_cpu_cycles_offset(i); + lwt_enabled = 1; mb();