Question on RCU_BOOST option

Koehrer Mathias (ETAS/ESS2)
2013-03-25T10:35:31Z

Hi all,

my x86 PC (32bit, Intel core i7, 8 cores) is started with "isolcpus=1-15".
Kernel: 3.6.11-rt31

I have an application having a real time thread bound to one CPU core (core 2).
This threads runs in an endless loop with real time priority (prio 80).
This leads to RCU stalls after a while.
I was now looking at the RCU_BOOST feature to see if this is a way to get rid of the RCU stalls.
My understanding is now, if I enable RCU_BOOST, set the RCU_BOOST_PRIO to "97" this should avoid the issue with the RCU stalls.
However, this works not as I expected.
Please see the following test-application,
--------- BEGIN CODE ---------
#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <math.h>
#include <sys/time.h>

volatile int end=0;

int set_rt_prio_and_core(int prio, int core)
{
{
int rc;
struct sched_param param;
memset(&param, 0, sizeof(param));
param.sched_priority = prio;
rc = sched_setscheduler(0, SCHED_FIFO, &param);
if (rc)
{
perror("sched_setscheduler");
}
}
{
int rc;
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(core, &mask);
rc = sched_setaffinity(0, sizeof(mask), &mask);
if (rc)
{
perror("sched_setaffinity");
}
}
return 0;
}

void *thread_func(void *arg)
{
int i;
volatile double f = 0.0;
set_rt_prio_and_core(80,2);

for (i=0; !end; i++)
{
f = f + sin(2.3*i); // Some dummy load...
}
return NULL;
}

int main(void)
{
pthread_t thr;

pthread_create(&thr, NULL, thread_func, NULL);
sleep(1000);
end = 1;
pthread_join(thr, NULL);
return 0;
}
--------- END CODE ---------

When I start this application it runs as expected with roughly 100% CPU load on this thread.
However after one minute, I got the following dmesg:

-------- BEGIN DMESG ---------
INFO: rcu_preempt self-detected stall on CPU { 2} (t=6000 jiffies)
Pid: 5312, comm: full-load Not tainted 3.6.11-rt31-1 #2
Call Trace:
[<c106e298>] rcu_check_callbacks+0x150/0x4a5
[<c1032a1e>] update_process_times+0x37/0x43
[<c10585cb>] tick_sched_timer+0x19f/0x1d0
[<c104232e>] __run_hrtimer+0xf6/0x1e4
[<c105842c>] ? tick_init_highres+0x14/0x14
[<c1042f49>] hrtimer_interrupt+0x1c6/0x34f
[<c101a92a>] smp_apic_timer_interrupt+0x6c/0x7f
[<c13a651a>] apic_timer_interrupt+0x2a/0x30
-------- END DMESG ---------

What does this mean?
Is it just an informational message that the boost worked? If yes: How can I switch off this message.

Looking at the RCU kernel threads I see the following:
ps ax -o cmd,rtprio,lastcpu | grep rcu
[rcuc/0] 1 0
[rcun/0] 99 0
[rcub/0] 97 0
[rcun/1] 99 0
[rcub/1] 97 0
[rcuc/1] 1 1
[rcuc/2] 1 2
[rcuc/3] 1 3
[rcuc/4] 1 4
[rcuc/5] 1 5
[rcuc/6] 1 0
[rcuc/7] 1 7

What is really unclear to me is the fact that there is a [rcun/0] and [rcun/1] but no /2 , /3, ... (the same with rcub).
Also, the "lastcpu" of [rcun/1] and [rcub/1] is 0 which is fairly surprising to me (I expected the CPU 1 here).

Any help or feedback on this is welcome.

Best regards

Mathias