diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/posix-cpu-timers.c | 2 | ||||
| -rw-r--r-- | kernel/power/swap.c | 2 | ||||
| -rw-r--r-- | kernel/softlockup.c | 2 | ||||
| -rw-r--r-- | kernel/time/timekeeping.c | 22 |
4 files changed, 25 insertions, 3 deletions
diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 895337b16a2..4e5288a831d 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c | |||
| @@ -311,7 +311,7 @@ static int cpu_clock_sample_group(const clockid_t which_clock, | |||
| 311 | struct task_cputime cputime; | 311 | struct task_cputime cputime; |
| 312 | 312 | ||
| 313 | thread_group_cputime(p, &cputime); | 313 | thread_group_cputime(p, &cputime); |
| 314 | switch (which_clock) { | 314 | switch (CPUCLOCK_WHICH(which_clock)) { |
| 315 | default: | 315 | default: |
| 316 | return -EINVAL; | 316 | return -EINVAL; |
| 317 | case CPUCLOCK_PROF: | 317 | case CPUCLOCK_PROF: |
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index b7713b53d07..6da14358537 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -633,7 +633,7 @@ void swsusp_close(fmode_t mode) | |||
| 633 | return; | 633 | return; |
| 634 | } | 634 | } |
| 635 | 635 | ||
| 636 | blkdev_put(resume_bdev, mode); /* move up */ | 636 | blkdev_put(resume_bdev, mode); |
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | static int swsusp_header_init(void) | 639 | static int swsusp_header_init(void) |
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index 3953e4aed73..dc0b3be6b7d 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c | |||
| @@ -188,7 +188,7 @@ static void check_hung_task(struct task_struct *t, unsigned long now) | |||
| 188 | if ((long)(now - t->last_switch_timestamp) < | 188 | if ((long)(now - t->last_switch_timestamp) < |
| 189 | sysctl_hung_task_timeout_secs) | 189 | sysctl_hung_task_timeout_secs) |
| 190 | return; | 190 | return; |
| 191 | if (sysctl_hung_task_warnings < 0) | 191 | if (!sysctl_hung_task_warnings) |
| 192 | return; | 192 | return; |
| 193 | sysctl_hung_task_warnings--; | 193 | sysctl_hung_task_warnings--; |
| 194 | 194 | ||
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index e7acfb482a6..fa05e88aa76 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -518,6 +518,28 @@ void update_wall_time(void) | |||
| 518 | /* correct the clock when NTP error is too big */ | 518 | /* correct the clock when NTP error is too big */ |
| 519 | clocksource_adjust(offset); | 519 | clocksource_adjust(offset); |
| 520 | 520 | ||
| 521 | /* | ||
| 522 | * Since in the loop above, we accumulate any amount of time | ||
| 523 | * in xtime_nsec over a second into xtime.tv_sec, its possible for | ||
| 524 | * xtime_nsec to be fairly small after the loop. Further, if we're | ||
| 525 | * slightly speeding the clocksource up in clocksource_adjust(), | ||
| 526 | * its possible the required corrective factor to xtime_nsec could | ||
| 527 | * cause it to underflow. | ||
| 528 | * | ||
| 529 | * Now, we cannot simply roll the accumulated second back, since | ||
| 530 | * the NTP subsystem has been notified via second_overflow. So | ||
| 531 | * instead we push xtime_nsec forward by the amount we underflowed, | ||
| 532 | * and add that amount into the error. | ||
| 533 | * | ||
| 534 | * We'll correct this error next time through this function, when | ||
| 535 | * xtime_nsec is not as small. | ||
| 536 | */ | ||
| 537 | if (unlikely((s64)clock->xtime_nsec < 0)) { | ||
| 538 | s64 neg = -(s64)clock->xtime_nsec; | ||
| 539 | clock->xtime_nsec = 0; | ||
| 540 | clock->error += neg << (NTP_SCALE_SHIFT - clock->shift); | ||
| 541 | } | ||
| 542 | |||
| 521 | /* store full nanoseconds into xtime after rounding it up and | 543 | /* store full nanoseconds into xtime after rounding it up and |
| 522 | * add the remainder to the error difference. | 544 | * add the remainder to the error difference. |
| 523 | */ | 545 | */ |
