From: Kirill A. Shutemov <kirill@xxxxxxxxxxxxx> task_get_effective_timer_slack() returns timer slack value to be used to configure per-task timers. It can be equal or higher than task's timer slack value. For now task_get_effective_timer_slack() returns timer_slack_ns of the task. Timer slack cgroup controller will implement a bit more sophisticated logic. Signed-off-by: Kirill A. Shutemov <kirill@xxxxxxxxxxxxx> --- fs/select.c | 7 ++----- include/linux/sched.h | 6 ++++++ kernel/fork.c | 4 ++++ kernel/futex.c | 4 ++-- kernel/hrtimer.c | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/fs/select.c b/fs/select.c index e56560d..712a122 100644 --- a/fs/select.c +++ b/fs/select.c @@ -69,7 +69,6 @@ static long __estimate_accuracy(struct timespec *tv) long select_estimate_accuracy(struct timespec *tv) { - unsigned long ret; struct timespec now; /* @@ -81,10 +80,8 @@ long select_estimate_accuracy(struct timespec *tv) ktime_get_ts(&now); now = timespec_sub(*tv, now); - ret = __estimate_accuracy(&now); - if (ret < current->timer_slack_ns) - return current->timer_slack_ns; - return ret; + return clamp_t(long, __estimate_accuracy(&now), + task_get_effective_timer_slack(current), LONG_MAX); } diff --git a/include/linux/sched.h b/include/linux/sched.h index 777d8a5..44f6f55 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -2620,6 +2620,12 @@ static inline unsigned long rlimit_max(unsigned int limit) return task_rlimit_max(current, limit); } +static inline unsigned long task_get_effective_timer_slack( + struct task_struct *tsk) +{ + return tsk->timer_slack_ns; +} + #endif /* __KERNEL__ */ #endif diff --git a/kernel/fork.c b/kernel/fork.c index 25e4291..4958de9 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1089,6 +1089,10 @@ static struct task_struct *copy_process(unsigned long clone_flags, memset(&p->rss_stat, 0, sizeof(p->rss_stat)); #endif + /* + * Save current task's (not effective) timer slack value as default + * timer slack value for new task. + */ p->default_timer_slack_ns = current->timer_slack_ns; task_io_accounting_init(&p->ioac); diff --git a/kernel/futex.c b/kernel/futex.c index b766d28..e5811c4 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -1845,7 +1845,7 @@ static int futex_wait(u32 __user *uaddr, unsigned int flags, u32 val, HRTIMER_MODE_ABS); hrtimer_init_sleeper(to, current); hrtimer_set_expires_range_ns(&to->timer, *abs_time, - current->timer_slack_ns); + task_get_effective_timer_slack(current)); } retry: @@ -2242,7 +2242,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, HRTIMER_MODE_ABS); hrtimer_init_sleeper(to, current); hrtimer_set_expires_range_ns(&to->timer, *abs_time, - current->timer_slack_ns); + task_get_effective_timer_slack(current)); } /* diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index 0c8d7c0..ffc9a8d 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c @@ -1542,7 +1542,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp, int ret = 0; unsigned long slack; - slack = current->timer_slack_ns; + slack = task_get_effective_timer_slack(current); if (rt_task(current)) slack = 0; -- 1.7.4.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers