Calculating a timeout from get_cycles() is a historical leftover without any functional requirement.
Use ktime_get() instead. Signed-off-by: Thomas Gleixner <[email protected]> --- drivers/misc/sgi-gru/gruhandles.c | 20 ++++++++------------ drivers/misc/sgi-gru/grukservices.c | 3 ++- drivers/misc/sgi-gru/grutlbpurge.c | 5 ++--- 3 files changed, 12 insertions(+), 16 deletions(-) --- a/drivers/misc/sgi-gru/gruhandles.c +++ b/drivers/misc/sgi-gru/gruhandles.c @@ -6,26 +6,22 @@ */ #include <linux/kernel.h> +#include <linux/timekeeping.h> #include "gru.h" #include "grulib.h" #include "grutables.h" -/* 10 sec */ #include <linux/sync_core.h> -#include <asm/tsc.h> -#define GRU_OPERATION_TIMEOUT ((cycles_t) tsc_khz*10*1000) -#define CLKS2NSEC(c) ((c) * 1000000 / tsc_khz) + +#define GRU_OPERATION_TIMEOUT_NSEC (((ktime_t)10 * NSEC_PER_SEC)) /* Extract the status field from a kernel handle */ #define GET_MSEG_HANDLE_STATUS(h) (((*(unsigned long *)(h)) >> 16) & 3) struct mcs_op_statistic mcs_op_statistics[mcsop_last]; -static void update_mcs_stats(enum mcs_op op, unsigned long clks) +static void update_mcs_stats(enum mcs_op op, unsigned long nsec) { - unsigned long nsec; - - nsec = CLKS2NSEC(clks); atomic_long_inc(&mcs_op_statistics[op].count); atomic_long_add(nsec, &mcs_op_statistics[op].total); if (mcs_op_statistics[op].max < nsec) @@ -58,21 +54,21 @@ static void report_instruction_timeout(v static int wait_instruction_complete(void *h, enum mcs_op opc) { + ktime_t start_time = ktime_get(); int status; - unsigned long start_time = get_cycles(); while (1) { cpu_relax(); status = GET_MSEG_HANDLE_STATUS(h); if (status != CCHSTATUS_ACTIVE) break; - if (GRU_OPERATION_TIMEOUT < (get_cycles() - start_time)) { + if (GRU_OP_TIMEOUT_NSEC < (ktime_get() - start_time)) { report_instruction_timeout(h); - start_time = get_cycles(); + start_time = ktime_get(); } } if (gru_options & OPT_STATS) - update_mcs_stats(opc, get_cycles() - start_time); + update_mcs_stats(opc, (unsigned long)(ktime_get() - start_time)); return status; } --- a/drivers/misc/sgi-gru/grukservices.c +++ b/drivers/misc/sgi-gru/grukservices.c @@ -20,6 +20,7 @@ #include <linux/uaccess.h> #include <linux/delay.h> #include <linux/export.h> +#include <linux/random.h> #include <asm/io_apic.h> #include "gru.h" #include "grulib.h" @@ -1106,7 +1107,7 @@ static int quicktest3(unsigned long arg) int ret = 0; memset(buf2, 0, sizeof(buf2)); - memset(buf1, get_cycles() & 255, sizeof(buf1)); + memset(buf1, get_random_u32() & 255, sizeof(buf1)); gru_copy_gpa(uv_gpa(buf2), uv_gpa(buf1), BUFSIZE); if (memcmp(buf1, buf2, BUFSIZE)) { printk(KERN_DEBUG "GRU:%d quicktest3 error\n", smp_processor_id()); --- a/drivers/misc/sgi-gru/grutlbpurge.c +++ b/drivers/misc/sgi-gru/grutlbpurge.c @@ -22,13 +22,12 @@ #include <linux/delay.h> #include <linux/timex.h> #include <linux/srcu.h> +#include <linux/random.h> #include <asm/processor.h> #include "gru.h" #include "grutables.h" #include <asm/uv/uv_hub.h> -#define gru_random() get_cycles() - /* ---------------------------------- TLB Invalidation functions -------- * get_tgh_handle * @@ -49,7 +48,7 @@ static inline int get_off_blade_tgh(stru int n; n = GRU_NUM_TGH - gru->gs_tgh_first_remote; - n = gru_random() % n; + n = get_random_u32() % n; n += gru->gs_tgh_first_remote; return n; }

