diff options
Diffstat (limited to 'arch/s390/include/asm/cputime.h')
| -rw-r--r-- | arch/s390/include/asm/cputime.h | 168 | 
1 files changed, 75 insertions, 93 deletions
diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h index 40e2ab0fa3f..f65bd363451 100644 --- a/arch/s390/include/asm/cputime.h +++ b/arch/s390/include/asm/cputime.h @@ -1,7 +1,5 @@  /* - *  include/asm-s390/cputime.h - * - *  (C) Copyright IBM Corp. 2004 + *  Copyright IBM Corp. 2004   *   *  Author: Martin Schwidefsky <schwidefsky@de.ibm.com>   */ @@ -14,116 +12,103 @@  #include <linux/spinlock.h>  #include <asm/div64.h> -/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ -typedef unsigned long long cputime_t; -typedef unsigned long long cputime64_t; +/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ -#ifndef __s390x__ +typedef unsigned long long __nocast cputime_t; +typedef unsigned long long __nocast cputime64_t; -static inline unsigned int -__div(unsigned long long n, unsigned int base) +static inline unsigned long __div(unsigned long long n, unsigned long base)  { +#ifndef CONFIG_64BIT  	register_pair rp;  	rp.pair = n >> 1;  	asm ("dr %0,%1" : "+d" (rp) : "d" (base >> 1));  	return rp.subreg.odd; +#else /* CONFIG_64BIT */ +	return n / base; +#endif /* CONFIG_64BIT */  } -#else /* __s390x__ */ +#define cputime_one_jiffy		jiffies_to_cputime(1) -static inline unsigned int -__div(unsigned long long n, unsigned int base) +/* + * Convert cputime to jiffies and back. + */ +static inline unsigned long cputime_to_jiffies(const cputime_t cputime)  { -	return n / base; +	return __div((__force unsigned long long) cputime, 4096000000ULL / HZ);  } -#endif /* __s390x__ */ +static inline cputime_t jiffies_to_cputime(const unsigned int jif) +{ +	return (__force cputime_t)(jif * (4096000000ULL / HZ)); +} -#define cputime_zero			(0ULL) -#define cputime_one_jiffy		jiffies_to_cputime(1) -#define cputime_max			((~0UL >> 1) - 1) -#define cputime_add(__a, __b)		((__a) +  (__b)) -#define cputime_sub(__a, __b)		((__a) -  (__b)) -#define cputime_div(__a, __n) ({		\ -	unsigned long long __div = (__a);	\ -	do_div(__div,__n);			\ -	__div;					\ -}) -#define cputime_halve(__a)		((__a) >> 1) -#define cputime_eq(__a, __b)		((__a) == (__b)) -#define cputime_gt(__a, __b)		((__a) >  (__b)) -#define cputime_ge(__a, __b)		((__a) >= (__b)) -#define cputime_lt(__a, __b)		((__a) <  (__b)) -#define cputime_le(__a, __b)		((__a) <= (__b)) -#define cputime_to_jiffies(__ct)	(__div((__ct), 4096000000ULL / HZ)) -#define cputime_to_scaled(__ct)		(__ct) -#define jiffies_to_cputime(__hz)	((cputime_t)(__hz) * (4096000000ULL / HZ)) - -#define cputime64_zero			(0ULL) -#define cputime64_add(__a, __b)		((__a) + (__b)) -#define cputime_to_cputime64(__ct)	(__ct) - -static inline u64 -cputime64_to_jiffies64(cputime64_t cputime) -{ -	do_div(cputime, 4096000000ULL / HZ); -	return cputime; +static inline u64 cputime64_to_jiffies64(cputime64_t cputime) +{ +	unsigned long long jif = (__force unsigned long long) cputime; +	do_div(jif, 4096000000ULL / HZ); +	return jif; +} + +static inline cputime64_t jiffies64_to_cputime64(const u64 jif) +{ +	return (__force cputime64_t)(jif * (4096000000ULL / HZ));  }  /*   * Convert cputime to microseconds and back.   */ -static inline unsigned int -cputime_to_usecs(const cputime_t cputime) +static inline unsigned int cputime_to_usecs(const cputime_t cputime)  { -	return cputime_div(cputime, 4096); +	return (__force unsigned long long) cputime >> 12;  } -static inline cputime_t -usecs_to_cputime(const unsigned int m) +static inline cputime_t usecs_to_cputime(const unsigned int m)  { -	return (cputime_t) m * 4096; +	return (__force cputime_t)(m * 4096ULL);  } +#define usecs_to_cputime64(m)		usecs_to_cputime(m) +  /*   * Convert cputime to milliseconds and back.   */ -static inline unsigned int -cputime_to_secs(const cputime_t cputime) +static inline unsigned int cputime_to_secs(const cputime_t cputime)  { -	return __div(cputime, 2048000000) >> 1; +	return __div((__force unsigned long long) cputime, 2048000000) >> 1;  } -static inline cputime_t -secs_to_cputime(const unsigned int s) +static inline cputime_t secs_to_cputime(const unsigned int s)  { -	return (cputime_t) s * 4096000000ULL; +	return (__force cputime_t)(s * 4096000000ULL);  }  /*   * Convert cputime to timespec and back.   */ -static inline cputime_t -timespec_to_cputime(const struct timespec *value) +static inline cputime_t timespec_to_cputime(const struct timespec *value)  { -	return value->tv_nsec * 4096 / 1000 + (u64) value->tv_sec * 4096000000ULL; +	unsigned long long ret = value->tv_sec * 4096000000ULL; +	return (__force cputime_t)(ret + value->tv_nsec * 4096 / 1000);  } -static inline void -cputime_to_timespec(const cputime_t cputime, struct timespec *value) +static inline void cputime_to_timespec(const cputime_t cputime, +				       struct timespec *value)  { -#ifndef __s390x__ +	unsigned long long __cputime = (__force unsigned long long) cputime; +#ifndef CONFIG_64BIT  	register_pair rp; -	rp.pair = cputime >> 1; +	rp.pair = __cputime >> 1;  	asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));  	value->tv_nsec = rp.subreg.even * 1000 / 4096;  	value->tv_sec = rp.subreg.odd;  #else -	value->tv_nsec = (cputime % 4096000000ULL) * 1000 / 4096; -	value->tv_sec = cputime / 4096000000ULL; +	value->tv_nsec = (__cputime % 4096000000ULL) * 1000 / 4096; +	value->tv_sec = __cputime / 4096000000ULL;  #endif  } @@ -132,77 +117,74 @@ cputime_to_timespec(const cputime_t cputime, struct timespec *value)   * Since cputime and timeval have the same resolution (microseconds)   * this is easy.   */ -static inline cputime_t -timeval_to_cputime(const struct timeval *value) +static inline cputime_t timeval_to_cputime(const struct timeval *value)  { -	return value->tv_usec * 4096 + (u64) value->tv_sec * 4096000000ULL; +	unsigned long long ret = value->tv_sec * 4096000000ULL; +	return (__force cputime_t)(ret + value->tv_usec * 4096ULL);  } -static inline void -cputime_to_timeval(const cputime_t cputime, struct timeval *value) +static inline void cputime_to_timeval(const cputime_t cputime, +				      struct timeval *value)  { -#ifndef __s390x__ +	unsigned long long __cputime = (__force unsigned long long) cputime; +#ifndef CONFIG_64BIT  	register_pair rp; -	rp.pair = cputime >> 1; +	rp.pair = __cputime >> 1;  	asm ("dr %0,%1" : "+d" (rp) : "d" (2048000000UL));  	value->tv_usec = rp.subreg.even / 4096;  	value->tv_sec = rp.subreg.odd;  #else -	value->tv_usec = (cputime % 4096000000ULL) / 4096; -	value->tv_sec = cputime / 4096000000ULL; +	value->tv_usec = (__cputime % 4096000000ULL) / 4096; +	value->tv_sec = __cputime / 4096000000ULL;  #endif  }  /*   * Convert cputime to clock and back.   */ -static inline clock_t -cputime_to_clock_t(cputime_t cputime) +static inline clock_t cputime_to_clock_t(cputime_t cputime)  { -	return cputime_div(cputime, 4096000000ULL / USER_HZ); +	unsigned long long clock = (__force unsigned long long) cputime; +	do_div(clock, 4096000000ULL / USER_HZ); +	return clock;  } -static inline cputime_t -clock_t_to_cputime(unsigned long x) +static inline cputime_t clock_t_to_cputime(unsigned long x)  { -	return (cputime_t) x * (4096000000ULL / USER_HZ); +	return (__force cputime_t)(x * (4096000000ULL / USER_HZ));  }  /*   * Convert cputime64 to clock.   */ -static inline clock_t -cputime64_to_clock_t(cputime64_t cputime) +static inline clock_t cputime64_to_clock_t(cputime64_t cputime)  { -       return cputime_div(cputime, 4096000000ULL / USER_HZ); +	unsigned long long clock = (__force unsigned long long) cputime; +	do_div(clock, 4096000000ULL / USER_HZ); +	return clock;  }  struct s390_idle_data { +	int nohz_delay;  	unsigned int sequence;  	unsigned long long idle_count; -	unsigned long long idle_enter;  	unsigned long long idle_time; -	int nohz_delay; +	unsigned long long clock_idle_enter; +	unsigned long long clock_idle_exit; +	unsigned long long timer_idle_enter; +	unsigned long long timer_idle_exit;  };  DECLARE_PER_CPU(struct s390_idle_data, s390_idle); -void vtime_start_cpu(__u64 int_clock, __u64 enter_timer);  cputime64_t s390_get_idle_time(int cpu);  #define arch_idle_time(cpu) s390_get_idle_time(cpu) -static inline void s390_idle_check(struct pt_regs *regs, __u64 int_clock, -				   __u64 enter_timer) -{ -	if (regs->psw.mask & PSW_MASK_WAIT) -		vtime_start_cpu(int_clock, enter_timer); -} -  static inline int s390_nohz_delay(int cpu)  { -	return per_cpu(s390_idle, cpu).nohz_delay != 0; +	return __get_cpu_var(s390_idle).nohz_delay != 0;  }  #define arch_needs_cpu(cpu) s390_nohz_delay(cpu)  | 
