[amd64] bump rt feature set to 3.2-rc5-rt8
svn path=/dists/trunk/linux-2.6/; revision=18389
This commit is contained in:
parent
93a7026d1b
commit
fd6ad13765
|
@ -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)
|
||||
|
|
|
@ -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;
|
|
@ -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
|
69
debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch
vendored
Normal file
69
debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch
vendored
Normal 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))
|
|
@ -14,4 +14,4 @@ Index: linux-3.2/localversion-rt
|
|||
--- /dev/null
|
||||
+++ linux-3.2/localversion-rt
|
||||
@@ -0,0 +1 @@
|
||||
+-rt6
|
||||
+-rt8
|
||||
|
|
|
@ -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())
|
||||
|
|
60
debian/patches/features/all/rt/printk-disable-migration-instead-of-preemption.patch
vendored
Normal file
60
debian/patches/features/all/rt/printk-disable-migration-instead-of-preemption.patch
vendored
Normal 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);
|
|
@ -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
|
|
@ -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);
|
36
debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch
vendored
Normal file
36
debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch
vendored
Normal 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;
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
+}
|
|
@ -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(-)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue