lkml.org 
[lkml]   [2007]   [Oct]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] Hook compat_sys_nanosleep up to high res timer code
    On Sun, 14 Oct 2007, Anton Blanchard wrote:
    > Hi Arnd,
    >
    > > The code looks correct, but I think it would be nicer to change
    > > hrtimer_nanosleep to take a kernel pointer and have all three
    > > callers (common_nsleep, sys_nanosleep and compat_sys_nanosleep)
    > > do the copy_to_user/put_compat_timespec in the caller.
    >
    > Good idea, I had considered that but thought a larger cleanup might run
    > afoul of the merge rules :)

    Looks good, except ....

    > --- a/kernel/compat.c
    > +++ b/kernel/compat.c
    > @@ -40,62 +40,26 @@ int put_compat_timespec(const struct timespec *ts, struct compat_timespec __user
    > __put_user(ts->tv_nsec, &cts->tv_nsec)) ? -EFAULT : 0;
    > }

    Can you put this into a separate patch please ?

    > --- a/kernel/hrtimer.c
    > +++ b/kernel/hrtimer.c
    > restart = &current_thread_info()->restart_block;
    > @@ -1353,7 +1347,8 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
    > asmlinkage long
    > sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
    > {
    > - struct timespec tu;
    > + struct timespec tu, rmt;
    > + int ret;
    >
    > if (copy_from_user(&tu, rqtp, sizeof(tu)))
    > return -EFAULT;
    > @@ -1361,7 +1356,14 @@ sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
    > if (!timespec_valid(&tu))
    > return -EINVAL;
    >
    > - return hrtimer_nanosleep(&tu, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
    > + ret = hrtimer_nanosleep(&tu, &rmt, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
    > +
    > + if (ret) {

    Can you check for rmtp as well ? rmtp is optional and can be NULL

    > + if (copy_to_user(rmtp, &rmt, sizeof(*rmtp)))
    > + return -EFAULT;
    > + }
    > +
    > + return ret;
    > }
    >
    > /*
    > diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
    > index 7a15afb..fc7dac2 100644
    > --- a/kernel/posix-timers.c
    > +++ b/kernel/posix-timers.c
    > @@ -980,9 +980,19 @@ sys_clock_getres(const clockid_t which_clock, struct timespec __user *tp)
    > static int common_nsleep(const clockid_t which_clock, int flags,
    > struct timespec *tsave, struct timespec __user *rmtp)
    > {
    > - return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
    > + struct timespec rmt;
    > + int ret;
    > +
    > + ret = hrtimer_nanosleep(tsave, &rmt, flags & TIMER_ABSTIME ?
    > HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
    > which_clock);
    > +
    > + if (ret) {

    Ditto.

    > + if (copy_to_user(rmtp, &rmt, sizeof(*rmtp)))
    > + return -EFAULT;
    > + }
    > +
    > + return ret;
    > }

    Thanks,

    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/

    \
     
     \ /
      Last update: 2007-10-15 08:15    [W:0.024 / U:29.596 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site