diff options
Diffstat (limited to 'kernel/time/itimer.c')
-rw-r--r-- | kernel/time/itimer.c | 60 |
1 files changed, 20 insertions, 40 deletions
diff --git a/kernel/time/itimer.c b/kernel/time/itimer.c index 8c89143f9ebf..a95f13c31464 100644 --- a/kernel/time/itimer.c +++ b/kernel/time/itimer.c | |||
@@ -45,16 +45,16 @@ static struct timeval itimer_get_remtime(struct hrtimer *timer) | |||
45 | static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, | 45 | static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, |
46 | struct itimerval *const value) | 46 | struct itimerval *const value) |
47 | { | 47 | { |
48 | cputime_t cval, cinterval; | 48 | u64 val, interval; |
49 | struct cpu_itimer *it = &tsk->signal->it[clock_id]; | 49 | struct cpu_itimer *it = &tsk->signal->it[clock_id]; |
50 | 50 | ||
51 | spin_lock_irq(&tsk->sighand->siglock); | 51 | spin_lock_irq(&tsk->sighand->siglock); |
52 | 52 | ||
53 | cval = it->expires; | 53 | val = it->expires; |
54 | cinterval = it->incr; | 54 | interval = it->incr; |
55 | if (cval) { | 55 | if (val) { |
56 | struct task_cputime cputime; | 56 | struct task_cputime cputime; |
57 | cputime_t t; | 57 | u64 t; |
58 | 58 | ||
59 | thread_group_cputimer(tsk, &cputime); | 59 | thread_group_cputimer(tsk, &cputime); |
60 | if (clock_id == CPUCLOCK_PROF) | 60 | if (clock_id == CPUCLOCK_PROF) |
@@ -63,17 +63,17 @@ static void get_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, | |||
63 | /* CPUCLOCK_VIRT */ | 63 | /* CPUCLOCK_VIRT */ |
64 | t = cputime.utime; | 64 | t = cputime.utime; |
65 | 65 | ||
66 | if (cval < t) | 66 | if (val < t) |
67 | /* about to fire */ | 67 | /* about to fire */ |
68 | cval = cputime_one_jiffy; | 68 | val = TICK_NSEC; |
69 | else | 69 | else |
70 | cval = cval - t; | 70 | val -= t; |
71 | } | 71 | } |
72 | 72 | ||
73 | spin_unlock_irq(&tsk->sighand->siglock); | 73 | spin_unlock_irq(&tsk->sighand->siglock); |
74 | 74 | ||
75 | cputime_to_timeval(cval, &value->it_value); | 75 | value->it_value = ns_to_timeval(val); |
76 | cputime_to_timeval(cinterval, &value->it_interval); | 76 | value->it_interval = ns_to_timeval(interval); |
77 | } | 77 | } |
78 | 78 | ||
79 | int do_getitimer(int which, struct itimerval *value) | 79 | int do_getitimer(int which, struct itimerval *value) |
@@ -129,55 +129,35 @@ enum hrtimer_restart it_real_fn(struct hrtimer *timer) | |||
129 | return HRTIMER_NORESTART; | 129 | return HRTIMER_NORESTART; |
130 | } | 130 | } |
131 | 131 | ||
132 | static inline u32 cputime_sub_ns(cputime_t ct, s64 real_ns) | ||
133 | { | ||
134 | struct timespec ts; | ||
135 | s64 cpu_ns; | ||
136 | |||
137 | cputime_to_timespec(ct, &ts); | ||
138 | cpu_ns = timespec_to_ns(&ts); | ||
139 | |||
140 | return (cpu_ns <= real_ns) ? 0 : cpu_ns - real_ns; | ||
141 | } | ||
142 | |||
143 | static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, | 132 | static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id, |
144 | const struct itimerval *const value, | 133 | const struct itimerval *const value, |
145 | struct itimerval *const ovalue) | 134 | struct itimerval *const ovalue) |
146 | { | 135 | { |
147 | cputime_t cval, nval, cinterval, ninterval; | 136 | u64 oval, nval, ointerval, ninterval; |
148 | s64 ns_ninterval, ns_nval; | ||
149 | u32 error, incr_error; | ||
150 | struct cpu_itimer *it = &tsk->signal->it[clock_id]; | 137 | struct cpu_itimer *it = &tsk->signal->it[clock_id]; |
151 | 138 | ||
152 | nval = timeval_to_cputime(&value->it_value); | 139 | nval = timeval_to_ns(&value->it_value); |
153 | ns_nval = timeval_to_ns(&value->it_value); | 140 | ninterval = timeval_to_ns(&value->it_interval); |
154 | ninterval = timeval_to_cputime(&value->it_interval); | ||
155 | ns_ninterval = timeval_to_ns(&value->it_interval); | ||
156 | |||
157 | error = cputime_sub_ns(nval, ns_nval); | ||
158 | incr_error = cputime_sub_ns(ninterval, ns_ninterval); | ||
159 | 141 | ||
160 | spin_lock_irq(&tsk->sighand->siglock); | 142 | spin_lock_irq(&tsk->sighand->siglock); |
161 | 143 | ||
162 | cval = it->expires; | 144 | oval = it->expires; |
163 | cinterval = it->incr; | 145 | ointerval = it->incr; |
164 | if (cval || nval) { | 146 | if (oval || nval) { |
165 | if (nval > 0) | 147 | if (nval > 0) |
166 | nval += cputime_one_jiffy; | 148 | nval += TICK_NSEC; |
167 | set_process_cpu_timer(tsk, clock_id, &nval, &cval); | 149 | set_process_cpu_timer(tsk, clock_id, &nval, &oval); |
168 | } | 150 | } |
169 | it->expires = nval; | 151 | it->expires = nval; |
170 | it->incr = ninterval; | 152 | it->incr = ninterval; |
171 | it->error = error; | ||
172 | it->incr_error = incr_error; | ||
173 | trace_itimer_state(clock_id == CPUCLOCK_VIRT ? | 153 | trace_itimer_state(clock_id == CPUCLOCK_VIRT ? |
174 | ITIMER_VIRTUAL : ITIMER_PROF, value, nval); | 154 | ITIMER_VIRTUAL : ITIMER_PROF, value, nval); |
175 | 155 | ||
176 | spin_unlock_irq(&tsk->sighand->siglock); | 156 | spin_unlock_irq(&tsk->sighand->siglock); |
177 | 157 | ||
178 | if (ovalue) { | 158 | if (ovalue) { |
179 | cputime_to_timeval(cval, &ovalue->it_value); | 159 | ovalue->it_value = ns_to_timeval(oval); |
180 | cputime_to_timeval(cinterval, &ovalue->it_interval); | 160 | ovalue->it_interval = ns_to_timeval(ointerval); |
181 | } | 161 | } |
182 | } | 162 | } |
183 | 163 | ||