lkml.org 
[lkml]   [2008]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH] Allow times and time system calls to return smallnegative values
    Date
    From
    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
    }




    \
     
     \ /
      Last update: 2008-12-04 17:17    [W:0.046 / U:0.920 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site