Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-09 Thread Ingo Molnar

* Brian Silverman  wrote:

> Here's my test code. Compile with `gcc -pthread -lrt test_pi.c`. It 
> requires permission to set a realtime scheduling policy of 2 when 
> running.

Mind sending a patch that sticks this testcase into 
tools/testing/selftests/sched/ or so, with the new 'sched' directory 
and new Makefile to be created by you as well?

I've reformatted the testcase below, to kernel coding style. Note that 
I added a minimal license notification, you might want to add your 
copyright.

Thanks,

Ingo

==>


/*
 * RLIMIT_RTTIME test code. Compile with:
 *
 * gcc -pthread -lrt test_pi.c
 *
 * It requires permission to set a realtime scheduling policy of 2 when running.
 *
 * License: GPLv2
 */
#define _GNU_SOURCE

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static const struct timespec kSleepTime = { 0, 1 };

static pthread_mutex_t mutex;

extern void nop()
{
}

void *nonrealtime(void *ignored_param)
{
while (1) {
assert(pthread_mutex_lock() == 0);
assert(pthread_mutex_unlock() == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL) 
== 0);
}
}

void *realtime(void *ignored_param)
{
struct sched_param param;

memset(, 0, sizeof(param));
param.sched_priority = 2;
assert(sched_setscheduler(0, SCHED_FIFO, ) == 0);

while (1) {
assert(pthread_mutex_lock() == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL) 
== 0);
assert(pthread_mutex_unlock() == 0);
}
}

void signal_handler(int number)
{
printf("got signal %d, SIGXCPU=%d\n", number, SIGXCPU);

exit(0);
}

int main()
{
struct sigaction action;
memset(, 0, sizeof(action));
action.sa_handler = signal_handler;
assert(sigaction(SIGXCPU, , NULL) == 0);

struct rlimit rlim;
rlim.rlim_cur = 500;
rlim.rlim_max = 5000;
assert(prlimit(0, RLIMIT_RTTIME, , NULL) == 0);

pthread_mutexattr_t mutexattr;
assert(pthread_mutexattr_init() == 0);
assert(pthread_mutexattr_setprotocol(, PTHREAD_PRIO_INHERIT) 
== 0);
assert(pthread_mutex_init(, ) == 0);
assert(pthread_mutexattr_destroy() == 0);

pthread_t nrt, rt;
assert(pthread_create(, NULL, nonrealtime, NULL) == 0);
assert(pthread_create(, NULL, realtime, NULL) == 0);
assert(pthread_join(nrt, NULL) == 0);
assert(pthread_join(rt, NULL) == 0);

return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-09 Thread Brian Silverman
On Mon, Mar 9, 2015 at 1:34 PM, Sebastian Andrzej Siewior
 wrote:

> From what I can tell not beeing a sched guy is that the patch looks
> reasonable since the timeout gets only set to zero on enqueue_task_rt().
> Is there something special you do to trigger this?

I posted some test code with two threads and a shared PTHREAD_PRIO_INHERIT
mutex. It forces repeated priority boosting from SCHED_OTHER to SCHED_RR and
then spins for a bit while boosted. It eventually receives a SIGXCPU
on non-fixed kernels.
The SIGXCPU happens much faster with a CONFIG_PREEMPT_RT kernel, and does
happen eventually with CONFIG_PREEMPT_VOLUNTARY kernels.

>
> Sebastian

Thanks,
Brian
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-09 Thread Sebastian Andrzej Siewior
* Austin Schuh | 2015-03-05 09:10:47 [-0800]:

>ping?

Why is this a ping? I haven't seen this in my rt nor in my lkml inbox.
Please repost it properly including lkml.
>From what I can tell not beeing a sched guy is that the patch looks
reasonable since the timeout gets only set to zero on enqueue_task_rt().
Is there something special you do to trigger this?

Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-09 Thread Sebastian Andrzej Siewior
* Austin Schuh | 2015-03-05 09:10:47 [-0800]:

ping?

Why is this a ping? I haven't seen this in my rt nor in my lkml inbox.
Please repost it properly including lkml.
From what I can tell not beeing a sched guy is that the patch looks
reasonable since the timeout gets only set to zero on enqueue_task_rt().
Is there something special you do to trigger this?

Sebastian
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-09 Thread Brian Silverman
On Mon, Mar 9, 2015 at 1:34 PM, Sebastian Andrzej Siewior
bige...@linutronix.de wrote:

 From what I can tell not beeing a sched guy is that the patch looks
 reasonable since the timeout gets only set to zero on enqueue_task_rt().
 Is there something special you do to trigger this?

I posted some test code with two threads and a shared PTHREAD_PRIO_INHERIT
mutex. It forces repeated priority boosting from SCHED_OTHER to SCHED_RR and
then spins for a bit while boosted. It eventually receives a SIGXCPU
on non-fixed kernels.
The SIGXCPU happens much faster with a CONFIG_PREEMPT_RT kernel, and does
happen eventually with CONFIG_PREEMPT_VOLUNTARY kernels.


 Sebastian

Thanks,
Brian
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-09 Thread Ingo Molnar

* Brian Silverman br...@peloton-tech.com wrote:

 Here's my test code. Compile with `gcc -pthread -lrt test_pi.c`. It 
 requires permission to set a realtime scheduling policy of 2 when 
 running.

Mind sending a patch that sticks this testcase into 
tools/testing/selftests/sched/ or so, with the new 'sched' directory 
and new Makefile to be created by you as well?

I've reformatted the testcase below, to kernel coding style. Note that 
I added a minimal license notification, you might want to add your 
copyright.

Thanks,

Ingo

==


/*
 * RLIMIT_RTTIME test code. Compile with:
 *
 * gcc -pthread -lrt test_pi.c
 *
 * It requires permission to set a realtime scheduling policy of 2 when running.
 *
 * License: GPLv2
 */
#define _GNU_SOURCE

#include pthread.h
#include unistd.h
#include stdio.h
#include time.h
#include sched.h
#include assert.h
#include sys/resource.h
#include string.h
#include signal.h
#include stdlib.h

static const struct timespec kSleepTime = { 0, 1 };

static pthread_mutex_t mutex;

extern void nop()
{
}

void *nonrealtime(void *ignored_param)
{
while (1) {
assert(pthread_mutex_lock(mutex) == 0);
assert(pthread_mutex_unlock(mutex) == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, kSleepTime, NULL) 
== 0);
}
}

