Messages in this thread |  | | | Subject | Re: [PATCH] Allow times and time system calls to return smallnegative values | | Date | Thu, 4 Dec 2008 17:01:58 +0100 | | From | "Joakim Tjernlund" <> |
| |
On Thu, 2008-12-04 at 16:40 +0100, Ingo Molnar wrote: > * Paul Mackerras <paulus@samba.org> wrote: > > > Ingo Molnar writes: > > > > > > + force_successful_syscall_return(); > > > > return compat_jiffies_to_clock_t(jiffies); > > > > > > just curious: what code does force_successful_syscall_return() actually > > > run in the powerpc case - those bits are missing from this patch. I > > > suspect it sets some sort of flag? > > > > It sets the TIF_NOERROR thread flag, which is tested in the syscall > > exit path along with various other thread flags. > > > > force_successful_syscall_return() is defined for powerpc in > > arch/powerpc/include/asm/ptrace.h. It's nothing new, it has existed > > for ages and is used in a few other places already. It has existing > > non-null definitions on alpha, ia64, powerpc, and sparc64. > > ok, was just curious. To make this code nicer, we could keep the time > syscalls from returning small negative numbers. > > the core issue is probably: > > jiffies.h:#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ)) > > the thing is, we did INITIAL_JIFFIES to find _in kernel_ jiffies > wraparoudn bugs (hung timers, broken drivers, etc.) - we did not want to > confuse userspace with it. > > So how about adding INITIAL_JIFFIES to the sys_times() return value?
Na, that will just hide the bug for some 497 days(or 49 days on alpha). In user space on have to use this workaround(and I think some variation is in glibc already):
static unsigned long quagga_times(void) { #if defined(GNU_LINUX) unsigned long ret; errno = 0; ret = times(NULL); /* Linux can handle NULL */ /* Workaround broken syscall impl. * A bugfix exists for the kernel, hopefully * it will make it into 2.6.29 */ if (errno) ret = (unsigned long) (-errno); return ret; #else struct tms dummy; /* Only return value is used */ return times(&dummy); #endif }
|  |