diff --git a/debian/changelog b/debian/changelog index 440ffc50a..0f54c4cfc 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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) diff --git a/debian/patches/features/all/rt/acpi-gpe-use-wait-simple.patch b/debian/patches/features/all/rt/acpi-gpe-use-wait-simple.patch new file mode 100644 index 000000000..05f2b41a2 --- /dev/null +++ b/debian/patches/features/all/rt/acpi-gpe-use-wait-simple.patch @@ -0,0 +1,72 @@ +Subject: acpi-gpe-use-wait-simple.patch +From: Thomas Gleixner +Date: Tue, 13 Dec 2011 17:14:35 +0100 + +Signed-off-by: Thomas Gleixner +--- + 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 ++ + 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; diff --git a/debian/patches/features/all/rt/cpumask-disable-offstack-on-rt.patch b/debian/patches/features/all/rt/cpumask-disable-offstack-on-rt.patch new file mode 100644 index 000000000..5ba57de55 --- /dev/null +++ b/debian/patches/features/all/rt/cpumask-disable-offstack-on-rt.patch @@ -0,0 +1,38 @@ +Subject: cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT +From: Thomas Gleixner +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 +--- + 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 diff --git a/debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch b/debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch new file mode 100644 index 000000000..83e415e56 --- /dev/null +++ b/debian/patches/features/all/rt/intel_idle-convert-i7300_idle_lock-to-raw-spinlock.patch @@ -0,0 +1,69 @@ +Subject: intel_idle: Convert i7300_idle_lock to raw spinlock +From: Mike Galbraith +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] [] dump_trace+0x85/0x2e0 +[ 27.104372] [] thread_return+0x12b/0x30b +[ 27.104381] [] schedule+0x29/0xb0 +[ 27.104389] [] rt_spin_lock_slowlock+0xc5/0x240 +[ 27.104401] [] i7300_idle_notifier+0x3f/0x360 [i7300_idle] +[ 27.104415] [] notifier_call_chain+0x37/0x70 +[ 27.104426] [] __atomic_notifier_call_chain+0x48/0x70 +[ 27.104439] [] cpu_idle+0x89/0xb0 +[ 27.104449] bad: scheduling from the idle thread! + +Signed-off-by: Mike Galbraith +Cc: Steven Rostedt +Link: http://lkml.kernel.org/r/1323258522.5057.73.camel@marge.simson.net +Signed-off-by: Thomas Gleixner + +--- + 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)) diff --git a/debian/patches/features/all/rt/localversion.patch b/debian/patches/features/all/rt/localversion.patch index f162cd01f..b09519687 100644 --- a/debian/patches/features/all/rt/localversion.patch +++ b/debian/patches/features/all/rt/localversion.patch @@ -14,4 +14,4 @@ Index: linux-3.2/localversion-rt --- /dev/null +++ linux-3.2/localversion-rt @@ -0,0 +1 @@ -+-rt6 ++-rt8 diff --git a/debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch b/debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch index 08b2a5786..ba3406469 100644 --- a/debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch +++ b/debian/patches/features/all/rt/patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch @@ -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()) diff --git a/debian/patches/features/all/rt/printk-disable-migration-instead-of-preemption.patch b/debian/patches/features/all/rt/printk-disable-migration-instead-of-preemption.patch new file mode 100644 index 000000000..5d6eed6dd --- /dev/null +++ b/debian/patches/features/all/rt/printk-disable-migration-instead-of-preemption.patch @@ -0,0 +1,60 @@ +Subject: printk: Disable migration instead of preemption +From: Richard Weinberger +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] [] __might_sleep+0xeb/0xf0 +[ 14.759318] [] rt_spin_lock_fastlock.constprop.9+0x21/0x43 +[ 14.759336] [] rt_spin_lock+0xe/0x10 +[ 14.759354] [] serial8250_console_write+0x81/0x121 +[ 14.759366] [] __call_console_drivers+0x7c/0x93 +[ 14.759369] [] _call_console_drivers+0x5c/0x60 +[ 14.759372] [] console_unlock+0x147/0x1a2 +[ 14.759374] [] vprintk+0x3ea/0x462 +[ 14.759383] [] printk+0x51/0x53 +[ 14.759399] [] ? proc_reg_poll+0x9a/0x9a +[ 14.759403] [] __handle_sysrq+0x50/0x14d +[ 14.759406] [] write_sysrq_trigger+0x4b/0x53 +[ 14.759408] [] ? __handle_sysrq+0x14d/0x14d +[ 14.759410] [] proc_reg_write+0x9f/0xbe +[ 14.759426] [] vfs_write+0xac/0xf3 +[ 14.759429] [] ? fget_light+0x3a/0x9b +[ 14.759431] [] sys_write+0x4a/0x6e +[ 14.759438] [] system_call_fastpath+0x16/0x1b + +Signed-off-by: Richard Weinberger +Link: http://lkml.kernel.org/r/1323696956-11445-1-git-send-email-rw@linutronix.de +Signed-off-by: Thomas Gleixner +--- + 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); diff --git a/debian/patches/features/all/rt/rt-rcutree-warn-fix.patch b/debian/patches/features/all/rt/rt-rcutree-warn-fix.patch new file mode 100644 index 000000000..0ab0c2637 --- /dev/null +++ b/debian/patches/features/all/rt/rt-rcutree-warn-fix.patch @@ -0,0 +1,44 @@ +Subject: rt/rcutree: Move misplaced prototype +From: Ingo Molnar +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 +Signed-off-by: Thomas Gleixner +--- +--- + 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 diff --git a/debian/patches/features/all/rt/rt-serial-warn-fix.patch b/debian/patches/features/all/rt/rt-serial-warn-fix.patch new file mode 100644 index 000000000..39b4264bf --- /dev/null +++ b/debian/patches/features/all/rt/rt-serial-warn-fix.patch @@ -0,0 +1,54 @@ +Subject: rt: Improve the serial console PASS_LIMIT +From: Ingo Molnar +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 +Signed-off-by: Thomas Gleixner +--- + 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); diff --git a/debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch b/debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch new file mode 100644 index 000000000..5649f5aaa --- /dev/null +++ b/debian/patches/features/all/rt/sched-ttwu-ensure-success-return-is-correct.patch @@ -0,0 +1,36 @@ +Subject: sched: ttwu: Return success when only changing the saved_state value +From: Thomas Gleixner +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 +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; + } diff --git a/debian/patches/features/all/rt/series b/debian/patches/features/all/rt/series index e07526f5d..7d7b9a23c 100644 --- a/debian/patches/features/all/rt/series +++ b/debian/patches/features/all/rt/series @@ -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 diff --git a/debian/patches/features/all/rt/wait-simple-version.patch b/debian/patches/features/all/rt/wait-simple-version.patch new file mode 100644 index 000000000..21e25e7b7 --- /dev/null +++ b/debian/patches/features/all/rt/wait-simple-version.patch @@ -0,0 +1,258 @@ +Subject: wait-simple: Simple waitqueue implementation +From: Thomas Gleixner +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 +--- + 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 ++#include ++ ++#include ++ ++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 ++ * ++ * Based on kernel/wait.c ++ * ++ * For licencing details see kernel-base/COPYING ++ */ ++#include ++#include ++#include ++#include ++ ++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); ++} diff --git a/debian/patches/features/all/rt/x86-highmem-warn.patch b/debian/patches/features/all/rt/x86-highmem-warn.patch index fbff544a5..86d972095 100644 --- a/debian/patches/features/all/rt/x86-highmem-warn.patch +++ b/debian/patches/features/all/rt/x86-highmem-warn.patch @@ -7,7 +7,7 @@ which allows us to get more information about the problem. Signed-off-by: Ingo Molnar Signed-off-by: Thomas Gleixner -[bwh: Adjust context for 3.2-rc5] + --- arch/x86/mm/highmem_32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/patches/series/base-extra b/debian/patches/series/base-extra index 43c73ea7d..696c9d28c 100644 --- a/debian/patches/series/base-extra +++ b/debian/patches/series/base-extra @@ -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