void *realtime(void *ignored_param)
{
struct sched_param param;

memset(param, 0, sizeof(param));
param.sched_priority = 2;
assert(sched_setscheduler(0, SCHED_FIFO, param) == 0);

while (1) {
assert(pthread_mutex_lock(mutex) == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, kSleepTime, NULL) 
== 0);
assert(pthread_mutex_unlock(mutex) == 0);
}
}

void signal_handler(int number)
{
printf(got signal %d, SIGXCPU=%d\n, number, SIGXCPU);

exit(0);
}

int main()
{
struct sigaction action;
memset(action, 0, sizeof(action));
action.sa_handler = signal_handler;
assert(sigaction(SIGXCPU, action, NULL) == 0);

struct rlimit rlim;
rlim.rlim_cur = 500;
rlim.rlim_max = 5000;
assert(prlimit(0, RLIMIT_RTTIME, rlim, NULL) == 0);

pthread_mutexattr_t mutexattr;
assert(pthread_mutexattr_init(mutexattr) == 0);
assert(pthread_mutexattr_setprotocol(mutexattr, PTHREAD_PRIO_INHERIT) 
== 0);
assert(pthread_mutex_init(mutex, mutexattr) == 0);
assert(pthread_mutexattr_destroy(mutexattr) == 0);

pthread_t nrt, rt;
assert(pthread_create(nrt, NULL, nonrealtime, NULL) == 0);
assert(pthread_create(rt, NULL, realtime, NULL) == 0);
assert(pthread_join(nrt, NULL) == 0);
assert(pthread_join(rt, NULL) == 0);

return 0;
}
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-05 Thread Austin Schuh
ping?

