Re: 2.6.26.3-rt2

From: John Kacur
Date: Thu Aug 21 2008 - 15:33:47 EST


On Thu, Aug 21, 2008 at 7:18 PM, Steven Rostedt <rostedt@xxxxxxxxxxx> wrote:
> We are pleased to announce the 2.6.26.3-rt2 tree, which can be
> downloaded from the location:
>
> http://rt.et.redhat.com/download/
>
> Information on the RT patch can be found at:
>
> http://rt.wiki.kernel.org/index.php/Main_Page
>
> Changes since 2.6.26-rt1
>
> - ported to 2.6.26.3
>
> - basic compile fixes (Steven Rostedt)
>
> - basic raw lock conversions (Steven Rostedt)
>
> - powerpc: irq radix tree updates (Sebastien Dugue)
>
> - call_rcu_sched (Paul E. McKenney)
>
> - rcu trace preemption fixes (Paul E. Mckenney)
>
> - remove lock in pm_qos_requirement (John Kacur)
>
> - rcu_process_callbacks (Paul E. McKenney)
>
> - rcu memory barriers update (Paul E. McKenney)
>
> - shorten posix_cpu_timers thread names (Arnaldo Carvalho de Melo)
>
> - account IRQ and RT load in SCHED_OTHER (Peter Zijlstra)
>
> - seq_lock updates/fixes (Gregory Haskins)
>
> to build a 2.6.26.3-rt2 tree, the following patches should be applied:
>
> http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2
> http://kernel.org/pub/linux/kernel/v2.6/patch-2.6.26.3.bz2
> http://rt.et.redhat.com/download/patch-2.6.26.3-rt2.bz2
>
>
>
> And like always, my RT version of Matt Mackall's ketchup will get this
> for you nicely:
>
> http://people.redhat.com/srostedt/rt/tools/ketchup-0.9.8-rt3
>
>
> The broken out patches are also available.
>

Hi Steve

Probably one of the most important patches that was missed is the one
from Chirag. I've taken it and updated it against 2.6.26.3-rt2 for
you, in case that will speed up -rt3 (see attached). (two hunks were
rejected because another applied fix fixed the same thing as part of
Chirag's patch.

I've compiled and done some limited testing, and among other things it
removes this kind of message.
BUG: sleeping function called from invalid context hald-runner(12244)
at kernel/rtmutex.c:743
in_atomic():1 [00000001], irqs_disabled():0
Pid: 12244, comm: hald-runner Tainted: G W 2.6.26.3-rt2 #1

Call Trace:
[<ffffffff802d3cda>] ? mnt_want_write+0x19/0xbc
[<ffffffff802307b6>] __might_sleep+0x12d/0x132
[<ffffffff8046d3de>] __rt_spin_lock+0x34/0x7d
[<ffffffff8046d435>] rt_spin_lock+0xe/0x10
[<ffffffff802d3cfc>] mnt_want_write+0x3b/0xbc
[<ffffffff802cea88>] touch_atime+0x1c/0x101
[<ffffffff802c426c>] __link_path_walk+0x484/0xf24
[<ffffffff802c4d72>] path_walk+0x66/0xc9
[<ffffffff802c51bf>] do_path_lookup+0x209/0x264
[<ffffffff802c5509>] __path_lookup_intent_open+0x61/0xa4
[<ffffffff802c555d>] path_lookup_open+0x11/0x13
[<ffffffff802c61f1>] do_filp_open+0xb6/0x8f5
[<ffffffff8046d3de>] ? __rt_spin_lock+0x34/0x7d
[<ffffffff802b897d>] ? get_unused_fd_flags+0x119/0x12a
[<ffffffff802b89e4>] do_sys_open+0x56/0xd6
[<ffffffff8020c374>] ? system_call_after_swapgs+0xc4/0x168
[<ffffffff802b8a97>] sys_open+0x20/0x22
[<ffffffff8020c3ab>] system_call_after_swapgs+0xfb/0x168

---------------------------
| preempt count: 00000001 ]
| 1-level deep critical section nesting:
----------------------------------------
.. [<ffffffff802d3cda>] .... mnt_want_write+0x19/0xbc
.....[<ffffffff802cea88>] .. ( <= touch_atime+0x1c/0x101)
From: chirag@xxxxxxxxxxxxxxxxxx Chirag Jog
To: j.mell@xxxxxxxxxxx J?rgen Mell, tglx@xxxxxxxxxxxxx Thomas Gleixner
Date: Wed, 30 Jul 2008 19:18:42 +0200
Subject: [PATCH] Fix Bug messages

