[PATCH] UML - time build fix - Kernel

This is a discussion on [PATCH] UML - time build fix - Kernel ; Put back an implementation of timeval_to_ns in arch/um/os-Linux/time.c. tglx pointed out in his review of tickless support that there was a perfectly good implementation of it in linux/time.h. The problem is that this is userspace code which can't pull in ...

+ Reply to Thread
Results 1 to 5 of 5

Thread: [PATCH] UML - time build fix

  1. [PATCH] UML - time build fix

    Put back an implementation of timeval_to_ns in
    arch/um/os-Linux/time.c. tglx pointed out in his review of tickless
    support that there was a perfectly good implementation of it in
    linux/time.h. The problem is that this is userspace code which can't
    pull in kernel headers and there doesn't seem to be a libc version.

    So, I'm copying the version from linux/time.h rather than resurrecting
    my version. This causes some declaration changes as it now returns a
    signed value rather than an unsigned value.

    Signed-off-by: Jeff Dike
    ---
    arch/um/include/os.h | 4 ++--
    arch/um/os-Linux/time.c | 22 +++++++++++++++++++---
    2 files changed, 21 insertions(+), 5 deletions(-)

    Index: linux-2.6.22/arch/um/include/os.h
    ================================================== =================
    --- linux-2.6.22.orig/arch/um/include/os.h 2007-09-25 09:26:42.000000000 -0400
    +++ linux-2.6.22/arch/um/include/os.h 2007-09-25 09:28:42.000000000 -0400
    @@ -252,9 +252,9 @@ extern void os_dump_core(void);
    extern void idle_sleep(unsigned long long nsecs);
    extern int set_interval(void);
    extern int timer_one_shot(int ticks);
    -extern unsigned long long disable_timer(void);
    +extern long long disable_timer(void);
    extern void uml_idle_timer(void);
    -extern unsigned long long os_nsecs(void);
    +extern long long os_nsecs(void);

    /* skas/mem.c */
    extern long run_syscall_stub(struct mm_id * mm_idp,
    Index: linux-2.6.22/arch/um/os-Linux/time.c
    ================================================== =================
    --- linux-2.6.22.orig/arch/um/os-Linux/time.c 2007-09-25 09:26:42.000000000 -0400
    +++ linux-2.6.22/arch/um/os-Linux/time.c 2007-09-25 09:28:42.000000000 -0400
    @@ -39,7 +39,23 @@ int timer_one_shot(int ticks)
    return 0;
    }

    -unsigned long long disable_timer(void)
    +/**
    + * timeval_to_ns - Convert timeval to nanoseconds
    + * @ts: pointer to the timeval variable to be converted
    + *
    + * Returns the scalar nanosecond representation of the timeval
    + * parameter.
    + *
    + * Ripped from linux/time.h because it's a kernel header, and thus
    + * unusable from here.
    + */
    +static inline long long timeval_to_ns(const struct timeval *tv)
    +{
    + return ((long long) tv->tv_sec * UM_NSEC_PER_SEC) +
    + tv->tv_usec * UM_NSEC_PER_USEC;
    +}
    +
    +long long disable_timer(void)
    {
    struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } });

    @@ -47,10 +63,10 @@ unsigned long long disable_timer(void)
    printk(UM_KERN_ERR "disable_timer - setitimer failed, "
    "errno = %d\n", errno);

    - return tv_to_nsec(&time.it_value);
    + return timeval_to_ns(&time.it_value);
    }

    -unsigned long long os_nsecs(void)
    +long long os_nsecs(void)
    {
    struct timeval tv;

    -
    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/

  2. Re: [PATCH] UML - time build fix


    On Tue, 2007-09-25 at 13:37 -0400, Jeff Dike wrote:
    > Put back an implementation of timeval_to_ns in
    > arch/um/os-Linux/time.c. tglx pointed out in his review of tickless
    > support that there was a perfectly good implementation of it in
    > linux/time.h. The problem is that this is userspace code which can't
    > pull in kernel headers and there doesn't seem to be a libc version.


    Oops. Did not notice. Can't we move it into some header file which is
    accessible from everywhere ?

    tglx

    > So, I'm copying the version from linux/time.h rather than resurrecting
    > my version. This causes some declaration changes as it now returns a
    > signed value rather than an unsigned value.
    >
    > Signed-off-by: Jeff Dike
    > ---
    > arch/um/include/os.h | 4 ++--
    > arch/um/os-Linux/time.c | 22 +++++++++++++++++++---
    > 2 files changed, 21 insertions(+), 5 deletions(-)
    >
    > Index: linux-2.6.22/arch/um/include/os.h
    > ================================================== =================
    > --- linux-2.6.22.orig/arch/um/include/os.h 2007-09-25 09:26:42.000000000 -0400
    > +++ linux-2.6.22/arch/um/include/os.h 2007-09-25 09:28:42.000000000 -0400
    > @@ -252,9 +252,9 @@ extern void os_dump_core(void);
    > extern void idle_sleep(unsigned long long nsecs);
    > extern int set_interval(void);
    > extern int timer_one_shot(int ticks);
    > -extern unsigned long long disable_timer(void);
    > +extern long long disable_timer(void);
    > extern void uml_idle_timer(void);
    > -extern unsigned long long os_nsecs(void);
    > +extern long long os_nsecs(void);
    >
    > /* skas/mem.c */
    > extern long run_syscall_stub(struct mm_id * mm_idp,
    > Index: linux-2.6.22/arch/um/os-Linux/time.c
    > ================================================== =================
    > --- linux-2.6.22.orig/arch/um/os-Linux/time.c 2007-09-25 09:26:42.000000000 -0400
    > +++ linux-2.6.22/arch/um/os-Linux/time.c 2007-09-25 09:28:42.000000000 -0400
    > @@ -39,7 +39,23 @@ int timer_one_shot(int ticks)
    > return 0;
    > }
    >
    > -unsigned long long disable_timer(void)
    > +/**
    > + * timeval_to_ns - Convert timeval to nanoseconds
    > + * @ts: pointer to the timeval variable to be converted
    > + *
    > + * Returns the scalar nanosecond representation of the timeval
    > + * parameter.
    > + *
    > + * Ripped from linux/time.h because it's a kernel header, and thus
    > + * unusable from here.
    > + */
    > +static inline long long timeval_to_ns(const struct timeval *tv)
    > +{
    > + return ((long long) tv->tv_sec * UM_NSEC_PER_SEC) +
    > + tv->tv_usec * UM_NSEC_PER_USEC;
    > +}
    > +
    > +long long disable_timer(void)
    > {
    > struct itimerval time = ((struct itimerval) { { 0, 0 }, { 0, 0 } });
    >
    > @@ -47,10 +63,10 @@ unsigned long long disable_timer(void)
    > printk(UM_KERN_ERR "disable_timer - setitimer failed, "
    > "errno = %d\n", errno);
    >
    > - return tv_to_nsec(&time.it_value);
    > + return timeval_to_ns(&time.it_value);
    > }
    >
    > -unsigned long long os_nsecs(void)
    > +long long os_nsecs(void)
    > {
    > struct timeval tv;
    >
    > -
    > 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/


    -
    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/

  3. Re: [PATCH] UML - time build fix

    On Tue, Sep 25, 2007 at 09:54:15PM +0200, Thomas Gleixner wrote:
    > On Tue, 2007-09-25 at 13:37 -0400, Jeff Dike wrote:
    > > Put back an implementation of timeval_to_ns in
    > > arch/um/os-Linux/time.c. tglx pointed out in his review of tickless
    > > support that there was a perfectly good implementation of it in
    > > linux/time.h. The problem is that this is userspace code which can't
    > > pull in kernel headers and there doesn't seem to be a libc version.

    >
    > Oops. Did not notice.


    It's a UML peculiarity...

    > Can't we move it into some header file which is accessible from everywhere ?


    Not in the generic kernel. UML has some generally includable headers
    of its own, but that doesn't really help.

    The one thing that would help is a libc timeval_to_ns.

    Jeff

    --
    Work email - jdike at linux dot intel dot com
    -
    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/

  4. Re: [PATCH] UML - time build fix

    Jeff,

    On Tue, 2007-09-25 at 17:56 -0400, Jeff Dike wrote:
    > On Tue, Sep 25, 2007 at 09:54:15PM +0200, Thomas Gleixner wrote:
    > > On Tue, 2007-09-25 at 13:37 -0400, Jeff Dike wrote:
    > > > Put back an implementation of timeval_to_ns in
    > > > arch/um/os-Linux/time.c. tglx pointed out in his review of tickless
    > > > support that there was a perfectly good implementation of it in
    > > > linux/time.h. The problem is that this is userspace code which can't
    > > > pull in kernel headers and there doesn't seem to be a libc version.

    > >
    > > Oops. Did not notice.

    >
    > It's a UML peculiarity...
    >
    > > Can't we move it into some header file which is accessible from everywhere ?

    >
    > Not in the generic kernel. UML has some generally includable headers
    > of its own, but that doesn't really help.
    >
    > The one thing that would help is a libc timeval_to_ns.


    Fair enough.

    tglx


    -
    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/

  5. Re: [uml-devel] [PATCH] UML - time build fix

    On mercoledý 26 settembre 2007, Thomas Gleixner wrote:
    > Jeff,
    >
    > On Tue, 2007-09-25 at 17:56 -0400, Jeff Dike wrote:
    > > On Tue, Sep 25, 2007 at 09:54:15PM +0200, Thomas Gleixner wrote:
    > > > On Tue, 2007-09-25 at 13:37 -0400, Jeff Dike wrote:
    > > > > Put back an implementation of timeval_to_ns in
    > > > > arch/um/os-Linux/time.c. tglx pointed out in his review of tickless
    > > > > support that there was a perfectly good implementation of it in
    > > > > linux/time.h. The problem is that this is userspace code which can't
    > > > > pull in kernel headers and there doesn't seem to be a libc version.
    > > >
    > > > Oops. Did not notice.

    > >
    > > It's a UML peculiarity...
    > >
    > > > Can't we move it into some header file which is accessible from
    > > > everywhere ?

    There is a way to do this without code duplication, but it is creating a
    non-inline function which calls the inline and calling the non-inline from
    userspace. It's done for a variety of other functions.

    There is a tradeoff of speed vs code duplication - and if this function is not
    supposed to change and to need to be kept in sync, it could be copied. I
    conceptually hate this solution, but it can make some sense.

    --
    "Doh!" (cit.), I've made another mistake!
    Paolo Giarrusso, aka Blaisorblade

    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.6 (GNU/Linux)

    iD8DBQBG+n7GqH9OHC+5NscRAuEIAJ4+ESGAjbQtA06T6LHFoS xAN9OwdQCdFw3L
    gHzDTRs767+EEGAiwVhhoGo=
    =mww4
    -----END PGP SIGNATURE-----


+ Reply to Thread