On Wed, Feb 18, 2015 at 4:23 PM,   wrote:
> From: Brian Silverman 
>
> When non-realtime tasks get priority-inheritance boosted to a realtime
> scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
> counter used for checking this (the same one used for SCHED_RR
> timeslices) was not getting reset. This meant that tasks running with a
> non-realtime scheduling class which are repeatedly boosted to a realtime
> one, but never block while they are running realtime, eventually hit the
> timeout without ever running for a time over the limit. This patch
> resets the realtime timeslice counter when un-PI-boosting from an RT to
> a non-RT scheduling class.
>
> I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
> mutex which induces priority boosting and spins while boosted that gets
> killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
> applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
> does happen eventually with PREEMPT_VOLUNTARY kernels.
>
> Signed-off-by: Brian Silverman 
> ---
> I am not subscribed to the list so please CC me on any responses.
>
>  kernel/sched/core.c |2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 87b9814..16ad0ed 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -3192,6 +3192,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
> } else {
> if (dl_prio(oldprio))
> p->dl.dl_boosted = 0;
> +   if (rt_prio(oldprio))
> +   p->rt.timeout = 0;
> p->sched_class = _sched_class;
> }
>
> --
> 1.7.10.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-03-05 Thread Austin Schuh
ping?

On Wed, Feb 18, 2015 at 4:23 PM,  br...@peloton-tech.com wrote:
 From: Brian Silverman br...@peloton-tech.com

 When non-realtime tasks get priority-inheritance boosted to a realtime
 scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
 counter used for checking this (the same one used for SCHED_RR
 timeslices) was not getting reset. This meant that tasks running with a
 non-realtime scheduling class which are repeatedly boosted to a realtime
 one, but never block while they are running realtime, eventually hit the
 timeout without ever running for a time over the limit. This patch
 resets the realtime timeslice counter when un-PI-boosting from an RT to
 a non-RT scheduling class.

 I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
 mutex which induces priority boosting and spins while boosted that gets
 killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
 applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
 does happen eventually with PREEMPT_VOLUNTARY kernels.

 Signed-off-by: Brian Silverman br...@peloton-tech.com
 ---
 I am not subscribed to the list so please CC me on any responses.

  kernel/sched/core.c |2 ++
  1 file changed, 2 insertions(+)

 diff --git a/kernel/sched/core.c b/kernel/sched/core.c
 index 87b9814..16ad0ed 100644
 --- a/kernel/sched/core.c
 +++ b/kernel/sched/core.c
 @@ -3192,6 +3192,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
 } else {
 if (dl_prio(oldprio))
 p-dl.dl_boosted = 0;
 +   if (rt_prio(oldprio))
 +   p-rt.timeout = 0;
 p-sched_class = fair_sched_class;
 }

 --
 1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-02-18 Thread Brian Silverman
Here's my test code. Compile with `gcc -pthread -lrt test_pi.c`. It
requires permission to set a realtime scheduling policy of 2 when
running.

#define _GNU_SOURCE

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static const struct timespec kSleepTime = {0, 1};
static pthread_mutex_t mutex;

extern void nop() {}

void *nonrealtime(void *ignored_param) {
  while (1) {
assert(pthread_mutex_lock() == 0);
assert(pthread_mutex_unlock() == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL) == 0);
  }
}

void *realtime(void *ignored_param) {
  struct sched_param param;
  memset(, 0, sizeof(param));
  param.sched_priority = 2;
  assert(sched_setscheduler(0, SCHED_FIFO, ) == 0);
  while (1) {
assert(pthread_mutex_lock() == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, , NULL) == 0);
assert(pthread_mutex_unlock() == 0);
  }
}

void signal_handler(int number) {
  printf("got signal %d, SIGXCPU=%d\n", number, SIGXCPU);
  exit(0);
}

