Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755993AbYHPWkl (ORCPT ); Sat, 16 Aug 2008 18:40:41 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753848AbYHPWkZ (ORCPT ); Sat, 16 Aug 2008 18:40:25 -0400 Received: from cantor2.suse.de ([195.135.220.15]:46999 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755249AbYHPWkX (ORCPT ); Sat, 16 Aug 2008 18:40:23 -0400 Subject: patch uml-track-and-make-up-lost-ticks.patch added to 2.6.25-stable tree To: jdike@addtoit.com, akpm@linux-foundation.org, gregkh@suse.de, jdike@linux.intel.com, linux-kernel@vger.kernel.org, nix@esperi.org.uk, torvalds@linux-foundation.org, user-mode-linux-devel@lists.sourceforge.net Cc: , From: Date: Sat, 16 Aug 2008 15:32:47 -0700 In-Reply-To: <20080805201405.GA11784@c2.user-mode-linux.org> Message-Id: <20080816224020.6F7E41454450@imap.suse.de> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5837 Lines: 196 This is a note to let you know that we have just queued up the patch titled Subject: uml: track and make up lost ticks to the 2.6.25-stable tree. Its filename is uml-track-and-make-up-lost-ticks.patch A git repo of this tree can be found at http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary >From stable-bounces@linux.kernel.org Tue Aug 5 13:14:23 2008 From: Jeff Dike Date: Tue, 5 Aug 2008 16:14:05 -0400 Subject: uml: track and make up lost ticks To: stable@kernel.org Cc: LKML , uml-devel Message-ID: <20080805201405.GA11784@c2.user-mode-linux.org> Content-Disposition: inline From: Jeff Dike commit fe2cc53ee013a4d4d0317d418e7019fe6533a5a8 upstream Alarm delivery could be noticably late in the !CONFIG_NOHZ case because lost ticks weren't being taken into account. This is now treated more carefully, with the time between ticks being calculated and the appropriate number of ticks delivered to the timekeeping system. Cc: Nix Signed-off-by: Jeff Dike Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Greg Kroah-Hartman --- arch/um/include/process.h | 4 +-- arch/um/os-Linux/signal.c | 1 arch/um/os-Linux/time.c | 54 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 53 insertions(+), 6 deletions(-) --- a/arch/um/include/process.h +++ b/arch/um/include/process.h @@ -8,8 +8,8 @@ #include -extern void sig_handler(int sig, struct sigcontext sc); -extern void alarm_handler(int sig, struct sigcontext sc); +extern void sig_handler(int sig, struct sigcontext *sc); +extern void alarm_handler(int sig, struct sigcontext *sc); #endif --- a/arch/um/os-Linux/signal.c +++ b/arch/um/os-Linux/signal.c @@ -12,6 +12,7 @@ #include "as-layout.h" #include "kern_util.h" #include "os.h" +#include "process.h" #include "sysdep/barrier.h" #include "sysdep/sigcontext.h" #include "user.h" --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c @@ -9,7 +9,9 @@ #include #include #include "kern_constants.h" +#include "kern_util.h" #include "os.h" +#include "process.h" #include "user.h" int set_interval(void) @@ -58,12 +60,17 @@ static inline long long timeval_to_ns(co long long disable_timer(void) { struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } }); + int remain, max = UM_NSEC_PER_SEC / UM_HZ; if (setitimer(ITIMER_VIRTUAL, &time, &time) < 0) printk(UM_KERN_ERR "disable_timer - setitimer failed, " "errno = %d\n", errno); - return timeval_to_ns(&time.it_value); + remain = timeval_to_ns(&time.it_value); + if (remain > max) + remain = max; + + return remain; } long long os_nsecs(void) @@ -79,7 +86,44 @@ static int after_sleep_interval(struct t { return 0; } + +static void deliver_alarm(void) +{ + alarm_handler(SIGVTALRM, NULL); +} + +static unsigned long long sleep_time(unsigned long long nsecs) +{ + return nsecs; +} + #else +unsigned long long last_tick; +unsigned long long skew; + +static void deliver_alarm(void) +{ + unsigned long long this_tick = os_nsecs(); + int one_tick = UM_NSEC_PER_SEC / UM_HZ; + + if (last_tick == 0) + last_tick = this_tick - one_tick; + + skew += this_tick - last_tick; + + while (skew >= one_tick) { + alarm_handler(SIGVTALRM, NULL); + skew -= one_tick; + } + + last_tick = this_tick; +} + +static unsigned long long sleep_time(unsigned long long nsecs) +{ + return nsecs > skew ? nsecs - skew : 0; +} + static inline long long timespec_to_us(const struct timespec *ts) { return ((long long) ts->tv_sec * UM_USEC_PER_SEC) + @@ -102,6 +146,8 @@ static int after_sleep_interval(struct t */ if (start_usecs > usec) start_usecs = usec; + + start_usecs -= skew / UM_NSEC_PER_USEC; tv = ((struct timeval) { .tv_sec = start_usecs / UM_USEC_PER_SEC, .tv_usec = start_usecs % UM_USEC_PER_SEC }); interval = ((struct itimerval) { { 0, usec }, tv }); @@ -113,8 +159,6 @@ static int after_sleep_interval(struct t } #endif -extern void alarm_handler(int sig, struct sigcontext *sc); - void idle_sleep(unsigned long long nsecs) { struct timespec ts; @@ -126,10 +170,12 @@ void idle_sleep(unsigned long long nsecs */ if (nsecs == 0) nsecs = UM_NSEC_PER_SEC / UM_HZ; + + nsecs = sleep_time(nsecs); ts = ((struct timespec) { .tv_sec = nsecs / UM_NSEC_PER_SEC, .tv_nsec = nsecs % UM_NSEC_PER_SEC }); if (nanosleep(&ts, &ts) == 0) - alarm_handler(SIGVTALRM, NULL); + deliver_alarm(); after_sleep_interval(&ts); } Patches currently in stable-queue which might be from jdike@addtoit.com are queue-2.6.25/uml-fix-build-when-slob-is-enabled.patch queue-2.6.25/uml-fix-bad-ntp-interaction-with-clock.patch queue-2.6.25/uml-physical-memory-shouldn-t-include-initial-stack.patch queue-2.6.25/uml-track-and-make-up-lost-ticks.patch queue-2.6.25/uml-missed-kmalloc-in-pcap_user.c.patch queue-2.6.25/uml-deal-with-host-time-going-backwards.patch queue-2.6.25/uml-deal-with-inaccessible-address-space-start.patch queue-2.6.25/uml-missing-export-of-csum_partial-on-uml-amd64.patch queue-2.6.25/uml-memcpy-export-needs-to-follow-host-declaration.patch queue-2.6.25/uml-stub-needs-to-tolerate-sigwinch.patch queue-2.6.25/uml-work-around-broken-host-ptrace_sysemu.patch queue-2.6.25/uml-fix-gcc-ices-and-unresolved-externs.patch queue-2.6.25/uml-fix-boot-crash.patch -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/