jiffies.c (858a0d7eb5300b5f620d98ab3c4b96c9d5f19131) | jiffies.c (93825f2ec736f30e034ab7c9d56b42849c5b00da) |
---|---|
1/*********************************************************************** 2* linux/kernel/time/jiffies.c 3* 4* This file contains the jiffies based clocksource. 5* 6* Copyright (C) 2004, 2005 IBM, John Stultz (johnstul@us.ibm.com) 7* 8* This program is free software; you can redistribute it and/or modify --- 13 unchanged lines hidden (view full) --- 22************************************************************************/ 23#include <linux/clocksource.h> 24#include <linux/jiffies.h> 25#include <linux/module.h> 26#include <linux/init.h> 27 28#include "timekeeping.h" 29 | 1/*********************************************************************** 2* linux/kernel/time/jiffies.c 3* 4* This file contains the jiffies based clocksource. 5* 6* Copyright (C) 2004, 2005 IBM, John Stultz (johnstul@us.ibm.com) 7* 8* This program is free software; you can redistribute it and/or modify --- 13 unchanged lines hidden (view full) --- 22************************************************************************/ 23#include <linux/clocksource.h> 24#include <linux/jiffies.h> 25#include <linux/module.h> 26#include <linux/init.h> 27 28#include "timekeeping.h" 29 |
30/* The Jiffies based clocksource is the lowest common 31 * denominator clock source which should function on 32 * all systems. It has the same coarse resolution as 33 * the timer interrupt frequency HZ and it suffers 34 * inaccuracies caused by missed or lost timer 35 * interrupts and the inability for the timer 36 * interrupt hardware to accuratly tick at the 37 * requested HZ value. It is also not recommended 38 * for "tick-less" systems. 39 */ 40#define NSEC_PER_JIFFY ((NSEC_PER_SEC+HZ/2)/HZ) | |
41 | 30 |
42/* Since jiffies uses a simple NSEC_PER_JIFFY multiplier | 31/* Since jiffies uses a simple TICK_NSEC multiplier |
43 * conversion, the .shift value could be zero. However 44 * this would make NTP adjustments impossible as they are 45 * in units of 1/2^.shift. Thus we use JIFFIES_SHIFT to 46 * shift both the nominator and denominator the same 47 * amount, and give ntp adjustments in units of 1/2^8 48 * 49 * The value 8 is somewhat carefully chosen, as anything | 32 * conversion, the .shift value could be zero. However 33 * this would make NTP adjustments impossible as they are 34 * in units of 1/2^.shift. Thus we use JIFFIES_SHIFT to 35 * shift both the nominator and denominator the same 36 * amount, and give ntp adjustments in units of 1/2^8 37 * 38 * The value 8 is somewhat carefully chosen, as anything |
50 * larger can result in overflows. NSEC_PER_JIFFY grows as 51 * HZ shrinks, so values greater than 8 overflow 32bits when | 39 * larger can result in overflows. TICK_NSEC grows as HZ 40 * shrinks, so values greater than 8 overflow 32bits when |
52 * HZ=100. 53 */ 54#if HZ < 34 55#define JIFFIES_SHIFT 6 56#elif HZ < 67 57#define JIFFIES_SHIFT 7 58#else 59#define JIFFIES_SHIFT 8 60#endif 61 62static u64 jiffies_read(struct clocksource *cs) 63{ 64 return (u64) jiffies; 65} 66 | 41 * HZ=100. 42 */ 43#if HZ < 34 44#define JIFFIES_SHIFT 6 45#elif HZ < 67 46#define JIFFIES_SHIFT 7 47#else 48#define JIFFIES_SHIFT 8 49#endif 50 51static u64 jiffies_read(struct clocksource *cs) 52{ 53 return (u64) jiffies; 54} 55 |
56/* 57 * The Jiffies based clocksource is the lowest common 58 * denominator clock source which should function on 59 * all systems. It has the same coarse resolution as 60 * the timer interrupt frequency HZ and it suffers 61 * inaccuracies caused by missed or lost timer 62 * interrupts and the inability for the timer 63 * interrupt hardware to accuratly tick at the 64 * requested HZ value. It is also not recommended 65 * for "tick-less" systems. 66 */ |
|
67static struct clocksource clocksource_jiffies = { 68 .name = "jiffies", 69 .rating = 1, /* lowest valid rating*/ 70 .read = jiffies_read, 71 .mask = CLOCKSOURCE_MASK(32), | 67static struct clocksource clocksource_jiffies = { 68 .name = "jiffies", 69 .rating = 1, /* lowest valid rating*/ 70 .read = jiffies_read, 71 .mask = CLOCKSOURCE_MASK(32), |
72 .mult = NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */ | 72 .mult = TICK_NSEC << JIFFIES_SHIFT, /* details above */ |
73 .shift = JIFFIES_SHIFT, 74 .max_cycles = 10, 75}; 76 77__cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock); 78 79#if (BITS_PER_LONG < 64) 80u64 get_jiffies_64(void) --- 39 unchanged lines hidden (view full) --- 120 121 /* Calc cycles per tick */ 122 cycles_per_tick = (cycles_per_second + HZ/2)/HZ; 123 /* shift_hz stores hz<<8 for extra accuracy */ 124 shift_hz = (u64)cycles_per_second << 8; 125 shift_hz += cycles_per_tick/2; 126 do_div(shift_hz, cycles_per_tick); 127 /* Calculate nsec_per_tick using shift_hz */ | 73 .shift = JIFFIES_SHIFT, 74 .max_cycles = 10, 75}; 76 77__cacheline_aligned_in_smp DEFINE_SEQLOCK(jiffies_lock); 78 79#if (BITS_PER_LONG < 64) 80u64 get_jiffies_64(void) --- 39 unchanged lines hidden (view full) --- 120 121 /* Calc cycles per tick */ 122 cycles_per_tick = (cycles_per_second + HZ/2)/HZ; 123 /* shift_hz stores hz<<8 for extra accuracy */ 124 shift_hz = (u64)cycles_per_second << 8; 125 shift_hz += cycles_per_tick/2; 126 do_div(shift_hz, cycles_per_tick); 127 /* Calculate nsec_per_tick using shift_hz */ |
128 nsec_per_tick = (u64)NSEC_PER_SEC << 8; | 128 nsec_per_tick = (u64)TICK_NSEC << 8; |
129 nsec_per_tick += (u32)shift_hz/2; 130 do_div(nsec_per_tick, (u32)shift_hz); 131 132 refined_jiffies.mult = ((u32)nsec_per_tick) << JIFFIES_SHIFT; 133 134 __clocksource_register(&refined_jiffies); 135 return 0; 136} | 129 nsec_per_tick += (u32)shift_hz/2; 130 do_div(nsec_per_tick, (u32)shift_hz); 131 132 refined_jiffies.mult = ((u32)nsec_per_tick) << JIFFIES_SHIFT; 133 134 __clocksource_register(&refined_jiffies); 135 return 0; 136} |