This patch should solve some of the bug messages.
It does two things:
1. Change rt_runtime_lock to be a raw spinlock as the comment above it
says: it is nested inside the rq lock.

2. Change mnt_writers to be a per_cpu locked variable.
This eliminates the need for the codepath to disable preemption and
then potentially sleep, leading to the BUG messages

Signed-off-by: Chirag <chirag@xxxxxxxxxxxxxxxxxx>
[updated Chirag's patch against 2.6.26.3-rt3]
Signed-off-by: John Kacur <jkacur at gmail dot com>

Index: linux-2.6.26.3/fs/namespace.c
===================================================================
--- linux-2.6.26.3.orig/fs/namespace.c
+++ linux-2.6.26.3/fs/namespace.c
@@ -178,13 +178,13 @@ struct mnt_writer {
unsigned long count;
struct vfsmount *mnt;
} ____cacheline_aligned_in_smp;
-static DEFINE_PER_CPU(struct mnt_writer, mnt_writers);
+static DEFINE_PER_CPU_LOCKED(struct mnt_writer, mnt_writers);

static int __init init_mnt_writers(void)
{
int cpu;
for_each_possible_cpu(cpu) {
- struct mnt_writer *writer = &per_cpu(mnt_writers, cpu);
+ struct mnt_writer *writer = &per_cpu_var_locked(mnt_writers, cpu);
spin_lock_init(&writer->lock);
lockdep_set_class(&writer->lock, &writer->lock_class);
writer->count = 0;
@@ -199,7 +199,7 @@ static void unlock_mnt_writers(void)
struct mnt_writer *cpu_writer;

for_each_possible_cpu(cpu) {
- cpu_writer = &per_cpu(mnt_writers, cpu);
+ cpu_writer = &per_cpu_var_locked(mnt_writers, cpu);
spin_unlock(&cpu_writer->lock);
}
}
@@ -251,8 +251,8 @@ int mnt_want_write(struct vfsmount *mnt)
{
int ret = 0;
struct mnt_writer *cpu_writer;
-
- cpu_writer = &get_cpu_var(mnt_writers);
+ int cpu = 0;
+ cpu_writer = &get_cpu_var_locked(mnt_writers, &cpu);
spin_lock(&cpu_writer->lock);
if (__mnt_is_readonly(mnt)) {
ret = -EROFS;
@@ -262,7 +262,7 @@ int mnt_want_write(struct vfsmount *mnt)
cpu_writer->count++;
out:
spin_unlock(&cpu_writer->lock);
- put_cpu_var(mnt_writers);
+ put_cpu_var_locked(mnt_writers, cpu);
return ret;
}
EXPORT_SYMBOL_GPL(mnt_want_write);
@@ -273,7 +273,7 @@ static void lock_mnt_writers(void)
struct mnt_writer *cpu_writer;

for_each_possible_cpu(cpu) {
- cpu_writer = &per_cpu(mnt_writers, cpu);
+ cpu_writer = &per_cpu_var_locked(mnt_writers, cpu);
spin_lock(&cpu_writer->lock);
__clear_mnt_count(cpu_writer);
cpu_writer->mnt = NULL;
@@ -332,8 +332,8 @@ void mnt_drop_write(struct vfsmount *mnt
{
int must_check_underflow = 0;
struct mnt_writer *cpu_writer;
-
- cpu_writer = &get_cpu_var(mnt_writers);
+ int cpu = 0;
+ cpu_writer = &get_cpu_var_locked(mnt_writers, &cpu);
spin_lock(&cpu_writer->lock);

use_cpu_writer_for_mount(cpu_writer, mnt);
@@ -360,7 +360,7 @@ void mnt_drop_write(struct vfsmount *mnt
* __mnt_writers can underflow. Without it,
* we could theoretically wrap __mnt_writers.
*/
- put_cpu_var(mnt_writers);
+ put_cpu_var_locked(mnt_writers, cpu);
}
EXPORT_SYMBOL_GPL(mnt_drop_write);

@@ -612,7 +612,7 @@ static inline void __mntput(struct vfsmo
* can come in.
*/
for_each_possible_cpu(cpu) {
- struct mnt_writer *cpu_writer = &per_cpu(mnt_writers, cpu);
+ struct mnt_writer *cpu_writer = &per_cpu_var_locked(mnt_writers, cpu);
if (cpu_writer->mnt != mnt)
continue;
spin_lock(&cpu_writer->lock);