int main() {
  struct sigaction action;
  memset(, 0, sizeof(action));
  action.sa_handler = signal_handler;
  assert(sigaction(SIGXCPU, , NULL) == 0);

  struct rlimit rlim;
  rlim.rlim_cur = 500;
  rlim.rlim_max = 5000;
  assert(prlimit(0, RLIMIT_RTTIME, , NULL) == 0);

  pthread_mutexattr_t mutexattr;
  assert(pthread_mutexattr_init() == 0);
  assert(pthread_mutexattr_setprotocol(, PTHREAD_PRIO_INHERIT) == 0);
  assert(pthread_mutex_init(, ) == 0);
  assert(pthread_mutexattr_destroy() == 0);

  pthread_t nrt, rt;
  assert(pthread_create(, NULL, nonrealtime, NULL) == 0);
  assert(pthread_create(, NULL, realtime, NULL) == 0);
  assert(pthread_join(nrt, NULL) == 0);
  assert(pthread_join(rt, NULL) == 0);
  return 0;
}


On Wed, Feb 18, 2015 at 7:23 PM,   wrote:
> From: Brian Silverman 
>
> When non-realtime tasks get priority-inheritance boosted to a realtime
> scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
> counter used for checking this (the same one used for SCHED_RR
> timeslices) was not getting reset. This meant that tasks running with a
> non-realtime scheduling class which are repeatedly boosted to a realtime
> one, but never block while they are running realtime, eventually hit the
> timeout without ever running for a time over the limit. This patch
> resets the realtime timeslice counter when un-PI-boosting from an RT to
> a non-RT scheduling class.
>
> I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
> mutex which induces priority boosting and spins while boosted that gets
> killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
> applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
> does happen eventually with PREEMPT_VOLUNTARY kernels.
>
> Signed-off-by: Brian Silverman 
> ---
> I am not subscribed to the list so please CC me on any responses.
>
>  kernel/sched/core.c |2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 87b9814..16ad0ed 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -3192,6 +3192,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
> } else {
> if (dl_prio(oldprio))
> p->dl.dl_boosted = 0;
> +   if (rt_prio(oldprio))
> +   p->rt.timeout = 0;
> p->sched_class = _sched_class;
> }
>
> --
> 1.7.10.4
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-02-18 Thread brian
From: Brian Silverman 

When non-realtime tasks get priority-inheritance boosted to a realtime
scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
counter used for checking this (the same one used for SCHED_RR
timeslices) was not getting reset. This meant that tasks running with a
non-realtime scheduling class which are repeatedly boosted to a realtime
one, but never block while they are running realtime, eventually hit the
timeout without ever running for a time over the limit. This patch
resets the realtime timeslice counter when un-PI-boosting from an RT to
a non-RT scheduling class.

I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
mutex which induces priority boosting and spins while boosted that gets
killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
does happen eventually with PREEMPT_VOLUNTARY kernels.

Signed-off-by: Brian Silverman 
---
I am not subscribed to the list so please CC me on any responses.

 kernel/sched/core.c |2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 87b9814..16ad0ed 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3192,6 +3192,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
} else {
if (dl_prio(oldprio))
p->dl.dl_boosted = 0;
+   if (rt_prio(oldprio))
+   p->rt.timeout = 0;
p->sched_class = _sched_class;
}
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-02-18 Thread Brian Silverman
Here's my test code. Compile with `gcc -pthread -lrt test_pi.c`. It
requires permission to set a realtime scheduling policy of 2 when
running.

#define _GNU_SOURCE

#include pthread.h
#include unistd.h
#include stdio.h
#include time.h
#include sched.h
#include assert.h
#include sys/resource.h
#include string.h
#include signal.h
#include stdlib.h

static const struct timespec kSleepTime = {0, 1};
static pthread_mutex_t mutex;

extern void nop() {}

void *nonrealtime(void *ignored_param) {
  while (1) {
assert(pthread_mutex_lock(mutex) == 0);
assert(pthread_mutex_unlock(mutex) == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, kSleepTime, NULL) == 0);
  }
}

void *realtime(void *ignored_param) {
  struct sched_param param;
  memset(param, 0, sizeof(param));
  param.sched_priority = 2;
  assert(sched_setscheduler(0, SCHED_FIFO, param) == 0);
  while (1) {
assert(pthread_mutex_lock(mutex) == 0);
assert(clock_nanosleep(CLOCK_MONOTONIC, 0, kSleepTime, NULL) == 0);
assert(pthread_mutex_unlock(mutex) == 0);
  }
}

void signal_handler(int number) {
  printf(got signal %d, SIGXCPU=%d\n, number, SIGXCPU);
  exit(0);
}

