Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Thomas Gleixner:
"Three fixlets from the timer departement:

- Update the timekeeper before updating vsyscall and pvclock. This
fixes the kvm-clock regression reported by Chris and Paolo.

- Use the proper irq work interface from NMI. This fixes the
regression reported by Catalin and Dave.

- Clarify the compat_nanosleep error handling mechanism to avoid
future confusion"

* 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
timekeeping: Update timekeeper before updating vsyscall and pvclock
compat: nanosleep: Clarify error handling
nohz: Restore NMI safe local irq work for local nohz kick

+39 -11
+1 -6
include/linux/tick.h
··· 183 183 184 184 extern void tick_nohz_init(void); 185 185 extern void __tick_nohz_full_check(void); 186 + extern void tick_nohz_full_kick(void); 186 187 extern void tick_nohz_full_kick_cpu(int cpu); 187 - 188 - static inline void tick_nohz_full_kick(void) 189 - { 190 - tick_nohz_full_kick_cpu(smp_processor_id()); 191 - } 192 - 193 188 extern void tick_nohz_full_kick_all(void); 194 189 extern void __tick_nohz_task_switch(struct task_struct *tsk); 195 190 #else
+21 -3
kernel/compat.c
··· 226 226 ret = hrtimer_nanosleep_restart(restart); 227 227 set_fs(oldfs); 228 228 229 - if (ret) { 229 + if (ret == -ERESTART_RESTARTBLOCK) { 230 230 rmtp = restart->nanosleep.compat_rmtp; 231 231 232 232 if (rmtp && compat_put_timespec(&rmt, rmtp)) ··· 256 256 HRTIMER_MODE_REL, CLOCK_MONOTONIC); 257 257 set_fs(oldfs); 258 258 259 - if (ret) { 259 + /* 260 + * hrtimer_nanosleep() can only return 0 or 261 + * -ERESTART_RESTARTBLOCK here because: 262 + * 263 + * - we call it with HRTIMER_MODE_REL and therefor exclude the 264 + * -ERESTARTNOHAND return path. 265 + * 266 + * - we supply the rmtp argument from the task stack (due to 267 + * the necessary compat conversion. So the update cannot 268 + * fail, which excludes the -EFAULT return path as well. If 269 + * it fails nevertheless we have a bigger problem and wont 270 + * reach this place anymore. 271 + * 272 + * - if the return value is 0, we do not have to update rmtp 273 + * because there is no remaining time. 274 + * 275 + * We check for -ERESTART_RESTARTBLOCK nevertheless if the 276 + * core implementation decides to return random nonsense. 277 + */ 278 + if (ret == -ERESTART_RESTARTBLOCK) { 260 279 struct restart_block *restart 261 280 = &current_thread_info()->restart_block; 262 281 ··· 285 266 if (rmtp && compat_put_timespec(&rmt, rmtp)) 286 267 return -EFAULT; 287 268 } 288 - 289 269 return ret; 290 270 } 291 271
+14
kernel/time/tick-sched.c
··· 225 225 }; 226 226 227 227 /* 228 + * Kick this CPU if it's full dynticks in order to force it to 229 + * re-evaluate its dependency on the tick and restart it if necessary. 230 + * This kick, unlike tick_nohz_full_kick_cpu() and tick_nohz_full_kick_all(), 231 + * is NMI safe. 232 + */ 233 + void tick_nohz_full_kick(void) 234 + { 235 + if (!tick_nohz_full_cpu(smp_processor_id())) 236 + return; 237 + 238 + irq_work_queue(&__get_cpu_var(nohz_full_kick_work)); 239 + } 240 + 241 + /* 228 242 * Kick the CPU if it's full dynticks in order to force it to 229 243 * re-evaluate its dependency on the tick and restart it if necessary. 230 244 */
+3 -2
kernel/time/timekeeping.c
··· 442 442 tk->ntp_error = 0; 443 443 ntp_clear(); 444 444 } 445 - update_vsyscall(tk); 446 - update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET); 447 445 448 446 tk_update_ktime_data(tk); 447 + 448 + update_vsyscall(tk); 449 + update_pvclock_gtod(tk, action & TK_CLOCK_WAS_SET); 449 450 450 451 if (action & TK_MIRROR) 451 452 memcpy(&shadow_timekeeper, &tk_core.timekeeper,