[amd64] bump rt feature set to 3.2-rc5-rt8

svn path=/dists/trunk/linux-2.6/; revision=18389
This commit is contained in:
Uwe Kleine-König 2011-12-15 14:24:33 +00:00
parent 93a7026d1b
commit fd6ad13765
14 changed files with 662 additions and 13 deletions

2
debian/changelog vendored
View File

@ -10,7 +10,7 @@ linux-2.6 (3.2~rc5-1~experimental.1) UNRELEASED; urgency=low
* [x86] et131x: Include driver in installer (Closes: #651440)
[ Uwe Kleine-König ]
* [amd64] Update rt featureset to 3.2-rc4-rt6
* [amd64] Update rt featureset to 3.2-rc5-rt8
[ Arnaud Patard ]
* [arm] setup: initialize arm_dma_zone_size earlier (Closes: #651215)

View File

@ -0,0 +1,72 @@
Subject: acpi-gpe-use-wait-simple.patch
From: Thomas Gleixner <tglx@linutronix.de>
Date: Tue, 13 Dec 2011 17:14:35 +0100
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/acpi/ec.c | 8 ++++----
drivers/acpi/internal.h | 4 +++-
2 files changed, 7 insertions(+), 5 deletions(-)
Index: linux-3.2/drivers/acpi/ec.c
===================================================================
--- linux-3.2.orig/drivers/acpi/ec.c
+++ linux-3.2/drivers/acpi/ec.c
@@ -222,7 +222,7 @@ static int ec_poll(struct acpi_ec *ec)
if (ec_transaction_done(ec))
return 0;
} else {
- if (wait_event_timeout(ec->wait,
+ if (swait_event_timeout(ec->wait,
ec_transaction_done(ec),
msecs_to_jiffies(1)))
return 0;
@@ -272,7 +272,7 @@ static int ec_wait_ibf0(struct acpi_ec *
unsigned long delay = jiffies + msecs_to_jiffies(ec_delay);
/* interrupt wait manually if GPE mode is not active */
while (time_before(jiffies, delay))
- if (wait_event_timeout(ec->wait, ec_check_ibf0(ec),
+ if (swait_event_timeout(ec->wait, ec_check_ibf0(ec),
msecs_to_jiffies(1)))
return 0;
return -ETIME;
@@ -612,7 +612,7 @@ static u32 acpi_ec_gpe_handler(acpi_hand
advance_transaction(ec, acpi_ec_read_status(ec));
if (ec_transaction_done(ec) &&
(acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) {
- wake_up(&ec->wait);
+ swait_wake(&ec->wait);
ec_check_sci(ec, acpi_ec_read_status(ec));
}
return ACPI_INTERRUPT_HANDLED | ACPI_REENABLE_GPE;
@@ -676,7 +676,7 @@ static struct acpi_ec *make_acpi_ec(void
return NULL;
ec->flags = 1 << EC_FLAGS_QUERY_PENDING;
mutex_init(&ec->lock);
- init_waitqueue_head(&ec->wait);
+ init_swait_head(&ec->wait);
INIT_LIST_HEAD(&ec->list);
raw_spin_lock_init(&ec->curr_lock);
return ec;
Index: linux-3.2/drivers/acpi/internal.h
===================================================================
--- linux-3.2.orig/drivers/acpi/internal.h
+++ linux-3.2/drivers/acpi/internal.h
@@ -23,6 +23,8 @@
#define PREFIX "ACPI: "
+#include <linux/wait-simple.h>
+
int init_acpi_device_notify(void);
int acpi_scan_init(void);
int acpi_sysfs_init(void);
@@ -59,7 +61,7 @@ struct acpi_ec {
unsigned long global_lock;
unsigned long flags;
struct mutex lock;
- wait_queue_head_t wait;
+ struct swait_head wait;
struct list_head list;
struct transaction *curr;
raw_spinlock_t curr_lock;

View File

@ -0,0 +1,38 @@
Subject: cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT
From: Thomas Gleixner <tglx@linutronix.de>
Date: Wed, 14 Dec 2011 01:03:49 +0100
We can't deal with the cpumask allocations which happen in atomic
context (see arch/x86/kernel/apic/io_apic.c) on RT right now.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
arch/x86/Kconfig | 2 +-
lib/Kconfig | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
Index: linux-3.2/arch/x86/Kconfig
===================================================================
--- linux-3.2.orig/arch/x86/Kconfig
+++ linux-3.2/arch/x86/Kconfig
@@ -730,7 +730,7 @@ config IOMMU_HELPER
config MAXSMP
bool "Enable Maximum number of SMP Processors and NUMA Nodes"
depends on X86_64 && SMP && DEBUG_KERNEL && EXPERIMENTAL
- select CPUMASK_OFFSTACK
+ select CPUMASK_OFFSTACK if !PREEMPT_RT_FULL
---help---
Enable maximum number of CPUS and NUMA Nodes for this architecture.
If unsure, say N.
Index: linux-3.2/lib/Kconfig
===================================================================
--- linux-3.2.orig/lib/Kconfig
+++ linux-3.2/lib/Kconfig
@@ -231,6 +231,7 @@ config CHECK_SIGNATURE
config CPUMASK_OFFSTACK
bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS
+ depends on !PREEMPT_RT_FULL
help
Use dynamic allocation for cpumask_var_t, instead of putting
them on the stack. This is a bit more expensive, but avoids

View File

@ -0,0 +1,69 @@
Subject: intel_idle: Convert i7300_idle_lock to raw spinlock
From: Mike Galbraith <efault@gmx.de>
Date: Wed, 07 Dec 2011 12:48:42 +0100
24 core Intel box's first exposure to 3.0.12-rt30-rc3 didn't go well.
[ 27.104159] i7300_idle: loaded v1.55
[ 27.104192] BUG: scheduling while atomic: swapper/2/0/0x00000002
[ 27.104309] Pid: 0, comm: swapper/2 Tainted: G N 3.0.12-rt30-rc3-rt #1
[ 27.104317] Call Trace:
[ 27.104338] [<ffffffff810046a5>] dump_trace+0x85/0x2e0
[ 27.104372] [<ffffffff8144eb00>] thread_return+0x12b/0x30b
[ 27.104381] [<ffffffff8144f1b9>] schedule+0x29/0xb0
[ 27.104389] [<ffffffff814506e5>] rt_spin_lock_slowlock+0xc5/0x240
[ 27.104401] [<ffffffffa01f818f>] i7300_idle_notifier+0x3f/0x360 [i7300_idle]
[ 27.104415] [<ffffffff814546c7>] notifier_call_chain+0x37/0x70
[ 27.104426] [<ffffffff81454748>] __atomic_notifier_call_chain+0x48/0x70
[ 27.104439] [<ffffffff81001a39>] cpu_idle+0x89/0xb0
[ 27.104449] bad: scheduling from the idle thread!
Signed-off-by: Mike Galbraith <efault@gmx.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1323258522.5057.73.camel@marge.simson.net
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/idle/i7300_idle.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Index: linux-3.2/drivers/idle/i7300_idle.c
===================================================================
--- linux-3.2.orig/drivers/idle/i7300_idle.c
+++ linux-3.2/drivers/idle/i7300_idle.c
@@ -75,7 +75,7 @@ static unsigned long past_skip;
static struct pci_dev *fbd_dev;
-static spinlock_t i7300_idle_lock;
+static raw_spinlock_t i7300_idle_lock;
static int i7300_idle_active;
static u8 i7300_idle_thrtctl_saved;
@@ -457,7 +457,7 @@ static int i7300_idle_notifier(struct no
idle_begin_time = ktime_get();
}
- spin_lock_irqsave(&i7300_idle_lock, flags);
+ raw_spin_lock_irqsave(&i7300_idle_lock, flags);
if (val == IDLE_START) {
cpumask_set_cpu(smp_processor_id(), idle_cpumask);
@@ -506,7 +506,7 @@ static int i7300_idle_notifier(struct no
}
}
end:
- spin_unlock_irqrestore(&i7300_idle_lock, flags);
+ raw_spin_unlock_irqrestore(&i7300_idle_lock, flags);
return 0;
}
@@ -554,7 +554,7 @@ struct debugfs_file_info {
static int __init i7300_idle_init(void)
{
- spin_lock_init(&i7300_idle_lock);
+ raw_spin_lock_init(&i7300_idle_lock);
total_us = 0;
if (i7300_idle_platform_probe(&fbd_dev, &ioat_dev, forceload))

View File

@ -14,4 +14,4 @@ Index: linux-3.2/localversion-rt
--- /dev/null
+++ linux-3.2/localversion-rt
@@ -0,0 +1 @@
+-rt6
+-rt8

View File

@ -95,7 +95,7 @@ Index: linux-3.2/kernel/softirq.c
===================================================================
--- linux-3.2.orig/kernel/softirq.c
+++ linux-3.2/kernel/softirq.c
@@ -138,7 +138,7 @@ static void wakeup_softirqd(void)
@@ -139,7 +139,7 @@ static void wakeup_softirqd(void)
wake_up_process(tsk);
}
@ -104,7 +104,7 @@ Index: linux-3.2/kernel/softirq.c
{
struct softirq_action *h = softirq_vec;
unsigned int prev_count = preempt_count();
@@ -161,7 +161,8 @@ static void handle_pending_softirqs(u32
@@ -162,7 +162,8 @@ static void handle_pending_softirqs(u32
prev_count, (unsigned int) preempt_count());
preempt_count() = prev_count;
}
@ -114,7 +114,7 @@ Index: linux-3.2/kernel/softirq.c
}
local_irq_disable();
}
@@ -313,7 +314,7 @@ restart:
@@ -314,7 +315,7 @@ restart:
/* Reset the pending bitmask before enabling irqs */
set_softirq_pending(0);
@ -123,7 +123,7 @@ Index: linux-3.2/kernel/softirq.c
pending = local_softirq_pending();
if (pending && --max_restart)
@@ -383,7 +384,12 @@ static inline void ksoftirqd_clr_sched_p
@@ -384,7 +385,12 @@ static inline void ksoftirqd_clr_sched_p
static DEFINE_LOCAL_IRQ_LOCK(local_softirq_lock);
static DEFINE_PER_CPU(struct task_struct *, local_softirq_runner);
@ -137,7 +137,7 @@ Index: linux-3.2/kernel/softirq.c
void __init softirq_early_init(void)
{
@@ -446,7 +452,7 @@ int in_serving_softirq(void)
@@ -448,7 +454,7 @@ EXPORT_SYMBOL(in_serving_softirq);
* Called with bh and local interrupts disabled. For full RT cpu must
* be pinned.
*/
@ -146,7 +146,7 @@ Index: linux-3.2/kernel/softirq.c
{
u32 pending = local_softirq_pending();
int cpu = smp_processor_id();
@@ -460,7 +466,7 @@ static void __do_softirq(void)
@@ -462,7 +468,7 @@ static void __do_softirq(void)
lockdep_softirq_enter();
@ -155,7 +155,7 @@ Index: linux-3.2/kernel/softirq.c
pending = local_softirq_pending();
if (pending)
@@ -499,7 +505,7 @@ static int __thread_do_softirq(int cpu)
@@ -501,7 +507,7 @@ static int __thread_do_softirq(int cpu)
* schedule!
*/
if (local_softirq_pending())

View File

@ -0,0 +1,60 @@
Subject: printk: Disable migration instead of preemption
From: Richard Weinberger <rw@linutronix.de>
Date: Mon, 12 Dec 2011 14:35:56 +0100
There is no need do disable preemption in vprintk(), disable_migrate()
is sufficient. This fixes the following bug in -rt:
[ 14.759233] BUG: sleeping function called from invalid context
at /home/rw/linux-rt/kernel/rtmutex.c:645
[ 14.759235] in_atomic(): 1, irqs_disabled(): 0, pid: 547, name: bash
[ 14.759244] Pid: 547, comm: bash Not tainted 3.0.12-rt29+ #3
[ 14.759246] Call Trace:
[ 14.759301] [<ffffffff8106fade>] __might_sleep+0xeb/0xf0
[ 14.759318] [<ffffffff810ad784>] rt_spin_lock_fastlock.constprop.9+0x21/0x43
[ 14.759336] [<ffffffff8161fef0>] rt_spin_lock+0xe/0x10
[ 14.759354] [<ffffffff81347ad1>] serial8250_console_write+0x81/0x121
[ 14.759366] [<ffffffff8107ecd3>] __call_console_drivers+0x7c/0x93
[ 14.759369] [<ffffffff8107ef31>] _call_console_drivers+0x5c/0x60
[ 14.759372] [<ffffffff8107f7e5>] console_unlock+0x147/0x1a2
[ 14.759374] [<ffffffff8107fd33>] vprintk+0x3ea/0x462
[ 14.759383] [<ffffffff816160e0>] printk+0x51/0x53
[ 14.759399] [<ffffffff811974e4>] ? proc_reg_poll+0x9a/0x9a
[ 14.759403] [<ffffffff81335b42>] __handle_sysrq+0x50/0x14d
[ 14.759406] [<ffffffff81335c8a>] write_sysrq_trigger+0x4b/0x53
[ 14.759408] [<ffffffff81335c3f>] ? __handle_sysrq+0x14d/0x14d
[ 14.759410] [<ffffffff81197583>] proc_reg_write+0x9f/0xbe
[ 14.759426] [<ffffffff811497ec>] vfs_write+0xac/0xf3
[ 14.759429] [<ffffffff8114a9b3>] ? fget_light+0x3a/0x9b
[ 14.759431] [<ffffffff811499db>] sys_write+0x4a/0x6e
[ 14.759438] [<ffffffff81625d52>] system_call_fastpath+0x16/0x1b
Signed-off-by: Richard Weinberger <rw@linutronix.de>
Link: http://lkml.kernel.org/r/1323696956-11445-1-git-send-email-rw@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
kernel/printk.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Index: linux-3.2/kernel/printk.c
===================================================================
--- linux-3.2.orig/kernel/printk.c
+++ linux-3.2/kernel/printk.c
@@ -902,7 +902,7 @@ asmlinkage int vprintk(const char *fmt,
boot_delay_msec();
printk_delay();
- preempt_disable();
+ migrate_disable();
/* This stops the holder of console_sem just where we want him */
raw_local_irq_save(flags);
this_cpu = smp_processor_id();
@@ -1033,7 +1033,7 @@ asmlinkage int vprintk(const char *fmt,
out_restore_irqs:
raw_local_irq_restore(flags);
- preempt_enable();
+ migrate_enable();
return printed_len;
}
EXPORT_SYMBOL(printk);

View File

@ -0,0 +1,44 @@
Subject: rt/rcutree: Move misplaced prototype
From: Ingo Molnar <mingo@elte.hu>
Date: Wed Dec 14 12:51:28 CET 2011
Fix this warning on x86 defconfig:
kernel/rcutree.h:433:13: warning: rcu_preempt_qs declared static but never defined [-Wunused-function]
The #ifdefs and prototypes here are a maze, move it closer to the
usage site that needs it.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
---
kernel/rcutree.c | 2 ++
kernel/rcutree.h | 1 -
2 files changed, 2 insertions(+), 1 deletion(-)
Index: tip/kernel/rcutree.c
===================================================================
--- tip.orig/kernel/rcutree.c
+++ tip/kernel/rcutree.c
@@ -171,6 +171,8 @@ void rcu_sched_qs(int cpu)
}
#ifdef CONFIG_PREEMPT_RT_FULL
+static void rcu_preempt_qs(int cpu);
+
void rcu_bh_qs(int cpu)
{
rcu_preempt_qs(cpu);
Index: tip/kernel/rcutree.h
===================================================================
--- tip.orig/kernel/rcutree.h
+++ tip/kernel/rcutree.h
@@ -430,7 +430,6 @@ DECLARE_PER_CPU(char, rcu_cpu_has_work);
/* Forward declarations for rcutree_plugin.h */
static void rcu_bootup_announce(void);
long rcu_batches_completed(void);
-static void rcu_preempt_qs(int cpu);
static void rcu_preempt_note_context_switch(int cpu);
static int rcu_preempt_blocked_readers_cgp(struct rcu_node *rnp);
#ifdef CONFIG_HOTPLUG_CPU

View File

@ -0,0 +1,54 @@
Subject: rt: Improve the serial console PASS_LIMIT
From: Ingo Molnar <mingo@elte.hu>
Date: Wed Dec 14 13:05:54 CET 2011
Beyond the warning:
drivers/tty/serial/8250.c:1613:6: warning: unused variable pass_counter [-Wunused-variable]
the solution of just looping infinitely was ugly - up it to 1 million to
give it a chance to continue in some really ugly situation.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
drivers/tty/serial/8250.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
Index: tip/drivers/tty/serial/8250.c
===================================================================
--- tip.orig/drivers/tty/serial/8250.c
+++ tip/drivers/tty/serial/8250.c
@@ -82,7 +82,16 @@ static unsigned int skip_txen_test; /* f
#define DEBUG_INTR(fmt...) do { } while (0)
#endif
-#define PASS_LIMIT 512
+/*
+ * On -rt we can have a more delays, and legitimately
+ * so - so don't drop work spuriously and spam the
+ * syslog:
+ */
+#ifdef CONFIG_PREEMPT_RT_FULL
+# define PASS_LIMIT 1000000
+#else
+# define PASS_LIMIT 512
+#endif
#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
@@ -1632,14 +1641,12 @@ static irqreturn_t serial8250_interrupt(
l = l->next;
-#ifndef CONFIG_PREEMPT_RT_FULL
if (l == i->head && pass_counter++ > PASS_LIMIT) {
/* If we hit this, we're dead. */
printk_ratelimited(KERN_ERR
"serial8250: too much work for irq%d\n", irq);
break;
}
-#endif
} while (l != end);
spin_unlock(&i->lock);

View File

@ -0,0 +1,36 @@
Subject: sched: ttwu: Return success when only changing the saved_state value
From: Thomas Gleixner <tglx@linutronix.de>
Date: Tue, 13 Dec 2011 21:42:19 +0100
When a task blocks on a rt lock, it saves the current state in
p->saved_state, so a lock related wake up will not destroy the
original state.
When a real wakeup happens, while the task is running due to a lock
wakeup already, we update p->saved_state to TASK_RUNNING, but we do
not return success, which might cause another wakeup in the waitqueue
code and the task remains in the waitqueue list. Return success in
that case as well.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: stable-rt@vger.kernel.org
---
kernel/sched.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
Index: linux-3.2/kernel/sched.c
===================================================================
--- linux-3.2.orig/kernel/sched.c
+++ linux-3.2/kernel/sched.c
@@ -2839,8 +2839,10 @@ try_to_wake_up(struct task_struct *p, un
* if the wakeup condition is true.
*/
if (!(wake_flags & WF_LOCK_SLEEPER)) {
- if (p->saved_state & state)
+ if (p->saved_state & state) {
p->saved_state = TASK_RUNNING;
+ success = 1;
+ }
}
goto out;
}

View File

@ -6,7 +6,6 @@
# UPSTREAM changes queued for 3.2 or in 3.1
############################################################
x86_64-patch-for-idle-notifiers.patch
re-possible-slab-deadlock-while-doing-ifenslave.patch
re-possible-slab-deadlock-while-doing-ifenslave-1.patch
# Should go to stable 3.0.x!
@ -98,7 +97,8 @@ sched-prevent-boosting-from-throttling.patch
# Stuff which should go upstream ASAP
############################################################
set-the-command-name-of-the-idle-tasks-in-smp-kernels-v3.patch
# RAW SPINLOCKS
intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch
# MM memcg
mm-memcg-shorten-preempt-disabled-section-around-event-checks.patch
@ -124,7 +124,6 @@ posix-timers-no-broadcast.patch
signals-allow-rt-tasks-to-cache-one-sigqueue-struct.patch
# SCHED
sched_rt_runtime_share.patch
# GENERIC CMPXCHG
generic-cmpxchg-use-raw-local-irq.patch
@ -374,6 +373,7 @@ sched-no-work-when-pi-blocked.patch
cond-resched-lock-rt-tweak.patch
sched-disable-ttwu-queue.patch
sched-disable-rt-group-sched-on-rt.patch
sched-ttwu-ensure-success-return-is-correct.patch
# STOP MACHINE
stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch
@ -459,6 +459,7 @@ rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch
rcu-fix-macro-substitution.patch
rcu-tiny-merge-bh.patch
patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch
rt-rcutree-warn-fix.patch
# LGLOCKS - lovely
lglocks-rt.patch
@ -467,6 +468,7 @@ lglocks-rt.patch
drivers-serial-cleanup-locking-for-rt.patch
drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch
drivers-tty-fix-omap-lock-crap.patch
rt-serial-warn-fix.patch
# FS
fs-namespace-preemption-fix.patch
@ -506,6 +508,7 @@ perf-move-irq-work-to-softirq-in-rt.patch
# CONSOLE. NEEDS more thought !!!
console-make-rt-friendly.patch
printk-disable-migration-instead-of-preemption.patch
# POWERC
power-use-generic-rwsem-on-rt.patch
@ -551,6 +554,13 @@ x86-crypto-reduce-preempt-disabled-regions.patch
# Device mapper
dm-make-rt-aware.patch
# Simple raw spinlock based waitqueue
wait-simple-version.patch
acpi-gpe-use-wait-simple.patch
# CPUMASK OFFSTACK
cpumask-disable-offstack-on-rt.patch
# Enable full RT
kconfig-disable-a-few-options-rt.patch
kconfig-preempt-rt-full.patch

View File

@ -0,0 +1,258 @@
Subject: wait-simple: Simple waitqueue implementation
From: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 12 Dec 2011 12:29:04 +0100
wait_queue is a swiss army knife and in most of the cases the
complexity is not needed. For RT waitqueues are a constant source of
trouble as we can't convert the head lock to a raw spinlock due to
fancy and long lasting callbacks.
Provide a slim version, which allows RT to replace wait queues. This
should go mainline as well, as it lowers memory consumption and
runtime overhead.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
include/linux/wait-simple.h | 152 ++++++++++++++++++++++++++++++++++++++++++++
kernel/Makefile | 2
kernel/wait-simple.c | 63 ++++++++++++++++++
3 files changed, 216 insertions(+), 1 deletion(-)
Index: linux-3.2/include/linux/wait-simple.h
===================================================================
--- /dev/null
+++ linux-3.2/include/linux/wait-simple.h
@@ -0,0 +1,152 @@
+#ifndef _LINUX_WAIT_SIMPLE_H
+#define _LINUX_WAIT_SIMPLE_H
+
+#include <linux/spinlock.h>
+#include <linux/list.h>
+
+#include <asm/current.h>
+
+struct swaiter {
+ struct task_struct *task;
+ struct list_head node;
+};
+
+#define DEFINE_SWAITER(name) \
+ struct swaiter name = { \
+ .task = current, \
+ .node = LIST_HEAD_INIT((name).node), \
+ }
+
+struct swait_head {
+ raw_spinlock_t lock;
+ struct list_head list;
+};
+
+#define DEFINE_SWAIT_HEAD(name) \
+ struct swait_head name = { \
+ .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \
+ .list = LIST_HEAD_INIT((name).list), \
+ }
+
+extern void __init_swait_head(struct swait_head *h, struct lock_class_key *key);
+
+#define init_swait_head(swh) \
+ do { \
+ static struct lock_class_key __key; \
+ \
+ __init_swait_head((swh), &__key); \
+ } while (0)
+
+/*
+ * Waiter functions
+ */
+static inline bool swaiter_enqueued(struct swaiter *w)
+{
+ return w->task != NULL;
+}
+
+extern void swait_prepare(struct swait_head *head, struct swaiter *w, int state);
+extern void swait_finish(struct swait_head *head, struct swaiter *w);
+
+/*
+ * Adds w to head->list. Must be called with head->lock locked.
+ */
+static inline void __swait_enqueue(struct swait_head *head, struct swaiter *w)
+{
+ list_add(&w->node, &head->list);
+}
+
+/*
+ * Removes w from head->list. Must be called with head->lock locked.
+ */
+static inline void __swait_dequeue(struct swaiter *w)
+{
+ list_del_init(&w->node);
+}
+
+/*
+ * Wakeup functions
+ */
+extern void __swait_wake(struct swait_head *head, unsigned int state);
+
+static inline void swait_wake(struct swait_head *head)
+{
+ __swait_wake(head, TASK_NORMAL);
+}
+
+/*
+ * Event API
+ */
+
+#define __swait_event(wq, condition) \
+do { \
+ DEFINE_SWAITER(__wait); \
+ \
+ for (;;) { \
+ swait_prepare(&wq, &__wait, TASK_UNINTERRUPTIBLE); \
+ if (condition) \
+ break; \
+ schedule(); \
+ } \
+ swait_finish(&wq, &__wait); \
+} while (0)
+
+/**
+ * swait_event - sleep until a condition gets true
+ * @wq: the waitqueue to wait on
+ * @condition: a C expression for the event to wait for
+ *
+ * The process is put to sleep (TASK_UNINTERRUPTIBLE) until the
+ * @condition evaluates to true. The @condition is checked each time
+ * the waitqueue @wq is woken up.
+ *
+ * wake_up() has to be called after changing any variable that could
+ * change the result of the wait condition.
+ */
+#define swait_event(wq, condition) \
+do { \
+ if (condition) \
+ break; \
+ __swait_event(wq, condition); \
+} while (0)
+
+#define __swait_event_timeout(wq, condition, ret) \
+do { \
+ DEFINE_SWAITER(__wait); \
+ \
+ for (;;) { \
+ swait_prepare(&wq, &__wait, TASK_UNINTERRUPTIBLE); \
+ if (condition) \
+ break; \
+ ret = schedule_timeout(ret); \
+ if (!ret) \
+ break; \
+ } \
+ swait_finish(&wq, &__wait); \
+} while (0)
+
+/**
+ * swait_event_timeout - sleep until a condition gets true or a timeout elapses
+ * @wq: the waitqueue to wait on
+ * @condition: a C expression for the event to wait for
+ * @timeout: timeout, in jiffies
+ *
+ * The process is put to sleep (TASK_UNINTERRUPTIBLE) until the
+ * @condition evaluates to true. The @condition is checked each time
+ * the waitqueue @wq is woken up.
+ *
+ * wake_up() has to be called after changing any variable that could
+ * change the result of the wait condition.
+ *
+ * The function returns 0 if the @timeout elapsed, and the remaining
+ * jiffies if the condition evaluated to true before the timeout elapsed.
+ */
+#define swait_event_timeout(wq, condition, timeout) \
+({ \
+ long __ret = timeout; \
+ if (!(condition)) \
+ __swait_event_timeout(wq, condition, __ret); \
+ __ret; \
+})
+
+#endif
Index: linux-3.2/kernel/Makefile
===================================================================
--- linux-3.2.orig/kernel/Makefile
+++ linux-3.2/kernel/Makefile
@@ -10,7 +10,7 @@ obj-y = sched.o fork.o exec_domain.o
kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o \
hrtimer.o nsproxy.o srcu.o semaphore.o \
notifier.o ksysfs.o sched_clock.o cred.o \
- async.o range.o
+ async.o range.o wait-simple.o
obj-y += groups.o
ifdef CONFIG_FUNCTION_TRACER
Index: linux-3.2/kernel/wait-simple.c
===================================================================
--- /dev/null
+++ linux-3.2/kernel/wait-simple.c
@@ -0,0 +1,63 @@
+/*
+ * Simple waitqueues without fancy flags and callbacks
+ *
+ * (C) 2011 Thomas Gleixner <tglx@linutronix.de>
+ *
+ * Based on kernel/wait.c
+ *
+ * For licencing details see kernel-base/COPYING
+ */
+#include <linux/init.h>
+#include <linux/export.h>
+#include <linux/sched.h>
+#include <linux/wait-simple.h>
+
+void __init_swait_head(struct swait_head *head, struct lock_class_key *key)
+{
+ raw_spin_lock_init(&head->lock);
+ lockdep_set_class(&head->lock, key);
+ INIT_LIST_HEAD(&head->list);
+}
+EXPORT_SYMBOL_GPL(__init_swait_head);
+
+void swait_prepare(struct swait_head *head, struct swaiter *w, int state)
+{
+ unsigned long flags;
+
+ raw_spin_lock_irqsave(&head->lock, flags);
+ w->task = current;
+ __swait_enqueue(head, w);
+ set_current_state(state);
+ raw_spin_unlock_irqrestore(&head->lock, flags);
+}
+EXPORT_SYMBOL_GPL(swait_prepare);
+
+void swait_finish(struct swait_head *head, struct swaiter *w)
+{
+ unsigned long flags;
+
+ __set_current_state(TASK_RUNNING);
+ if (w->task) {
+ raw_spin_lock_irqsave(&head->lock, flags);
+ __swait_dequeue(w);
+ raw_spin_unlock_irqrestore(&head->lock, flags);
+ }
+}
+EXPORT_SYMBOL_GPL(swait_finish);
+
+void __swait_wake(struct swait_head *head, unsigned int state)
+{
+ struct swaiter *curr, *next;
+ unsigned long flags;
+
+ raw_spin_lock_irqsave(&head->lock, flags);
+
+ list_for_each_entry_safe(curr, next, &head->list, node) {
+ if (wake_up_state(curr->task, state)) {
+ __swait_dequeue(curr);
+ curr->task = NULL;
+ }
+ }
+
+ raw_spin_unlock_irqrestore(&head->lock, flags);
+}

View File

@ -7,7 +7,7 @@ which allows us to get more information about the problem.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
[bwh: Adjust context for 3.2-rc5]
---
arch/x86/mm/highmem_32.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

View File

@ -12,6 +12,7 @@
+ features/all/rt/power-allow-irq-threading.patch featureset=rt
+ features/all/rt/sched-keep-period-timer-alive-when-throttled.patch featureset=rt
+ features/all/rt/sched-prevent-boosting-from-throttling.patch featureset=rt
+ features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch featureset=rt
+ features/all/rt/mm-memcg-shorten-preempt-disabled-section-around-event-checks.patch featureset=rt
+ features/all/rt/tracing-account-for-preempt-off-in-preempt_schedule.patch featureset=rt
+ features/all/rt/signal-revert-ptrace-preempt-magic.patch featureset=rt
@ -144,6 +145,7 @@
+ features/all/rt/cond-resched-lock-rt-tweak.patch featureset=rt
+ features/all/rt/sched-disable-ttwu-queue.patch featureset=rt
+ features/all/rt/sched-disable-rt-group-sched-on-rt.patch featureset=rt
+ features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch featureset=rt
+ features/all/rt/stop_machine-convert-stop_machine_run-to-PREEMPT_RT.patch featureset=rt
+ features/all/rt/stomp-machine-mark-stomper-thread.patch featureset=rt
+ features/all/rt/stomp-machine-raw-lock.patch featureset=rt
@ -196,10 +198,12 @@
+ features/all/rt/rcu-fix-macro-substitution.patch featureset=rt
+ features/all/rt/rcu-tiny-merge-bh.patch featureset=rt
+ features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch featureset=rt
+ features/all/rt/rt-rcutree-warn-fix.patch featureset=rt
+ features/all/rt/lglocks-rt.patch featureset=rt
+ features/all/rt/drivers-serial-cleanup-locking-for-rt.patch featureset=rt
+ features/all/rt/drivers-serial-call-flush_to_ldisc-when-the-irq-is-t.patch featureset=rt
+ features/all/rt/drivers-tty-fix-omap-lock-crap.patch featureset=rt
+ features/all/rt/rt-serial-warn-fix.patch featureset=rt
+ features/all/rt/fs-namespace-preemption-fix.patch featureset=rt
+ features/all/rt/mm-protect-activate-switch-mm.patch featureset=rt
+ features/all/rt/fs-block-rt-support.patch featureset=rt
@ -220,6 +224,7 @@
+ features/all/rt/skbufhead-raw-lock.patch featureset=rt
+ features/all/rt/perf-move-irq-work-to-softirq-in-rt.patch featureset=rt
+ features/all/rt/console-make-rt-friendly.patch featureset=rt
+ features/all/rt/printk-disable-migration-instead-of-preemption.patch featureset=rt
+ features/all/rt/power-use-generic-rwsem-on-rt.patch featureset=rt
+ features/all/rt/power-disable-highmem-on-rt.patch featureset=rt
+ features/all/rt/arm-disable-highmem-on-rt.patch featureset=rt
@ -236,5 +241,8 @@
+ features/all/rt/scsi-fcoe-rt-aware.patch featureset=rt
+ features/all/rt/x86-crypto-reduce-preempt-disabled-regions.patch featureset=rt
+ features/all/rt/dm-make-rt-aware.patch featureset=rt
+ features/all/rt/wait-simple-version.patch featureset=rt
+ features/all/rt/acpi-gpe-use-wait-simple.patch featureset=rt
+ features/all/rt/cpumask-disable-offstack-on-rt.patch featureset=rt
+ features/all/rt/kconfig-disable-a-few-options-rt.patch featureset=rt
+ features/all/rt/kconfig-preempt-rt-full.patch featureset=rt