int main() {
  struct sigaction action;
  memset(action, 0, sizeof(action));
  action.sa_handler = signal_handler;
  assert(sigaction(SIGXCPU, action, NULL) == 0);

  struct rlimit rlim;
  rlim.rlim_cur = 500;
  rlim.rlim_max = 5000;
  assert(prlimit(0, RLIMIT_RTTIME, rlim, NULL) == 0);

  pthread_mutexattr_t mutexattr;
  assert(pthread_mutexattr_init(mutexattr) == 0);
  assert(pthread_mutexattr_setprotocol(mutexattr, PTHREAD_PRIO_INHERIT) == 0);
  assert(pthread_mutex_init(mutex, mutexattr) == 0);
  assert(pthread_mutexattr_destroy(mutexattr) == 0);

  pthread_t nrt, rt;
  assert(pthread_create(nrt, NULL, nonrealtime, NULL) == 0);
  assert(pthread_create(rt, NULL, realtime, NULL) == 0);
  assert(pthread_join(nrt, NULL) == 0);
  assert(pthread_join(rt, NULL) == 0);
  return 0;
}


On Wed, Feb 18, 2015 at 7:23 PM,  br...@peloton-tech.com wrote:
 From: Brian Silverman br...@peloton-tech.com

 When non-realtime tasks get priority-inheritance boosted to a realtime
 scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
 counter used for checking this (the same one used for SCHED_RR
 timeslices) was not getting reset. This meant that tasks running with a
 non-realtime scheduling class which are repeatedly boosted to a realtime
 one, but never block while they are running realtime, eventually hit the
 timeout without ever running for a time over the limit. This patch
 resets the realtime timeslice counter when un-PI-boosting from an RT to
 a non-RT scheduling class.

 I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
 mutex which induces priority boosting and spins while boosted that gets
 killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
 applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
 does happen eventually with PREEMPT_VOLUNTARY kernels.

 Signed-off-by: Brian Silverman br...@peloton-tech.com
 ---
 I am not subscribed to the list so please CC me on any responses.

  kernel/sched/core.c |2 ++
  1 file changed, 2 insertions(+)

 diff --git a/kernel/sched/core.c b/kernel/sched/core.c
 index 87b9814..16ad0ed 100644
 --- a/kernel/sched/core.c
 +++ b/kernel/sched/core.c
 @@ -3192,6 +3192,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
 } else {
 if (dl_prio(oldprio))
 p-dl.dl_boosted = 0;
 +   if (rt_prio(oldprio))
 +   p-rt.timeout = 0;
 p-sched_class = fair_sched_class;
 }

 --
 1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] sched: fix RLIMIT_RTTIME when PI-boosting to RT

2015-02-18 Thread brian
From: Brian Silverman br...@peloton-tech.com

When non-realtime tasks get priority-inheritance boosted to a realtime
scheduling class, RLIMIT_RTTIME starts to apply to them. However, the
counter used for checking this (the same one used for SCHED_RR
timeslices) was not getting reset. This meant that tasks running with a
non-realtime scheduling class which are repeatedly boosted to a realtime
one, but never block while they are running realtime, eventually hit the
timeout without ever running for a time over the limit. This patch
resets the realtime timeslice counter when un-PI-boosting from an RT to
a non-RT scheduling class.

I have some test code with two threads and a shared PTHREAD_PRIO_INHERIT
mutex which induces priority boosting and spins while boosted that gets
killed by a SIGXCPU on non-fixed kernels but doesn't with this patch
applied. It happens much faster with a CONFIG_PREEMPT_RT kernel, and
does happen eventually with PREEMPT_VOLUNTARY kernels.

Signed-off-by: Brian Silverman br...@peloton-tech.com
---
I am not subscribed to the list so please CC me on any responses.

 kernel/sched/core.c |2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 87b9814..16ad0ed 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3192,6 +3192,8 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
} else {
if (dl_prio(oldprio))
p-dl.dl_boosted = 0;
+   if (rt_prio(oldprio))
+   p-rt.timeout = 0;
p-sched_class = fair_sched_class;
}
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/