[rt] Update to 3.4-rt8 and reenable
svn path=/dists/trunk/linux-2.6/; revision=19085
This commit is contained in:
commit
478d361442
|
@ -13,6 +13,7 @@ linux-2.6 (3.4.1-1~experimental.1) UNRELEASED; urgency=low
|
|||
[ Ben Hutchings ]
|
||||
* DFSG: Remove the new vs6624 driver, which contains non-free firmware
|
||||
* aufs: Update to aufs3.4-20120521
|
||||
* [rt] Update to 3.4-rt8 and reenable
|
||||
|
||||
-- Ben Hutchings <ben@decadent.org.uk> Mon, 21 May 2012 01:37:21 +0100
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[base]
|
||||
featuresets:
|
||||
none
|
||||
# rt
|
||||
rt
|
||||
kernel-arch: x86
|
||||
|
||||
[build]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[base]
|
||||
featuresets:
|
||||
none
|
||||
# rt
|
||||
rt
|
||||
kernel-arch: x86
|
||||
|
||||
[description]
|
||||
|
|
|
@ -1,155 +0,0 @@
|
|||
From 76f41af7cc93591a2723d2c59918df003f90cb09 Mon Sep 17 00:00:00 2001
|
||||
From: Frederic Weisbecker <fweisbec@gmail.com>
|
||||
Date: Mon, 26 Sep 2011 12:19:11 +0200
|
||||
Subject: [PATCH 001/267] x86: Call idle notifier after irq_enter()
|
||||
|
||||
Interrupts notify the idle exit state before calling irq_enter(). But
|
||||
the notifier code calls rcu_read_lock() and this is not allowed while
|
||||
rcu is in an extended quiescent state. We need to wait for
|
||||
rcu_irq_enter() to be called before doing so otherwise this results in
|
||||
a grumpy RCU:
|
||||
|
||||
[ 0.099991] WARNING: at include/linux/rcupdate.h:194 __atomic_notifier_call_chain+0xd2/0x110()
|
||||
[ 0.099991] Hardware name: AMD690VM-FMH
|
||||
[ 0.099991] Modules linked in:
|
||||
[ 0.099991] Pid: 0, comm: swapper Not tainted 3.0.0-rc6+ #255
|
||||
[ 0.099991] Call Trace:
|
||||
[ 0.099991] <IRQ> [<ffffffff81051c8a>] warn_slowpath_common+0x7a/0xb0
|
||||
[ 0.099991] [<ffffffff81051cd5>] warn_slowpath_null+0x15/0x20
|
||||
[ 0.099991] [<ffffffff817d6fa2>] __atomic_notifier_call_chain+0xd2/0x110
|
||||
[ 0.099991] [<ffffffff817d6ff1>] atomic_notifier_call_chain+0x11/0x20
|
||||
[ 0.099991] [<ffffffff81001873>] exit_idle+0x43/0x50
|
||||
[ 0.099991] [<ffffffff81020439>] smp_apic_timer_interrupt+0x39/0xa0
|
||||
[ 0.099991] [<ffffffff817da253>] apic_timer_interrupt+0x13/0x20
|
||||
[ 0.099991] <EOI> [<ffffffff8100ae67>] ? default_idle+0xa7/0x350
|
||||
[ 0.099991] [<ffffffff8100ae65>] ? default_idle+0xa5/0x350
|
||||
[ 0.099991] [<ffffffff8100b19b>] amd_e400_idle+0x8b/0x110
|
||||
[ 0.099991] [<ffffffff810cb01f>] ? rcu_enter_nohz+0x8f/0x160
|
||||
[ 0.099991] [<ffffffff810019a0>] cpu_idle+0xb0/0x110
|
||||
[ 0.099991] [<ffffffff817a7505>] rest_init+0xe5/0x140
|
||||
[ 0.099991] [<ffffffff817a7468>] ? rest_init+0x48/0x140
|
||||
[ 0.099991] [<ffffffff81cc5ca3>] start_kernel+0x3d1/0x3dc
|
||||
[ 0.099991] [<ffffffff81cc5321>] x86_64_start_reservations+0x131/0x135
|
||||
[ 0.099991] [<ffffffff81cc5412>] x86_64_start_kernel+0xed/0xf4
|
||||
|
||||
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
|
||||
Link: http://lkml.kernel.org/r/20110929194047.GA10247@linux.vnet.ibm.com
|
||||
Cc: Ingo Molnar <mingo@redhat.com>
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Cc: Andy Henroid <andrew.d.henroid@intel.com>
|
||||
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/x86/kernel/apic/apic.c | 6 +++---
|
||||
arch/x86/kernel/apic/io_apic.c | 2 +-
|
||||
arch/x86/kernel/cpu/mcheck/therm_throt.c | 2 +-
|
||||
arch/x86/kernel/cpu/mcheck/threshold.c | 2 +-
|
||||
arch/x86/kernel/irq.c | 6 +++---
|
||||
5 files changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
|
||||
index f98d84c..2cd2d93 100644
|
||||
--- a/arch/x86/kernel/apic/apic.c
|
||||
+++ b/arch/x86/kernel/apic/apic.c
|
||||
@@ -876,8 +876,8 @@ void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)
|
||||
* Besides, if we don't timer interrupts ignore the global
|
||||
* interrupt lock, which is the WrongThing (tm) to do.
|
||||
*/
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
local_apic_timer_interrupt();
|
||||
irq_exit();
|
||||
|
||||
@@ -1809,8 +1809,8 @@ void smp_spurious_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
/*
|
||||
* Check if this really is a spurious interrupt and ACK it
|
||||
* if it is a vectored one. Just in case...
|
||||
@@ -1846,8 +1846,8 @@ void smp_error_interrupt(struct pt_regs *regs)
|
||||
"Illegal register address", /* APIC Error Bit 7 */
|
||||
};
|
||||
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
/* First tickle the hardware, only then report what went on. -- REW */
|
||||
v0 = apic_read(APIC_ESR);
|
||||
apic_write(APIC_ESR, 0);
|
||||
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
|
||||
index 6d939d7..8980555 100644
|
||||
--- a/arch/x86/kernel/apic/io_apic.c
|
||||
+++ b/arch/x86/kernel/apic/io_apic.c
|
||||
@@ -2421,8 +2421,8 @@ asmlinkage void smp_irq_move_cleanup_interrupt(void)
|
||||
unsigned vector, me;
|
||||
|
||||
ack_APIC_irq();
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
|
||||
me = smp_processor_id();
|
||||
for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS; vector++) {
|
||||
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c
|
||||
index 787e06c..ce21561 100644
|
||||
--- a/arch/x86/kernel/cpu/mcheck/therm_throt.c
|
||||
+++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c
|
||||
@@ -397,8 +397,8 @@ static void (*smp_thermal_vector)(void) = unexpected_thermal_interrupt;
|
||||
|
||||
asmlinkage void smp_thermal_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
inc_irq_stat(irq_thermal_count);
|
||||
smp_thermal_vector();
|
||||
irq_exit();
|
||||
diff --git a/arch/x86/kernel/cpu/mcheck/threshold.c b/arch/x86/kernel/cpu/mcheck/threshold.c
|
||||
index d746df2..aa578ca 100644
|
||||
--- a/arch/x86/kernel/cpu/mcheck/threshold.c
|
||||
+++ b/arch/x86/kernel/cpu/mcheck/threshold.c
|
||||
@@ -19,8 +19,8 @@ void (*mce_threshold_vector)(void) = default_threshold_interrupt;
|
||||
|
||||
asmlinkage void smp_threshold_interrupt(void)
|
||||
{
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
inc_irq_stat(irq_threshold_count);
|
||||
mce_threshold_vector();
|
||||
irq_exit();
|
||||
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
|
||||
index 429e0c9..5d31e5b 100644
|
||||
--- a/arch/x86/kernel/irq.c
|
||||
+++ b/arch/x86/kernel/irq.c
|
||||
@@ -181,8 +181,8 @@ unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
|
||||
unsigned vector = ~regs->orig_ax;
|
||||
unsigned irq;
|
||||
|
||||
- exit_idle();
|
||||
irq_enter();
|
||||
+ exit_idle();
|
||||
|
||||
irq = __this_cpu_read(vector_irq[vector]);
|
||||
|
||||
@@ -209,10 +209,10 @@ void smp_x86_platform_ipi(struct pt_regs *regs)
|
||||
|
||||
ack_APIC_irq();
|
||||
|
||||
- exit_idle();
|
||||
-
|
||||
irq_enter();
|
||||
|
||||
+ exit_idle();
|
||||
+
|
||||
inc_irq_stat(x86_platform_ipis);
|
||||
|
||||
if (x86_platform_ipi_callback)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
From 415c7e81f6b54e5f8e8cddf0f2ff1c1855eeade3 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 16 Jul 2011 16:27:13 +0200
|
||||
Subject: [PATCH 008/267] arm-enable-interrupts-in-signal-code.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/arm/kernel/signal.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c
|
||||
index 9e617bd..c7001bc 100644
|
||||
--- a/arch/arm/kernel/signal.c
|
||||
+++ b/arch/arm/kernel/signal.c
|
||||
@@ -672,6 +672,9 @@ static void do_signal(struct pt_regs *regs, int syscall)
|
||||
if (!user_mode(regs))
|
||||
return;
|
||||
|
||||
+ local_irq_enable();
|
||||
+ preempt_check_resched();
|
||||
+
|
||||
/*
|
||||
* If we were from a system call, check for system call restarting...
|
||||
*/
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From 490faa4e4541df017386a562e4e9ad7011f49562 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 16 Jul 2011 12:09:54 +0200
|
||||
Subject: [PATCH 009/267] powerpc: 85xx: Mark cascade irq IRQF_NO_THREAD
|
||||
|
||||
Cascade interrupt must run in hard interrupt context.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/powerpc/platforms/85xx/mpc85xx_cds.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
|
||||
index 66cb8d6..7e2a4d2 100644
|
||||
--- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c
|
||||
+++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
|
||||
@@ -177,7 +177,7 @@ static irqreturn_t mpc85xx_8259_cascade_action(int irq, void *dev_id)
|
||||
|
||||
static struct irqaction mpc85xxcds_8259_irqaction = {
|
||||
.handler = mpc85xx_8259_cascade_action,
|
||||
- .flags = IRQF_SHARED,
|
||||
+ .flags = IRQF_SHARED | IRQF_NO_THREAD,
|
||||
.name = "8259 cascade",
|
||||
};
|
||||
#endif /* PPC_I8259 */
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
From 05a48c448ba9085941f020ea02a7c880e80d683c Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 5 Oct 2011 14:11:24 +0200
|
||||
Subject: [PATCH 010/267] powerpc: wsp: Mark opb cascade handler
|
||||
IRQF_NO_THREAD
|
||||
|
||||
Cascade handlers must run in hard interrupt context.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/powerpc/platforms/wsp/opb_pic.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/powerpc/platforms/wsp/opb_pic.c b/arch/powerpc/platforms/wsp/opb_pic.c
|
||||
index be05631..19f353d 100644
|
||||
--- a/arch/powerpc/platforms/wsp/opb_pic.c
|
||||
+++ b/arch/powerpc/platforms/wsp/opb_pic.c
|
||||
@@ -320,7 +320,8 @@ void __init opb_pic_init(void)
|
||||
}
|
||||
|
||||
/* Attach opb interrupt handler to new virtual IRQ */
|
||||
- rc = request_irq(virq, opb_irq_handler, 0, "OPB LS Cascade", opb);
|
||||
+ rc = request_irq(virq, opb_irq_handler, IRQF_NO_THREAD,
|
||||
+ "OPB LS Cascade", opb);
|
||||
if (rc) {
|
||||
printk("opb: request_irq failed: %d\n", rc);
|
||||
continue;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,73 +0,0 @@
|
|||
From c5f5de2dcb79c63ab914f69b8d1a59ba211f8b15 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 5 Oct 2011 14:00:26 +0200
|
||||
Subject: [PATCH 011/267] powerpc: Mark IPI interrupts IRQF_NO_THREAD
|
||||
|
||||
IPI handlers cannot be threaded. Remove the obsolete IRQF_DISABLED
|
||||
flag (see commit e58aa3d2) while at it.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/powerpc/kernel/smp.c | 4 ++--
|
||||
arch/powerpc/platforms/powermac/smp.c | 4 ++--
|
||||
arch/powerpc/sysdev/xics/xics-common.c | 5 +++--
|
||||
3 files changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
|
||||
index 6df7090..abdedd3 100644
|
||||
--- a/arch/powerpc/kernel/smp.c
|
||||
+++ b/arch/powerpc/kernel/smp.c
|
||||
@@ -187,8 +187,8 @@ int smp_request_message_ipi(int virq, int msg)
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
- err = request_irq(virq, smp_ipi_action[msg], IRQF_PERCPU,
|
||||
- smp_ipi_name[msg], 0);
|
||||
+ err = request_irq(virq, smp_ipi_action[msg],
|
||||
+ IRQF_PERCPU | IRQF_NO_THREAD, smp_ipi_name[msg], 0);
|
||||
WARN(err < 0, "unable to request_irq %d for %s (rc %d)\n",
|
||||
virq, smp_ipi_name[msg], err);
|
||||
|
||||
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c
|
||||
index 3394254..8d75ac8 100644
|
||||
--- a/arch/powerpc/platforms/powermac/smp.c
|
||||
+++ b/arch/powerpc/platforms/powermac/smp.c
|
||||
@@ -200,7 +200,7 @@ static int psurge_secondary_ipi_init(void)
|
||||
|
||||
if (psurge_secondary_virq)
|
||||
rc = request_irq(psurge_secondary_virq, psurge_ipi_intr,
|
||||
- IRQF_PERCPU, "IPI", NULL);
|
||||
+ IRQF_NO_THREAD | IRQF_PERCPU, "IPI", NULL);
|
||||
|
||||
if (rc)
|
||||
pr_err("Failed to setup secondary cpu IPI\n");
|
||||
@@ -408,7 +408,7 @@ static int __init smp_psurge_kick_cpu(int nr)
|
||||
|
||||
static struct irqaction psurge_irqaction = {
|
||||
.handler = psurge_ipi_intr,
|
||||
- .flags = IRQF_PERCPU,
|
||||
+ .flags = IRQF_PERCPU | IRQF_NO_THREAD,
|
||||
.name = "primary IPI",
|
||||
};
|
||||
|
||||
diff --git a/arch/powerpc/sysdev/xics/xics-common.c b/arch/powerpc/sysdev/xics/xics-common.c
|
||||
index 63762c6..4ba6194 100644
|
||||
--- a/arch/powerpc/sysdev/xics/xics-common.c
|
||||
+++ b/arch/powerpc/sysdev/xics/xics-common.c
|
||||
@@ -134,10 +134,11 @@ static void xics_request_ipi(void)
|
||||
BUG_ON(ipi == NO_IRQ);
|
||||
|
||||
/*
|
||||
- * IPIs are marked IRQF_PERCPU. The handler was set in map.
|
||||
+ * IPIs are marked PERCPU and also IRQF_NO_THREAD as they must
|
||||
+ * run in hard interrupt context. The handler was set in map.
|
||||
*/
|
||||
BUG_ON(request_irq(ipi, icp_ops->ipi_action,
|
||||
- IRQF_PERCPU, "IPI", NULL));
|
||||
+ IRQF_NO_THREAD|IRQF_PERCPU, "IPI", NULL));
|
||||
}
|
||||
|
||||
int __init xics_smp_probe(void)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From 2e574f68fff54d8c7398b3984f183fb80ec8ce3e Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 16 Jul 2011 13:16:24 +0200
|
||||
Subject: [PATCH 012/267] powerpc: Allow irq threading
|
||||
|
||||
All interrupts which must be non threaded are marked
|
||||
IRQF_NO_THREAD. So it's safe to allow force threaded handlers.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/powerpc/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
|
||||
index 951e18f..7c93c7e 100644
|
||||
--- a/arch/powerpc/Kconfig
|
||||
+++ b/arch/powerpc/Kconfig
|
||||
@@ -132,6 +132,7 @@ config PPC
|
||||
select IRQ_PER_CPU
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IRQ_SHOW_LEVEL
|
||||
+ select IRQ_FORCED_THREADING
|
||||
select HAVE_RCU_TABLE_FREE if SMP
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_BPF_JIT if (PPC64 && NET)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
From 9e1c03d11fdc2426a5d53a1d0e0b63b412924287 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Tue, 18 Oct 2011 22:03:48 +0200
|
||||
Subject: [PATCH 013/267] sched: Keep period timer ticking when throttling
|
||||
active
|
||||
|
||||
When a runqueue is throttled we cannot disable the period timer
|
||||
because that timer is the only way to undo the throttling.
|
||||
|
||||
We got stale throttling entries when a rq was throttled and then the
|
||||
global sysctl was disabled, which stopped the timer.
|
||||
|
||||
[ tglx: Preliminary changelog ]
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/sched_rt.c | 13 ++++++++-----
|
||||
1 file changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
|
||||
index 78fcacf..40d97e1 100644
|
||||
--- a/kernel/sched_rt.c
|
||||
+++ b/kernel/sched_rt.c
|
||||
@@ -580,12 +580,9 @@ static inline int balance_runtime(struct rt_rq *rt_rq)
|
||||
|
||||
static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun)
|
||||
{
|
||||
- int i, idle = 1;
|
||||
+ int i, idle = 1, throttled = 0;
|
||||
const struct cpumask *span;
|
||||
|
||||
- if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)
|
||||
- return 1;
|
||||
-
|
||||
span = sched_rt_period_mask();
|
||||
for_each_cpu(i, span) {
|
||||
int enqueue = 0;
|
||||
@@ -620,12 +617,17 @@ static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun)
|
||||
if (!rt_rq_throttled(rt_rq))
|
||||
enqueue = 1;
|
||||
}
|
||||
+ if (rt_rq->rt_throttled)
|
||||
+ throttled = 1;
|
||||
|
||||
if (enqueue)
|
||||
sched_rt_rq_enqueue(rt_rq);
|
||||
raw_spin_unlock(&rq->lock);
|
||||
}
|
||||
|
||||
+ if (!throttled && (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF))
|
||||
+ return 1;
|
||||
+
|
||||
return idle;
|
||||
}
|
||||
|
||||
@@ -686,7 +688,8 @@ static void update_curr_rt(struct rq *rq)
|
||||
if (unlikely((s64)delta_exec < 0))
|
||||
delta_exec = 0;
|
||||
|
||||
- schedstat_set(curr->se.statistics.exec_max, max(curr->se.statistics.exec_max, delta_exec));
|
||||
+ schedstat_set(curr->se.statistics.exec_max,
|
||||
+ max(curr->se.statistics.exec_max, delta_exec));
|
||||
|
||||
curr->se.sum_exec_runtime += delta_exec;
|
||||
account_group_exec_runtime(curr, delta_exec);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
From ce43773df1fea5d063ac8d1aca4ff806bf899b5b Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Tue, 18 Oct 2011 22:03:48 +0200
|
||||
Subject: [PATCH 014/267] sched: Do not throttle due to PI boosting
|
||||
|
||||
When a runqueue has rt_runtime_us = 0 then the only way it can
|
||||
accumulate rt_time is via PI boosting. Though that causes the runqueue
|
||||
to be throttled and replenishing does not change anything due to
|
||||
rt_runtime_us = 0. So avoid that situation by clearing rt_time and
|
||||
skip the throttling alltogether.
|
||||
|
||||
[ tglx: Preliminary changelog ]
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/sched_rt.c | 20 ++++++++++++++++++--
|
||||
1 file changed, 18 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
|
||||
index 40d97e1..c108b9c 100644
|
||||
--- a/kernel/sched_rt.c
|
||||
+++ b/kernel/sched_rt.c
|
||||
@@ -659,8 +659,24 @@ static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq)
|
||||
return 0;
|
||||
|
||||
if (rt_rq->rt_time > runtime) {
|
||||
- rt_rq->rt_throttled = 1;
|
||||
- printk_once(KERN_WARNING "sched: RT throttling activated\n");
|
||||
+ struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq);
|
||||
+
|
||||
+ /*
|
||||
+ * Don't actually throttle groups that have no runtime assigned
|
||||
+ * but accrue some time due to boosting.
|
||||
+ */
|
||||
+ if (likely(rt_b->rt_runtime)) {
|
||||
+ rt_rq->rt_throttled = 1;
|
||||
+ printk_once(KERN_WARNING "sched: RT throttling activated\n");
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * In case we did anyway, make it go away,
|
||||
+ * replenishment is a joke, since it will replenish us
|
||||
+ * with exactly 0 ns.
|
||||
+ */
|
||||
+ rt_rq->rt_time = 0;
|
||||
+ }
|
||||
+
|
||||
if (rt_rq_throttled(rt_rq)) {
|
||||
sched_rt_rq_dequeue(rt_rq);
|
||||
return 1;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
From f427d80501aa7fcdf695288aa8eb507dbd5c9369 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 28 Feb 2012 19:06:50 +0100
|
||||
Subject: [PATCH 015/267] time: Remove bogus comments
|
||||
|
||||
There is no global irq lock which makes a syscall magically SMP
|
||||
safe. Remove the outdated comment concerning do_settimeofday() as
|
||||
well.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/time.c | 6 ------
|
||||
1 file changed, 6 deletions(-)
|
||||
|
||||
diff --git a/kernel/time.c b/kernel/time.c
|
||||
index 73e416d..ba744cf 100644
|
||||
--- a/kernel/time.c
|
||||
+++ b/kernel/time.c
|
||||
@@ -163,7 +163,6 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)
|
||||
return error;
|
||||
|
||||
if (tz) {
|
||||
- /* SMP safe, global irq locking makes it work. */
|
||||
sys_tz = *tz;
|
||||
update_vsyscall_tz();
|
||||
if (firsttime) {
|
||||
@@ -173,12 +172,7 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)
|
||||
}
|
||||
}
|
||||
if (tv)
|
||||
- {
|
||||
- /* SMP safe, again the code in arch/foo/time.c should
|
||||
- * globally block out interrupts when it runs.
|
||||
- */
|
||||
return do_settimeofday(tv);
|
||||
- }
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
From 76f63af187b74e8d533678278b247292340ccc10 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 28 Feb 2012 19:10:46 +0100
|
||||
Subject: [PATCH 016/267] x86: vdso: Remove bogus locking in
|
||||
update_vsyscall_tz()
|
||||
|
||||
Changing the sequence count in update_vsyscall_tz() is completely
|
||||
pointless.
|
||||
|
||||
The vdso code copies the data unprotected. There is no point to change
|
||||
this as sys_tz is nowhere protected at all. See sys_gettimeofday().
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/x86/kernel/vsyscall_64.c | 5 -----
|
||||
1 file changed, 5 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
|
||||
index e4d4a22..f04adbd 100644
|
||||
--- a/arch/x86/kernel/vsyscall_64.c
|
||||
+++ b/arch/x86/kernel/vsyscall_64.c
|
||||
@@ -80,12 +80,7 @@ early_param("vsyscall", vsyscall_setup);
|
||||
|
||||
void update_vsyscall_tz(void)
|
||||
{
|
||||
- unsigned long flags;
|
||||
-
|
||||
- write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags);
|
||||
- /* sys_tz has changed */
|
||||
vsyscall_gtod_data.sys_tz = sys_tz;
|
||||
- write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
|
||||
}
|
||||
|
||||
void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,128 +0,0 @@
|
|||
From 11f9d4b70b2592b57dda3c33bdcd726ee98c9a71 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 28 Feb 2012 18:24:07 +0100
|
||||
Subject: [PATCH 017/267] x86: vdso: Use seqcount instead of seqlock
|
||||
|
||||
The update of the vdso data happens under xtime_lock, so adding a
|
||||
nested lock is pointless. Just use a seqcount to sync the readers.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/x86/include/asm/vgtod.h | 2 +-
|
||||
arch/x86/kernel/vsyscall_64.c | 11 +++--------
|
||||
arch/x86/vdso/vclock_gettime.c | 16 ++++++++--------
|
||||
3 files changed, 12 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/vgtod.h b/arch/x86/include/asm/vgtod.h
|
||||
index 815285b..1f00717 100644
|
||||
--- a/arch/x86/include/asm/vgtod.h
|
||||
+++ b/arch/x86/include/asm/vgtod.h
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <linux/clocksource.h>
|
||||
|
||||
struct vsyscall_gtod_data {
|
||||
- seqlock_t lock;
|
||||
+ seqcount_t seq;
|
||||
|
||||
/* open coded 'struct timespec' */
|
||||
time_t wall_time_sec;
|
||||
diff --git a/arch/x86/kernel/vsyscall_64.c b/arch/x86/kernel/vsyscall_64.c
|
||||
index f04adbd..50392ee 100644
|
||||
--- a/arch/x86/kernel/vsyscall_64.c
|
||||
+++ b/arch/x86/kernel/vsyscall_64.c
|
||||
@@ -52,10 +52,7 @@
|
||||
#include "vsyscall_trace.h"
|
||||
|
||||
DEFINE_VVAR(int, vgetcpu_mode);
|
||||
-DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data) =
|
||||
-{
|
||||
- .lock = __SEQLOCK_UNLOCKED(__vsyscall_gtod_data.lock),
|
||||
-};
|
||||
+DEFINE_VVAR(struct vsyscall_gtod_data, vsyscall_gtod_data);
|
||||
|
||||
static enum { EMULATE, NATIVE, NONE } vsyscall_mode = NATIVE;
|
||||
|
||||
@@ -86,9 +83,7 @@ void update_vsyscall_tz(void)
|
||||
void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
|
||||
struct clocksource *clock, u32 mult)
|
||||
{
|
||||
- unsigned long flags;
|
||||
-
|
||||
- write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags);
|
||||
+ write_seqcount_begin(&vsyscall_gtod_data.seq);
|
||||
|
||||
/* copy vsyscall data */
|
||||
vsyscall_gtod_data.clock.vclock_mode = clock->archdata.vclock_mode;
|
||||
@@ -101,7 +96,7 @@ void update_vsyscall(struct timespec *wall_time, struct timespec *wtm,
|
||||
vsyscall_gtod_data.wall_to_monotonic = *wtm;
|
||||
vsyscall_gtod_data.wall_time_coarse = __current_kernel_time();
|
||||
|
||||
- write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
|
||||
+ write_seqcount_end(&vsyscall_gtod_data.seq);
|
||||
}
|
||||
|
||||
static void warn_bad_vsyscall(const char *level, struct pt_regs *regs,
|
||||
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c
|
||||
index 6bc0e72..d8511fb 100644
|
||||
--- a/arch/x86/vdso/vclock_gettime.c
|
||||
+++ b/arch/x86/vdso/vclock_gettime.c
|
||||
@@ -86,11 +86,11 @@ notrace static noinline int do_realtime(struct timespec *ts)
|
||||
{
|
||||
unsigned long seq, ns;
|
||||
do {
|
||||
- seq = read_seqbegin(>od->lock);
|
||||
+ seq = read_seqcount_begin(>od->seq);
|
||||
ts->tv_sec = gtod->wall_time_sec;
|
||||
ts->tv_nsec = gtod->wall_time_nsec;
|
||||
ns = vgetns();
|
||||
- } while (unlikely(read_seqretry(>od->lock, seq)));
|
||||
+ } while (unlikely(read_seqcount_retry(>od->seq, seq)));
|
||||
timespec_add_ns(ts, ns);
|
||||
return 0;
|
||||
}
|
||||
@@ -99,12 +99,12 @@ notrace static noinline int do_monotonic(struct timespec *ts)
|
||||
{
|
||||
unsigned long seq, ns, secs;
|
||||
do {
|
||||
- seq = read_seqbegin(>od->lock);
|
||||
+ seq = read_seqcount_begin(>od->seq);
|
||||
secs = gtod->wall_time_sec;
|
||||
ns = gtod->wall_time_nsec + vgetns();
|
||||
secs += gtod->wall_to_monotonic.tv_sec;
|
||||
ns += gtod->wall_to_monotonic.tv_nsec;
|
||||
- } while (unlikely(read_seqretry(>od->lock, seq)));
|
||||
+ } while (unlikely(read_seqcount_retry(>od->seq, seq)));
|
||||
|
||||
/* wall_time_nsec, vgetns(), and wall_to_monotonic.tv_nsec
|
||||
* are all guaranteed to be nonnegative.
|
||||
@@ -123,10 +123,10 @@ notrace static noinline int do_realtime_coarse(struct timespec *ts)
|
||||
{
|
||||
unsigned long seq;
|
||||
do {
|
||||
- seq = read_seqbegin(>od->lock);
|
||||
+ seq = read_seqcount_begin(>od->seq);
|
||||
ts->tv_sec = gtod->wall_time_coarse.tv_sec;
|
||||
ts->tv_nsec = gtod->wall_time_coarse.tv_nsec;
|
||||
- } while (unlikely(read_seqretry(>od->lock, seq)));
|
||||
+ } while (unlikely(read_seqcount_retry(>od->seq, seq)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -134,12 +134,12 @@ notrace static noinline int do_monotonic_coarse(struct timespec *ts)
|
||||
{
|
||||
unsigned long seq, ns, secs;
|
||||
do {
|
||||
- seq = read_seqbegin(>od->lock);
|
||||
+ seq = read_seqcount_begin(>od->seq);
|
||||
secs = gtod->wall_time_coarse.tv_sec;
|
||||
ns = gtod->wall_time_coarse.tv_nsec;
|
||||
secs += gtod->wall_to_monotonic.tv_sec;
|
||||
ns += gtod->wall_to_monotonic.tv_nsec;
|
||||
- } while (unlikely(read_seqretry(>od->lock, seq)));
|
||||
+ } while (unlikely(read_seqcount_retry(>od->seq, seq)));
|
||||
|
||||
/* wall_time_nsec and wall_to_monotonic.tv_nsec are
|
||||
* guaranteed to be between 0 and NSEC_PER_SEC.
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
From 0ad3596103ef2c8ecb6145c8a98ed7e38a9bc6ce Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 28 Feb 2012 18:33:08 +0100
|
||||
Subject: [PATCH 018/267] ia64: vsyscall: Use seqcount instead of seqlock
|
||||
|
||||
The update of the vdso data happens under xtime_lock, so adding a
|
||||
nested lock is pointless. Just use a seqcount to sync the readers.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: Tony Luck <tony.luck@intel.com>
|
||||
---
|
||||
arch/ia64/kernel/asm-offsets.c | 4 ++--
|
||||
arch/ia64/kernel/fsys.S | 2 +-
|
||||
arch/ia64/kernel/fsyscall_gtod_data.h | 2 +-
|
||||
arch/ia64/kernel/time.c | 10 +++-------
|
||||
4 files changed, 7 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c
|
||||
index af56501..106aeb6 100644
|
||||
--- a/arch/ia64/kernel/asm-offsets.c
|
||||
+++ b/arch/ia64/kernel/asm-offsets.c
|
||||
@@ -269,8 +269,8 @@ void foo(void)
|
||||
BLANK();
|
||||
|
||||
/* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */
|
||||
- DEFINE(IA64_GTOD_LOCK_OFFSET,
|
||||
- offsetof (struct fsyscall_gtod_data_t, lock));
|
||||
+ DEFINE(IA64_GTOD_SEQ_OFFSET,
|
||||
+ offsetof (struct fsyscall_gtod_data_t, seq);
|
||||
DEFINE(IA64_GTOD_WALL_TIME_OFFSET,
|
||||
offsetof (struct fsyscall_gtod_data_t, wall_time));
|
||||
DEFINE(IA64_GTOD_MONO_TIME_OFFSET,
|
||||
diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S
|
||||
index 331d42b..fa77de7 100644
|
||||
--- a/arch/ia64/kernel/fsys.S
|
||||
+++ b/arch/ia64/kernel/fsys.S
|
||||
@@ -174,7 +174,7 @@ ENTRY(fsys_set_tid_address)
|
||||
FSYS_RETURN
|
||||
END(fsys_set_tid_address)
|
||||
|
||||
-#if IA64_GTOD_LOCK_OFFSET !=0
|
||||
+#if IA64_GTOD_SEQ_OFFSET !=0
|
||||
#error fsys_gettimeofday incompatible with changes to struct fsyscall_gtod_data_t
|
||||
#endif
|
||||
#if IA64_ITC_JITTER_OFFSET !=0
|
||||
diff --git a/arch/ia64/kernel/fsyscall_gtod_data.h b/arch/ia64/kernel/fsyscall_gtod_data.h
|
||||
index 57d2ee6..146b15b 100644
|
||||
--- a/arch/ia64/kernel/fsyscall_gtod_data.h
|
||||
+++ b/arch/ia64/kernel/fsyscall_gtod_data.h
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
struct fsyscall_gtod_data_t {
|
||||
- seqlock_t lock;
|
||||
+ seqcount_t seq;
|
||||
struct timespec wall_time;
|
||||
struct timespec monotonic_time;
|
||||
cycle_t clk_mask;
|
||||
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c
|
||||
index 43920de..8e991a0 100644
|
||||
--- a/arch/ia64/kernel/time.c
|
||||
+++ b/arch/ia64/kernel/time.c
|
||||
@@ -35,9 +35,7 @@
|
||||
|
||||
static cycle_t itc_get_cycles(struct clocksource *cs);
|
||||
|
||||
-struct fsyscall_gtod_data_t fsyscall_gtod_data = {
|
||||
- .lock = __SEQLOCK_UNLOCKED(fsyscall_gtod_data.lock),
|
||||
-};
|
||||
+struct fsyscall_gtod_data_t fsyscall_gtod_data;
|
||||
|
||||
struct itc_jitter_data_t itc_jitter_data;
|
||||
|
||||
@@ -460,9 +458,7 @@ void update_vsyscall_tz(void)
|
||||
void update_vsyscall(struct timespec *wall, struct timespec *wtm,
|
||||
struct clocksource *c, u32 mult)
|
||||
{
|
||||
- unsigned long flags;
|
||||
-
|
||||
- write_seqlock_irqsave(&fsyscall_gtod_data.lock, flags);
|
||||
+ write_seqcount_begin(&fsyscall_gtod_data.seq);
|
||||
|
||||
/* copy fsyscall clock data */
|
||||
fsyscall_gtod_data.clk_mask = c->mask;
|
||||
@@ -485,6 +481,6 @@ void update_vsyscall(struct timespec *wall, struct timespec *wtm,
|
||||
fsyscall_gtod_data.monotonic_time.tv_sec++;
|
||||
}
|
||||
|
||||
- write_sequnlock_irqrestore(&fsyscall_gtod_data.lock, flags);
|
||||
+ write_seqcount_end(&fsyscall_gtod_data.seq);
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
From 00f0fcf98b55531834e45b94ad6f8b03737e2ce0 Mon Sep 17 00:00:00 2001
|
||||
From: Al Viro <viro@ZenIV.linux.org.uk>
|
||||
Date: Thu, 15 Mar 2012 18:39:40 +0000
|
||||
Subject: [PATCH 021/267] vfs: fs_struct: Move code out of seqcount write
|
||||
sections
|
||||
|
||||
RT cannot disable preemption in the seqcount write sections due to
|
||||
functions called which take "sleeping" spinlocks.
|
||||
|
||||
Move the code out of those sections. It does not need to be there.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
fs/fs_struct.c | 27 +++++++++++++++------------
|
||||
1 file changed, 15 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/fs/fs_struct.c b/fs/fs_struct.c
|
||||
index 78b519c..f5818c4 100644
|
||||
--- a/fs/fs_struct.c
|
||||
+++ b/fs/fs_struct.c
|
||||
@@ -26,11 +26,11 @@ void set_fs_root(struct fs_struct *fs, struct path *path)
|
||||
{
|
||||
struct path old_root;
|
||||
|
||||
+ path_get_longterm(path);
|
||||
spin_lock(&fs->lock);
|
||||
write_seqcount_begin(&fs->seq);
|
||||
old_root = fs->root;
|
||||
fs->root = *path;
|
||||
- path_get_longterm(path);
|
||||
write_seqcount_end(&fs->seq);
|
||||
spin_unlock(&fs->lock);
|
||||
if (old_root.dentry)
|
||||
@@ -45,11 +45,11 @@ void set_fs_pwd(struct fs_struct *fs, struct path *path)
|
||||
{
|
||||
struct path old_pwd;
|
||||
|
||||
+ path_get_longterm(path);
|
||||
spin_lock(&fs->lock);
|
||||
write_seqcount_begin(&fs->seq);
|
||||
old_pwd = fs->pwd;
|
||||
fs->pwd = *path;
|
||||
- path_get_longterm(path);
|
||||
write_seqcount_end(&fs->seq);
|
||||
spin_unlock(&fs->lock);
|
||||
|
||||
@@ -57,6 +57,14 @@ void set_fs_pwd(struct fs_struct *fs, struct path *path)
|
||||
path_put_longterm(&old_pwd);
|
||||
}
|
||||
|
||||
+static inline int replace_path(struct path *p, const struct path *old, const struct path *new)
|
||||
+{
|
||||
+ if (likely(p->dentry != old->dentry || p->mnt != old->mnt))
|
||||
+ return 0;
|
||||
+ *p = *new;
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
void chroot_fs_refs(struct path *old_root, struct path *new_root)
|
||||
{
|
||||
struct task_struct *g, *p;
|
||||
@@ -68,21 +76,16 @@ void chroot_fs_refs(struct path *old_root, struct path *new_root)
|
||||
task_lock(p);
|
||||
fs = p->fs;
|
||||
if (fs) {
|
||||
+ int hits = 0;
|
||||
spin_lock(&fs->lock);
|
||||
write_seqcount_begin(&fs->seq);
|
||||
- if (fs->root.dentry == old_root->dentry
|
||||
- && fs->root.mnt == old_root->mnt) {
|
||||
- path_get_longterm(new_root);
|
||||
- fs->root = *new_root;
|
||||
+ hits += replace_path(&fs->root, old_root, new_root);
|
||||
+ hits += replace_path(&fs->pwd, old_root, new_root);
|
||||
+ write_seqcount_end(&fs->seq);
|
||||
+ while (hits--) {
|
||||
count++;
|
||||
- }
|
||||
- if (fs->pwd.dentry == old_root->dentry
|
||||
- && fs->pwd.mnt == old_root->mnt) {
|
||||
path_get_longterm(new_root);
|
||||
- fs->pwd = *new_root;
|
||||
- count++;
|
||||
}
|
||||
- write_seqcount_end(&fs->seq);
|
||||
spin_unlock(&fs->lock);
|
||||
}
|
||||
task_unlock(p);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,537 +0,0 @@
|
|||
From 575bc99dec3a6b5121859ec0dc56a400313c500b Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 1 Mar 2012 15:14:06 +0100
|
||||
Subject: [PATCH 022/267] timekeeping: Split xtime_lock
|
||||
|
||||
xtime_lock is going to be split apart in mainline, so we can shorten
|
||||
the seqcount protected regions and avoid updating seqcount in some
|
||||
code pathes. This is a straight forward split, so we can avoid the
|
||||
whole mess with raw seqlocks for RT.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/time/jiffies.c | 4 +-
|
||||
kernel/time/ntp.c | 24 ++++++++----
|
||||
kernel/time/tick-common.c | 10 +++--
|
||||
kernel/time/tick-internal.h | 3 +-
|
||||
kernel/time/tick-sched.c | 16 +++++---
|
||||
kernel/time/timekeeping.c | 90 +++++++++++++++++++++++++------------------
|
||||
6 files changed, 88 insertions(+), 59 deletions(-)
|
||||
|
||||
diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c
|
||||
index a470154..21940eb 100644
|
||||
--- a/kernel/time/jiffies.c
|
||||
+++ b/kernel/time/jiffies.c
|
||||
@@ -74,9 +74,9 @@ u64 get_jiffies_64(void)
|
||||
u64 ret;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
ret = jiffies_64;
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(get_jiffies_64);
|
||||
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c
|
||||
index 4b85a7a..419cbaa 100644
|
||||
--- a/kernel/time/ntp.c
|
||||
+++ b/kernel/time/ntp.c
|
||||
@@ -358,7 +358,8 @@ static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
|
||||
{
|
||||
enum hrtimer_restart res = HRTIMER_NORESTART;
|
||||
|
||||
- write_seqlock(&xtime_lock);
|
||||
+ raw_spin_lock(&xtime_lock);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
switch (time_state) {
|
||||
case TIME_OK:
|
||||
@@ -388,7 +389,8 @@ static enum hrtimer_restart ntp_leap_second(struct hrtimer *timer)
|
||||
break;
|
||||
}
|
||||
|
||||
- write_sequnlock(&xtime_lock);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock(&xtime_lock);
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -663,7 +665,8 @@ int do_adjtimex(struct timex *txc)
|
||||
|
||||
getnstimeofday(&ts);
|
||||
|
||||
- write_seqlock_irq(&xtime_lock);
|
||||
+ raw_spin_lock_irq(&xtime_lock);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
if (txc->modes & ADJ_ADJTIME) {
|
||||
long save_adjust = time_adjust;
|
||||
@@ -705,7 +708,8 @@ int do_adjtimex(struct timex *txc)
|
||||
/* fill PPS status fields */
|
||||
pps_fill_timex(txc);
|
||||
|
||||
- write_sequnlock_irq(&xtime_lock);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irq(&xtime_lock);
|
||||
|
||||
txc->time.tv_sec = ts.tv_sec;
|
||||
txc->time.tv_usec = ts.tv_nsec;
|
||||
@@ -903,7 +907,8 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
|
||||
|
||||
pts_norm = pps_normalize_ts(*phase_ts);
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
/* clear the error bits, they will be set again if needed */
|
||||
time_status &= ~(STA_PPSJITTER | STA_PPSWANDER | STA_PPSERROR);
|
||||
@@ -916,7 +921,8 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
|
||||
* just start the frequency interval */
|
||||
if (unlikely(pps_fbase.tv_sec == 0)) {
|
||||
pps_fbase = *raw_ts;
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -931,7 +937,8 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
|
||||
time_status |= STA_PPSJITTER;
|
||||
/* restart the frequency calibration interval */
|
||||
pps_fbase = *raw_ts;
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
pr_err("hardpps: PPSJITTER: bad pulse\n");
|
||||
return;
|
||||
}
|
||||
@@ -948,7 +955,8 @@ void hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts)
|
||||
|
||||
hardpps_update_phase(pts_norm.nsec);
|
||||
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(hardpps);
|
||||
|
||||
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
|
||||
index da6c9ec..39de540 100644
|
||||
--- a/kernel/time/tick-common.c
|
||||
+++ b/kernel/time/tick-common.c
|
||||
@@ -63,13 +63,15 @@ int tick_is_oneshot_available(void)
|
||||
static void tick_periodic(int cpu)
|
||||
{
|
||||
if (tick_do_timer_cpu == cpu) {
|
||||
- write_seqlock(&xtime_lock);
|
||||
+ raw_spin_lock(&xtime_lock);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
/* Keep track of the next tick event */
|
||||
tick_next_period = ktime_add(tick_next_period, tick_period);
|
||||
|
||||
do_timer(1);
|
||||
- write_sequnlock(&xtime_lock);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock(&xtime_lock);
|
||||
}
|
||||
|
||||
update_process_times(user_mode(get_irq_regs()));
|
||||
@@ -130,9 +132,9 @@ void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
|
||||
ktime_t next;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
next = tick_next_period;
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
|
||||
|
||||
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
|
||||
index 4e265b9..c91100d 100644
|
||||
--- a/kernel/time/tick-internal.h
|
||||
+++ b/kernel/time/tick-internal.h
|
||||
@@ -141,4 +141,5 @@ static inline int tick_device_is_functional(struct clock_event_device *dev)
|
||||
#endif
|
||||
|
||||
extern void do_timer(unsigned long ticks);
|
||||
-extern seqlock_t xtime_lock;
|
||||
+extern raw_spinlock_t xtime_lock;
|
||||
+extern seqcount_t xtime_seq;
|
||||
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
|
||||
index c923640..d7abd2f 100644
|
||||
--- a/kernel/time/tick-sched.c
|
||||
+++ b/kernel/time/tick-sched.c
|
||||
@@ -56,7 +56,8 @@ static void tick_do_update_jiffies64(ktime_t now)
|
||||
return;
|
||||
|
||||
/* Reevalute with xtime_lock held */
|
||||
- write_seqlock(&xtime_lock);
|
||||
+ raw_spin_lock(&xtime_lock);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
delta = ktime_sub(now, last_jiffies_update);
|
||||
if (delta.tv64 >= tick_period.tv64) {
|
||||
@@ -79,7 +80,8 @@ static void tick_do_update_jiffies64(ktime_t now)
|
||||
/* Keep the tick_next_period variable up to date */
|
||||
tick_next_period = ktime_add(last_jiffies_update, tick_period);
|
||||
}
|
||||
- write_sequnlock(&xtime_lock);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock(&xtime_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -89,12 +91,14 @@ static ktime_t tick_init_jiffy_update(void)
|
||||
{
|
||||
ktime_t period;
|
||||
|
||||
- write_seqlock(&xtime_lock);
|
||||
+ raw_spin_lock(&xtime_lock);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
/* Did we start the jiffies update yet ? */
|
||||
if (last_jiffies_update.tv64 == 0)
|
||||
last_jiffies_update = tick_next_period;
|
||||
period = last_jiffies_update;
|
||||
- write_sequnlock(&xtime_lock);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock(&xtime_lock);
|
||||
return period;
|
||||
}
|
||||
|
||||
@@ -345,11 +349,11 @@ void tick_nohz_stop_sched_tick(int inidle)
|
||||
ts->idle_calls++;
|
||||
/* Read jiffies and the time when jiffies were updated last */
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
last_update = last_jiffies_update;
|
||||
last_jiffies = jiffies;
|
||||
time_delta = timekeeping_max_deferment();
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) ||
|
||||
arch_needs_cpu(cpu)) {
|
||||
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
|
||||
index 2378413..da9e1f9 100644
|
||||
--- a/kernel/time/timekeeping.c
|
||||
+++ b/kernel/time/timekeeping.c
|
||||
@@ -139,8 +139,8 @@ static inline s64 timekeeping_get_ns_raw(void)
|
||||
* This read-write spinlock protects us from races in SMP while
|
||||
* playing with xtime.
|
||||
*/
|
||||
-__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
|
||||
-
|
||||
+__cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(xtime_lock);
|
||||
+seqcount_t xtime_seq;
|
||||
|
||||
/*
|
||||
* The current time
|
||||
@@ -222,7 +222,7 @@ void getnstimeofday(struct timespec *ts)
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
|
||||
*ts = xtime;
|
||||
nsecs = timekeeping_get_ns();
|
||||
@@ -230,7 +230,7 @@ void getnstimeofday(struct timespec *ts)
|
||||
/* If arch requires, add in gettimeoffset() */
|
||||
nsecs += arch_gettimeoffset();
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
timespec_add_ns(ts, nsecs);
|
||||
}
|
||||
@@ -245,14 +245,14 @@ ktime_t ktime_get(void)
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
secs = xtime.tv_sec + wall_to_monotonic.tv_sec;
|
||||
nsecs = xtime.tv_nsec + wall_to_monotonic.tv_nsec;
|
||||
nsecs += timekeeping_get_ns();
|
||||
/* If arch requires, add in gettimeoffset() */
|
||||
nsecs += arch_gettimeoffset();
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
/*
|
||||
* Use ktime_set/ktime_add_ns to create a proper ktime on
|
||||
* 32-bit architectures without CONFIG_KTIME_SCALAR.
|
||||
@@ -278,14 +278,14 @@ void ktime_get_ts(struct timespec *ts)
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
*ts = xtime;
|
||||
tomono = wall_to_monotonic;
|
||||
nsecs = timekeeping_get_ns();
|
||||
/* If arch requires, add in gettimeoffset() */
|
||||
nsecs += arch_gettimeoffset();
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec,
|
||||
ts->tv_nsec + tomono.tv_nsec + nsecs);
|
||||
@@ -313,7 +313,7 @@ void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real)
|
||||
do {
|
||||
u32 arch_offset;
|
||||
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
|
||||
*ts_raw = raw_time;
|
||||
*ts_real = xtime;
|
||||
@@ -326,7 +326,7 @@ void getnstime_raw_and_real(struct timespec *ts_raw, struct timespec *ts_real)
|
||||
nsecs_raw += arch_offset;
|
||||
nsecs_real += arch_offset;
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
timespec_add_ns(ts_raw, nsecs_raw);
|
||||
timespec_add_ns(ts_real, nsecs_real);
|
||||
@@ -365,7 +365,8 @@ int do_settimeofday(const struct timespec *tv)
|
||||
if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
|
||||
return -EINVAL;
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
timekeeping_forward_now();
|
||||
|
||||
@@ -381,7 +382,8 @@ int do_settimeofday(const struct timespec *tv)
|
||||
update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
|
||||
timekeeper.mult);
|
||||
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
/* signal hrtimers about time change */
|
||||
clock_was_set();
|
||||
@@ -405,7 +407,8 @@ int timekeeping_inject_offset(struct timespec *ts)
|
||||
if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC)
|
||||
return -EINVAL;
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
timekeeping_forward_now();
|
||||
|
||||
@@ -418,7 +421,8 @@ int timekeeping_inject_offset(struct timespec *ts)
|
||||
update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
|
||||
timekeeper.mult);
|
||||
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
/* signal hrtimers about time change */
|
||||
clock_was_set();
|
||||
@@ -490,11 +494,11 @@ void getrawmonotonic(struct timespec *ts)
|
||||
s64 nsecs;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
nsecs = timekeeping_get_ns_raw();
|
||||
*ts = raw_time;
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
timespec_add_ns(ts, nsecs);
|
||||
}
|
||||
@@ -510,11 +514,11 @@ int timekeeping_valid_for_hres(void)
|
||||
int ret;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
|
||||
ret = timekeeper.clock->flags & CLOCK_SOURCE_VALID_FOR_HRES;
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -572,7 +576,8 @@ void __init timekeeping_init(void)
|
||||
read_persistent_clock(&now);
|
||||
read_boot_clock(&boot);
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
ntp_init();
|
||||
|
||||
@@ -593,7 +598,8 @@ void __init timekeeping_init(void)
|
||||
-boot.tv_sec, -boot.tv_nsec);
|
||||
total_sleep_time.tv_sec = 0;
|
||||
total_sleep_time.tv_nsec = 0;
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
}
|
||||
|
||||
/* time in seconds when suspend began */
|
||||
@@ -640,7 +646,8 @@ void timekeeping_inject_sleeptime(struct timespec *delta)
|
||||
if (!(ts.tv_sec == 0 && ts.tv_nsec == 0))
|
||||
return;
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
timekeeping_forward_now();
|
||||
|
||||
__timekeeping_inject_sleeptime(delta);
|
||||
@@ -650,7 +657,8 @@ void timekeeping_inject_sleeptime(struct timespec *delta)
|
||||
update_vsyscall(&xtime, &wall_to_monotonic, timekeeper.clock,
|
||||
timekeeper.mult);
|
||||
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
/* signal hrtimers about time change */
|
||||
clock_was_set();
|
||||
@@ -673,7 +681,8 @@ static void timekeeping_resume(void)
|
||||
|
||||
clocksource_resume();
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
|
||||
if (timespec_compare(&ts, &timekeeping_suspend_time) > 0) {
|
||||
ts = timespec_sub(ts, timekeeping_suspend_time);
|
||||
@@ -683,7 +692,8 @@ static void timekeeping_resume(void)
|
||||
timekeeper.clock->cycle_last = timekeeper.clock->read(timekeeper.clock);
|
||||
timekeeper.ntp_error = 0;
|
||||
timekeeping_suspended = 0;
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
touch_softlockup_watchdog();
|
||||
|
||||
@@ -701,7 +711,8 @@ static int timekeeping_suspend(void)
|
||||
|
||||
read_persistent_clock(&timekeeping_suspend_time);
|
||||
|
||||
- write_seqlock_irqsave(&xtime_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&xtime_lock, flags);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
timekeeping_forward_now();
|
||||
timekeeping_suspended = 1;
|
||||
|
||||
@@ -724,7 +735,8 @@ static int timekeeping_suspend(void)
|
||||
timekeeping_suspend_time =
|
||||
timespec_add(timekeeping_suspend_time, delta_delta);
|
||||
}
|
||||
- write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL);
|
||||
clocksource_suspend();
|
||||
@@ -1101,13 +1113,13 @@ void get_monotonic_boottime(struct timespec *ts)
|
||||
WARN_ON(timekeeping_suspended);
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
*ts = xtime;
|
||||
tomono = wall_to_monotonic;
|
||||
sleep = total_sleep_time;
|
||||
nsecs = timekeeping_get_ns();
|
||||
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec,
|
||||
ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec + nsecs);
|
||||
@@ -1158,10 +1170,10 @@ struct timespec current_kernel_time(void)
|
||||
unsigned long seq;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
|
||||
now = xtime;
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
return now;
|
||||
}
|
||||
@@ -1173,11 +1185,11 @@ struct timespec get_monotonic_coarse(void)
|
||||
unsigned long seq;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
|
||||
now = xtime;
|
||||
mono = wall_to_monotonic;
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
|
||||
set_normalized_timespec(&now, now.tv_sec + mono.tv_sec,
|
||||
now.tv_nsec + mono.tv_nsec);
|
||||
@@ -1209,11 +1221,11 @@ void get_xtime_and_monotonic_and_sleep_offset(struct timespec *xtim,
|
||||
unsigned long seq;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
*xtim = xtime;
|
||||
*wtom = wall_to_monotonic;
|
||||
*sleep = total_sleep_time;
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1225,9 +1237,9 @@ ktime_t ktime_get_monotonic_offset(void)
|
||||
struct timespec wtom;
|
||||
|
||||
do {
|
||||
- seq = read_seqbegin(&xtime_lock);
|
||||
+ seq = read_seqcount_begin(&xtime_seq);
|
||||
wtom = wall_to_monotonic;
|
||||
- } while (read_seqretry(&xtime_lock, seq));
|
||||
+ } while (read_seqcount_retry(&xtime_seq, seq));
|
||||
return timespec_to_ktime(wtom);
|
||||
}
|
||||
|
||||
@@ -1239,7 +1251,9 @@ ktime_t ktime_get_monotonic_offset(void)
|
||||
*/
|
||||
void xtime_update(unsigned long ticks)
|
||||
{
|
||||
- write_seqlock(&xtime_lock);
|
||||
+ raw_spin_lock(&xtime_lock);
|
||||
+ write_seqcount_begin(&xtime_seq);
|
||||
do_timer(ticks);
|
||||
- write_sequnlock(&xtime_lock);
|
||||
+ write_seqcount_end(&xtime_seq);
|
||||
+ raw_spin_unlock(&xtime_lock);
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
From 2d38d140493b8b52deebbe11692a71e4513b7605 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Weiner <hannes@cmpxchg.org>
|
||||
Date: Thu, 17 Nov 2011 07:49:25 +0100
|
||||
Subject: [PATCH 024/267] mm: memcg: shorten preempt-disabled section around
|
||||
event checks
|
||||
|
||||
Only the ratelimit checks themselves have to run with preemption
|
||||
disabled, the resulting actions - checking for usage thresholds,
|
||||
updating the soft limit tree - can and should run with preemption
|
||||
enabled.
|
||||
|
||||
Signed-off-by: Johannes Weiner <jweiner@redhat.com>
|
||||
Tested-by: Luis Henriques <henrix@camandro.org>
|
||||
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
mm/memcontrol.c | 73 ++++++++++++++++++++++++++-----------------------------
|
||||
1 file changed, 35 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
|
||||
index 778554f..abf5497 100644
|
||||
--- a/mm/memcontrol.c
|
||||
+++ b/mm/memcontrol.c
|
||||
@@ -683,37 +683,32 @@ static unsigned long mem_cgroup_nr_lru_pages(struct mem_cgroup *memcg,
|
||||
return total;
|
||||
}
|
||||
|
||||
-static bool __memcg_event_check(struct mem_cgroup *memcg, int target)
|
||||
+static bool mem_cgroup_event_ratelimit(struct mem_cgroup *memcg,
|
||||
+ enum mem_cgroup_events_target target)
|
||||
{
|
||||
unsigned long val, next;
|
||||
|
||||
val = __this_cpu_read(memcg->stat->events[MEM_CGROUP_EVENTS_COUNT]);
|
||||
next = __this_cpu_read(memcg->stat->targets[target]);
|
||||
/* from time_after() in jiffies.h */
|
||||
- return ((long)next - (long)val < 0);
|
||||
-}
|
||||
-
|
||||
-static void __mem_cgroup_target_update(struct mem_cgroup *memcg, int target)
|
||||
-{
|
||||
- unsigned long val, next;
|
||||
-
|
||||
- val = __this_cpu_read(memcg->stat->events[MEM_CGROUP_EVENTS_COUNT]);
|
||||
-
|
||||
- switch (target) {
|
||||
- case MEM_CGROUP_TARGET_THRESH:
|
||||
- next = val + THRESHOLDS_EVENTS_TARGET;
|
||||
- break;
|
||||
- case MEM_CGROUP_TARGET_SOFTLIMIT:
|
||||
- next = val + SOFTLIMIT_EVENTS_TARGET;
|
||||
- break;
|
||||
- case MEM_CGROUP_TARGET_NUMAINFO:
|
||||
- next = val + NUMAINFO_EVENTS_TARGET;
|
||||
- break;
|
||||
- default:
|
||||
- return;
|
||||
+ if ((long)next - (long)val < 0) {
|
||||
+ switch (target) {
|
||||
+ case MEM_CGROUP_TARGET_THRESH:
|
||||
+ next = val + THRESHOLDS_EVENTS_TARGET;
|
||||
+ break;
|
||||
+ case MEM_CGROUP_TARGET_SOFTLIMIT:
|
||||
+ next = val + SOFTLIMIT_EVENTS_TARGET;
|
||||
+ break;
|
||||
+ case MEM_CGROUP_TARGET_NUMAINFO:
|
||||
+ next = val + NUMAINFO_EVENTS_TARGET;
|
||||
+ break;
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+ __this_cpu_write(memcg->stat->targets[target], next);
|
||||
+ return true;
|
||||
}
|
||||
-
|
||||
- __this_cpu_write(memcg->stat->targets[target], next);
|
||||
+ return false;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -724,25 +719,27 @@ static void memcg_check_events(struct mem_cgroup *memcg, struct page *page)
|
||||
{
|
||||
preempt_disable();
|
||||
/* threshold event is triggered in finer grain than soft limit */
|
||||
- if (unlikely(__memcg_event_check(memcg, MEM_CGROUP_TARGET_THRESH))) {
|
||||
+ if (unlikely(mem_cgroup_event_ratelimit(memcg,
|
||||
+ MEM_CGROUP_TARGET_THRESH))) {
|
||||
+ bool do_softlimit, do_numainfo;
|
||||
+
|
||||
+ do_softlimit = mem_cgroup_event_ratelimit(memcg,
|
||||
+ MEM_CGROUP_TARGET_SOFTLIMIT);
|
||||
+#if MAX_NUMNODES > 1
|
||||
+ do_numainfo = mem_cgroup_event_ratelimit(memcg,
|
||||
+ MEM_CGROUP_TARGET_NUMAINFO);
|
||||
+#endif
|
||||
+ preempt_enable();
|
||||
+
|
||||
mem_cgroup_threshold(memcg);
|
||||
- __mem_cgroup_target_update(memcg, MEM_CGROUP_TARGET_THRESH);
|
||||
- if (unlikely(__memcg_event_check(memcg,
|
||||
- MEM_CGROUP_TARGET_SOFTLIMIT))) {
|
||||
+ if (unlikely(do_softlimit))
|
||||
mem_cgroup_update_tree(memcg, page);
|
||||
- __mem_cgroup_target_update(memcg,
|
||||
- MEM_CGROUP_TARGET_SOFTLIMIT);
|
||||
- }
|
||||
#if MAX_NUMNODES > 1
|
||||
- if (unlikely(__memcg_event_check(memcg,
|
||||
- MEM_CGROUP_TARGET_NUMAINFO))) {
|
||||
+ if (unlikely(do_numainfo))
|
||||
atomic_inc(&memcg->numainfo_events);
|
||||
- __mem_cgroup_target_update(memcg,
|
||||
- MEM_CGROUP_TARGET_NUMAINFO);
|
||||
- }
|
||||
#endif
|
||||
- }
|
||||
- preempt_enable();
|
||||
+ } else
|
||||
+ preempt_enable();
|
||||
}
|
||||
|
||||
static struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
From 64b759067a99f8482feb0c2f75f6ce0fde842166 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 21 Mar 2011 12:09:35 +0100
|
||||
Subject: [PATCH 030/267] sched: Create schedule_preempt_disabled()
|
||||
|
||||
Get rid of the ever repeating:
|
||||
|
||||
preempt_enable_no_resched();
|
||||
schedule();
|
||||
preempt_disable();
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/sched.h | 1 +
|
||||
kernel/sched.c | 12 ++++++++++++
|
||||
2 files changed, 13 insertions(+)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 1c4f3e9..9897fe6 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -359,6 +359,7 @@ extern signed long schedule_timeout_interruptible(signed long timeout);
|
||||
extern signed long schedule_timeout_killable(signed long timeout);
|
||||
extern signed long schedule_timeout_uninterruptible(signed long timeout);
|
||||
asmlinkage void schedule(void);
|
||||
+extern void schedule_preempt_disabled(void);
|
||||
extern int mutex_spin_on_owner(struct mutex *lock, struct task_struct *owner);
|
||||
|
||||
struct nsproxy;
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index 6b32395..465fd11 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -4456,6 +4456,18 @@ asmlinkage void __sched schedule(void)
|
||||
}
|
||||
EXPORT_SYMBOL(schedule);
|
||||
|
||||
+/**
|
||||
+ * schedule_preempt_disabled - called with preemption disabled
|
||||
+ *
|
||||
+ * Returns with preemption disabled. Note: preempt_count must be 1
|
||||
+ */
|
||||
+void __sched schedule_preempt_disabled(void)
|
||||
+{
|
||||
+ preempt_enable_no_resched();
|
||||
+ schedule();
|
||||
+ preempt_disable();
|
||||
+}
|
||||
+
|
||||
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
|
||||
|
||||
static inline bool owner_running(struct mutex *lock, struct task_struct *owner)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,500 +0,0 @@
|
|||
From 662df03fb70d4e277547eaa2adfd7e0d520bb35f Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 21 Mar 2011 12:33:18 +0100
|
||||
Subject: [PATCH 031/267] sched: Use schedule_preempt_disabled()
|
||||
|
||||
Coccinelle based conversion.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/arm/kernel/process.c | 4 +---
|
||||
arch/avr32/kernel/process.c | 4 +---
|
||||
arch/blackfin/kernel/process.c | 4 +---
|
||||
arch/cris/kernel/process.c | 4 +---
|
||||
arch/frv/kernel/process.c | 4 +---
|
||||
arch/h8300/kernel/process.c | 4 +---
|
||||
arch/ia64/kernel/process.c | 4 +---
|
||||
arch/m32r/kernel/process.c | 4 +---
|
||||
arch/m68k/kernel/process_mm.c | 4 +---
|
||||
arch/m68k/kernel/process_no.c | 4 +---
|
||||
arch/microblaze/kernel/process.c | 4 +---
|
||||
arch/mips/kernel/process.c | 4 +---
|
||||
arch/mn10300/kernel/process.c | 4 +---
|
||||
arch/parisc/kernel/process.c | 4 +---
|
||||
arch/powerpc/kernel/idle.c | 8 ++++----
|
||||
arch/powerpc/platforms/iseries/setup.c | 8 ++------
|
||||
arch/s390/kernel/process.c | 4 +---
|
||||
arch/score/kernel/process.c | 4 +---
|
||||
arch/sh/kernel/idle.c | 4 +---
|
||||
arch/sparc/kernel/process_32.c | 8 ++------
|
||||
arch/sparc/kernel/process_64.c | 10 ++++------
|
||||
arch/tile/kernel/process.c | 4 +---
|
||||
arch/x86/kernel/process_32.c | 4 +---
|
||||
arch/x86/kernel/process_64.c | 4 +---
|
||||
arch/xtensa/kernel/process.c | 4 +---
|
||||
init/main.c | 5 +----
|
||||
kernel/mutex.c | 4 +---
|
||||
kernel/softirq.c | 4 +---
|
||||
28 files changed, 36 insertions(+), 95 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
|
||||
index 3d0c6fb..54833ff 100644
|
||||
--- a/arch/arm/kernel/process.c
|
||||
+++ b/arch/arm/kernel/process.c
|
||||
@@ -214,9 +214,7 @@ void cpu_idle(void)
|
||||
}
|
||||
leds_event(led_idle_end);
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/avr32/kernel/process.c b/arch/avr32/kernel/process.c
|
||||
index ef5a2a0..c8724c9 100644
|
||||
--- a/arch/avr32/kernel/process.c
|
||||
+++ b/arch/avr32/kernel/process.c
|
||||
@@ -38,9 +38,7 @@ void cpu_idle(void)
|
||||
while (!need_resched())
|
||||
cpu_idle_sleep();
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c
|
||||
index 6a80a9e..11acc10 100644
|
||||
--- a/arch/blackfin/kernel/process.c
|
||||
+++ b/arch/blackfin/kernel/process.c
|
||||
@@ -92,9 +92,7 @@ void cpu_idle(void)
|
||||
while (!need_resched())
|
||||
idle();
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
|
||||
index aa585e4..d8f50ff 100644
|
||||
--- a/arch/cris/kernel/process.c
|
||||
+++ b/arch/cris/kernel/process.c
|
||||
@@ -115,9 +115,7 @@ void cpu_idle (void)
|
||||
idle = default_idle;
|
||||
idle();
|
||||
}
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
|
||||
index 3901df1..29cc497 100644
|
||||
--- a/arch/frv/kernel/process.c
|
||||
+++ b/arch/frv/kernel/process.c
|
||||
@@ -92,9 +92,7 @@ void cpu_idle(void)
|
||||
idle();
|
||||
}
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
|
||||
index 933bd38..1a173b3 100644
|
||||
--- a/arch/h8300/kernel/process.c
|
||||
+++ b/arch/h8300/kernel/process.c
|
||||
@@ -81,9 +81,7 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
while (!need_resched())
|
||||
idle();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
|
||||
index 6d33c5c..9dc52b6 100644
|
||||
--- a/arch/ia64/kernel/process.c
|
||||
+++ b/arch/ia64/kernel/process.c
|
||||
@@ -330,9 +330,7 @@ cpu_idle (void)
|
||||
normal_xtp();
|
||||
#endif
|
||||
}
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
check_pgt_cache();
|
||||
if (cpu_is_offline(cpu))
|
||||
play_dead();
|
||||
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c
|
||||
index 422bea9..3a4a32b 100644
|
||||
--- a/arch/m32r/kernel/process.c
|
||||
+++ b/arch/m32r/kernel/process.c
|
||||
@@ -90,9 +90,7 @@ void cpu_idle (void)
|
||||
|
||||
idle();
|
||||
}
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/m68k/kernel/process_mm.c b/arch/m68k/kernel/process_mm.c
|
||||
index aa4ffb8..c413aa0 100644
|
||||
--- a/arch/m68k/kernel/process_mm.c
|
||||
+++ b/arch/m68k/kernel/process_mm.c
|
||||
@@ -94,9 +94,7 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
while (!need_resched())
|
||||
idle();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/m68k/kernel/process_no.c b/arch/m68k/kernel/process_no.c
|
||||
index 5e1078c..f7fe6c3 100644
|
||||
--- a/arch/m68k/kernel/process_no.c
|
||||
+++ b/arch/m68k/kernel/process_no.c
|
||||
@@ -73,9 +73,7 @@ void cpu_idle(void)
|
||||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
idle();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c
|
||||
index 95cc295..d3b2b42 100644
|
||||
--- a/arch/microblaze/kernel/process.c
|
||||
+++ b/arch/microblaze/kernel/process.c
|
||||
@@ -108,9 +108,7 @@ void cpu_idle(void)
|
||||
idle();
|
||||
tick_nohz_restart_sched_tick();
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
check_pgt_cache();
|
||||
}
|
||||
}
|
||||
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
|
||||
index c47f96e..4dbf66d 100644
|
||||
--- a/arch/mips/kernel/process.c
|
||||
+++ b/arch/mips/kernel/process.c
|
||||
@@ -78,9 +78,7 @@ void __noreturn cpu_idle(void)
|
||||
play_dead();
|
||||
#endif
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c
|
||||
index 28eec31..cac401d 100644
|
||||
--- a/arch/mn10300/kernel/process.c
|
||||
+++ b/arch/mn10300/kernel/process.c
|
||||
@@ -123,9 +123,7 @@ void cpu_idle(void)
|
||||
idle();
|
||||
}
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
|
||||
index 4b4b918..f6eb367 100644
|
||||
--- a/arch/parisc/kernel/process.c
|
||||
+++ b/arch/parisc/kernel/process.c
|
||||
@@ -71,9 +71,7 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
while (!need_resched())
|
||||
barrier();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
check_pgt_cache();
|
||||
}
|
||||
}
|
||||
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c
|
||||
index 39a2baa..f46dae5 100644
|
||||
--- a/arch/powerpc/kernel/idle.c
|
||||
+++ b/arch/powerpc/kernel/idle.c
|
||||
@@ -94,11 +94,11 @@ void cpu_idle(void)
|
||||
HMT_medium();
|
||||
ppc64_runlatch_on();
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- if (cpu_should_die())
|
||||
+ if (cpu_should_die()) {
|
||||
+ preempt_enable_no_resched();
|
||||
cpu_die();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ }
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c
|
||||
index ea0acbd..e0c5b49 100644
|
||||
--- a/arch/powerpc/platforms/iseries/setup.c
|
||||
+++ b/arch/powerpc/platforms/iseries/setup.c
|
||||
@@ -582,9 +582,7 @@ static void iseries_shared_idle(void)
|
||||
if (hvlpevent_is_pending())
|
||||
process_iSeries_events();
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -611,9 +609,7 @@ static void iseries_dedicated_idle(void)
|
||||
|
||||
ppc64_runlatch_on();
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
|
||||
index 53088e2..fa093f7 100644
|
||||
--- a/arch/s390/kernel/process.c
|
||||
+++ b/arch/s390/kernel/process.c
|
||||
@@ -94,9 +94,7 @@ void cpu_idle(void)
|
||||
while (!need_resched())
|
||||
default_idle();
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
|
||||
index 25d0803..2707023 100644
|
||||
--- a/arch/score/kernel/process.c
|
||||
+++ b/arch/score/kernel/process.c
|
||||
@@ -53,9 +53,7 @@ void __noreturn cpu_idle(void)
|
||||
while (!need_resched())
|
||||
barrier();
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/sh/kernel/idle.c b/arch/sh/kernel/idle.c
|
||||
index db4ecd7..b7c18f0 100644
|
||||
--- a/arch/sh/kernel/idle.c
|
||||
+++ b/arch/sh/kernel/idle.c
|
||||
@@ -112,9 +112,7 @@ void cpu_idle(void)
|
||||
}
|
||||
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c
|
||||
index f793742..935fdbc 100644
|
||||
--- a/arch/sparc/kernel/process_32.c
|
||||
+++ b/arch/sparc/kernel/process_32.c
|
||||
@@ -113,9 +113,7 @@ void cpu_idle(void)
|
||||
while (!need_resched())
|
||||
cpu_relax();
|
||||
}
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
check_pgt_cache();
|
||||
}
|
||||
}
|
||||
@@ -138,9 +136,7 @@ void cpu_idle(void)
|
||||
while (!need_resched())
|
||||
cpu_relax();
|
||||
}
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
check_pgt_cache();
|
||||
}
|
||||
}
|
||||
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
|
||||
index 3739a06..8ba0dbe 100644
|
||||
--- a/arch/sparc/kernel/process_64.c
|
||||
+++ b/arch/sparc/kernel/process_64.c
|
||||
@@ -102,15 +102,13 @@ void cpu_idle(void)
|
||||
|
||||
tick_nohz_restart_sched_tick();
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
-
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
- if (cpu_is_offline(cpu))
|
||||
+ if (cpu_is_offline(cpu)) {
|
||||
+ preempt_enable_no_resched();
|
||||
cpu_play_dead();
|
||||
+ }
|
||||
#endif
|
||||
-
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c
|
||||
index 9c45d8b..5a8b631 100644
|
||||
--- a/arch/tile/kernel/process.c
|
||||
+++ b/arch/tile/kernel/process.c
|
||||
@@ -106,9 +106,7 @@ void cpu_idle(void)
|
||||
current_thread_info()->status |= TS_POLLING;
|
||||
}
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
|
||||
index 8598296..ada175e3 100644
|
||||
--- a/arch/x86/kernel/process_32.c
|
||||
+++ b/arch/x86/kernel/process_32.c
|
||||
@@ -117,9 +117,7 @@ void cpu_idle(void)
|
||||
start_critical_timings();
|
||||
}
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
|
||||
index 6a364a6..08840ab 100644
|
||||
--- a/arch/x86/kernel/process_64.c
|
||||
+++ b/arch/x86/kernel/process_64.c
|
||||
@@ -150,9 +150,7 @@ void cpu_idle(void)
|
||||
}
|
||||
|
||||
tick_nohz_restart_sched_tick();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
|
||||
index 47041e7..2c90047 100644
|
||||
--- a/arch/xtensa/kernel/process.c
|
||||
+++ b/arch/xtensa/kernel/process.c
|
||||
@@ -113,9 +113,7 @@ void cpu_idle(void)
|
||||
while (1) {
|
||||
while (!need_resched())
|
||||
platform_idle();
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/init/main.c b/init/main.c
|
||||
index 217ed23..0e274f9 100644
|
||||
--- a/init/main.c
|
||||
+++ b/init/main.c
|
||||
@@ -378,11 +378,8 @@ static noinline void __init_refok rest_init(void)
|
||||
* at least once to get things moving:
|
||||
*/
|
||||
init_idle_bootup_task(current);
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
-
|
||||
+ schedule_preempt_disabled();
|
||||
/* Call into cpu_idle with preempt disabled */
|
||||
- preempt_disable();
|
||||
cpu_idle();
|
||||
}
|
||||
|
||||
diff --git a/kernel/mutex.c b/kernel/mutex.c
|
||||
index 89096dd..a307cc9 100644
|
||||
--- a/kernel/mutex.c
|
||||
+++ b/kernel/mutex.c
|
||||
@@ -240,9 +240,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
|
||||
|
||||
/* didn't get the lock, go to sleep: */
|
||||
spin_unlock_mutex(&lock->wait_lock, flags);
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
spin_lock_mutex(&lock->wait_lock, flags);
|
||||
}
|
||||
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index 2c71d91..c9da2c8 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -744,9 +744,7 @@ static int run_ksoftirqd(void * __bind_cpu)
|
||||
while (!kthread_should_stop()) {
|
||||
preempt_disable();
|
||||
if (!local_softirq_pending()) {
|
||||
- preempt_enable_no_resched();
|
||||
- schedule();
|
||||
- preempt_disable();
|
||||
+ schedule_preempt_disabled();
|
||||
}
|
||||
|
||||
__set_current_state(TASK_RUNNING);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,71 +0,0 @@
|
|||
From 31e34bf84003d53073f3fa91d53cd6ac31bfbe58 Mon Sep 17 00:00:00 2001
|
||||
From: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Date: Sat, 6 Mar 2010 17:47:10 +0100
|
||||
Subject: [PATCH 038/267] ARM: AT91: PIT: Remove irq handler when clock event
|
||||
is unused
|
||||
|
||||
Setup and remove the interrupt handler in clock event mode selection.
|
||||
This avoids calling the (shared) interrupt handler when the device is
|
||||
not used.
|
||||
|
||||
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/arm/mach-at91/at91rm9200_time.c | 2 ++
|
||||
arch/arm/mach-at91/at91sam926x_time.c | 6 +++++-
|
||||
2 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c
|
||||
index 1dd69c8..0666570 100644
|
||||
--- a/arch/arm/mach-at91/at91rm9200_time.c
|
||||
+++ b/arch/arm/mach-at91/at91rm9200_time.c
|
||||
@@ -114,6 +114,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev)
|
||||
last_crtr = read_CRTR();
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
+ setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq);
|
||||
/* PIT for periodic irqs; fixed rate of 1/HZ */
|
||||
irqmask = AT91_ST_PITS;
|
||||
at91_sys_write(AT91_ST_PIMR, LATCH);
|
||||
@@ -127,6 +128,7 @@ clkevt32k_mode(enum clock_event_mode mode, struct clock_event_device *dev)
|
||||
break;
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
+ remove_irq(AT91_ID_SYS, &at91rm9200_timer_irq);
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
irqmask = 0;
|
||||
break;
|
||||
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c
|
||||
index 4ba8549..97d1e14 100644
|
||||
--- a/arch/arm/mach-at91/at91sam926x_time.c
|
||||
+++ b/arch/arm/mach-at91/at91sam926x_time.c
|
||||
@@ -54,7 +54,7 @@ static struct clocksource pit_clk = {
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
-
|
||||
+static struct irqaction at91sam926x_pit_irq;
|
||||
/*
|
||||
* Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16)
|
||||
*/
|
||||
@@ -63,6 +63,9 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev)
|
||||
{
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
+ /* Set up irq handler */
|
||||
+ setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq);
|
||||
+
|
||||
/* update clocksource counter */
|
||||
pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR));
|
||||
at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN
|
||||
@@ -75,6 +78,7 @@ pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev)
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
/* disable irq, leaving the clocksource active */
|
||||
at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN);
|
||||
+ remove_irq(AT91_ID_SYS, &at91sam926x_pit_irq);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
From a5f63f3c98dcea7b51fda0df14ecc187fb329eee Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 21 Mar 2011 13:32:17 +0100
|
||||
Subject: [PATCH 044/267] preempt-mark-legitimated-no-resched-sites.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/powerpc/kernel/idle.c | 2 +-
|
||||
arch/sparc/kernel/process_64.c | 2 +-
|
||||
include/linux/preempt.h | 5 ++++-
|
||||
kernel/sched.c | 6 +++---
|
||||
kernel/softirq.c | 4 ++--
|
||||
5 files changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c
|
||||
index f46dae5..5d70d10 100644
|
||||
--- a/arch/powerpc/kernel/idle.c
|
||||
+++ b/arch/powerpc/kernel/idle.c
|
||||
@@ -95,7 +95,7 @@ void cpu_idle(void)
|
||||
ppc64_runlatch_on();
|
||||
tick_nohz_restart_sched_tick();
|
||||
if (cpu_should_die()) {
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
cpu_die();
|
||||
}
|
||||
schedule_preempt_disabled();
|
||||
diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
|
||||
index 8ba0dbe..86fe09a 100644
|
||||
--- a/arch/sparc/kernel/process_64.c
|
||||
+++ b/arch/sparc/kernel/process_64.c
|
||||
@@ -104,7 +104,7 @@ void cpu_idle(void)
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (cpu_is_offline(cpu)) {
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
cpu_play_dead();
|
||||
}
|
||||
#endif
|
||||
diff --git a/include/linux/preempt.h b/include/linux/preempt.h
|
||||
index 58969b2..227b0f5 100644
|
||||
--- a/include/linux/preempt.h
|
||||
+++ b/include/linux/preempt.h
|
||||
@@ -48,12 +48,14 @@ do { \
|
||||
barrier(); \
|
||||
} while (0)
|
||||
|
||||
-#define preempt_enable_no_resched() \
|
||||
+#define __preempt_enable_no_resched() \
|
||||
do { \
|
||||
barrier(); \
|
||||
dec_preempt_count(); \
|
||||
} while (0)
|
||||
|
||||
+#define preempt_enable_no_resched() __preempt_enable_no_resched()
|
||||
+
|
||||
#define preempt_enable() \
|
||||
do { \
|
||||
preempt_enable_no_resched(); \
|
||||
@@ -92,6 +94,7 @@ do { \
|
||||
#else /* !CONFIG_PREEMPT_COUNT */
|
||||
|
||||
#define preempt_disable() do { } while (0)
|
||||
+#define __preempt_enable_no_resched() do { } while (0)
|
||||
#define preempt_enable_no_resched() do { } while (0)
|
||||
#define preempt_enable() do { } while (0)
|
||||
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index 465fd11..e35f01c 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -4415,7 +4415,7 @@ need_resched:
|
||||
|
||||
post_schedule(rq);
|
||||
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
if (need_resched())
|
||||
goto need_resched;
|
||||
}
|
||||
@@ -4463,7 +4463,7 @@ EXPORT_SYMBOL(schedule);
|
||||
*/
|
||||
void __sched schedule_preempt_disabled(void)
|
||||
{
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
schedule();
|
||||
preempt_disable();
|
||||
}
|
||||
@@ -5705,7 +5705,7 @@ SYSCALL_DEFINE0(sched_yield)
|
||||
__release(rq->lock);
|
||||
spin_release(&rq->lock.dep_map, 1, _THIS_IP_);
|
||||
do_raw_spin_unlock(&rq->lock);
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
|
||||
schedule();
|
||||
|
||||
diff --git a/kernel/softirq.c b/kernel/softirq.c
|
||||
index c9da2c8..a8becbf 100644
|
||||
--- a/kernel/softirq.c
|
||||
+++ b/kernel/softirq.c
|
||||
@@ -353,7 +353,7 @@ void irq_exit(void)
|
||||
if (idle_cpu(smp_processor_id()) && !in_interrupt() && !need_resched())
|
||||
tick_nohz_stop_sched_tick(0);
|
||||
#endif
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -759,7 +759,7 @@ static int run_ksoftirqd(void * __bind_cpu)
|
||||
if (local_softirq_pending())
|
||||
__do_softirq();
|
||||
local_irq_enable();
|
||||
- preempt_enable_no_resched();
|
||||
+ __preempt_enable_no_resched();
|
||||
cond_resched();
|
||||
preempt_disable();
|
||||
rcu_note_context_switch((long)__bind_cpu);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
From 96af58acea4b1f2d36ff57313a95c5cd6e8c0e9c Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 28 Jun 2011 15:44:15 +0200
|
||||
Subject: [PATCH 061/267] softirq-thread-do-softirq.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/interrupt.h | 2 ++
|
||||
net/core/dev.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
||||
index a64b00e..21b94de 100644
|
||||
--- a/include/linux/interrupt.h
|
||||
+++ b/include/linux/interrupt.h
|
||||
@@ -454,6 +454,8 @@ struct softirq_action
|
||||
|
||||
asmlinkage void do_softirq(void);
|
||||
asmlinkage void __do_softirq(void);
|
||||
+static inline void thread_do_softirq(void) { do_softirq(); }
|
||||
+
|
||||
extern void open_softirq(int nr, void (*action)(struct softirq_action *));
|
||||
extern void softirq_init(void);
|
||||
static inline void __raise_softirq_irqoff(unsigned int nr)
|
||||
diff --git a/net/core/dev.c b/net/core/dev.c
|
||||
index 55cd370..c28987a 100644
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -3037,7 +3037,7 @@ int netif_rx_ni(struct sk_buff *skb)
|
||||
preempt_disable();
|
||||
err = netif_rx(skb);
|
||||
if (local_softirq_pending())
|
||||
- do_softirq();
|
||||
+ thread_do_softirq();
|
||||
preempt_enable();
|
||||
|
||||
return err;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From 52c45c824d10baf0dd84cc56dc2fc35536d4fa49 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 18 Jul 2011 15:59:38 +0200
|
||||
Subject: [PATCH 064/267] x86-32-fix-signal-crap.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/x86/kernel/entry_32.S | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
|
||||
index bcda816..426cf51 100644
|
||||
--- a/arch/x86/kernel/entry_32.S
|
||||
+++ b/arch/x86/kernel/entry_32.S
|
||||
@@ -629,7 +629,11 @@ work_notifysig: # deal with pending signals and
|
||||
jne work_notifysig_v86 # returning to kernel-space or
|
||||
# vm86-space
|
||||
xorl %edx, %edx
|
||||
+ TRACE_IRQS_ON
|
||||
+ ENABLE_INTERRUPTS(CLBR_NONE)
|
||||
call do_notify_resume
|
||||
+ DISABLE_INTERRUPTS(CLBR_ANY)
|
||||
+ TRACE_IRQS_OFF
|
||||
jmp resume_userspace_sig
|
||||
|
||||
ALIGN
|
||||
@@ -642,7 +646,11 @@ work_notifysig_v86:
|
||||
movl %esp, %eax
|
||||
#endif
|
||||
xorl %edx, %edx
|
||||
+ TRACE_IRQS_ON
|
||||
+ ENABLE_INTERRUPTS(CLBR_NONE)
|
||||
call do_notify_resume
|
||||
+ DISABLE_INTERRUPTS(CLBR_ANY)
|
||||
+ TRACE_IRQS_OFF
|
||||
jmp resume_userspace_sig
|
||||
END(work_pending)
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
From e48b25d1e88f0066fc74583020ad764cd0d002f5 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 24 Jun 2011 22:23:02 +0200
|
||||
Subject: [PATCH 066/267] rcu: Reduce lock section
|
||||
|
||||
So the waitqueue wakeup is outside the raw locked section.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/rcutree.c | 2 +-
|
||||
kernel/rcutree.h | 3 ++-
|
||||
kernel/rcutree_plugin.h | 14 ++++++++------
|
||||
3 files changed, 11 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/kernel/rcutree.c b/kernel/rcutree.c
|
||||
index 6b76d81..8ef8675 100644
|
||||
--- a/kernel/rcutree.c
|
||||
+++ b/kernel/rcutree.c
|
||||
@@ -1221,7 +1221,7 @@ static void __rcu_offline_cpu(int cpu, struct rcu_state *rsp)
|
||||
else
|
||||
raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
||||
if (need_report & RCU_OFL_TASKS_EXP_GP)
|
||||
- rcu_report_exp_rnp(rsp, rnp);
|
||||
+ rcu_report_exp_rnp(rsp, rnp, true);
|
||||
rcu_node_kthread_setaffinity(rnp, -1);
|
||||
}
|
||||
|
||||
diff --git a/kernel/rcutree.h b/kernel/rcutree.h
|
||||
index 849ce9e..dca495d 100644
|
||||
--- a/kernel/rcutree.h
|
||||
+++ b/kernel/rcutree.h
|
||||
@@ -451,7 +451,8 @@ static void rcu_preempt_check_callbacks(int cpu);
|
||||
static void rcu_preempt_process_callbacks(void);
|
||||
void call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu));
|
||||
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU)
|
||||
-static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp);
|
||||
+static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
|
||||
+ bool wake);
|
||||
#endif /* #if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_TREE_PREEMPT_RCU) */
|
||||
static int rcu_preempt_pending(int cpu);
|
||||
static int rcu_preempt_needs_cpu(int cpu);
|
||||
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
|
||||
index 4b9b9f8..73cab33 100644
|
||||
--- a/kernel/rcutree_plugin.h
|
||||
+++ b/kernel/rcutree_plugin.h
|
||||
@@ -407,7 +407,7 @@ static noinline void rcu_read_unlock_special(struct task_struct *t)
|
||||
* then we need to report up the rcu_node hierarchy.
|
||||
*/
|
||||
if (!empty_exp && !rcu_preempted_readers_exp(rnp))
|
||||
- rcu_report_exp_rnp(&rcu_preempt_state, rnp);
|
||||
+ rcu_report_exp_rnp(&rcu_preempt_state, rnp, true);
|
||||
} else {
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
@@ -731,7 +731,8 @@ static int sync_rcu_preempt_exp_done(struct rcu_node *rnp)
|
||||
*
|
||||
* Caller must hold sync_rcu_preempt_exp_mutex.
|
||||
*/
|
||||
-static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
|
||||
+static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
|
||||
+ bool wake)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long mask;
|
||||
@@ -744,7 +745,8 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
|
||||
}
|
||||
if (rnp->parent == NULL) {
|
||||
raw_spin_unlock_irqrestore(&rnp->lock, flags);
|
||||
- wake_up(&sync_rcu_preempt_exp_wq);
|
||||
+ if (wake)
|
||||
+ wake_up(&sync_rcu_preempt_exp_wq);
|
||||
break;
|
||||
}
|
||||
mask = rnp->grpmask;
|
||||
@@ -777,7 +779,7 @@ sync_rcu_preempt_exp_init(struct rcu_state *rsp, struct rcu_node *rnp)
|
||||
must_wait = 1;
|
||||
}
|
||||
if (!must_wait)
|
||||
- rcu_report_exp_rnp(rsp, rnp);
|
||||
+ rcu_report_exp_rnp(rsp, rnp, false);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1069,9 +1071,9 @@ EXPORT_SYMBOL_GPL(synchronize_rcu_expedited);
|
||||
* report on tasks preempted in RCU read-side critical sections during
|
||||
* expedited RCU grace periods.
|
||||
*/
|
||||
-static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
|
||||
+static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp,
|
||||
+ bool wake)
|
||||
{
|
||||
- return;
|
||||
}
|
||||
|
||||
#endif /* #ifdef CONFIG_HOTPLUG_CPU */
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
From 90713b9e3f210d7ebb96dade4cc71b7397ce99d4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 1 Dec 2011 00:04:00 +0100
|
||||
Subject: [PATCH 068/267] wait: Provide __wake_up_all_locked
|
||||
|
||||
For code which protects the waitqueue itself with another lock it
|
||||
makes no sense to acquire the waitqueue lock for wakeup all. Provide
|
||||
__wake_up_all_locked.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: stable-rt@vger.kernel.org
|
||||
---
|
||||
include/linux/wait.h | 5 +++--
|
||||
kernel/sched.c | 4 ++--
|
||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/linux/wait.h b/include/linux/wait.h
|
||||
index 3efc9f3..1e904b8 100644
|
||||
--- a/include/linux/wait.h
|
||||
+++ b/include/linux/wait.h
|
||||
@@ -157,7 +157,7 @@ void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key);
|
||||
void __wake_up_locked_key(wait_queue_head_t *q, unsigned int mode, void *key);
|
||||
void __wake_up_sync_key(wait_queue_head_t *q, unsigned int mode, int nr,
|
||||
void *key);
|
||||
-void __wake_up_locked(wait_queue_head_t *q, unsigned int mode);
|
||||
+void __wake_up_locked(wait_queue_head_t *q, unsigned int mode, int nr);
|
||||
void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr);
|
||||
void __wake_up_bit(wait_queue_head_t *, void *, int);
|
||||
int __wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, int (*)(void *), unsigned);
|
||||
@@ -170,7 +170,8 @@ wait_queue_head_t *bit_waitqueue(void *, int);
|
||||
#define wake_up(x) __wake_up(x, TASK_NORMAL, 1, NULL)
|
||||
#define wake_up_nr(x, nr) __wake_up(x, TASK_NORMAL, nr, NULL)
|
||||
#define wake_up_all(x) __wake_up(x, TASK_NORMAL, 0, NULL)
|
||||
-#define wake_up_locked(x) __wake_up_locked((x), TASK_NORMAL)
|
||||
+#define wake_up_locked(x) __wake_up_locked((x), TASK_NORMAL, 1)
|
||||
+#define wake_up_all_locked(x) __wake_up_locked((x), TASK_NORMAL, 0)
|
||||
|
||||
#define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
|
||||
#define wake_up_interruptible_nr(x, nr) __wake_up(x, TASK_INTERRUPTIBLE, nr, NULL)
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index e35f01c..bb93b0b 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -4637,9 +4637,9 @@ EXPORT_SYMBOL(__wake_up);
|
||||
/*
|
||||
* Same as __wake_up but called with the spinlock in wait_queue_head_t held.
|
||||
*/
|
||||
-void __wake_up_locked(wait_queue_head_t *q, unsigned int mode)
|
||||
+void __wake_up_locked(wait_queue_head_t *q, unsigned int mode, int nr)
|
||||
{
|
||||
- __wake_up_common(q, mode, 1, 0, NULL);
|
||||
+ __wake_up_common(q, mode, nr, 0, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__wake_up_locked);
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
From 0285604d1f4283b1bb59ec7efd683d4475c018db Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 1 Dec 2011 00:07:16 +0100
|
||||
Subject: [PATCH 069/267] pci: Use __wake_up_all_locked
|
||||
pci_unblock_user_cfg_access()
|
||||
|
||||
The waitqueue is protected by the pci_lock, so we can just avoid to
|
||||
lock the waitqueue lock itself. That prevents the
|
||||
might_sleep()/scheduling while atomic problem on RT
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: stable-rt@vger.kernel.org
|
||||
---
|
||||
drivers/pci/access.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/pci/access.c b/drivers/pci/access.c
|
||||
index fdaa42a..1a6cc67 100644
|
||||
--- a/drivers/pci/access.c
|
||||
+++ b/drivers/pci/access.c
|
||||
@@ -441,7 +441,7 @@ void pci_unblock_user_cfg_access(struct pci_dev *dev)
|
||||
WARN_ON(!dev->block_ucfg_access);
|
||||
|
||||
dev->block_ucfg_access = 0;
|
||||
- wake_up_all(&pci_ucfg_wait);
|
||||
+ wake_up_all_locked(&pci_ucfg_wait);
|
||||
raw_spin_unlock_irqrestore(&pci_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_unblock_user_cfg_access);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
From dc3a0b29103cadebe8c40fd3ad80b18b7d1af27b Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 8 Jul 2011 20:25:16 +0200
|
||||
Subject: [PATCH 072/267] localversion.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
Link: http://lkml.kernel.org/n/tip-8vdw4bfcsds27cvox6rpb334@git.kernel.org
|
||||
---
|
||||
localversion-rt | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
create mode 100644 localversion-rt
|
||||
|
||||
diff --git a/localversion-rt b/localversion-rt
|
||||
new file mode 100644
|
||||
index 0000000..b2111a2
|
||||
--- /dev/null
|
||||
+++ b/localversion-rt
|
||||
@@ -0,0 +1 @@
|
||||
+-rt24
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
From d553f4dded23aedcf07184908178b715c78cc492 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 19 Aug 2009 09:56:42 +0200
|
||||
Subject: [PATCH 092/267] mm: Replace cgroup_page bit spinlock
|
||||
|
||||
Bit spinlocks are not working on RT. Replace them.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/page_cgroup.h | 28 ++++++++++++++++++++++++++++
|
||||
mm/page_cgroup.c | 1 +
|
||||
2 files changed, 29 insertions(+)
|
||||
|
||||
diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h
|
||||
index 961ecc7..2927c08 100644
|
||||
--- a/include/linux/page_cgroup.h
|
||||
+++ b/include/linux/page_cgroup.h
|
||||
@@ -30,6 +30,10 @@ enum {
|
||||
*/
|
||||
struct page_cgroup {
|
||||
unsigned long flags;
|
||||
+#ifdef CONFIG_PREEMPT_RT_BASE
|
||||
+ spinlock_t pcg_lock;
|
||||
+ spinlock_t pcm_lock;
|
||||
+#endif
|
||||
struct mem_cgroup *mem_cgroup;
|
||||
struct list_head lru; /* per cgroup LRU list */
|
||||
};
|
||||
@@ -96,30 +100,54 @@ static inline void lock_page_cgroup(struct page_cgroup *pc)
|
||||
* Don't take this lock in IRQ context.
|
||||
* This lock is for pc->mem_cgroup, USED, CACHE, MIGRATION
|
||||
*/
|
||||
+#ifndef CONFIG_PREEMPT_RT_BASE
|
||||
bit_spin_lock(PCG_LOCK, &pc->flags);
|
||||
+#else
|
||||
+ spin_lock(&pc->pcg_lock);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static inline void unlock_page_cgroup(struct page_cgroup *pc)
|
||||
{
|
||||
+#ifndef CONFIG_PREEMPT_RT_BASE
|
||||
bit_spin_unlock(PCG_LOCK, &pc->flags);
|
||||
+#else
|
||||
+ spin_unlock(&pc->pcg_lock);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static inline void move_lock_page_cgroup(struct page_cgroup *pc,
|
||||
unsigned long *flags)
|
||||
{
|
||||
+#ifndef CONFIG_PREEMPT_RT_BASE
|
||||
/*
|
||||
* We know updates to pc->flags of page cache's stats are from both of
|
||||
* usual context or IRQ context. Disable IRQ to avoid deadlock.
|
||||
*/
|
||||
local_irq_save(*flags);
|
||||
bit_spin_lock(PCG_MOVE_LOCK, &pc->flags);
|
||||
+#else
|
||||
+ spin_lock_irqsave(&pc->pcm_lock, *flags);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static inline void move_unlock_page_cgroup(struct page_cgroup *pc,
|
||||
unsigned long *flags)
|
||||
{
|
||||
+#ifndef CONFIG_PREEMPT_RT_BASE
|
||||
bit_spin_unlock(PCG_MOVE_LOCK, &pc->flags);
|
||||
local_irq_restore(*flags);
|
||||
+#else
|
||||
+ spin_unlock_irqrestore(&pc->pcm_lock, *flags);
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static inline void page_cgroup_lock_init(struct page_cgroup *pc)
|
||||
+{
|
||||
+#ifdef CONFIG_PREEMPT_RT_BASE
|
||||
+ spin_lock_init(&pc->pcg_lock);
|
||||
+ spin_lock_init(&pc->pcm_lock);
|
||||
+#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM
|
||||
diff --git a/mm/page_cgroup.c b/mm/page_cgroup.c
|
||||
index 2d123f9..2e0d18d 100644
|
||||
--- a/mm/page_cgroup.c
|
||||
+++ b/mm/page_cgroup.c
|
||||
@@ -17,6 +17,7 @@ static void __meminit init_page_cgroup(struct page_cgroup *pc, unsigned long id)
|
||||
set_page_cgroup_array_id(pc, id);
|
||||
pc->mem_cgroup = NULL;
|
||||
INIT_LIST_HEAD(&pc->lru);
|
||||
+ page_cgroup_lock_init(pc);
|
||||
}
|
||||
static unsigned long total_usage;
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
From d8ce6bcfe27b0b0649048b054827a7c6a64b5d0c Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 22 Jun 2011 20:47:08 +0200
|
||||
Subject: [PATCH 113/267] mm-vmstat-fix-the-irq-lock-asymetry.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
mm/vmscan.c | 18 +++++++++---------
|
||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/mm/vmscan.c b/mm/vmscan.c
|
||||
index cb33d9c..39f9629 100644
|
||||
--- a/mm/vmscan.c
|
||||
+++ b/mm/vmscan.c
|
||||
@@ -1344,8 +1344,8 @@ static int too_many_isolated(struct zone *zone, int file,
|
||||
*/
|
||||
static noinline_for_stack void
|
||||
putback_lru_pages(struct zone *zone, struct scan_control *sc,
|
||||
- unsigned long nr_anon, unsigned long nr_file,
|
||||
- struct list_head *page_list)
|
||||
+ unsigned long nr_anon, unsigned long nr_file,
|
||||
+ struct list_head *page_list, unsigned long nr_reclaimed)
|
||||
{
|
||||
struct page *page;
|
||||
struct pagevec pvec;
|
||||
@@ -1356,7 +1356,12 @@ putback_lru_pages(struct zone *zone, struct scan_control *sc,
|
||||
/*
|
||||
* Put back any unfreeable pages.
|
||||
*/
|
||||
- spin_lock(&zone->lru_lock);
|
||||
+ spin_lock_irq(&zone->lru_lock);
|
||||
+
|
||||
+ if (current_is_kswapd())
|
||||
+ __count_vm_events(KSWAPD_STEAL, nr_reclaimed);
|
||||
+ __count_zone_vm_events(PGSTEAL, zone, nr_reclaimed);
|
||||
+
|
||||
while (!list_empty(page_list)) {
|
||||
int lru;
|
||||
page = lru_to_page(page_list);
|
||||
@@ -1539,12 +1544,7 @@ shrink_inactive_list(unsigned long nr_to_scan, struct zone *zone,
|
||||
priority, &nr_dirty, &nr_writeback);
|
||||
}
|
||||
|
||||
- local_irq_disable();
|
||||
- if (current_is_kswapd())
|
||||
- __count_vm_events(KSWAPD_STEAL, nr_reclaimed);
|
||||
- __count_zone_vm_events(PGSTEAL, zone, nr_reclaimed);
|
||||
-
|
||||
- putback_lru_pages(zone, sc, nr_anon, nr_file, &page_list);
|
||||
+ putback_lru_pages(zone, sc, nr_anon, nr_file, &page_list, nr_reclaimed);
|
||||
|
||||
/*
|
||||
* If reclaim is isolating dirty pages under writeback, it implies
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
From f4c10a6646165be65152353cde34f57b80e14519 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 10 Apr 2012 14:34:04 -0400
|
||||
Subject: [PATCH 119/267] panic-disable-random-on-rt
|
||||
|
||||
---
|
||||
kernel/panic.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/kernel/panic.c b/kernel/panic.c
|
||||
index 3458469..50f4de5 100644
|
||||
--- a/kernel/panic.c
|
||||
+++ b/kernel/panic.c
|
||||
@@ -343,9 +343,11 @@ static u64 oops_id;
|
||||
|
||||
static int init_oops_id(void)
|
||||
{
|
||||
+#ifndef CONFIG_PREEMPT_RT_FULL
|
||||
if (!oops_id)
|
||||
get_random_bytes(&oops_id, sizeof(oops_id));
|
||||
else
|
||||
+#endif
|
||||
oops_id++;
|
||||
|
||||
return 0;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
From 6d0f369ac20fb888983eff59ce6cb1ec93e815c5 Mon Sep 17 00:00:00 2001
|
||||
From: Yong Zhang <yong.zhang0@gmail.com>
|
||||
Date: Thu, 13 Oct 2011 15:52:30 +0800
|
||||
Subject: [PATCH 135/267] hrtimer: Add missing debug_activate() aid [Was: Re:
|
||||
[ANNOUNCE] 3.0.6-rt17]
|
||||
|
||||
On Fri, Oct 07, 2011 at 10:25:25AM -0700, Fernando Lopez-Lezcano wrote:
|
||||
> On 10/06/2011 06:15 PM, Thomas Gleixner wrote:
|
||||
> >Dear RT Folks,
|
||||
> >
|
||||
> >I'm pleased to announce the 3.0.6-rt17 release.
|
||||
>
|
||||
> Hi and thanks again. So far this one is not hanging which is very
|
||||
> good news. But I still see the hrtimer_fixup_activate warnings I
|
||||
> reported for rt16...
|
||||
|
||||
Hi Fernando,
|
||||
|
||||
I think below patch will smooth your concern?
|
||||
|
||||
Thanks,
|
||||
Yong
|
||||
---
|
||||
kernel/hrtimer.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
|
||||
index 358442b..d363df8 100644
|
||||
--- a/kernel/hrtimer.c
|
||||
+++ b/kernel/hrtimer.c
|
||||
@@ -1042,6 +1042,7 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
||||
* remove it again and report a failure. This avoids
|
||||
* stale base->first entries.
|
||||
*/
|
||||
+ debug_deactivate(timer);
|
||||
__remove_hrtimer(timer, new_base,
|
||||
timer->state & HRTIMER_STATE_CALLBACK, 0);
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
From 2cf8fbc8ec1ba087782bc59ae4e452bd42d6c9e2 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 6 Jun 2011 20:07:38 +0200
|
||||
Subject: [PATCH 145/267] sched-prevent-idle-boost.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/sched.c | 21 +++++++++++++++++++--
|
||||
1 file changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index f101d97..b813946 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -5037,6 +5037,24 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
|
||||
|
||||
rq = __task_rq_lock(p);
|
||||
|
||||
+ /*
|
||||
+ * Idle task boosting is a nono in general. There is one
|
||||
+ * exception, when PREEMPT_RT and NOHZ is active:
|
||||
+ *
|
||||
+ * The idle task calls get_next_timer_interrupt() and holds
|
||||
+ * the timer wheel base->lock on the CPU and another CPU wants
|
||||
+ * to access the timer (probably to cancel it). We can safely
|
||||
+ * ignore the boosting request, as the idle CPU runs this code
|
||||
+ * with interrupts disabled and will complete the lock
|
||||
+ * protected section without being interrupted. So there is no
|
||||
+ * real need to boost.
|
||||
+ */
|
||||
+ if (unlikely(p == rq->idle)) {
|
||||
+ WARN_ON(p != rq->curr);
|
||||
+ WARN_ON(p->pi_blocked_on);
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
+
|
||||
trace_sched_pi_setprio(p, prio);
|
||||
oldprio = p->prio;
|
||||
prev_class = p->sched_class;
|
||||
@@ -5060,11 +5078,10 @@ void rt_mutex_setprio(struct task_struct *p, int prio)
|
||||
enqueue_task(rq, p, oldprio < prio ? ENQUEUE_HEAD : 0);
|
||||
|
||||
check_class_changed(rq, p, prev_class, oldprio);
|
||||
+out_unlock:
|
||||
__task_rq_unlock(rq);
|
||||
}
|
||||
-
|
||||
#endif
|
||||
-
|
||||
void set_user_nice(struct task_struct *p, long nice)
|
||||
{
|
||||
int old_prio, delta, on_rq;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
From 99413c8e97ac85b7f0d29603625302a76aa06e1e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Zijlstra <peterz@infradead.org>
|
||||
Date: Tue, 16 Mar 2010 14:31:44 -0700
|
||||
Subject: [PATCH 147/267] sched: Break out from load_balancing on rq_lock
|
||||
contention
|
||||
|
||||
Also limit NEW_IDLE pull
|
||||
|
||||
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/sched_fair.c | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
|
||||
index 8a39fa3..3747e53 100644
|
||||
--- a/kernel/sched_fair.c
|
||||
+++ b/kernel/sched_fair.c
|
||||
@@ -2899,6 +2899,10 @@ balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest,
|
||||
*/
|
||||
if (idle == CPU_NEWLY_IDLE)
|
||||
break;
|
||||
+
|
||||
+ if (raw_spin_is_contended(&this_rq->lock) ||
|
||||
+ raw_spin_is_contended(&busiest->lock))
|
||||
+ break;
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -3039,6 +3043,20 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
|
||||
rem_load_move -= moved_load;
|
||||
if (rem_load_move < 0)
|
||||
break;
|
||||
+
|
||||
+#ifdef CONFIG_PREEMPT
|
||||
+ /*
|
||||
+ * NEWIDLE balancing is a source of latency, so preemptible
|
||||
+ * kernels will stop after the first task is pulled to minimize
|
||||
+ * the critical section.
|
||||
+ */
|
||||
+ if (idle == CPU_NEWLY_IDLE && this_rq->nr_running)
|
||||
+ break;
|
||||
+
|
||||
+ if (raw_spin_is_contended(&this_rq->lock) ||
|
||||
+ raw_spin_is_contended(&busiest->lock))
|
||||
+ break;
|
||||
+#endif
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
From dd97a1f5ab811d126ed8fff8fd9dc43dbbb845ee Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 17 Jul 2011 20:46:52 +0200
|
||||
Subject: [PATCH 150/267] sched-no-work-when-pi-blocked.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/sched.h | 8 ++++++++
|
||||
kernel/sched.c | 5 ++++-
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 38d78dc..99e7f8b 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -2095,12 +2095,20 @@ extern unsigned int sysctl_sched_cfs_bandwidth_slice;
|
||||
extern int rt_mutex_getprio(struct task_struct *p);
|
||||
extern void rt_mutex_setprio(struct task_struct *p, int prio);
|
||||
extern void rt_mutex_adjust_pi(struct task_struct *p);
|
||||
+static inline bool tsk_is_pi_blocked(struct task_struct *tsk)
|
||||
+{
|
||||
+ return tsk->pi_blocked_on != NULL;
|
||||
+}
|
||||
#else
|
||||
static inline int rt_mutex_getprio(struct task_struct *p)
|
||||
{
|
||||
return p->normal_prio;
|
||||
}
|
||||
# define rt_mutex_adjust_pi(p) do { } while (0)
|
||||
+static inline bool tsk_is_pi_blocked(struct task_struct *tsk)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
#endif
|
||||
|
||||
extern bool yield_to(struct task_struct *p, bool preempt);
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index af3883b..5b871cb 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -4461,7 +4461,7 @@ need_resched:
|
||||
|
||||
static inline void sched_submit_work(struct task_struct *tsk)
|
||||
{
|
||||
- if (!tsk->state)
|
||||
+ if (!tsk->state || tsk_is_pi_blocked(tsk))
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -4481,6 +4481,9 @@ static inline void sched_submit_work(struct task_struct *tsk)
|
||||
|
||||
static inline void sched_update_worker(struct task_struct *tsk)
|
||||
{
|
||||
+ if (tsk_is_pi_blocked(tsk))
|
||||
+ return;
|
||||
+
|
||||
if (tsk->flags & PF_WQ_WORKER)
|
||||
wq_worker_running(tsk);
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
From 0366f3687cfda21ddb7b00c56165439afb0a2ffb Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 13 Sep 2011 16:42:35 +0200
|
||||
Subject: [PATCH 152/267] sched-disable-ttwu-queue.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/sched_features.h | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/kernel/sched_features.h b/kernel/sched_features.h
|
||||
index 8480224..0007001 100644
|
||||
--- a/kernel/sched_features.h
|
||||
+++ b/kernel/sched_features.h
|
||||
@@ -60,11 +60,15 @@ SCHED_FEAT(OWNER_SPIN, 1)
|
||||
*/
|
||||
SCHED_FEAT(NONTASK_POWER, 1)
|
||||
|
||||
+#ifndef CONFIG_PREEMPT_RT_FULL
|
||||
/*
|
||||
* Queue remote wakeups on the target CPU and process them
|
||||
* using the scheduler IPI. Reduces rq->lock contention/bounces.
|
||||
*/
|
||||
SCHED_FEAT(TTWU_QUEUE, 1)
|
||||
+#else
|
||||
+SCHED_FEAT(TTWU_QUEUE, 0)
|
||||
+#endif
|
||||
|
||||
SCHED_FEAT(FORCE_SD_OVERLAP, 0)
|
||||
SCHED_FEAT(RT_RUNTIME_SHARE, 1)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
From 15761075fe95848ac4cfa95a0b2e860eb2e3b82a Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 4 Nov 2011 20:48:36 +0100
|
||||
Subject: [PATCH 174/267] sched-clear-pf-thread-bound-on-fallback-rq.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/sched.c | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index 51c0ad6..81b340d 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -2570,7 +2570,12 @@ static int select_fallback_rq(int cpu, struct task_struct *p)
|
||||
printk(KERN_INFO "process %d (%s) no longer affine to cpu%d\n",
|
||||
task_pid_nr(p), p->comm, cpu);
|
||||
}
|
||||
-
|
||||
+ /*
|
||||
+ * Clear PF_THREAD_BOUND, otherwise we wreckage
|
||||
+ * migrate_disable/enable. See optimization for
|
||||
+ * PF_THREAD_BOUND tasks there.
|
||||
+ */
|
||||
+ p->flags &= ~PF_THREAD_BOUND;
|
||||
return dest_cpu;
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
From 40ebaf9abcb5b1d219eba80ba6648c0142b9fa12 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:30:01 -0500
|
||||
Subject: [PATCH 211/267] serial: 8250: Clean up the locking for -rt
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/8250.c | 15 +++++----------
|
||||
1 file changed, 5 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
|
||||
index eeadf1b..43f7f46 100644
|
||||
--- a/drivers/tty/serial/8250.c
|
||||
+++ b/drivers/tty/serial/8250.c
|
||||
@@ -2846,14 +2846,10 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
|
||||
|
||||
touch_nmi_watchdog();
|
||||
|
||||
- local_irq_save(flags);
|
||||
- if (up->port.sysrq) {
|
||||
- /* serial8250_handle_port() already took the lock */
|
||||
- locked = 0;
|
||||
- } else if (oops_in_progress) {
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
- } else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ if (up->port.sysrq || oops_in_progress)
|
||||
+ locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
+ else
|
||||
+ spin_lock_irqsave(&up->port.lock, flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -2885,8 +2881,7 @@ serial8250_console_write(struct console *co, const char *s, unsigned int count)
|
||||
check_modem_status(up);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
- local_irq_restore(flags);
|
||||
+ spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
}
|
||||
|
||||
static int __init serial8250_console_setup(struct console *co, char *options)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
From 81272c044fe3dd9a13be10c4aca5a0d6d6d428e2 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 28 Jul 2011 13:32:57 +0200
|
||||
Subject: [PATCH 213/267] drivers-tty-fix-omap-lock-crap.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/omap-serial.c | 8 +++-----
|
||||
1 file changed, 3 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
|
||||
index 5e713d3..93cdb92 100644
|
||||
--- a/drivers/tty/serial/omap-serial.c
|
||||
+++ b/drivers/tty/serial/omap-serial.c
|
||||
@@ -946,13 +946,12 @@ serial_omap_console_write(struct console *co, const char *s,
|
||||
unsigned int ier;
|
||||
int locked = 1;
|
||||
|
||||
- local_irq_save(flags);
|
||||
if (up->port.sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
+ locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ spin_lock_irqsave(&up->port.lock, flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -979,8 +978,7 @@ serial_omap_console_write(struct console *co, const char *s,
|
||||
check_modem_status(up);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
- local_irq_restore(flags);
|
||||
+ spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
}
|
||||
|
||||
static int __init
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
From d9e6aef724ad0444ca59f536062b3ce3755ab8ff Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 19 Jul 2009 08:44:27 -0500
|
||||
Subject: [PATCH 215/267] fs: namespace preemption fix
|
||||
|
||||
On RT we cannot loop with preemption disabled here as
|
||||
mnt_make_readonly() might have been preempted. We can safely enable
|
||||
preemption while waiting for MNT_WRITE_HOLD to be cleared. Safe on !RT
|
||||
as well.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
fs/namespace.c | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/fs/namespace.c b/fs/namespace.c
|
||||
index cfc6d44..63fd6d7 100644
|
||||
--- a/fs/namespace.c
|
||||
+++ b/fs/namespace.c
|
||||
@@ -341,8 +341,14 @@ int mnt_want_write(struct vfsmount *mnt)
|
||||
* incremented count after it has set MNT_WRITE_HOLD.
|
||||
*/
|
||||
smp_mb();
|
||||
- while (mnt->mnt_flags & MNT_WRITE_HOLD)
|
||||
+ /*
|
||||
+ * No need to keep preemption disabled accross the spin loop.
|
||||
+ */
|
||||
+ while (mnt->mnt_flags & MNT_WRITE_HOLD) {
|
||||
+ preempt_enable();
|
||||
cpu_relax();
|
||||
+ preempt_disable();
|
||||
+ }
|
||||
/*
|
||||
* After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will
|
||||
* be set to match its requirements. So we must not load that until
|
||||
@@ -352,9 +358,7 @@ int mnt_want_write(struct vfsmount *mnt)
|
||||
if (__mnt_is_readonly(mnt)) {
|
||||
mnt_dec_writers(mnt);
|
||||
ret = -EROFS;
|
||||
- goto out;
|
||||
}
|
||||
-out:
|
||||
preempt_enable();
|
||||
return ret;
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
From 2bd1f5a798104f32a4dd4dff8fcf06c97cbba2ba Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 13 Jul 2011 11:03:16 +0200
|
||||
Subject: [PATCH 231/267] jump-label-rt.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/jump_label.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
|
||||
index 388b0d4..9cc8ed9 100644
|
||||
--- a/include/linux/jump_label.h
|
||||
+++ b/include/linux/jump_label.h
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
-#if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL)
|
||||
+#if defined(CC_HAVE_ASM_GOTO) && defined(CONFIG_JUMP_LABEL) && !defined(CONFIG_PREEMPT_BASE)
|
||||
|
||||
struct jump_label_key {
|
||||
atomic_t enabled;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
From 2393db19529654fe543796abc967c908eb7c6148 Mon Sep 17 00:00:00 2001
|
||||
From: Richard Weinberger <rw@linutronix.de>
|
||||
Date: Mon, 12 Dec 2011 14:35:56 +0100
|
||||
Subject: [PATCH 235/267] printk: Disable migration instead of preemption
|
||||
|
||||
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(-)
|
||||
|
||||
diff --git a/kernel/printk.c b/kernel/printk.c
|
||||
index fad23c8..13ea6a9 100644
|
||||
--- a/kernel/printk.c
|
||||
+++ b/kernel/printk.c
|
||||
@@ -901,7 +901,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
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();
|
||||
@@ -1032,7 +1032,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
out_restore_irqs:
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
- preempt_enable();
|
||||
+ migrate_enable();
|
||||
return printed_len;
|
||||
}
|
||||
EXPORT_SYMBOL(printk);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,169 +0,0 @@
|
|||
From 5f911928368b0d9b62da0df476c458037b4f7da4 Mon Sep 17 00:00:00 2001
|
||||
From: Frank Rowand <frank.rowand@am.sony.com>
|
||||
Date: Fri, 23 Sep 2011 13:43:12 -0700
|
||||
Subject: [PATCH 247/267] sysrq: Allow immediate Magic SysRq output for
|
||||
PREEMPT_RT_FULL
|
||||
|
||||
Add a CONFIG option to allow the output from Magic SysRq to be output
|
||||
immediately, even if this causes large latencies.
|
||||
|
||||
If PREEMPT_RT_FULL, printk() will not try to acquire the console lock
|
||||
when interrupts or preemption are disabled. If the console lock is
|
||||
not acquired the printk() output will be buffered, but will not be
|
||||
output immediately. Some drivers call into the Magic SysRq code
|
||||
with interrupts or preemption disabled, so the output of Magic SysRq
|
||||
will be buffered instead of printing immediately if this option is
|
||||
not selected.
|
||||
|
||||
Even with this option selected, Magic SysRq output will be delayed
|
||||
if the attempt to acquire the console lock fails.
|
||||
|
||||
Signed-off-by: Frank Rowand <frank.rowand@am.sony.com>
|
||||
Link: http://lkml.kernel.org/r/4E7CEF60.5020508@am.sony.com
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
[ukleinek: make apply on top of debian/sysrq-mask.patch]
|
||||
|
||||
drivers/tty/serial/cpm_uart/cpm_uart_core.c | 2 +-
|
||||
drivers/tty/sysrq.c | 23 +++++++++++++++++++++++
|
||||
include/linux/sysrq.h | 5 +++++
|
||||
kernel/printk.c | 5 +++--
|
||||
lib/Kconfig.debug | 22 ++++++++++++++++++++++
|
||||
5 files changed, 54 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/tty/serial/cpm_uart/cpm_uart_core.c b/drivers/tty/serial/cpm_uart/cpm_uart_core.c
|
||||
index b418947..a8b0559 100644
|
||||
--- a/drivers/tty/serial/cpm_uart/cpm_uart_core.c
|
||||
+++ b/drivers/tty/serial/cpm_uart/cpm_uart_core.c
|
||||
@@ -1226,7 +1226,7 @@ static void cpm_uart_console_write(struct console *co, const char *s,
|
||||
{
|
||||
struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index];
|
||||
unsigned long flags;
|
||||
- int nolock = oops_in_progress;
|
||||
+ int nolock = oops_in_progress || sysrq_in_progress;
|
||||
|
||||
if (unlikely(nolock)) {
|
||||
local_irq_save(flags);
|
||||
diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c
|
||||
index 43db715..5219738 100644
|
||||
--- a/drivers/tty/sysrq.c
|
||||
+++ b/drivers/tty/sysrq.c
|
||||
@@ -492,6 +492,23 @@ static void __sysrq_put_key_op(int key, struct sysrq_key_op *op_p)
|
||||
sysrq_key_table[i] = op_p;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_MAGIC_SYSRQ_FORCE_PRINTK
|
||||
+
|
||||
+int sysrq_in_progress;
|
||||
+
|
||||
+static void set_sysrq_in_progress(int value)
|
||||
+{
|
||||
+ sysrq_in_progress = value;
|
||||
+}
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+static void set_sysrq_in_progress(int value)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
void __handle_sysrq(int key, bool check_mask)
|
||||
{
|
||||
struct sysrq_key_op *op_p;
|
||||
@@ -500,6 +517,9 @@ void __handle_sysrq(int key, bool check_mask)
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sysrq_key_table_lock, flags);
|
||||
+
|
||||
+ set_sysrq_in_progress(1);
|
||||
+
|
||||
/*
|
||||
* Raise the apparent loglevel to maximum so that the sysrq header
|
||||
* is shown to provide the user with positive feedback. We do not
|
||||
@@ -541,6 +561,9 @@ void __handle_sysrq(int key, bool check_mask)
|
||||
printk("\n");
|
||||
console_loglevel = orig_log_level;
|
||||
}
|
||||
+
|
||||
+ set_sysrq_in_progress(0);
|
||||
+
|
||||
spin_unlock_irqrestore(&sysrq_key_table_lock, flags);
|
||||
}
|
||||
|
||||
diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h
|
||||
index 7faf933..d224c0b 100644
|
||||
--- a/include/linux/sysrq.h
|
||||
+++ b/include/linux/sysrq.h
|
||||
@@ -38,6 +38,11 @@ struct sysrq_key_op {
|
||||
int enable_mask;
|
||||
};
|
||||
|
||||
+#ifdef CONFIG_MAGIC_SYSRQ_FORCE_PRINTK
|
||||
+extern int sysrq_in_progress;
|
||||
+#else
|
||||
+#define sysrq_in_progress 0
|
||||
+#endif
|
||||
#ifdef CONFIG_MAGIC_SYSRQ
|
||||
|
||||
/* Generic SysRq interface -- you may call it from any device driver, supplying
|
||||
diff --git a/kernel/printk.c b/kernel/printk.c
|
||||
index 13ea6a9..9eabbbb 100644
|
||||
--- a/kernel/printk.c
|
||||
+++ b/kernel/printk.c
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/tty.h>
|
||||
#include <linux/tty_driver.h>
|
||||
#include <linux/console.h>
|
||||
+#include <linux/sysrq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/nmi.h>
|
||||
@@ -834,8 +835,8 @@ static int console_trylock_for_printk(unsigned int cpu, unsigned long flags)
|
||||
{
|
||||
int retval = 0, wake = 0;
|
||||
#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
- int lock = !early_boot_irqs_disabled && !irqs_disabled_flags(flags) &&
|
||||
- !preempt_count();
|
||||
+ int lock = (!early_boot_irqs_disabled && !irqs_disabled_flags(flags) &&
|
||||
+ !preempt_count()) || sysrq_in_progress;
|
||||
#else
|
||||
int lock = 1;
|
||||
#endif
|
||||
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
||||
index c347db3..13a937b 100644
|
||||
--- a/lib/Kconfig.debug
|
||||
+++ b/lib/Kconfig.debug
|
||||
@@ -62,6 +62,28 @@ config MAGIC_SYSRQ
|
||||
Specifies the default mask for the allowed SysRq keys. This can be
|
||||
used to disable several sensitive keys by default.
|
||||
|
||||
+config MAGIC_SYSRQ_FORCE_PRINTK
|
||||
+ bool "Force printk from Magic SysRq"
|
||||
+ depends on MAGIC_SYSRQ && PREEMPT_RT_FULL
|
||||
+ default n
|
||||
+ help
|
||||
+ Allow the output from Magic SysRq to be output immediately, even if
|
||||
+ this causes large latencies. This can cause performance problems
|
||||
+ for real-time processes.
|
||||
+
|
||||
+ If PREEMPT_RT_FULL, printk() will not try to acquire the console lock
|
||||
+ when interrupts or preemption are disabled. If the console lock is
|
||||
+ not acquired the printk() output will be buffered, but will not be
|
||||
+ output immediately. Some drivers call into the Magic SysRq code
|
||||
+ with interrupts or preemption disabled, so the output of Magic SysRq
|
||||
+ will be buffered instead of printing immediately if this option is
|
||||
+ not selected.
|
||||
+
|
||||
+ Even with this option selected, Magic SysRq output will be delayed
|
||||
+ if the attempt to acquire the console lock fails.
|
||||
+
|
||||
+ Don't say Y unless you really know what this hack does.
|
||||
+
|
||||
config STRIP_ASM_SYMS
|
||||
bool "Strip assembler-generated symbols during link"
|
||||
default n
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
From a583b75cab964e833c5031f86eb95d3caed27398 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 13 Nov 2011 17:17:09 +0100
|
||||
Subject: [PATCH 260/267] softirq: Check preemption after reenabling
|
||||
interrupts
|
||||
|
||||
raise_softirq_irqoff() disables interrupts and wakes the softirq
|
||||
daemon, but after reenabling interrupts there is no preemption check,
|
||||
so the execution of the softirq thread might be delayed arbitrarily.
|
||||
|
||||
In principle we could add that check to local_irq_enable/restore, but
|
||||
that's overkill as the rasie_softirq_irqoff() sections are the only
|
||||
ones which show this behaviour.
|
||||
|
||||
Reported-by: Carsten Emde <cbe@osadl.org>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Cc: stable-rt@vger.kernel.org
|
||||
---
|
||||
block/blk-iopoll.c | 3 +++
|
||||
block/blk-softirq.c | 3 +++
|
||||
include/linux/preempt.h | 3 +++
|
||||
net/core/dev.c | 6 ++++++
|
||||
4 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/block/blk-iopoll.c b/block/blk-iopoll.c
|
||||
index 58916af..f7ca9b4 100644
|
||||
--- a/block/blk-iopoll.c
|
||||
+++ b/block/blk-iopoll.c
|
||||
@@ -38,6 +38,7 @@ void blk_iopoll_sched(struct blk_iopoll *iop)
|
||||
list_add_tail(&iop->list, &__get_cpu_var(blk_cpu_iopoll));
|
||||
__raise_softirq_irqoff(BLOCK_IOPOLL_SOFTIRQ);
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
EXPORT_SYMBOL(blk_iopoll_sched);
|
||||
|
||||
@@ -135,6 +136,7 @@ static void blk_iopoll_softirq(struct softirq_action *h)
|
||||
__raise_softirq_irqoff(BLOCK_IOPOLL_SOFTIRQ);
|
||||
|
||||
local_irq_enable();
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -204,6 +206,7 @@ static int __cpuinit blk_iopoll_cpu_notify(struct notifier_block *self,
|
||||
&__get_cpu_var(blk_cpu_iopoll));
|
||||
__raise_softirq_irqoff(BLOCK_IOPOLL_SOFTIRQ);
|
||||
local_irq_enable();
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
diff --git a/block/blk-softirq.c b/block/blk-softirq.c
|
||||
index 1366a89..60a88ab 100644
|
||||
--- a/block/blk-softirq.c
|
||||
+++ b/block/blk-softirq.c
|
||||
@@ -50,6 +50,7 @@ static void trigger_softirq(void *data)
|
||||
raise_softirq_irqoff(BLOCK_SOFTIRQ);
|
||||
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -92,6 +93,7 @@ static int __cpuinit blk_cpu_notify(struct notifier_block *self,
|
||||
&__get_cpu_var(blk_cpu_done));
|
||||
raise_softirq_irqoff(BLOCK_SOFTIRQ);
|
||||
local_irq_enable();
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
return NOTIFY_OK;
|
||||
@@ -150,6 +152,7 @@ do_local:
|
||||
goto do_local;
|
||||
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
/**
|
||||
diff --git a/include/linux/preempt.h b/include/linux/preempt.h
|
||||
index 6450c01..58d8982 100644
|
||||
--- a/include/linux/preempt.h
|
||||
+++ b/include/linux/preempt.h
|
||||
@@ -56,8 +56,10 @@ do { \
|
||||
|
||||
#ifndef CONFIG_PREEMPT_RT_BASE
|
||||
# define preempt_enable_no_resched() __preempt_enable_no_resched()
|
||||
+# define preempt_check_resched_rt() do { } while (0)
|
||||
#else
|
||||
# define preempt_enable_no_resched() preempt_enable()
|
||||
+# define preempt_check_resched_rt() preempt_check_resched()
|
||||
#endif
|
||||
|
||||
#define preempt_enable() \
|
||||
@@ -105,6 +107,7 @@ do { \
|
||||
#define preempt_disable_notrace() do { } while (0)
|
||||
#define preempt_enable_no_resched_notrace() do { } while (0)
|
||||
#define preempt_enable_notrace() do { } while (0)
|
||||
+#define preempt_check_resched_rt() do { } while (0)
|
||||
|
||||
#endif /* CONFIG_PREEMPT_COUNT */
|
||||
|
||||
diff --git a/net/core/dev.c b/net/core/dev.c
|
||||
index ae4fd5e..3756e96 100644
|
||||
--- a/net/core/dev.c
|
||||
+++ b/net/core/dev.c
|
||||
@@ -1779,6 +1779,7 @@ static inline void __netif_reschedule(struct Qdisc *q)
|
||||
sd->output_queue_tailp = &q->next_sched;
|
||||
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
void __netif_schedule(struct Qdisc *q)
|
||||
@@ -1800,6 +1801,7 @@ void dev_kfree_skb_irq(struct sk_buff *skb)
|
||||
sd->completion_queue = skb;
|
||||
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(dev_kfree_skb_irq);
|
||||
@@ -2969,6 +2971,7 @@ enqueue:
|
||||
rps_unlock(sd);
|
||||
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
|
||||
atomic_long_inc(&skb->dev->rx_dropped);
|
||||
kfree_skb(skb);
|
||||
@@ -3790,6 +3793,7 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd)
|
||||
} else
|
||||
#endif
|
||||
local_irq_enable();
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
|
||||
static int process_backlog(struct napi_struct *napi, int quota)
|
||||
@@ -3862,6 +3866,7 @@ void __napi_schedule(struct napi_struct *n)
|
||||
local_irq_save(flags);
|
||||
____napi_schedule(&__get_cpu_var(softnet_data), n);
|
||||
local_irq_restore(flags);
|
||||
+ preempt_check_resched_rt();
|
||||
}
|
||||
EXPORT_SYMBOL(__napi_schedule);
|
||||
|
||||
@@ -6402,6 +6407,7 @@ static int dev_cpu_callback(struct notifier_block *nfb,
|
||||
|
||||
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
||||
local_irq_enable();
|
||||
+ preempt_check_resched_rt();
|
||||
|
||||
/* Process offline CPU's input_pkt_queue */
|
||||
while ((skb = __skb_dequeue(&oldsd->process_queue))) {
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
From 87b9564badf043711b03d381536be29103e9cce9 Mon Sep 17 00:00:00 2001
|
||||
From: Steven Rostedt <srostedt@redhat.com>
|
||||
Date: Mon, 16 Apr 2012 21:51:54 -0400
|
||||
Subject: [PATCH 266/267] rt: Make migrate_disable/enable() and
|
||||
__rt_mutex_init non-GPL only
|
||||
|
||||
Modules that load on the normal vanilla kernel should also load on
|
||||
an -rt kernel as well. This does not mean we condone non-GPL modules,
|
||||
we are only being consistent.
|
||||
|
||||
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
|
||||
---
|
||||
kernel/rtmutex.c | 2 +-
|
||||
kernel/sched.c | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
|
||||
index b525158..9c4f6e5 100644
|
||||
--- a/kernel/rtmutex.c
|
||||
+++ b/kernel/rtmutex.c
|
||||
@@ -1290,7 +1290,7 @@ void __rt_mutex_init(struct rt_mutex *lock, const char *name)
|
||||
|
||||
debug_rt_mutex_init(lock, name);
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(__rt_mutex_init);
|
||||
+EXPORT_SYMBOL(__rt_mutex_init);
|
||||
|
||||
/**
|
||||
* rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index 1cc706d..3b12e0b 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -4426,7 +4426,7 @@ void migrate_disable(void)
|
||||
p->migrate_disable = 1;
|
||||
preempt_enable();
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(migrate_disable);
|
||||
+EXPORT_SYMBOL(migrate_disable);
|
||||
|
||||
void migrate_enable(void)
|
||||
{
|
||||
@@ -4478,7 +4478,7 @@ void migrate_enable(void)
|
||||
unpin_current_cpu();
|
||||
preempt_enable();
|
||||
}
|
||||
-EXPORT_SYMBOL_GPL(migrate_enable);
|
||||
+EXPORT_SYMBOL(migrate_enable);
|
||||
#else
|
||||
static inline void update_migrate_disable(struct task_struct *p) { }
|
||||
#define migrate_disabled_updated(p) 0
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
From 9eee911c32b17fa49c4d00541a7459ab912d4fc5 Mon Sep 17 00:00:00 2001
|
||||
From: Steven Rostedt <srostedt@redhat.com>
|
||||
Date: Mon, 16 Apr 2012 22:15:29 -0400
|
||||
Subject: [PATCH 267/267] Linux 3.2.16-rt27 REBASE
|
||||
|
||||
---
|
||||
localversion-rt | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/localversion-rt b/localversion-rt
|
||||
index b2111a2..be1e37b 100644
|
||||
--- a/localversion-rt
|
||||
+++ b/localversion-rt
|
||||
@@ -1 +1 @@
|
||||
--rt24
|
||||
+-rt27
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
From 6bd3fc45f9c1bd877a0fd6776610ca5658dae3b1 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 21 Jul 2009 22:54:51 +0200
|
||||
Subject: [PATCH 084/267] acpi: Do not disable interrupts on PREEMPT_RT
|
||||
Subject: acpi: Do not disable interrupts on PREEMPT_RT
|
||||
|
||||
Use the local_irq_*_nort() variants.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
arch/x86/include/asm/acpi.h | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
|
||||
index 610001d..c1c23d2 100644
|
||||
--- a/arch/x86/include/asm/acpi.h
|
||||
+++ b/arch/x86/include/asm/acpi.h
|
||||
Index: linux-3.4/arch/x86/include/asm/acpi.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/x86/include/asm/acpi.h
|
||||
+++ linux-3.4/arch/x86/include/asm/acpi.h
|
||||
@@ -51,8 +51,8 @@
|
||||
|
||||
#define ACPI_ASM_MACROS
|
||||
|
@ -25,6 +25,3 @@ index 610001d..c1c23d2 100644
|
|||
#define ACPI_FLUSH_CPU_CACHE() wbinvd()
|
||||
|
||||
int __acpi_acquire_global_lock(unsigned int *lock);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
From ce05fde6b2b86bc5569433eef6869bdb1adcb32c Mon Sep 17 00:00:00 2001
|
||||
Subject: mm: Fixup all fault handlers to check current->pagefault_disable
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 17 Mar 2011 11:32:28 +0100
|
||||
Subject: [PATCH 046/267] mm: Fixup all fault handlers to check
|
||||
current->pagefault_disable
|
||||
|
||||
Necessary for decoupling pagefault disable from preempt count.
|
||||
|
||||
|
@ -32,11 +30,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
arch/xtensa/mm/fault.c | 2 +-
|
||||
22 files changed, 27 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
|
||||
index fadd5f8..6d73e1b 100644
|
||||
--- a/arch/alpha/mm/fault.c
|
||||
+++ b/arch/alpha/mm/fault.c
|
||||
@@ -107,7 +107,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
|
||||
Index: linux-3.4/arch/alpha/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/alpha/mm/fault.c
|
||||
+++ linux-3.4/arch/alpha/mm/fault.c
|
||||
@@ -106,7 +106,7 @@ do_page_fault(unsigned long address, uns
|
||||
|
||||
/* If we're in an interrupt context, or have no user context,
|
||||
we must not take the fault. */
|
||||
|
@ -45,11 +43,11 @@ index fadd5f8..6d73e1b 100644
|
|||
goto no_context;
|
||||
|
||||
#ifdef CONFIG_ALPHA_LARGE_VMALLOC
|
||||
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
|
||||
index aa33949..c8dd303 100644
|
||||
--- a/arch/arm/mm/fault.c
|
||||
+++ b/arch/arm/mm/fault.c
|
||||
@@ -294,7 +294,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
Index: linux-3.4/arch/arm/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mm/fault.c
|
||||
+++ linux-3.4/arch/arm/mm/fault.c
|
||||
@@ -277,7 +277,7 @@ do_page_fault(unsigned long addr, unsign
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -58,11 +56,11 @@ index aa33949..c8dd303 100644
|
|||
goto no_context;
|
||||
|
||||
/*
|
||||
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c
|
||||
index f7040a1..623a027 100644
|
||||
--- a/arch/avr32/mm/fault.c
|
||||
+++ b/arch/avr32/mm/fault.c
|
||||
@@ -81,7 +81,8 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs)
|
||||
Index: linux-3.4/arch/avr32/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/avr32/mm/fault.c
|
||||
+++ linux-3.4/arch/avr32/mm/fault.c
|
||||
@@ -81,7 +81,8 @@ asmlinkage void do_page_fault(unsigned l
|
||||
* If we're in an interrupt or have no user context, we must
|
||||
* not take the fault...
|
||||
*/
|
||||
|
@ -72,11 +70,11 @@ index f7040a1..623a027 100644
|
|||
goto no_context;
|
||||
|
||||
local_irq_enable();
|
||||
diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c
|
||||
index 9dcac8e..2b2c292 100644
|
||||
--- a/arch/cris/mm/fault.c
|
||||
+++ b/arch/cris/mm/fault.c
|
||||
@@ -111,7 +111,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
|
||||
Index: linux-3.4/arch/cris/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/cris/mm/fault.c
|
||||
+++ linux-3.4/arch/cris/mm/fault.c
|
||||
@@ -112,7 +112,7 @@ do_page_fault(unsigned long address, str
|
||||
* user context, we must not take the fault.
|
||||
*/
|
||||
|
||||
|
@ -85,11 +83,11 @@ index 9dcac8e..2b2c292 100644
|
|||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c
|
||||
index a325d57..3da8ec7 100644
|
||||
--- a/arch/frv/mm/fault.c
|
||||
+++ b/arch/frv/mm/fault.c
|
||||
@@ -79,7 +79,7 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
|
||||
Index: linux-3.4/arch/frv/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/frv/mm/fault.c
|
||||
+++ linux-3.4/arch/frv/mm/fault.c
|
||||
@@ -78,7 +78,7 @@ asmlinkage void do_page_fault(int datamm
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -98,11 +96,11 @@ index a325d57..3da8ec7 100644
|
|||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
|
||||
index 20b3593..2a4e44f 100644
|
||||
--- a/arch/ia64/mm/fault.c
|
||||
+++ b/arch/ia64/mm/fault.c
|
||||
@@ -89,7 +89,7 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
|
||||
Index: linux-3.4/arch/ia64/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/ia64/mm/fault.c
|
||||
+++ linux-3.4/arch/ia64/mm/fault.c
|
||||
@@ -88,7 +88,7 @@ ia64_do_page_fault (unsigned long addres
|
||||
/*
|
||||
* If we're in an interrupt or have no user context, we must not take the fault..
|
||||
*/
|
||||
|
@ -111,11 +109,11 @@ index 20b3593..2a4e44f 100644
|
|||
goto no_context;
|
||||
|
||||
#ifdef CONFIG_VIRTUAL_MEM_MAP
|
||||
diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c
|
||||
index 2c9aeb4..16fa2c7 100644
|
||||
--- a/arch/m32r/mm/fault.c
|
||||
+++ b/arch/m32r/mm/fault.c
|
||||
@@ -115,7 +115,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,
|
||||
Index: linux-3.4/arch/m32r/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/m32r/mm/fault.c
|
||||
+++ linux-3.4/arch/m32r/mm/fault.c
|
||||
@@ -114,7 +114,7 @@ asmlinkage void do_page_fault(struct pt_
|
||||
* If we're in an interrupt or have no user context or are running in an
|
||||
* atomic region then we must not take the fault..
|
||||
*/
|
||||
|
@ -124,11 +122,11 @@ index 2c9aeb4..16fa2c7 100644
|
|||
goto bad_area_nosemaphore;
|
||||
|
||||
/* When running in the kernel we expect faults to occur only to
|
||||
diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c
|
||||
index 2db6099..238ffc0 100644
|
||||
--- a/arch/m68k/mm/fault.c
|
||||
+++ b/arch/m68k/mm/fault.c
|
||||
@@ -85,7 +85,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
|
||||
Index: linux-3.4/arch/m68k/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/m68k/mm/fault.c
|
||||
+++ linux-3.4/arch/m68k/mm/fault.c
|
||||
@@ -84,7 +84,7 @@ int do_page_fault(struct pt_regs *regs,
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -137,11 +135,11 @@ index 2db6099..238ffc0 100644
|
|||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c
|
||||
index ae97d2c..c3f219c 100644
|
||||
--- a/arch/microblaze/mm/fault.c
|
||||
+++ b/arch/microblaze/mm/fault.c
|
||||
@@ -107,7 +107,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
|
||||
Index: linux-3.4/arch/microblaze/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/microblaze/mm/fault.c
|
||||
+++ linux-3.4/arch/microblaze/mm/fault.c
|
||||
@@ -106,7 +106,7 @@ void do_page_fault(struct pt_regs *regs,
|
||||
if ((error_code & 0x13) == 0x13 || (error_code & 0x11) == 0x11)
|
||||
is_write = 0;
|
||||
|
||||
|
@ -150,11 +148,11 @@ index ae97d2c..c3f219c 100644
|
|||
if (kernel_mode(regs))
|
||||
goto bad_area_nosemaphore;
|
||||
|
||||
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
|
||||
index 937cf33..ce7e75e 100644
|
||||
--- a/arch/mips/mm/fault.c
|
||||
+++ b/arch/mips/mm/fault.c
|
||||
@@ -88,7 +88,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, unsigned long writ
|
||||
Index: linux-3.4/arch/mips/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/mips/mm/fault.c
|
||||
+++ linux-3.4/arch/mips/mm/fault.c
|
||||
@@ -89,7 +89,7 @@ asmlinkage void __kprobes do_page_fault(
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -162,12 +160,12 @@ index 937cf33..ce7e75e 100644
|
|||
+ if (in_atomic() || !mm || current->pagefault_disabled)
|
||||
goto bad_area_nosemaphore;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c
|
||||
index 0945409..53c8d16 100644
|
||||
--- a/arch/mn10300/mm/fault.c
|
||||
+++ b/arch/mn10300/mm/fault.c
|
||||
@@ -168,7 +168,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code,
|
||||
retry:
|
||||
Index: linux-3.4/arch/mn10300/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/mn10300/mm/fault.c
|
||||
+++ linux-3.4/arch/mn10300/mm/fault.c
|
||||
@@ -167,7 +167,7 @@ asmlinkage void do_page_fault(struct pt_
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -176,11 +174,11 @@ index 0945409..53c8d16 100644
|
|||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
|
||||
index 18162ce..09ecc8a 100644
|
||||
--- a/arch/parisc/mm/fault.c
|
||||
+++ b/arch/parisc/mm/fault.c
|
||||
@@ -176,7 +176,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
||||
Index: linux-3.4/arch/parisc/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/parisc/mm/fault.c
|
||||
+++ linux-3.4/arch/parisc/mm/fault.c
|
||||
@@ -176,7 +176,7 @@ void do_page_fault(struct pt_regs *regs,
|
||||
unsigned long acc_type;
|
||||
int fault;
|
||||
|
||||
|
@ -189,24 +187,24 @@ index 18162ce..09ecc8a 100644
|
|||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
|
||||
index 5efe8c9..17f8bbe 100644
|
||||
--- a/arch/powerpc/mm/fault.c
|
||||
+++ b/arch/powerpc/mm/fault.c
|
||||
@@ -162,7 +162,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
|
||||
}
|
||||
#endif
|
||||
Index: linux-3.4/arch/powerpc/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/powerpc/mm/fault.c
|
||||
+++ linux-3.4/arch/powerpc/mm/fault.c
|
||||
@@ -261,7 +261,7 @@ int __kprobes do_page_fault(struct pt_re
|
||||
if (!arch_irq_disabled_regs(regs))
|
||||
local_irq_enable();
|
||||
|
||||
- if (in_atomic() || mm == NULL) {
|
||||
+ if (in_atomic() || mm == NULL || current->pagefault_disabled) {
|
||||
if (!user_mode(regs))
|
||||
return SIGSEGV;
|
||||
/* in_atomic() in user mode is really bad,
|
||||
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
|
||||
index c7f0fbc..0d60168 100644
|
||||
--- a/arch/s390/mm/fault.c
|
||||
+++ b/arch/s390/mm/fault.c
|
||||
@@ -294,7 +294,8 @@ static inline int do_exception(struct pt_regs *regs, int access,
|
||||
Index: linux-3.4/arch/s390/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/s390/mm/fault.c
|
||||
+++ linux-3.4/arch/s390/mm/fault.c
|
||||
@@ -283,7 +283,8 @@ static inline int do_exception(struct pt
|
||||
* user context.
|
||||
*/
|
||||
fault = VM_FAULT_BADCONTEXT;
|
||||
|
@ -216,21 +214,21 @@ index c7f0fbc..0d60168 100644
|
|||
goto out;
|
||||
|
||||
address = trans_exc_code & __FAIL_ADDR_MASK;
|
||||
@@ -425,7 +426,8 @@ void __kprobes do_asce_exception(struct pt_regs *regs, long pgm_int_code,
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
@@ -415,7 +416,8 @@ void __kprobes do_asce_exception(struct
|
||||
unsigned long trans_exc_code;
|
||||
|
||||
trans_exc_code = regs->int_parm_long;
|
||||
- if (unlikely(!user_space_fault(trans_exc_code) || in_atomic() || !mm))
|
||||
+ if (unlikely(!user_space_fault(trans_exc_code) || in_atomic() || !mm ||
|
||||
+ current->pagefault_disabled))
|
||||
+ current->pagefault_disabled))
|
||||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c
|
||||
index 47b600e..4c12824 100644
|
||||
--- a/arch/score/mm/fault.c
|
||||
+++ b/arch/score/mm/fault.c
|
||||
@@ -72,7 +72,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
|
||||
Index: linux-3.4/arch/score/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/score/mm/fault.c
|
||||
+++ linux-3.4/arch/score/mm/fault.c
|
||||
@@ -72,7 +72,7 @@ asmlinkage void do_page_fault(struct pt_
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -239,11 +237,11 @@ index 47b600e..4c12824 100644
|
|||
goto bad_area_nosemaphore;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/sh/mm/fault_32.c b/arch/sh/mm/fault_32.c
|
||||
index 7bebd04..a67ac56 100644
|
||||
--- a/arch/sh/mm/fault_32.c
|
||||
+++ b/arch/sh/mm/fault_32.c
|
||||
@@ -166,7 +166,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
|
||||
Index: linux-3.4/arch/sh/mm/fault_32.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/sh/mm/fault_32.c
|
||||
+++ linux-3.4/arch/sh/mm/fault_32.c
|
||||
@@ -166,7 +166,7 @@ asmlinkage void __kprobes do_page_fault(
|
||||
* If we're in an interrupt, have no user context or are running
|
||||
* in an atomic region then we must not take the fault:
|
||||
*/
|
||||
|
@ -252,11 +250,11 @@ index 7bebd04..a67ac56 100644
|
|||
goto no_context;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c
|
||||
index 8023fd7..e0742c1 100644
|
||||
--- a/arch/sparc/mm/fault_32.c
|
||||
+++ b/arch/sparc/mm/fault_32.c
|
||||
@@ -247,8 +247,8 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
|
||||
Index: linux-3.4/arch/sparc/mm/fault_32.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/sparc/mm/fault_32.c
|
||||
+++ linux-3.4/arch/sparc/mm/fault_32.c
|
||||
@@ -248,8 +248,8 @@ asmlinkage void do_sparc_fault(struct pt
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -267,11 +265,11 @@ index 8023fd7..e0742c1 100644
|
|||
|
||||
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
|
||||
|
||||
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
|
||||
index 504c062..9d691a5 100644
|
||||
--- a/arch/sparc/mm/fault_64.c
|
||||
+++ b/arch/sparc/mm/fault_64.c
|
||||
@@ -322,7 +322,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
|
||||
Index: linux-3.4/arch/sparc/mm/fault_64.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/sparc/mm/fault_64.c
|
||||
+++ linux-3.4/arch/sparc/mm/fault_64.c
|
||||
@@ -323,7 +323,7 @@ asmlinkage void __kprobes do_sparc64_fau
|
||||
* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -280,11 +278,11 @@ index 504c062..9d691a5 100644
|
|||
goto intr_or_no_mm;
|
||||
|
||||
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
|
||||
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c
|
||||
index 25b7b90..ecdb016 100644
|
||||
--- a/arch/tile/mm/fault.c
|
||||
+++ b/arch/tile/mm/fault.c
|
||||
@@ -346,7 +346,7 @@ static int handle_page_fault(struct pt_regs *regs,
|
||||
Index: linux-3.4/arch/tile/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/tile/mm/fault.c
|
||||
+++ linux-3.4/arch/tile/mm/fault.c
|
||||
@@ -355,7 +355,7 @@ static int handle_page_fault(struct pt_r
|
||||
* If we're in an interrupt, have no user context or are running in an
|
||||
* atomic region then we must not take the fault.
|
||||
*/
|
||||
|
@ -293,11 +291,11 @@ index 25b7b90..ecdb016 100644
|
|||
vma = NULL; /* happy compiler */
|
||||
goto bad_area_nosemaphore;
|
||||
}
|
||||
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
|
||||
index dafc947..a283400 100644
|
||||
--- a/arch/um/kernel/trap.c
|
||||
+++ b/arch/um/kernel/trap.c
|
||||
@@ -37,7 +37,7 @@ int handle_page_fault(unsigned long address, unsigned long ip,
|
||||
Index: linux-3.4/arch/um/kernel/trap.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/um/kernel/trap.c
|
||||
+++ linux-3.4/arch/um/kernel/trap.c
|
||||
@@ -37,7 +37,7 @@ int handle_page_fault(unsigned long addr
|
||||
* If the fault was during atomic operation, don't take the fault, just
|
||||
* fail.
|
||||
*/
|
||||
|
@ -306,11 +304,11 @@ index dafc947..a283400 100644
|
|||
goto out_nosemaphore;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
|
||||
index 5db0490..191015f 100644
|
||||
--- a/arch/x86/mm/fault.c
|
||||
+++ b/arch/x86/mm/fault.c
|
||||
@@ -1084,7 +1084,7 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
||||
Index: linux-3.4/arch/x86/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/x86/mm/fault.c
|
||||
+++ linux-3.4/arch/x86/mm/fault.c
|
||||
@@ -1094,7 +1094,7 @@ do_page_fault(struct pt_regs *regs, unsi
|
||||
* If we're in an interrupt, have no user context or are running
|
||||
* in an atomic region then we must not take the fault:
|
||||
*/
|
||||
|
@ -319,11 +317,11 @@ index 5db0490..191015f 100644
|
|||
bad_area_nosemaphore(regs, error_code, address);
|
||||
return;
|
||||
}
|
||||
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c
|
||||
index e367e30..705f483 100644
|
||||
--- a/arch/xtensa/mm/fault.c
|
||||
+++ b/arch/xtensa/mm/fault.c
|
||||
@@ -57,7 +57,7 @@ void do_page_fault(struct pt_regs *regs)
|
||||
Index: linux-3.4/arch/xtensa/mm/fault.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/xtensa/mm/fault.c
|
||||
+++ linux-3.4/arch/xtensa/mm/fault.c
|
||||
@@ -56,7 +56,7 @@ void do_page_fault(struct pt_regs *regs)
|
||||
/* If we're in an interrupt or have no user
|
||||
* context, we must not take the fault..
|
||||
*/
|
||||
|
@ -332,6 +330,3 @@ index e367e30..705f483 100644
|
|||
bad_page_fault(regs, address, SIGSEGV);
|
||||
return;
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From d24eb79d3953d59e4a232bb66d6182d00007c02d Mon Sep 17 00:00:00 2001
|
||||
Subject: arm: Allow forced irq threading
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 16 Jul 2011 13:15:20 +0200
|
||||
Subject: [PATCH 028/267] arm: Allow forced irq threading
|
||||
|
||||
All timer interrupts and the perf interrupt are marked NO_THREAD, so
|
||||
its safe to allow forced interrupt threading.
|
||||
|
@ -11,18 +10,15 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
arch/arm/Kconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
|
||||
index ab3740e..fc327b8 100644
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -29,6 +29,7 @@ config ARM
|
||||
Index: linux-3.4/arch/arm/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/Kconfig
|
||||
+++ linux-3.4/arch/arm/Kconfig
|
||||
@@ -31,6 +31,7 @@ config ARM
|
||||
select HAVE_C_RECORDMCOUNT
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select HAVE_SPARSE_IRQ
|
||||
select GENERIC_IRQ_SHOW
|
||||
+ select IRQ_FORCED_THREADING
|
||||
select CPU_PM if (SUSPEND || CPU_IDLE)
|
||||
help
|
||||
The ARM series is a line of low-power-consumption RISC chip designs
|
||||
--
|
||||
1.7.10
|
||||
|
||||
select GENERIC_PCI_IOMAP
|
||||
select HAVE_BPF_JIT if NET
|
58
debian/patches/features/all/rt/arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch
vendored
Normal file
58
debian/patches/features/all/rt/arm-at91-pit-remove-irq-handler-when-clock-is-unused.patch
vendored
Normal file
|
@ -0,0 +1,58 @@
|
|||
From: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Date: Sat, 6 Mar 2010 17:47:10 +0100
|
||||
Subject: ARM: AT91: PIT: Remove irq handler when clock event is unused
|
||||
|
||||
Setup and remove the interrupt handler in clock event mode selection.
|
||||
This avoids calling the (shared) interrupt handler when the device is
|
||||
not used.
|
||||
|
||||
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
arch/arm/mach-at91/at91rm9200_time.c | 1 +
|
||||
arch/arm/mach-at91/at91sam926x_time.c | 5 ++++-
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: linux-3.4/arch/arm/mach-at91/at91rm9200_time.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-at91/at91rm9200_time.c
|
||||
+++ linux-3.4/arch/arm/mach-at91/at91rm9200_time.c
|
||||
@@ -130,6 +130,7 @@ clkevt32k_mode(enum clock_event_mode mod
|
||||
break;
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
+ remove_irq(AT91_ID_SYS, &at91rm9200_timer_irq);
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
irqmask = 0;
|
||||
break;
|
||||
Index: linux-3.4/arch/arm/mach-at91/at91sam926x_time.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-at91/at91sam926x_time.c
|
||||
+++ linux-3.4/arch/arm/mach-at91/at91sam926x_time.c
|
||||
@@ -67,7 +67,7 @@ static struct clocksource pit_clk = {
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
-
|
||||
+static struct irqaction at91sam926x_pit_irq;
|
||||
/*
|
||||
* Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16)
|
||||
*/
|
||||
@@ -76,6 +76,8 @@ pit_clkevt_mode(enum clock_event_mode mo
|
||||
{
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
+ /* Set up irq handler */
|
||||
+ setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq);
|
||||
/* update clocksource counter */
|
||||
pit_cnt += pit_cycle * PIT_PICNT(pit_read(AT91_PIT_PIVR));
|
||||
pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN
|
||||
@@ -88,6 +90,7 @@ pit_clkevt_mode(enum clock_event_mode mo
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
/* disable irq, leaving the clocksource active */
|
||||
pit_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN);
|
||||
+ remove_irq(AT91_ID_SYS, &at91sam926x_pit_irq);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
|
@ -1,21 +1,21 @@
|
|||
From 7f2157307f760daa1eb214bbe42f6b128bde99b2 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 1 May 2010 18:29:35 +0200
|
||||
Subject: [PATCH 239/267] ARM: at91: tclib: Default to tclib timer for RT
|
||||
Subject: ARM: at91: tclib: Default to tclib timer for RT
|
||||
|
||||
RT is not too happy about the shared timer interrupt in AT91
|
||||
devices. Default to tclib timer for RT.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/misc/Kconfig | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
|
||||
index 1cb530c..951ae6c 100644
|
||||
--- a/drivers/misc/Kconfig
|
||||
+++ b/drivers/misc/Kconfig
|
||||
@@ -82,6 +82,7 @@ config AB8500_PWM
|
||||
Index: linux-3.4/drivers/misc/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/misc/Kconfig
|
||||
+++ linux-3.4/drivers/misc/Kconfig
|
||||
@@ -72,6 +72,7 @@ config AB8500_PWM
|
||||
config ATMEL_TCLIB
|
||||
bool "Atmel AT32/AT91 Timer/Counter Library"
|
||||
depends on (AVR32 || ARCH_AT91)
|
||||
|
@ -23,7 +23,7 @@ index 1cb530c..951ae6c 100644
|
|||
help
|
||||
Select this if you want a library to allocate the Timer/Counter
|
||||
blocks found on many Atmel processors. This facilitates using
|
||||
@@ -114,7 +115,7 @@ config ATMEL_TCB_CLKSRC_BLOCK
|
||||
@@ -104,7 +105,7 @@ config ATMEL_TCB_CLKSRC_BLOCK
|
||||
config ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK
|
||||
bool "TC Block use 32 KiHz clock"
|
||||
depends on ATMEL_TCB_CLKSRC
|
||||
|
@ -32,6 +32,3 @@ index 1cb530c..951ae6c 100644
|
|||
help
|
||||
Select this to use 32 KiHz base clock rate as TC block clock
|
||||
source for clock events.
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
From b4413229a63e7c48b6f26a03eb74e418dce27d49 Mon Sep 17 00:00:00 2001
|
||||
Subject: preempt-rt: Convert arm boot_lock to raw
|
||||
From: Frank Rowand <frank.rowand@am.sony.com>
|
||||
Date: Mon, 19 Sep 2011 14:51:14 -0700
|
||||
Subject: [PATCH 029/267] preempt-rt: Convert arm boot_lock to raw
|
||||
|
||||
|
||||
The arm boot_lock is used by the secondary processor startup code. The locking
|
||||
task is the idle thread, which has idle->sched_class == &idle_sched_class.
|
||||
|
@ -23,25 +23,24 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
arch/arm/mach-exynos/platsmp.c | 12 ++++++------
|
||||
arch/arm/mach-msm/platsmp.c | 10 +++++-----
|
||||
arch/arm/mach-omap2/omap-smp.c | 10 +++++-----
|
||||
arch/arm/mach-tegra/platsmp.c | 10 +++++-----
|
||||
arch/arm/mach-ux500/platsmp.c | 10 +++++-----
|
||||
arch/arm/plat-versatile/platsmp.c | 10 +++++-----
|
||||
6 files changed, 31 insertions(+), 31 deletions(-)
|
||||
5 files changed, 26 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/mach-exynos/platsmp.c b/arch/arm/mach-exynos/platsmp.c
|
||||
index 69ffb2f..fe321b0 100644
|
||||
--- a/arch/arm/mach-exynos/platsmp.c
|
||||
+++ b/arch/arm/mach-exynos/platsmp.c
|
||||
@@ -63,7 +63,7 @@ static void __iomem *scu_base_addr(void)
|
||||
Index: linux-3.4/arch/arm/mach-exynos/platsmp.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-exynos/platsmp.c
|
||||
+++ linux-3.4/arch/arm/mach-exynos/platsmp.c
|
||||
@@ -62,7 +62,7 @@ static void __iomem *scu_base_addr(void)
|
||||
return (void __iomem *)(S5P_VA_SCU);
|
||||
}
|
||||
|
||||
-static DEFINE_SPINLOCK(boot_lock);
|
||||
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
||||
|
||||
static void __cpuinit exynos4_gic_secondary_init(void)
|
||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
{
|
||||
@@ -108,8 +108,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
@@ -82,8 +82,8 @@ void __cpuinit platform_secondary_init(u
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
|
@ -52,7 +51,7 @@ index 69ffb2f..fe321b0 100644
|
|||
}
|
||||
|
||||
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -120,7 +120,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -94,7 +94,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* Set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
|
@ -61,7 +60,7 @@ index 69ffb2f..fe321b0 100644
|
|||
|
||||
/*
|
||||
* The secondary processor is waiting to be released from
|
||||
@@ -149,7 +149,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -123,7 +123,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
|
||||
if (timeout == 0) {
|
||||
printk(KERN_ERR "cpu1 power enable failed");
|
||||
|
@ -70,7 +69,7 @@ index 69ffb2f..fe321b0 100644
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
}
|
||||
@@ -177,7 +177,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -151,7 +151,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
|
@ -79,11 +78,11 @@ index 69ffb2f..fe321b0 100644
|
|||
|
||||
return pen_release != -1 ? -ENOSYS : 0;
|
||||
}
|
||||
diff --git a/arch/arm/mach-msm/platsmp.c b/arch/arm/mach-msm/platsmp.c
|
||||
index fdec58a..cad6b81 100644
|
||||
--- a/arch/arm/mach-msm/platsmp.c
|
||||
+++ b/arch/arm/mach-msm/platsmp.c
|
||||
@@ -39,7 +39,7 @@ extern void msm_secondary_startup(void);
|
||||
Index: linux-3.4/arch/arm/mach-msm/platsmp.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-msm/platsmp.c
|
||||
+++ linux-3.4/arch/arm/mach-msm/platsmp.c
|
||||
@@ -40,7 +40,7 @@ extern void msm_secondary_startup(void);
|
||||
*/
|
||||
volatile int pen_release = -1;
|
||||
|
||||
|
@ -92,7 +91,7 @@ index fdec58a..cad6b81 100644
|
|||
|
||||
static inline int get_core_count(void)
|
||||
{
|
||||
@@ -69,8 +69,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
@@ -70,8 +70,8 @@ void __cpuinit platform_secondary_init(u
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
|
@ -103,7 +102,7 @@ index fdec58a..cad6b81 100644
|
|||
}
|
||||
|
||||
static __cpuinit void prepare_cold_cpu(unsigned int cpu)
|
||||
@@ -107,7 +107,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -108,7 +108,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
|
@ -112,7 +111,7 @@ index fdec58a..cad6b81 100644
|
|||
|
||||
/*
|
||||
* The secondary processor is waiting to be released from
|
||||
@@ -141,7 +141,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -142,7 +142,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
|
@ -121,20 +120,20 @@ index fdec58a..cad6b81 100644
|
|||
|
||||
return pen_release != -1 ? -ENOSYS : 0;
|
||||
}
|
||||
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
|
||||
index 4412ddb..490de9c 100644
|
||||
--- a/arch/arm/mach-omap2/omap-smp.c
|
||||
+++ b/arch/arm/mach-omap2/omap-smp.c
|
||||
@@ -29,7 +29,7 @@
|
||||
Index: linux-3.4/arch/arm/mach-omap2/omap-smp.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-omap2/omap-smp.c
|
||||
+++ linux-3.4/arch/arm/mach-omap2/omap-smp.c
|
||||
@@ -34,7 +34,7 @@
|
||||
/* SCU base address */
|
||||
static void __iomem *scu_base;
|
||||
|
||||
-static DEFINE_SPINLOCK(boot_lock);
|
||||
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
||||
|
||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
void __iomem *omap4_get_scu_base(void)
|
||||
{
|
||||
@@ -43,8 +43,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
@@ -65,8 +65,8 @@ void __cpuinit platform_secondary_init(u
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
|
@ -145,7 +144,7 @@ index 4412ddb..490de9c 100644
|
|||
}
|
||||
|
||||
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -53,7 +53,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -77,7 +77,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* Set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
|
@ -154,7 +153,7 @@ index 4412ddb..490de9c 100644
|
|||
|
||||
/*
|
||||
* Update the AuxCoreBoot0 with boot state for secondary core.
|
||||
@@ -70,7 +70,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -117,7 +117,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* Now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
|
@ -163,53 +162,11 @@ index 4412ddb..490de9c 100644
|
|||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/arch/arm/mach-tegra/platsmp.c b/arch/arm/mach-tegra/platsmp.c
|
||||
index 7d2b5d0..571f61a 100644
|
||||
--- a/arch/arm/mach-tegra/platsmp.c
|
||||
+++ b/arch/arm/mach-tegra/platsmp.c
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
extern void tegra_secondary_startup(void);
|
||||
|
||||
-static DEFINE_SPINLOCK(boot_lock);
|
||||
+static DEFINE_RAW_SPINLOCK(boot_lock);
|
||||
static void __iomem *scu_base = IO_ADDRESS(TEGRA_ARM_PERIF_BASE);
|
||||
|
||||
#define EVP_CPU_RESET_VECTOR \
|
||||
@@ -50,8 +50,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
- spin_lock(&boot_lock);
|
||||
- spin_unlock(&boot_lock);
|
||||
+ raw_spin_lock(&boot_lock);
|
||||
+ raw_spin_unlock(&boot_lock);
|
||||
}
|
||||
|
||||
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -65,7 +65,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
* set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
- spin_lock(&boot_lock);
|
||||
+ raw_spin_lock(&boot_lock);
|
||||
|
||||
|
||||
/* set the reset vector to point to the secondary_startup routine */
|
||||
@@ -101,7 +101,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
* now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
- spin_unlock(&boot_lock);
|
||||
+ raw_spin_unlock(&boot_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
diff --git a/arch/arm/mach-ux500/platsmp.c b/arch/arm/mach-ux500/platsmp.c
|
||||
index a19e398..9e92c6c 100644
|
||||
--- a/arch/arm/mach-ux500/platsmp.c
|
||||
+++ b/arch/arm/mach-ux500/platsmp.c
|
||||
@@ -57,7 +57,7 @@ static void __iomem *scu_base_addr(void)
|
||||
Index: linux-3.4/arch/arm/mach-ux500/platsmp.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-ux500/platsmp.c
|
||||
+++ linux-3.4/arch/arm/mach-ux500/platsmp.c
|
||||
@@ -58,7 +58,7 @@ static void __iomem *scu_base_addr(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -218,7 +175,7 @@ index a19e398..9e92c6c 100644
|
|||
|
||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
{
|
||||
@@ -77,8 +77,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
@@ -78,8 +78,8 @@ void __cpuinit platform_secondary_init(u
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
|
@ -229,7 +186,7 @@ index a19e398..9e92c6c 100644
|
|||
}
|
||||
|
||||
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -89,7 +89,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -90,7 +90,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
|
@ -238,7 +195,7 @@ index a19e398..9e92c6c 100644
|
|||
|
||||
/*
|
||||
* The secondary processor is waiting to be released from
|
||||
@@ -110,7 +110,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -111,7 +111,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
|
@ -247,11 +204,11 @@ index a19e398..9e92c6c 100644
|
|||
|
||||
return pen_release != -1 ? -ENOSYS : 0;
|
||||
}
|
||||
diff --git a/arch/arm/plat-versatile/platsmp.c b/arch/arm/plat-versatile/platsmp.c
|
||||
index 92f18d3..287bbb5 100644
|
||||
--- a/arch/arm/plat-versatile/platsmp.c
|
||||
+++ b/arch/arm/plat-versatile/platsmp.c
|
||||
@@ -37,7 +37,7 @@ static void __cpuinit write_pen_release(int val)
|
||||
Index: linux-3.4/arch/arm/plat-versatile/platsmp.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/plat-versatile/platsmp.c
|
||||
+++ linux-3.4/arch/arm/plat-versatile/platsmp.c
|
||||
@@ -38,7 +38,7 @@ static void __cpuinit write_pen_release(
|
||||
outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1));
|
||||
}
|
||||
|
||||
|
@ -260,7 +217,7 @@ index 92f18d3..287bbb5 100644
|
|||
|
||||
void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
{
|
||||
@@ -57,8 +57,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
|
||||
@@ -58,8 +58,8 @@ void __cpuinit platform_secondary_init(u
|
||||
/*
|
||||
* Synchronise with the boot thread.
|
||||
*/
|
||||
|
@ -271,7 +228,7 @@ index 92f18d3..287bbb5 100644
|
|||
}
|
||||
|
||||
int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -69,7 +69,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -70,7 +70,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* Set synchronisation state between this boot processor
|
||||
* and the secondary one
|
||||
*/
|
||||
|
@ -280,7 +237,7 @@ index 92f18d3..287bbb5 100644
|
|||
|
||||
/*
|
||||
* This is really belt and braces; we hold unintended secondary
|
||||
@@ -99,7 +99,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
@@ -100,7 +100,7 @@ int __cpuinit boot_secondary(unsigned in
|
||||
* now the secondary core is starting up let it run its
|
||||
* calibrations, then wait for it to finish
|
||||
*/
|
||||
|
@ -289,6 +246,3 @@ index 92f18d3..287bbb5 100644
|
|||
|
||||
return pen_release != -1 ? -ENOSYS : 0;
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,17 @@
|
|||
From 9b87c1e6e04a2419345383133d155c912ec6ae9f Mon Sep 17 00:00:00 2001
|
||||
Subject: arm-disable-highmem-on-rt.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 18 Jul 2011 17:09:28 +0200
|
||||
Subject: [PATCH 238/267] arm-disable-highmem-on-rt.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/arm/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
|
||||
index fc327b8..0e53586 100644
|
||||
--- a/arch/arm/Kconfig
|
||||
+++ b/arch/arm/Kconfig
|
||||
@@ -1668,7 +1668,7 @@ config HAVE_ARCH_PFN_VALID
|
||||
Index: linux-3.4/arch/arm/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/Kconfig
|
||||
+++ linux-3.4/arch/arm/Kconfig
|
||||
@@ -1716,7 +1716,7 @@ config HAVE_ARCH_PFN_VALID
|
||||
|
||||
config HIGHMEM
|
||||
bool "High Memory Support"
|
||||
|
@ -21,6 +20,3 @@ index fc327b8..0e53586 100644
|
|||
help
|
||||
The address space of ARM processors is only 4 Gigabytes large
|
||||
and it has to accommodate user address space, kernel address
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
Subject: arm-enable-interrupts-in-signal-code.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 16 Jul 2011 16:27:13 +0200
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/arm/kernel/signal.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
Index: linux-3.4/arch/arm/kernel/signal.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/kernel/signal.c
|
||||
+++ linux-3.4/arch/arm/kernel/signal.c
|
||||
@@ -664,6 +664,9 @@ static void do_signal(struct pt_regs *re
|
||||
if (!user_mode(regs))
|
||||
return;
|
||||
|
||||
+ local_irq_enable();
|
||||
+ preempt_check_resched();
|
||||
+
|
||||
/*
|
||||
* If we were from a system call, check for system call restarting...
|
||||
*/
|
|
@ -1,7 +1,6 @@
|
|||
From 8aa76e7290f80f472b9aebdaf8ae7d627d579359 Mon Sep 17 00:00:00 2001
|
||||
Subject: arm: Mark pmu interupt IRQF_NO_THREAD
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 16 Mar 2011 14:45:31 +0100
|
||||
Subject: [PATCH 027/267] arm: Mark pmu interupt IRQF_NO_THREAD
|
||||
|
||||
PMU interrupt must not be threaded. Remove IRQF_DISABLED while at it
|
||||
as we run all handlers with interrupts disabled anyway.
|
||||
|
@ -11,11 +10,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
arch/arm/kernel/perf_event.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c
|
||||
index ecebb89..e1286fb 100644
|
||||
--- a/arch/arm/kernel/perf_event.c
|
||||
+++ b/arch/arm/kernel/perf_event.c
|
||||
@@ -435,7 +435,7 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)
|
||||
Index: linux-3.4/arch/arm/kernel/perf_event.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/kernel/perf_event.c
|
||||
+++ linux-3.4/arch/arm/kernel/perf_event.c
|
||||
@@ -433,7 +433,7 @@ armpmu_reserve_hardware(struct arm_pmu *
|
||||
}
|
||||
|
||||
err = request_irq(irq, handle_irq,
|
||||
|
@ -24,6 +23,3 @@ index ecebb89..e1286fb 100644
|
|||
"arm-pmu", armpmu);
|
||||
if (err) {
|
||||
pr_err("unable to request IRQ%d for ARM PMU counters\n",
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
Subject: arm-omap-make-wakeupgen_lock-raw.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 11 Apr 2012 11:26:38 +0200
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
arch/arm/mach-omap2/omap-wakeupgen.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
Index: linux-3.4/arch/arm/mach-omap2/omap-wakeupgen.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/mach-omap2/omap-wakeupgen.c
|
||||
+++ linux-3.4/arch/arm/mach-omap2/omap-wakeupgen.c
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
static void __iomem *wakeupgen_base;
|
||||
static void __iomem *sar_base;
|
||||
-static DEFINE_SPINLOCK(wakeupgen_lock);
|
||||
+static DEFINE_RAW_SPINLOCK(wakeupgen_lock);
|
||||
static unsigned int irq_target_cpu[NR_IRQS];
|
||||
|
||||
/*
|
||||
@@ -128,9 +128,9 @@ static void wakeupgen_mask(struct irq_da
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&wakeupgen_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&wakeupgen_lock, flags);
|
||||
_wakeupgen_clear(d->irq, irq_target_cpu[d->irq]);
|
||||
- spin_unlock_irqrestore(&wakeupgen_lock, flags);
|
||||
+ raw_spin_unlock_irqrestore(&wakeupgen_lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -140,9 +140,9 @@ static void wakeupgen_unmask(struct irq_
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&wakeupgen_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&wakeupgen_lock, flags);
|
||||
_wakeupgen_set(d->irq, irq_target_cpu[d->irq]);
|
||||
- spin_unlock_irqrestore(&wakeupgen_lock, flags);
|
||||
+ raw_spin_unlock_irqrestore(&wakeupgen_lock, flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
@@ -183,7 +183,7 @@ static void wakeupgen_irqmask_all(unsign
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
- spin_lock_irqsave(&wakeupgen_lock, flags);
|
||||
+ raw_spin_lock_irqsave(&wakeupgen_lock, flags);
|
||||
if (set) {
|
||||
_wakeupgen_save_masks(cpu);
|
||||
_wakeupgen_set_all(cpu, WKG_MASK_ALL);
|
||||
@@ -191,7 +191,7 @@ static void wakeupgen_irqmask_all(unsign
|
||||
_wakeupgen_set_all(cpu, WKG_UNMASK_ALL);
|
||||
_wakeupgen_restore_masks(cpu);
|
||||
}
|
||||
- spin_unlock_irqrestore(&wakeupgen_lock, flags);
|
||||
+ raw_spin_unlock_irqrestore(&wakeupgen_lock, flags);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1,23 +1,22 @@
|
|||
From 8568db0e556b5159c9c7d85ce78f66d1df5d50ee Mon Sep 17 00:00:00 2001
|
||||
From: Steven Rostedt <srostedt@redhat.com>
|
||||
Date: Fri, 3 Jul 2009 08:44:29 -0500
|
||||
Subject: [PATCH 080/267] ata: Do not disable interrupts in ide code for
|
||||
preempt-rt
|
||||
Subject: ata: Do not disable interrupts in ide code for preempt-rt
|
||||
|
||||
Use the local_irq_*_nort variants.
|
||||
|
||||
Signed-off-by: Steven Rostedt <srostedt@redhat.com>
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/ata/libata-sff.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
|
||||
index 4cadfa2..100f85c 100644
|
||||
--- a/drivers/ata/libata-sff.c
|
||||
+++ b/drivers/ata/libata-sff.c
|
||||
@@ -678,9 +678,9 @@ unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, unsigned char *buf,
|
||||
Index: linux-3.4/drivers/ata/libata-sff.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/ata/libata-sff.c
|
||||
+++ linux-3.4/drivers/ata/libata-sff.c
|
||||
@@ -678,9 +678,9 @@ unsigned int ata_sff_data_xfer_noirq(str
|
||||
unsigned long flags;
|
||||
unsigned int consumed;
|
||||
|
||||
|
@ -29,19 +28,19 @@ index 4cadfa2..100f85c 100644
|
|||
|
||||
return consumed;
|
||||
}
|
||||
@@ -719,7 +719,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
||||
@@ -719,7 +719,7 @@ static void ata_pio_sector(struct ata_qu
|
||||
unsigned long flags;
|
||||
|
||||
/* FIXME: use a bounce buffer */
|
||||
- local_irq_save(flags);
|
||||
+ local_irq_save_nort(flags);
|
||||
buf = kmap_atomic(page, KM_IRQ0);
|
||||
buf = kmap_atomic(page);
|
||||
|
||||
/* do the actual data transfer */
|
||||
@@ -727,7 +727,7 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
|
||||
@@ -727,7 +727,7 @@ static void ata_pio_sector(struct ata_qu
|
||||
do_write);
|
||||
|
||||
kunmap_atomic(buf, KM_IRQ0);
|
||||
kunmap_atomic(buf);
|
||||
- local_irq_restore(flags);
|
||||
+ local_irq_restore_nort(flags);
|
||||
} else {
|
||||
|
@ -53,18 +52,15 @@ index 4cadfa2..100f85c 100644
|
|||
/* FIXME: use bounce buffer */
|
||||
- local_irq_save(flags);
|
||||
+ local_irq_save_nort(flags);
|
||||
buf = kmap_atomic(page, KM_IRQ0);
|
||||
buf = kmap_atomic(page);
|
||||
|
||||
/* do the actual data transfer */
|
||||
@@ -872,7 +872,7 @@ next_sg:
|
||||
count, rw);
|
||||
|
||||
kunmap_atomic(buf, KM_IRQ0);
|
||||
kunmap_atomic(buf);
|
||||
- local_irq_restore(flags);
|
||||
+ local_irq_restore_nort(flags);
|
||||
} else {
|
||||
buf = page_address(page);
|
||||
consumed = ap->ops->sff_data_xfer(dev, buf + offset,
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From e2c97e4d5da80e66340ea752cb33bf8802feaa53 Mon Sep 17 00:00:00 2001
|
||||
Subject: block: Shorten interrupt disabled regions
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 22 Jun 2011 19:47:02 +0200
|
||||
Subject: [PATCH 005/267] block: Shorten interrupt disabled regions
|
||||
|
||||
Moving the blk_sched_flush_plug() call out of the interrupt/preempt
|
||||
disabled region in the scheduler allows us to replace
|
||||
|
@ -47,11 +46,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
block/blk-core.c | 20 ++++++++------------
|
||||
1 file changed, 8 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/block/blk-core.c b/block/blk-core.c
|
||||
index 15de223..7366ad4 100644
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -300,7 +300,11 @@ void __blk_run_queue(struct request_queue *q)
|
||||
Index: linux-3.4/block/blk-core.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/block/blk-core.c
|
||||
+++ linux-3.4/block/blk-core.c
|
||||
@@ -302,7 +302,11 @@ void __blk_run_queue(struct request_queu
|
||||
{
|
||||
if (unlikely(blk_queue_stopped(q)))
|
||||
return;
|
||||
|
@ -64,7 +63,7 @@ index 15de223..7366ad4 100644
|
|||
q->request_fn(q);
|
||||
}
|
||||
EXPORT_SYMBOL(__blk_run_queue);
|
||||
@@ -2745,11 +2749,11 @@ static void queue_unplugged(struct request_queue *q, unsigned int depth,
|
||||
@@ -2779,11 +2783,11 @@ static void queue_unplugged(struct reque
|
||||
* this lock).
|
||||
*/
|
||||
if (from_schedule) {
|
||||
|
@ -78,7 +77,7 @@ index 15de223..7366ad4 100644
|
|||
}
|
||||
|
||||
}
|
||||
@@ -2775,7 +2779,6 @@ static void flush_plug_callbacks(struct blk_plug *plug)
|
||||
@@ -2809,7 +2813,6 @@ static void flush_plug_callbacks(struct
|
||||
void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
|
||||
{
|
||||
struct request_queue *q;
|
||||
|
@ -86,7 +85,7 @@ index 15de223..7366ad4 100644
|
|||
struct request *rq;
|
||||
LIST_HEAD(list);
|
||||
unsigned int depth;
|
||||
@@ -2796,11 +2799,6 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
|
||||
@@ -2830,11 +2833,6 @@ void blk_flush_plug_list(struct blk_plug
|
||||
q = NULL;
|
||||
depth = 0;
|
||||
|
||||
|
@ -98,16 +97,16 @@ index 15de223..7366ad4 100644
|
|||
while (!list_empty(&list)) {
|
||||
rq = list_entry_rq(list.next);
|
||||
list_del_init(&rq->queuelist);
|
||||
@@ -2813,7 +2811,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
|
||||
@@ -2847,7 +2845,7 @@ void blk_flush_plug_list(struct blk_plug
|
||||
queue_unplugged(q, depth, from_schedule);
|
||||
q = rq->q;
|
||||
depth = 0;
|
||||
- spin_lock(q->queue_lock);
|
||||
+ spin_lock_irq(q->queue_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* rq is already accounted, so use raw insert
|
||||
@@ -2831,8 +2829,6 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
|
||||
@@ -2874,8 +2872,6 @@ void blk_flush_plug_list(struct blk_plug
|
||||
*/
|
||||
if (q)
|
||||
queue_unplugged(q, depth, from_schedule);
|
||||
|
@ -116,6 +115,3 @@ index 15de223..7366ad4 100644
|
|||
}
|
||||
|
||||
void blk_finish_plug(struct blk_plug *plug)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,18 @@
|
|||
From 7258f0c5442a0dde07c06e12f431134e4b9bff47 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:29:58 -0500
|
||||
Subject: [PATCH 077/267] bug: BUG_ON/WARN_ON variants dependend on RT/!RT
|
||||
Subject: bug: BUG_ON/WARN_ON variants dependend on RT/!RT
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
include/asm-generic/bug.h | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h
|
||||
index 84458b0..97c1eaf 100644
|
||||
--- a/include/asm-generic/bug.h
|
||||
+++ b/include/asm-generic/bug.h
|
||||
Index: linux-3.4/include/asm-generic/bug.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/asm-generic/bug.h
|
||||
+++ linux-3.4/include/asm-generic/bug.h
|
||||
@@ -3,6 +3,10 @@
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
@ -24,7 +24,7 @@ index 84458b0..97c1eaf 100644
|
|||
#ifdef CONFIG_BUG
|
||||
|
||||
#ifdef CONFIG_GENERIC_BUG
|
||||
@@ -202,4 +206,18 @@ extern void warn_slowpath_null(const char *file, const int line);
|
||||
@@ -202,4 +206,18 @@ extern void warn_slowpath_null(const cha
|
||||
# define WARN_ON_SMP(x) ({0;})
|
||||
#endif
|
||||
|
||||
|
@ -43,6 +43,3 @@ index 84458b0..97c1eaf 100644
|
|||
+#endif
|
||||
+
|
||||
#endif
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,25 +1,24 @@
|
|||
From b4217e96b0c71c84b8edbca7b99813b5f0f72033 Mon Sep 17 00:00:00 2001
|
||||
From: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Date: Mon, 8 Mar 2010 18:57:04 +0100
|
||||
Subject: [PATCH 039/267] clocksource: TCLIB: Allow higher clock rates for
|
||||
clock events
|
||||
Subject: clocksource: TCLIB: Allow higher clock rates for clock events
|
||||
|
||||
As default the TCLIB uses the 32KiHz base clock rate for clock events.
|
||||
Add a compile time selection to allow higher clock resulution.
|
||||
|
||||
Signed-off-by: Benedikt Spranger <b.spranger@linutronix.de>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/clocksource/tcb_clksrc.c | 44 ++++++++++++++++++++++----------------
|
||||
drivers/misc/Kconfig | 11 ++++++++--
|
||||
drivers/clocksource/tcb_clksrc.c | 44 +++++++++++++++++++++++----------------
|
||||
drivers/misc/Kconfig | 11 +++++++--
|
||||
2 files changed, 35 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c
|
||||
index 79c47e8..8976b3d 100644
|
||||
--- a/drivers/clocksource/tcb_clksrc.c
|
||||
+++ b/drivers/clocksource/tcb_clksrc.c
|
||||
@@ -21,8 +21,7 @@
|
||||
* resolution better than 200 nsec).
|
||||
Index: linux-3.4/drivers/clocksource/tcb_clksrc.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/clocksource/tcb_clksrc.c
|
||||
+++ linux-3.4/drivers/clocksource/tcb_clksrc.c
|
||||
@@ -23,8 +23,7 @@
|
||||
* this 32 bit free-running counter. the second channel is not used.
|
||||
*
|
||||
* - The third channel may be used to provide a 16-bit clockevent
|
||||
- * source, used in either periodic or oneshot mode. This runs
|
||||
|
@ -28,7 +27,7 @@ index 79c47e8..8976b3d 100644
|
|||
*
|
||||
* A boot clocksource and clockevent source are also currently needed,
|
||||
* unless the relevant platforms (ARM/AT91, AVR32/AT32) are changed so
|
||||
@@ -68,6 +67,7 @@ static struct clocksource clksrc = {
|
||||
@@ -74,6 +73,7 @@ static struct clocksource clksrc = {
|
||||
struct tc_clkevt_device {
|
||||
struct clock_event_device clkevt;
|
||||
struct clk *clk;
|
||||
|
@ -36,7 +35,7 @@ index 79c47e8..8976b3d 100644
|
|||
void __iomem *regs;
|
||||
};
|
||||
|
||||
@@ -76,13 +76,6 @@ static struct tc_clkevt_device *to_tc_clkevt(struct clock_event_device *clkevt)
|
||||
@@ -82,13 +82,6 @@ static struct tc_clkevt_device *to_tc_cl
|
||||
return container_of(clkevt, struct tc_clkevt_device, clkevt);
|
||||
}
|
||||
|
||||
|
@ -50,7 +49,7 @@ index 79c47e8..8976b3d 100644
|
|||
static u32 timer_clock;
|
||||
|
||||
static void tc_mode(enum clock_event_mode m, struct clock_event_device *d)
|
||||
@@ -105,11 +98,12 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d)
|
||||
@@ -111,11 +104,12 @@ static void tc_mode(enum clock_event_mod
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
clk_enable(tcd->clk);
|
||||
|
||||
|
@ -65,7 +64,7 @@ index 79c47e8..8976b3d 100644
|
|||
|
||||
/* Enable clock and interrupts on RC compare */
|
||||
__raw_writel(ATMEL_TC_CPCS, regs + ATMEL_TC_REG(2, IER));
|
||||
@@ -122,7 +116,7 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d)
|
||||
@@ -128,7 +122,7 @@ static void tc_mode(enum clock_event_mod
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
clk_enable(tcd->clk);
|
||||
|
||||
|
@ -74,7 +73,7 @@ index 79c47e8..8976b3d 100644
|
|||
__raw_writel(timer_clock | ATMEL_TC_CPCSTOP
|
||||
| ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO,
|
||||
regs + ATMEL_TC_REG(2, CMR));
|
||||
@@ -152,8 +146,12 @@ static struct tc_clkevt_device clkevt = {
|
||||
@@ -158,8 +152,12 @@ static struct tc_clkevt_device clkevt =
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC
|
||||
| CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
|
@ -87,7 +86,7 @@ index 79c47e8..8976b3d 100644
|
|||
.set_next_event = tc_next_event,
|
||||
.set_mode = tc_mode,
|
||||
},
|
||||
@@ -179,8 +177,9 @@ static struct irqaction tc_irqaction = {
|
||||
@@ -185,8 +183,9 @@ static struct irqaction tc_irqaction = {
|
||||
.handler = ch2_irq,
|
||||
};
|
||||
|
||||
|
@ -98,7 +97,7 @@ index 79c47e8..8976b3d 100644
|
|||
struct clk *t2_clk = tc->clk[2];
|
||||
int irq = tc->irq[2];
|
||||
|
||||
@@ -188,11 +187,17 @@ static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx)
|
||||
@@ -194,11 +193,17 @@ static void __init setup_clkevents(struc
|
||||
clkevt.clk = t2_clk;
|
||||
tc_irqaction.dev_id = &clkevt;
|
||||
|
||||
|
@ -120,8 +119,8 @@ index 79c47e8..8976b3d 100644
|
|||
clkevt.clkevt.min_delta_ns = clockevent_delta2ns(1, &clkevt.clkevt) + 1;
|
||||
clkevt.clkevt.cpumask = cpumask_of(0);
|
||||
|
||||
@@ -295,8 +300,11 @@ static int __init tcb_clksrc_init(void)
|
||||
clocksource_register(&clksrc);
|
||||
@@ -327,8 +332,11 @@ static int __init tcb_clksrc_init(void)
|
||||
clocksource_register_hz(&clksrc, divided_rate);
|
||||
|
||||
/* channel 2: periodic and oneshot timer support */
|
||||
+#ifdef CONFIG_ATMEL_TCB_CLKSRC_USE_SLOW_CLOCK
|
||||
|
@ -133,11 +132,11 @@ index 79c47e8..8976b3d 100644
|
|||
return 0;
|
||||
}
|
||||
arch_initcall(tcb_clksrc_init);
|
||||
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
|
||||
index 5664696..f3031a4 100644
|
||||
--- a/drivers/misc/Kconfig
|
||||
+++ b/drivers/misc/Kconfig
|
||||
@@ -97,8 +97,7 @@ config ATMEL_TCB_CLKSRC
|
||||
Index: linux-3.4/drivers/misc/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/misc/Kconfig
|
||||
+++ linux-3.4/drivers/misc/Kconfig
|
||||
@@ -87,8 +87,7 @@ config ATMEL_TCB_CLKSRC
|
||||
are combined to make a single 32-bit timer.
|
||||
|
||||
When GENERIC_CLOCKEVENTS is defined, the third timer channel
|
||||
|
@ -147,7 +146,7 @@ index 5664696..f3031a4 100644
|
|||
|
||||
config ATMEL_TCB_CLKSRC_BLOCK
|
||||
int
|
||||
@@ -112,6 +111,14 @@ config ATMEL_TCB_CLKSRC_BLOCK
|
||||
@@ -102,6 +101,14 @@ config ATMEL_TCB_CLKSRC_BLOCK
|
||||
TC can be used for other purposes, such as PWM generation and
|
||||
interval timing.
|
||||
|
||||
|
@ -162,6 +161,3 @@ index 5664696..f3031a4 100644
|
|||
config IBM_ASM
|
||||
tristate "Device driver for IBM RSA service processor"
|
||||
depends on X86 && PCI && INPUT && EXPERIMENTAL
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,17 @@
|
|||
From 5136313c61afded30a8da141ae60d4bca90b0cf2 Mon Sep 17 00:00:00 2001
|
||||
Subject: cond-resched-lock-rt-tweak.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 17 Jul 2011 22:51:33 +0200
|
||||
Subject: [PATCH 151/267] cond-resched-lock-rt-tweak.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/sched.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 99e7f8b..175aaee 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -2599,7 +2599,7 @@ extern int _cond_resched(void);
|
||||
Index: linux-3.4/include/linux/sched.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/sched.h
|
||||
+++ linux-3.4/include/linux/sched.h
|
||||
@@ -2689,7 +2689,7 @@ extern int _cond_resched(void);
|
||||
|
||||
extern int __cond_resched_lock(spinlock_t *lock);
|
||||
|
||||
|
@ -21,6 +20,3 @@ index 99e7f8b..175aaee 100644
|
|||
#define PREEMPT_LOCK_OFFSET PREEMPT_OFFSET
|
||||
#else
|
||||
#define PREEMPT_LOCK_OFFSET 0
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,19 +1,18 @@
|
|||
From 1a9f6b8b37a41e2b59c1989b461bf5b1fbecb50e Mon Sep 17 00:00:00 2001
|
||||
Subject: cond-resched-softirq-fix.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 14 Jul 2011 09:56:44 +0200
|
||||
Subject: [PATCH 149/267] cond-resched-softirq-fix.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/sched.h | 4 ++++
|
||||
kernel/sched.c | 2 ++
|
||||
kernel/sched/core.c | 2 ++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/include/linux/sched.h b/include/linux/sched.h
|
||||
index 6c20349..38d78dc 100644
|
||||
--- a/include/linux/sched.h
|
||||
+++ b/include/linux/sched.h
|
||||
@@ -2602,12 +2602,16 @@ extern int __cond_resched_lock(spinlock_t *lock);
|
||||
Index: linux-3.4/include/linux/sched.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/sched.h
|
||||
+++ linux-3.4/include/linux/sched.h
|
||||
@@ -2700,12 +2700,16 @@ extern int __cond_resched_lock(spinlock_
|
||||
__cond_resched_lock(lock); \
|
||||
})
|
||||
|
||||
|
@ -30,11 +29,11 @@ index 6c20349..38d78dc 100644
|
|||
|
||||
/*
|
||||
* Does a critical section need to be broken due to another
|
||||
diff --git a/kernel/sched.c b/kernel/sched.c
|
||||
index 42d0003..af3883b 100644
|
||||
--- a/kernel/sched.c
|
||||
+++ b/kernel/sched.c
|
||||
@@ -5826,6 +5826,7 @@ int __cond_resched_lock(spinlock_t *lock)
|
||||
Index: linux-3.4/kernel/sched/core.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/sched/core.c
|
||||
+++ linux-3.4/kernel/sched/core.c
|
||||
@@ -4605,6 +4605,7 @@ int __cond_resched_lock(spinlock_t *lock
|
||||
}
|
||||
EXPORT_SYMBOL(__cond_resched_lock);
|
||||
|
||||
|
@ -42,7 +41,7 @@ index 42d0003..af3883b 100644
|
|||
int __sched __cond_resched_softirq(void)
|
||||
{
|
||||
BUG_ON(!in_softirq());
|
||||
@@ -5839,6 +5840,7 @@ int __sched __cond_resched_softirq(void)
|
||||
@@ -4618,6 +4619,7 @@ int __sched __cond_resched_softirq(void)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__cond_resched_softirq);
|
||||
|
@ -50,6 +49,3 @@ index 42d0003..af3883b 100644
|
|||
|
||||
/**
|
||||
* yield - yield the current processor to other threads.
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,17 @@
|
|||
From 7345e11db5653c75894b0a3d3cf2f0f380016b79 Mon Sep 17 00:00:00 2001
|
||||
Subject: console-make-rt-friendly.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 17 Jul 2011 22:43:07 +0200
|
||||
Subject: [PATCH 234/267] console-make-rt-friendly.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
kernel/printk.c | 26 +++++++++++++++++++++++---
|
||||
1 file changed, 23 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/kernel/printk.c b/kernel/printk.c
|
||||
index 2b95bc0..fad23c8 100644
|
||||
--- a/kernel/printk.c
|
||||
+++ b/kernel/printk.c
|
||||
@@ -504,6 +504,7 @@ static void __call_console_drivers(unsigned start, unsigned end)
|
||||
Index: linux-3.4/kernel/printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/printk.c
|
||||
+++ linux-3.4/kernel/printk.c
|
||||
@@ -507,6 +507,7 @@ static void __call_console_drivers(unsig
|
||||
{
|
||||
struct console *con;
|
||||
|
||||
|
@ -20,7 +19,7 @@ index 2b95bc0..fad23c8 100644
|
|||
for_each_console(con) {
|
||||
if (exclusive_console && con != exclusive_console)
|
||||
continue;
|
||||
@@ -512,6 +513,7 @@ static void __call_console_drivers(unsigned start, unsigned end)
|
||||
@@ -515,6 +516,7 @@ static void __call_console_drivers(unsig
|
||||
(con->flags & CON_ANYTIME)))
|
||||
con->write(con, &LOG_BUF(start), end - start);
|
||||
}
|
||||
|
@ -28,7 +27,7 @@ index 2b95bc0..fad23c8 100644
|
|||
}
|
||||
|
||||
#ifdef CONFIG_EARLY_PRINTK
|
||||
@@ -827,12 +829,18 @@ static inline int can_use_console(unsigned int cpu)
|
||||
@@ -839,12 +841,18 @@ static inline int can_use_console(unsign
|
||||
* interrupts disabled. It should return with 'lockbuf_lock'
|
||||
* released but interrupts still disabled.
|
||||
*/
|
||||
|
@ -49,7 +48,7 @@ index 2b95bc0..fad23c8 100644
|
|||
retval = 1;
|
||||
|
||||
/*
|
||||
@@ -1010,8 +1018,15 @@ asmlinkage int vprintk(const char *fmt, va_list args)
|
||||
@@ -1021,8 +1029,15 @@ asmlinkage int vprintk(const char *fmt,
|
||||
* will release 'logbuf_lock' regardless of whether it
|
||||
* actually gets the semaphore or not.
|
||||
*/
|
||||
|
@ -66,7 +65,7 @@ index 2b95bc0..fad23c8 100644
|
|||
|
||||
lockdep_on();
|
||||
out_restore_irqs:
|
||||
@@ -1321,11 +1336,16 @@ again:
|
||||
@@ -1345,11 +1360,16 @@ again:
|
||||
_con_start = con_start;
|
||||
_log_end = log_end;
|
||||
con_start = log_end; /* Flush */
|
||||
|
@ -83,6 +82,3 @@ index 2b95bc0..fad23c8 100644
|
|||
}
|
||||
console_locked = 0;
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 7414f6f107d40967dc5fe7339f11c70ce57e8b74 Mon Sep 17 00:00:00 2001
|
||||
Subject: cpu: Make hotplug.lock a "sleeping" spinlock on RT
|
||||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Fri, 2 Mar 2012 10:36:57 -0500
|
||||
Subject: [PATCH 259/267] cpu: Make hotplug.lock a "sleeping" spinlock on RT
|
||||
Date: Fri, 02 Mar 2012 10:36:57 -0500
|
||||
|
||||
Tasks can block on hotplug.lock in pin_current_cpu(), but their state
|
||||
might be != RUNNING. So the mutex wakeup will set the state
|
||||
|
@ -23,10 +22,10 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
kernel/cpu.c | 35 ++++++++++++++++++++++++++---------
|
||||
1 file changed, 26 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/kernel/cpu.c b/kernel/cpu.c
|
||||
index fa40834..66dfb74 100644
|
||||
--- a/kernel/cpu.c
|
||||
+++ b/kernel/cpu.c
|
||||
Index: linux-3.4/kernel/cpu.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/cpu.c
|
||||
+++ linux-3.4/kernel/cpu.c
|
||||
@@ -46,7 +46,12 @@ static int cpu_hotplug_disabled;
|
||||
|
||||
static struct {
|
||||
|
@ -122,6 +121,3 @@ index fa40834..66dfb74 100644
|
|||
}
|
||||
|
||||
#else /* #if CONFIG_HOTPLUG_CPU */
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,17 @@
|
|||
From 4999ba9453b30762e55beaf253c8999c58266fc3 Mon Sep 17 00:00:00 2001
|
||||
Subject: cpu-rt-variants.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 17 Jun 2011 15:42:38 +0200
|
||||
Subject: [PATCH 105/267] cpu-rt-variants.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
include/linux/smp.h | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/include/linux/smp.h b/include/linux/smp.h
|
||||
index 8cc38d3..e6c58d8 100644
|
||||
--- a/include/linux/smp.h
|
||||
+++ b/include/linux/smp.h
|
||||
@@ -173,6 +173,14 @@ smp_call_function_any(const struct cpumask *mask, smp_call_func_t func,
|
||||
Index: linux-3.4/include/linux/smp.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/smp.h
|
||||
+++ linux-3.4/include/linux/smp.h
|
||||
@@ -219,6 +219,14 @@ smp_call_function_any(const struct cpuma
|
||||
#define get_cpu() ({ preempt_disable(); smp_processor_id(); })
|
||||
#define put_cpu() preempt_enable()
|
||||
|
||||
|
@ -27,6 +26,3 @@ index 8cc38d3..e6c58d8 100644
|
|||
/*
|
||||
* Callback to arch code if there's nosmp or maxcpus=0 on the
|
||||
* boot command line:
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 113ec250cd47567fa333e584f5a210780df47ac7 Mon Sep 17 00:00:00 2001
|
||||
Subject: cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 14 Dec 2011 01:03:49 +0100
|
||||
Subject: [PATCH 252/267] cpumask: Disable CONFIG_CPUMASK_OFFSTACK for RT
|
||||
|
||||
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.
|
||||
|
@ -12,11 +11,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
lib/Kconfig | 1 +
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
||||
index e084a73..c42146e 100644
|
||||
--- a/arch/x86/Kconfig
|
||||
+++ b/arch/x86/Kconfig
|
||||
@@ -730,7 +730,7 @@ config IOMMU_HELPER
|
||||
Index: linux-3.4/arch/x86/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/x86/Kconfig
|
||||
+++ linux-3.4/arch/x86/Kconfig
|
||||
@@ -750,7 +750,7 @@ config IOMMU_HELPER
|
||||
config MAXSMP
|
||||
bool "Enable Maximum number of SMP Processors and NUMA Nodes"
|
||||
depends on X86_64 && SMP && DEBUG_KERNEL && EXPERIMENTAL
|
||||
|
@ -25,11 +24,11 @@ index e084a73..c42146e 100644
|
|||
---help---
|
||||
Enable maximum number of CPUS and NUMA Nodes for this architecture.
|
||||
If unsure, say N.
|
||||
diff --git a/lib/Kconfig b/lib/Kconfig
|
||||
index 32f3e5a..63d81e8 100644
|
||||
--- a/lib/Kconfig
|
||||
+++ b/lib/Kconfig
|
||||
@@ -231,6 +231,7 @@ config CHECK_SIGNATURE
|
||||
Index: linux-3.4/lib/Kconfig
|
||||
===================================================================
|
||||
--- linux-3.4.orig/lib/Kconfig
|
||||
+++ linux-3.4/lib/Kconfig
|
||||
@@ -303,6 +303,7 @@ config CHECK_SIGNATURE
|
||||
|
||||
config CPUMASK_OFFSTACK
|
||||
bool "Force CPU masks off stack" if DEBUG_PER_CPU_MAPS
|
||||
|
@ -37,6 +36,3 @@ index 32f3e5a..63d81e8 100644
|
|||
help
|
||||
Use dynamic allocation for cpumask_var_t, instead of putting
|
||||
them on the stack. This is a bit more expensive, but avoids
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,17 @@
|
|||
From 0fbe4d83b24b5cb2db0da8b4ddd3fa545013bd93 Mon Sep 17 00:00:00 2001
|
||||
Subject: debugobjects-rt.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 17 Jul 2011 21:41:35 +0200
|
||||
Subject: [PATCH 230/267] debugobjects-rt.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
lib/debugobjects.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/debugobjects.c b/lib/debugobjects.c
|
||||
index a78b7c6..9b622c9 100644
|
||||
--- a/lib/debugobjects.c
|
||||
+++ b/lib/debugobjects.c
|
||||
@@ -306,7 +306,10 @@ __debug_object_init(void *addr, struct debug_obj_descr *descr, int onstack)
|
||||
Index: linux-3.4/lib/debugobjects.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/lib/debugobjects.c
|
||||
+++ linux-3.4/lib/debugobjects.c
|
||||
@@ -310,7 +310,10 @@ __debug_object_init(void *addr, struct d
|
||||
struct debug_obj *obj;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -24,7 +23,7 @@ index a78b7c6..9b622c9 100644
|
|||
|
||||
db = get_bucket((unsigned long) addr);
|
||||
|
||||
@@ -1015,9 +1018,9 @@ static int __init debug_objects_replace_static_objects(void)
|
||||
@@ -1053,9 +1056,9 @@ static int __init debug_objects_replace_
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -35,6 +34,3 @@ index a78b7c6..9b622c9 100644
|
|||
return 0;
|
||||
free:
|
||||
hlist_for_each_entry_safe(obj, node, tmp, &objects, node) {
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 7c5e9c5bb3dbe26f8ecc18020a36ed55e99c6a25 Mon Sep 17 00:00:00 2001
|
||||
Subject: dm: Make rt aware
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Mon, 14 Nov 2011 23:06:09 +0100
|
||||
Subject: [PATCH 251/267] dm: Make rt aware
|
||||
|
||||
Use the BUG_ON_NORT variant for the irq_disabled() checks. RT has
|
||||
interrupts legitimately enabled here as we cant deadlock against the
|
||||
|
@ -14,11 +13,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
drivers/md/dm.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
|
||||
index 4720f68..b1eff42 100644
|
||||
--- a/drivers/md/dm.c
|
||||
+++ b/drivers/md/dm.c
|
||||
@@ -1648,14 +1648,14 @@ static void dm_request_fn(struct request_queue *q)
|
||||
Index: linux-3.4/drivers/md/dm.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/md/dm.c
|
||||
+++ linux-3.4/drivers/md/dm.c
|
||||
@@ -1648,14 +1648,14 @@ static void dm_request_fn(struct request
|
||||
if (map_request(ti, clone, md))
|
||||
goto requeued;
|
||||
|
||||
|
@ -35,6 +34,3 @@ index 4720f68..b1eff42 100644
|
|||
spin_lock(q->queue_lock);
|
||||
|
||||
delay_and_out:
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,22 +1,22 @@
|
|||
From 4d7e0a71990ab73749dfde4f4cd201cf1bdb0f45 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:29:24 -0500
|
||||
Subject: [PATCH 041/267] drivers/net: Use disable_irq_nosync() in 8139too
|
||||
Subject: drivers/net: Use disable_irq_nosync() in 8139too
|
||||
|
||||
Use disable_irq_nosync() instead of disable_irq() as this might be
|
||||
called in atomic context with netpoll.
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/net/ethernet/realtek/8139too.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c
|
||||
index 4d6b254..004c054 100644
|
||||
--- a/drivers/net/ethernet/realtek/8139too.c
|
||||
+++ b/drivers/net/ethernet/realtek/8139too.c
|
||||
@@ -2174,7 +2174,7 @@ static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance)
|
||||
Index: linux-3.4/drivers/net/ethernet/realtek/8139too.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/realtek/8139too.c
|
||||
+++ linux-3.4/drivers/net/ethernet/realtek/8139too.c
|
||||
@@ -2240,7 +2240,7 @@ static irqreturn_t rtl8139_interrupt (in
|
||||
*/
|
||||
static void rtl8139_poll_controller(struct net_device *dev)
|
||||
{
|
||||
|
@ -25,6 +25,3 @@ index 4d6b254..004c054 100644
|
|||
rtl8139_interrupt(dev->irq, dev);
|
||||
enable_irq(dev->irq);
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
From 2989477b9c1c1f9aa82a8db158ab3a03a4b7b2f5 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 17 Nov 2009 12:02:43 +0100
|
||||
Subject: [PATCH 043/267] drivers: net: at91_ether: Make mdio protection -rt
|
||||
safe
|
||||
Subject: drivers: net: at91_ether: Make mdio protection -rt safe
|
||||
|
||||
Neither the phy interrupt nor the timer callback which updates the
|
||||
link status in absense of a phy interrupt are taking lp->lock which
|
||||
|
@ -15,15 +13,16 @@ Fix this by adding proper locking to at91ether_phy_interrupt() and
|
|||
at91_check_ether() which serializes the access on -rt.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/net/ethernet/cadence/at91_ether.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/cadence/at91_ether.c b/drivers/net/ethernet/cadence/at91_ether.c
|
||||
index 56624d3..ad4dbea 100644
|
||||
--- a/drivers/net/ethernet/cadence/at91_ether.c
|
||||
+++ b/drivers/net/ethernet/cadence/at91_ether.c
|
||||
@@ -200,7 +200,9 @@ static irqreturn_t at91ether_phy_interrupt(int irq, void *dev_id)
|
||||
Index: linux-3.4/drivers/net/ethernet/cadence/at91_ether.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/cadence/at91_ether.c
|
||||
+++ linux-3.4/drivers/net/ethernet/cadence/at91_ether.c
|
||||
@@ -201,7 +201,9 @@ static irqreturn_t at91ether_phy_interru
|
||||
struct net_device *dev = (struct net_device *) dev_id;
|
||||
struct at91_private *lp = netdev_priv(dev);
|
||||
unsigned int phy;
|
||||
|
@ -33,7 +32,7 @@ index 56624d3..ad4dbea 100644
|
|||
/*
|
||||
* This hander is triggered on both edges, but the PHY chips expect
|
||||
* level-triggering. We therefore have to check if the PHY actually has
|
||||
@@ -242,6 +244,7 @@ static irqreturn_t at91ether_phy_interrupt(int irq, void *dev_id)
|
||||
@@ -243,6 +245,7 @@ static irqreturn_t at91ether_phy_interru
|
||||
|
||||
done:
|
||||
disable_mdi();
|
||||
|
@ -41,7 +40,7 @@ index 56624d3..ad4dbea 100644
|
|||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -398,9 +401,11 @@ static void at91ether_check_link(unsigned long dev_id)
|
||||
@@ -399,9 +402,11 @@ static void at91ether_check_link(unsigne
|
||||
struct net_device *dev = (struct net_device *) dev_id;
|
||||
struct at91_private *lp = netdev_priv(dev);
|
||||
|
||||
|
@ -53,6 +52,3 @@ index 56624d3..ad4dbea 100644
|
|||
|
||||
mod_timer(&lp->check_timer, jiffies + LINK_POLL_INTERVAL);
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
From 1c36d3306722a2042bd4dc26baf20393c42c5b22 Mon Sep 17 00:00:00 2001
|
||||
From: Darren Hart <dvhltc@us.ibm.com>
|
||||
Date: Tue, 18 May 2010 14:33:07 -0700
|
||||
Subject: [PATCH 042/267] drivers: net: ehea: Make rx irq handler non-threaded
|
||||
(IRQF_NO_THREAD)
|
||||
Subject: drivers: net: ehea: Make rx irq handler non-threaded (IRQF_NO_THREAD)
|
||||
|
||||
The underlying hardware is edge triggered but presented by XICS as level
|
||||
triggered. The edge triggered interrupts are not reissued after masking. This
|
||||
|
@ -35,15 +33,16 @@ Cc: Michael Ellerman <ellerman@au1.ibm.com>
|
|||
Cc: Doug Maxey <doug.maxey@us.ibm.com>
|
||||
LKML-Reference: <4BF30793.5070300@us.ibm.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/net/ethernet/ibm/ehea/ehea_main.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
||||
index bfeccbf..fddfaf1 100644
|
||||
--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
||||
+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
||||
@@ -1304,7 +1304,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
|
||||
Index: linux-3.4/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
||||
+++ linux-3.4/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
||||
@@ -1306,7 +1306,7 @@ static int ehea_reg_interrupts(struct ne
|
||||
"%s-queue%d", dev->name, i);
|
||||
ret = ibmebus_request_irq(pr->eq->attr.ist1,
|
||||
ehea_recv_irq_handler,
|
||||
|
@ -52,6 +51,3 @@ index bfeccbf..fddfaf1 100644
|
|||
pr);
|
||||
if (ret) {
|
||||
netdev_err(dev, "failed registering irq for ehea_queue port_res_nr:%d, ist=%X\n",
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 91639026470adfb7ab98a86b62dfefedb485e3a4 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 20 Jun 2009 11:36:54 +0200
|
||||
Subject: [PATCH 099/267] drivers/net: fix livelock issues
|
||||
Subject: drivers/net: fix livelock issues
|
||||
|
||||
Preempt-RT runs into a live lock issue with the NETDEV_TX_LOCKED micro
|
||||
optimization. The reason is that the softirq thread is rescheduling
|
||||
|
@ -11,6 +10,7 @@ monoplize the CPU and livelock on UP systems.
|
|||
Remove it.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/net/ethernet/atheros/atl1c/atl1c_main.c | 6 +-----
|
||||
drivers/net/ethernet/atheros/atl1e/atl1e_main.c | 3 +--
|
||||
|
@ -21,11 +21,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
drivers/net/rionet.c | 6 +-----
|
||||
7 files changed, 10 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
index eccdcff..ee8d8a2 100644
|
||||
--- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
+++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
@@ -2236,11 +2236,7 @@ static netdev_tx_t atl1c_xmit_frame(struct sk_buff *skb,
|
||||
Index: linux-3.4/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
+++ linux-3.4/drivers/net/ethernet/atheros/atl1c/atl1c_main.c
|
||||
@@ -2240,11 +2240,7 @@ static netdev_tx_t atl1c_xmit_frame(stru
|
||||
}
|
||||
|
||||
tpd_req = atl1c_cal_tpd_req(skb);
|
||||
|
@ -38,11 +38,11 @@ index eccdcff..ee8d8a2 100644
|
|||
|
||||
if (atl1c_tpd_avail(adapter, type) < tpd_req) {
|
||||
/* no enough descriptor, just stop queue */
|
||||
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
||||
index 95483bc..eaf84e9 100644
|
||||
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
||||
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
||||
@@ -1819,8 +1819,7 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb,
|
||||
Index: linux-3.4/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
||||
+++ linux-3.4/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
|
||||
@@ -1822,8 +1822,7 @@ static netdev_tx_t atl1e_xmit_frame(stru
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
tpd_req = atl1e_cal_tdp_req(skb);
|
||||
|
@ -52,11 +52,11 @@ index 95483bc..eaf84e9 100644
|
|||
|
||||
if (atl1e_tpd_avail(adapter) < tpd_req) {
|
||||
/* no enough descriptor, just stop queue */
|
||||
diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.c b/drivers/net/ethernet/chelsio/cxgb/sge.c
|
||||
index f9b6023..6d7412a 100644
|
||||
--- a/drivers/net/ethernet/chelsio/cxgb/sge.c
|
||||
+++ b/drivers/net/ethernet/chelsio/cxgb/sge.c
|
||||
@@ -1678,8 +1678,7 @@ static int t1_sge_tx(struct sk_buff *skb, struct adapter *adapter,
|
||||
Index: linux-3.4/drivers/net/ethernet/chelsio/cxgb/sge.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/chelsio/cxgb/sge.c
|
||||
+++ linux-3.4/drivers/net/ethernet/chelsio/cxgb/sge.c
|
||||
@@ -1678,8 +1678,7 @@ static int t1_sge_tx(struct sk_buff *skb
|
||||
struct cmdQ *q = &sge->cmdQ[qid];
|
||||
unsigned int credits, pidx, genbit, count, use_sched_skb = 0;
|
||||
|
||||
|
@ -66,11 +66,11 @@ index f9b6023..6d7412a 100644
|
|||
|
||||
reclaim_completed_tx(sge, q);
|
||||
|
||||
diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c
|
||||
index c27fb3d..4624278 100644
|
||||
--- a/drivers/net/ethernet/neterion/s2io.c
|
||||
+++ b/drivers/net/ethernet/neterion/s2io.c
|
||||
@@ -4090,12 +4090,7 @@ static netdev_tx_t s2io_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
Index: linux-3.4/drivers/net/ethernet/neterion/s2io.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/neterion/s2io.c
|
||||
+++ linux-3.4/drivers/net/ethernet/neterion/s2io.c
|
||||
@@ -4089,12 +4089,7 @@ static netdev_tx_t s2io_xmit(struct sk_b
|
||||
[skb->priority & (MAX_TX_FIFOS - 1)];
|
||||
fifo = &mac_control->fifos[queue];
|
||||
|
||||
|
@ -84,11 +84,11 @@ index c27fb3d..4624278 100644
|
|||
|
||||
if (sp->config.multiq) {
|
||||
if (__netif_subqueue_stopped(dev, fifo->fifo_no)) {
|
||||
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
||||
index 43c7b25..c084bea 100644
|
||||
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
||||
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
||||
@@ -1937,10 +1937,9 @@ static int pch_gbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
|
||||
Index: linux-3.4/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
||||
+++ linux-3.4/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
||||
@@ -2131,10 +2131,9 @@ static int pch_gbe_xmit_frame(struct sk_
|
||||
adapter->stats.tx_length_errors++;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
@ -102,11 +102,11 @@ index 43c7b25..c084bea 100644
|
|||
if (unlikely(!PCH_GBE_DESC_UNUSED(tx_ring))) {
|
||||
netif_stop_queue(netdev);
|
||||
spin_unlock_irqrestore(&tx_ring->tx_lock, flags);
|
||||
diff --git a/drivers/net/ethernet/tehuti/tehuti.c b/drivers/net/ethernet/tehuti/tehuti.c
|
||||
index 3a90af6..e2e930e 100644
|
||||
--- a/drivers/net/ethernet/tehuti/tehuti.c
|
||||
+++ b/drivers/net/ethernet/tehuti/tehuti.c
|
||||
@@ -1605,13 +1605,8 @@ static netdev_tx_t bdx_tx_transmit(struct sk_buff *skb,
|
||||
Index: linux-3.4/drivers/net/ethernet/tehuti/tehuti.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/tehuti/tehuti.c
|
||||
+++ linux-3.4/drivers/net/ethernet/tehuti/tehuti.c
|
||||
@@ -1606,13 +1606,8 @@ static netdev_tx_t bdx_tx_transmit(struc
|
||||
unsigned long flags;
|
||||
|
||||
ENTER;
|
||||
|
@ -122,11 +122,11 @@ index 3a90af6..e2e930e 100644
|
|||
|
||||
/* build tx descriptor */
|
||||
BDX_ASSERT(f->m.wptr >= f->m.memsz); /* started with valid wptr */
|
||||
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c
|
||||
index 7145714..2a1ed18 100644
|
||||
--- a/drivers/net/rionet.c
|
||||
+++ b/drivers/net/rionet.c
|
||||
@@ -176,11 +176,7 @@ static int rionet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
Index: linux-3.4/drivers/net/rionet.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/rionet.c
|
||||
+++ linux-3.4/drivers/net/rionet.c
|
||||
@@ -176,11 +176,7 @@ static int rionet_start_xmit(struct sk_b
|
||||
u16 destid;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -139,6 +139,3 @@ index 7145714..2a1ed18 100644
|
|||
|
||||
if ((rnet->tx_cnt + 1) > RIONET_TX_RING_SIZE) {
|
||||
netif_stop_queue(ndev);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From f6a04ba9615eedce21fa38c8a9276c1c041f4535 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 1 Apr 2010 20:20:57 +0200
|
||||
Subject: [PATCH 101/267] drivers: net: gianfar: Make RT aware
|
||||
Subject: drivers: net: gianfar: Make RT aware
|
||||
|
||||
The adjust_link() disables interrupts before taking the queue
|
||||
locks. On RT those locks are converted to "sleeping" locks and
|
||||
|
@ -11,15 +10,16 @@ local_irq_save/restore_nort.
|
|||
Reported-by: Xianghua Xiao <xiaoxianghua@gmail.com>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Tested-by: Xianghua Xiao <xiaoxianghua@gmail.com>
|
||||
|
||||
---
|
||||
drivers/net/ethernet/freescale/gianfar.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
|
||||
index 83199fd..97d238c 100644
|
||||
--- a/drivers/net/ethernet/freescale/gianfar.c
|
||||
+++ b/drivers/net/ethernet/freescale/gianfar.c
|
||||
@@ -1671,7 +1671,7 @@ void stop_gfar(struct net_device *dev)
|
||||
Index: linux-3.4/drivers/net/ethernet/freescale/gianfar.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/freescale/gianfar.c
|
||||
+++ linux-3.4/drivers/net/ethernet/freescale/gianfar.c
|
||||
@@ -1643,7 +1643,7 @@ void stop_gfar(struct net_device *dev)
|
||||
|
||||
|
||||
/* Lock it down */
|
||||
|
@ -28,7 +28,7 @@ index 83199fd..97d238c 100644
|
|||
lock_tx_qs(priv);
|
||||
lock_rx_qs(priv);
|
||||
|
||||
@@ -1679,7 +1679,7 @@ void stop_gfar(struct net_device *dev)
|
||||
@@ -1651,7 +1651,7 @@ void stop_gfar(struct net_device *dev)
|
||||
|
||||
unlock_rx_qs(priv);
|
||||
unlock_tx_qs(priv);
|
||||
|
@ -37,7 +37,7 @@ index 83199fd..97d238c 100644
|
|||
|
||||
/* Free the IRQs */
|
||||
if (priv->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
|
||||
@@ -2949,7 +2949,7 @@ static void adjust_link(struct net_device *dev)
|
||||
@@ -2948,7 +2948,7 @@ static void adjust_link(struct net_devic
|
||||
struct phy_device *phydev = priv->phydev;
|
||||
int new_state = 0;
|
||||
|
||||
|
@ -46,7 +46,7 @@ index 83199fd..97d238c 100644
|
|||
lock_tx_qs(priv);
|
||||
|
||||
if (phydev->link) {
|
||||
@@ -3016,7 +3016,7 @@ static void adjust_link(struct net_device *dev)
|
||||
@@ -3015,7 +3015,7 @@ static void adjust_link(struct net_devic
|
||||
if (new_state && netif_msg_link(priv))
|
||||
phy_print_status(phydev);
|
||||
unlock_tx_qs(priv);
|
||||
|
@ -55,6 +55,3 @@ index 83199fd..97d238c 100644
|
|||
}
|
||||
|
||||
/* Update the hash table based on the current list of multicast
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,22 +1,21 @@
|
|||
From 32a59ec7007ad587e8523ea3628b364c434d4c54 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:30:18 -0500
|
||||
Subject: [PATCH 040/267] drivers/net: tulip_remove_one needs to call
|
||||
pci_disable_device()
|
||||
Subject: drivers/net: tulip_remove_one needs to call pci_disable_device()
|
||||
|
||||
Otherwise the device is not completely shut down.
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/net/ethernet/dec/tulip/tulip_core.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/dec/tulip/tulip_core.c b/drivers/net/ethernet/dec/tulip/tulip_core.c
|
||||
index 9656dd0..ef7df09 100644
|
||||
--- a/drivers/net/ethernet/dec/tulip/tulip_core.c
|
||||
+++ b/drivers/net/ethernet/dec/tulip/tulip_core.c
|
||||
@@ -1949,6 +1949,7 @@ static void __devexit tulip_remove_one (struct pci_dev *pdev)
|
||||
Index: linux-3.4/drivers/net/ethernet/dec/tulip/tulip_core.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/dec/tulip/tulip_core.c
|
||||
+++ linux-3.4/drivers/net/ethernet/dec/tulip/tulip_core.c
|
||||
@@ -1946,6 +1946,7 @@ static void __devexit tulip_remove_one (
|
||||
pci_iounmap(pdev, tp->base_addr);
|
||||
free_netdev (dev);
|
||||
pci_release_regions (pdev);
|
||||
|
@ -24,6 +23,3 @@ index 9656dd0..ef7df09 100644
|
|||
pci_set_drvdata (pdev, NULL);
|
||||
|
||||
/* pci_power_off (pdev, -1); */
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From c9c1db28cb2aece6eeda56b86a309b2d564751b8 Mon Sep 17 00:00:00 2001
|
||||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Fri, 3 Jul 2009 08:30:00 -0500
|
||||
Subject: [PATCH 100/267] drivers/net: vortex fix locking issues
|
||||
Subject: drivers/net: vortex fix locking issues
|
||||
|
||||
Argh, cut and paste wasn't enough...
|
||||
|
||||
|
@ -17,15 +16,12 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
---
|
||||
drivers/net/ethernet/3com/3c59x.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c
|
||||
index e0c5529..af31580 100644
|
||||
--- a/drivers/net/ethernet/3com/3c59x.c
|
||||
+++ b/drivers/net/ethernet/3com/3c59x.c
|
||||
@@ -843,9 +843,9 @@ static void poll_vortex(struct net_device *dev)
|
||||
Index: linux-3.4/drivers/net/ethernet/3com/3c59x.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/net/ethernet/3com/3c59x.c
|
||||
+++ linux-3.4/drivers/net/ethernet/3com/3c59x.c
|
||||
@@ -843,9 +843,9 @@ static void poll_vortex(struct net_devic
|
||||
{
|
||||
struct vortex_private *vp = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
@ -37,7 +33,7 @@ index e0c5529..af31580 100644
|
|||
}
|
||||
#endif
|
||||
|
||||
@@ -1921,12 +1921,12 @@ static void vortex_tx_timeout(struct net_device *dev)
|
||||
@@ -1920,12 +1920,12 @@ static void vortex_tx_timeout(struct net
|
||||
* Block interrupts because vortex_interrupt does a bare spin_lock()
|
||||
*/
|
||||
unsigned long flags;
|
||||
|
@ -52,6 +48,3 @@ index e0c5529..af31580 100644
|
|||
}
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,21 +1,21 @@
|
|||
From a908abba18460e32b36e6b183e77b6c7c1cceb94 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:29:30 -0500
|
||||
Subject: [PATCH 037/267] drivers: random: Reduce preempt disabled region
|
||||
Subject: drivers: random: Reduce preempt disabled region
|
||||
|
||||
No need to keep preemption disabled across the whole function.
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/char/random.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/char/random.c b/drivers/char/random.c
|
||||
index 6035ab8..786a856 100644
|
||||
--- a/drivers/char/random.c
|
||||
+++ b/drivers/char/random.c
|
||||
@@ -633,8 +633,11 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
|
||||
Index: linux-3.4/drivers/char/random.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/char/random.c
|
||||
+++ linux-3.4/drivers/char/random.c
|
||||
@@ -633,8 +633,11 @@ static void add_timer_randomness(struct
|
||||
preempt_disable();
|
||||
/* if over the trickle threshold, use only 1 in 4096 samples */
|
||||
if (input_pool.entropy_count > trickle_thresh &&
|
||||
|
@ -28,8 +28,8 @@ index 6035ab8..786a856 100644
|
|||
+ preempt_enable();
|
||||
|
||||
sample.jiffies = jiffies;
|
||||
sample.cycles = get_cycles();
|
||||
@@ -676,8 +679,6 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
|
||||
|
||||
@@ -680,8 +683,6 @@ static void add_timer_randomness(struct
|
||||
credit_entropy_bits(&input_pool,
|
||||
min_t(int, fls(delta>>1), 11));
|
||||
}
|
||||
|
@ -38,6 +38,3 @@ index 6035ab8..786a856 100644
|
|||
}
|
||||
|
||||
void add_input_randomness(unsigned int type, unsigned int code,
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,20 +1,19 @@
|
|||
From 4e5bbac0b9e6295553e4e4ddc234f1ccdb54f20d Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:30:01 -0500
|
||||
Subject: [PATCH 212/267] serial: 8250: Call flush_to_ldisc when the irq is
|
||||
threaded
|
||||
Subject: serial: 8250: Call flush_to_ldisc when the irq is threaded
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
|
||||
---
|
||||
drivers/tty/serial/8250.c | 2 ++
|
||||
drivers/tty/tty_buffer.c | 4 ++++
|
||||
drivers/tty/serial/8250/8250.c | 2 ++
|
||||
drivers/tty/tty_buffer.c | 4 ++++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c
|
||||
index 43f7f46..687b1ad 100644
|
||||
--- a/drivers/tty/serial/8250.c
|
||||
+++ b/drivers/tty/serial/8250.c
|
||||
@@ -1631,12 +1631,14 @@ static irqreturn_t serial8250_interrupt(int irq, void *dev_id)
|
||||
Index: linux-3.4/drivers/tty/serial/8250/8250.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/tty/serial/8250/8250.c
|
||||
+++ linux-3.4/drivers/tty/serial/8250/8250.c
|
||||
@@ -1584,12 +1584,14 @@ static irqreturn_t serial8250_interrupt(
|
||||
|
||||
l = l->next;
|
||||
|
||||
|
@ -29,11 +28,11 @@ index 43f7f46..687b1ad 100644
|
|||
} while (l != end);
|
||||
|
||||
spin_unlock(&i->lock);
|
||||
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c
|
||||
index 6c9b7cd..a56c223 100644
|
||||
--- a/drivers/tty/tty_buffer.c
|
||||
+++ b/drivers/tty/tty_buffer.c
|
||||
@@ -493,10 +493,14 @@ void tty_flip_buffer_push(struct tty_struct *tty)
|
||||
Index: linux-3.4/drivers/tty/tty_buffer.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/tty/tty_buffer.c
|
||||
+++ linux-3.4/drivers/tty/tty_buffer.c
|
||||
@@ -493,10 +493,14 @@ void tty_flip_buffer_push(struct tty_str
|
||||
tty->buf.tail->commit = tty->buf.tail->used;
|
||||
spin_unlock_irqrestore(&tty->buf.lock, flags);
|
||||
|
||||
|
@ -48,6 +47,3 @@ index 6c9b7cd..a56c223 100644
|
|||
}
|
||||
EXPORT_SYMBOL(tty_flip_buffer_push);
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:30:01 -0500
|
||||
Subject: serial: 8250: Clean up the locking for -rt
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
drivers/tty/serial/8250/8250.c | 15 +++++----------
|
||||
1 file changed, 5 insertions(+), 10 deletions(-)
|
||||
|
||||
Index: linux-3.4/drivers/tty/serial/8250/8250.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/tty/serial/8250/8250.c
|
||||
+++ linux-3.4/drivers/tty/serial/8250/8250.c
|
||||
@@ -2807,14 +2807,10 @@ serial8250_console_write(struct console
|
||||
|
||||
touch_nmi_watchdog();
|
||||
|
||||
- local_irq_save(flags);
|
||||
- if (port->sysrq) {
|
||||
- /* serial8250_handle_irq() already took the lock */
|
||||
- locked = 0;
|
||||
- } else if (oops_in_progress) {
|
||||
- locked = spin_trylock(&port->lock);
|
||||
- } else
|
||||
- spin_lock(&port->lock);
|
||||
+ if (port->sysrq || oops_in_progress)
|
||||
+ locked = spin_trylock_irqsave(&port->lock, flags);
|
||||
+ else
|
||||
+ spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -2846,8 +2842,7 @@ serial8250_console_write(struct console
|
||||
serial8250_modem_status(up);
|
||||
|
||||
if (locked)
|
||||
- spin_unlock(&port->lock);
|
||||
- local_irq_restore(flags);
|
||||
+ spin_unlock_irqrestore(&port->lock, flags);
|
||||
}
|
||||
|
||||
static int __init serial8250_console_setup(struct console *co, char *options)
|
|
@ -0,0 +1,40 @@
|
|||
Subject: drivers-tty-fix-omap-lock-crap.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Thu, 28 Jul 2011 13:32:57 +0200
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
drivers/tty/serial/omap-serial.c | 12 ++++--------
|
||||
1 file changed, 4 insertions(+), 8 deletions(-)
|
||||
|
||||
Index: linux-3.4/drivers/tty/serial/omap-serial.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/drivers/tty/serial/omap-serial.c
|
||||
+++ linux-3.4/drivers/tty/serial/omap-serial.c
|
||||
@@ -1064,13 +1064,10 @@ serial_omap_console_write(struct console
|
||||
|
||||
pm_runtime_get_sync(&up->pdev->dev);
|
||||
|
||||
- local_irq_save(flags);
|
||||
- if (up->port.sysrq)
|
||||
- locked = 0;
|
||||
- else if (oops_in_progress)
|
||||
- locked = spin_trylock(&up->port.lock);
|
||||
+ if (up->port.sysrq || oops_in_progress)
|
||||
+ locked = spin_trylock_irqsave(&up->port.lock, flags);
|
||||
else
|
||||
- spin_lock(&up->port.lock);
|
||||
+ spin_lock_irqsave(&up->port.lock, flags);
|
||||
|
||||
/*
|
||||
* First save the IER then disable the interrupts
|
||||
@@ -1099,8 +1096,7 @@ serial_omap_console_write(struct console
|
||||
pm_runtime_mark_last_busy(&up->pdev->dev);
|
||||
pm_runtime_put_autosuspend(&up->pdev->dev);
|
||||
if (locked)
|
||||
- spin_unlock(&up->port.lock);
|
||||
- local_irq_restore(flags);
|
||||
+ spin_unlock_irqrestore(&up->port.lock, flags);
|
||||
}
|
||||
|
||||
static int __init
|
|
@ -1,7 +1,6 @@
|
|||
From d6a466f7aef3ff53e864d1d0a8f5e93d61768714 Mon Sep 17 00:00:00 2001
|
||||
Subject: early-printk-consolidate.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sat, 23 Jul 2011 11:04:08 +0200
|
||||
Subject: [PATCH 073/267] early-printk-consolidate.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
|
@ -19,14 +18,14 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
arch/x86/kernel/early_printk.c | 21 ++-------------------
|
||||
include/linux/console.h | 1 +
|
||||
include/linux/printk.h | 5 +++++
|
||||
kernel/printk.c | 27 ++++++++++++++++++++-------
|
||||
15 files changed, 62 insertions(+), 110 deletions(-)
|
||||
kernel/printk.c | 30 +++++++++++++++++++++++-------
|
||||
15 files changed, 65 insertions(+), 110 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/kernel/early_printk.c b/arch/arm/kernel/early_printk.c
|
||||
index 85aa2b2..4307653 100644
|
||||
--- a/arch/arm/kernel/early_printk.c
|
||||
+++ b/arch/arm/kernel/early_printk.c
|
||||
@@ -29,28 +29,17 @@ static void early_console_write(struct console *con, const char *s, unsigned n)
|
||||
Index: linux-3.4/arch/arm/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/arm/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/arm/kernel/early_printk.c
|
||||
@@ -29,28 +29,17 @@ static void early_console_write(struct c
|
||||
early_write(s, n);
|
||||
}
|
||||
|
||||
|
@ -58,11 +57,11 @@ index 85aa2b2..4307653 100644
|
|||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/arch/blackfin/kernel/early_printk.c b/arch/blackfin/kernel/early_printk.c
|
||||
index 84ed837..61fbd2d 100644
|
||||
--- a/arch/blackfin/kernel/early_printk.c
|
||||
+++ b/arch/blackfin/kernel/early_printk.c
|
||||
@@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_init(unsigned int port,
|
||||
Index: linux-3.4/arch/blackfin/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/blackfin/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/blackfin/kernel/early_printk.c
|
||||
@@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_
|
||||
extern struct console *bfin_jc_early_init(void);
|
||||
#endif
|
||||
|
||||
|
@ -71,10 +70,10 @@ index 84ed837..61fbd2d 100644
|
|||
/* Default console */
|
||||
#define DEFAULT_PORT 0
|
||||
#define DEFAULT_CFLAG CS8|B57600
|
||||
diff --git a/arch/microblaze/kernel/early_printk.c b/arch/microblaze/kernel/early_printk.c
|
||||
index d26d92d..0420624 100644
|
||||
--- a/arch/microblaze/kernel/early_printk.c
|
||||
+++ b/arch/microblaze/kernel/early_printk.c
|
||||
Index: linux-3.4/arch/microblaze/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/microblaze/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/microblaze/kernel/early_printk.c
|
||||
@@ -21,7 +21,6 @@
|
||||
#include <asm/setup.h>
|
||||
#include <asm/prom.h>
|
||||
|
@ -83,7 +82,7 @@ index d26d92d..0420624 100644
|
|||
static u32 base_addr;
|
||||
|
||||
#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE
|
||||
@@ -109,27 +108,11 @@ static struct console early_serial_uart16550_console = {
|
||||
@@ -109,27 +108,11 @@ static struct console early_serial_uart1
|
||||
};
|
||||
#endif /* CONFIG_SERIAL_8250_CONSOLE */
|
||||
|
||||
|
@ -127,9 +126,9 @@ index d26d92d..0420624 100644
|
|||
- if (!early_console_initialized || !early_console)
|
||||
+ if (!early_console)
|
||||
return;
|
||||
printk(KERN_INFO "early_printk_console remaping from 0x%x to ",
|
||||
printk(KERN_INFO "early_printk_console remapping from 0x%x to ",
|
||||
base_addr);
|
||||
@@ -179,9 +161,9 @@ void __init remap_early_printk(void)
|
||||
@@ -195,9 +177,9 @@ void __init remap_early_printk(void)
|
||||
|
||||
void __init disable_early_printk(void)
|
||||
{
|
||||
|
@ -141,11 +140,11 @@ index d26d92d..0420624 100644
|
|||
- early_console_initialized = 0;
|
||||
+ early_console = NULL;
|
||||
}
|
||||
diff --git a/arch/mips/kernel/early_printk.c b/arch/mips/kernel/early_printk.c
|
||||
index 9ae813e..973c995 100644
|
||||
--- a/arch/mips/kernel/early_printk.c
|
||||
+++ b/arch/mips/kernel/early_printk.c
|
||||
@@ -25,20 +25,18 @@ early_console_write(struct console *con, const char *s, unsigned n)
|
||||
Index: linux-3.4/arch/mips/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/mips/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/mips/kernel/early_printk.c
|
||||
@@ -25,20 +25,18 @@ early_console_write(struct console *con,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -170,11 +169,11 @@ index 9ae813e..973c995 100644
|
|||
- register_console(&early_console);
|
||||
+ register_console(&early_console_prom);
|
||||
}
|
||||
diff --git a/arch/powerpc/kernel/udbg.c b/arch/powerpc/kernel/udbg.c
|
||||
index 57fa2c0..1b9174d 100644
|
||||
--- a/arch/powerpc/kernel/udbg.c
|
||||
+++ b/arch/powerpc/kernel/udbg.c
|
||||
@@ -182,15 +182,13 @@ static struct console udbg_console = {
|
||||
Index: linux-3.4/arch/powerpc/kernel/udbg.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/powerpc/kernel/udbg.c
|
||||
+++ linux-3.4/arch/powerpc/kernel/udbg.c
|
||||
@@ -179,15 +179,13 @@ static struct console udbg_console = {
|
||||
.index = 0,
|
||||
};
|
||||
|
||||
|
@ -191,7 +190,7 @@ index 57fa2c0..1b9174d 100644
|
|||
return;
|
||||
|
||||
if (!udbg_putc)
|
||||
@@ -200,7 +198,7 @@ void __init register_early_udbg_console(void)
|
||||
@@ -197,7 +195,7 @@ void __init register_early_udbg_console(
|
||||
printk(KERN_INFO "early console immortal !\n");
|
||||
udbg_console.flags &= ~CON_BOOT;
|
||||
}
|
||||
|
@ -200,10 +199,10 @@ index 57fa2c0..1b9174d 100644
|
|||
register_console(&udbg_console);
|
||||
}
|
||||
|
||||
diff --git a/arch/sh/kernel/sh_bios.c b/arch/sh/kernel/sh_bios.c
|
||||
index 47475cc..a5b51b9 100644
|
||||
--- a/arch/sh/kernel/sh_bios.c
|
||||
+++ b/arch/sh/kernel/sh_bios.c
|
||||
Index: linux-3.4/arch/sh/kernel/sh_bios.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/sh/kernel/sh_bios.c
|
||||
+++ linux-3.4/arch/sh/kernel/sh_bios.c
|
||||
@@ -144,8 +144,6 @@ static struct console bios_console = {
|
||||
.index = -1,
|
||||
};
|
||||
|
@ -213,10 +212,10 @@ index 47475cc..a5b51b9 100644
|
|||
static int __init setup_early_printk(char *buf)
|
||||
{
|
||||
int keep_early = 0;
|
||||
diff --git a/arch/sparc/kernel/setup_32.c b/arch/sparc/kernel/setup_32.c
|
||||
index fe1e3fc..e6475f0 100644
|
||||
--- a/arch/sparc/kernel/setup_32.c
|
||||
+++ b/arch/sparc/kernel/setup_32.c
|
||||
Index: linux-3.4/arch/sparc/kernel/setup_32.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/sparc/kernel/setup_32.c
|
||||
+++ linux-3.4/arch/sparc/kernel/setup_32.c
|
||||
@@ -221,6 +221,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
boot_flags_init(*cmdline_p);
|
||||
|
@ -225,11 +224,11 @@ index fe1e3fc..e6475f0 100644
|
|||
register_console(&prom_early_console);
|
||||
|
||||
/* Set sparc_cpu_model */
|
||||
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c
|
||||
index a854a1c..b85d039 100644
|
||||
--- a/arch/sparc/kernel/setup_64.c
|
||||
+++ b/arch/sparc/kernel/setup_64.c
|
||||
@@ -487,6 +487,12 @@ static void __init init_sparc64_elf_hwcap(void)
|
||||
Index: linux-3.4/arch/sparc/kernel/setup_64.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/sparc/kernel/setup_64.c
|
||||
+++ linux-3.4/arch/sparc/kernel/setup_64.c
|
||||
@@ -487,6 +487,12 @@ static void __init init_sparc64_elf_hwca
|
||||
popc_patch();
|
||||
}
|
||||
|
||||
|
@ -251,11 +250,11 @@ index a854a1c..b85d039 100644
|
|||
|
||||
if (tlb_type == hypervisor)
|
||||
printk("ARCH: SUN4V\n");
|
||||
diff --git a/arch/tile/kernel/early_printk.c b/arch/tile/kernel/early_printk.c
|
||||
index 493a0e6..ba2ac00 100644
|
||||
--- a/arch/tile/kernel/early_printk.c
|
||||
+++ b/arch/tile/kernel/early_printk.c
|
||||
@@ -32,25 +32,8 @@ static struct console early_hv_console = {
|
||||
Index: linux-3.4/arch/tile/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/tile/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/tile/kernel/early_printk.c
|
||||
@@ -33,25 +33,8 @@ static struct console early_hv_console =
|
||||
};
|
||||
|
||||
/* Direct interface for emergencies */
|
||||
|
@ -281,7 +280,7 @@ index 493a0e6..ba2ac00 100644
|
|||
void early_panic(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -68,14 +51,13 @@ static int __initdata keep_early;
|
||||
@@ -69,14 +52,13 @@ static int __initdata keep_early;
|
||||
|
||||
static int __init setup_early_printk(char *str)
|
||||
{
|
||||
|
@ -297,7 +296,7 @@ index 493a0e6..ba2ac00 100644
|
|||
register_console(early_console);
|
||||
|
||||
return 0;
|
||||
@@ -84,12 +66,12 @@ static int __init setup_early_printk(char *str)
|
||||
@@ -85,12 +67,12 @@ static int __init setup_early_printk(cha
|
||||
void __init disable_early_printk(void)
|
||||
{
|
||||
early_console_complete = 1;
|
||||
|
@ -312,7 +311,7 @@ index 493a0e6..ba2ac00 100644
|
|||
} else {
|
||||
early_printk("keeping early console\n");
|
||||
}
|
||||
@@ -97,7 +79,7 @@ void __init disable_early_printk(void)
|
||||
@@ -98,7 +80,7 @@ void __init disable_early_printk(void)
|
||||
|
||||
void warn_early_printk(void)
|
||||
{
|
||||
|
@ -321,11 +320,11 @@ index 493a0e6..ba2ac00 100644
|
|||
return;
|
||||
early_printk("\
|
||||
Machine shutting down before console output is fully initialized.\n\
|
||||
diff --git a/arch/um/kernel/early_printk.c b/arch/um/kernel/early_printk.c
|
||||
index ec649bf..183060f 100644
|
||||
--- a/arch/um/kernel/early_printk.c
|
||||
+++ b/arch/um/kernel/early_printk.c
|
||||
@@ -16,7 +16,7 @@ static void early_console_write(struct console *con, const char *s, unsigned int
|
||||
Index: linux-3.4/arch/um/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/um/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/um/kernel/early_printk.c
|
||||
@@ -16,7 +16,7 @@ static void early_console_write(struct c
|
||||
um_early_printk(s, n);
|
||||
}
|
||||
|
||||
|
@ -347,11 +346,11 @@ index ec649bf..183060f 100644
|
|||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/arch/unicore32/kernel/early_printk.c b/arch/unicore32/kernel/early_printk.c
|
||||
index 3922255..9be0d5d 100644
|
||||
--- a/arch/unicore32/kernel/early_printk.c
|
||||
+++ b/arch/unicore32/kernel/early_printk.c
|
||||
@@ -33,21 +33,17 @@ static struct console early_ocd_console = {
|
||||
Index: linux-3.4/arch/unicore32/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/unicore32/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/unicore32/kernel/early_printk.c
|
||||
@@ -33,21 +33,17 @@ static struct console early_ocd_console
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
|
@ -377,11 +376,11 @@ index 3922255..9be0d5d 100644
|
|||
|
||||
if (keep_early)
|
||||
early_console->flags &= ~CON_BOOT;
|
||||
diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
|
||||
index cd28a35..5f3d9c5 100644
|
||||
--- a/arch/x86/kernel/early_printk.c
|
||||
+++ b/arch/x86/kernel/early_printk.c
|
||||
@@ -169,25 +169,9 @@ static struct console early_serial_console = {
|
||||
Index: linux-3.4/arch/x86/kernel/early_printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/x86/kernel/early_printk.c
|
||||
+++ linux-3.4/arch/x86/kernel/early_printk.c
|
||||
@@ -169,25 +169,9 @@ static struct console early_serial_conso
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
|
@ -408,7 +407,7 @@ index cd28a35..5f3d9c5 100644
|
|||
printk(KERN_CRIT "ERROR: earlyprintk= %s already used\n",
|
||||
con->name);
|
||||
return;
|
||||
@@ -207,9 +191,8 @@ static int __init setup_early_printk(char *buf)
|
||||
@@ -207,9 +191,8 @@ static int __init setup_early_printk(cha
|
||||
if (!buf)
|
||||
return 0;
|
||||
|
||||
|
@ -419,10 +418,10 @@ index cd28a35..5f3d9c5 100644
|
|||
|
||||
keep = (strstr(buf, "keep") != NULL);
|
||||
|
||||
diff --git a/include/linux/console.h b/include/linux/console.h
|
||||
index 7453cfd..e5b5dc0 100644
|
||||
--- a/include/linux/console.h
|
||||
+++ b/include/linux/console.h
|
||||
Index: linux-3.4/include/linux/console.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/console.h
|
||||
+++ linux-3.4/include/linux/console.h
|
||||
@@ -133,6 +133,7 @@ struct console {
|
||||
for (con = console_drivers; con != NULL; con = con->next)
|
||||
|
||||
|
@ -431,10 +430,10 @@ index 7453cfd..e5b5dc0 100644
|
|||
|
||||
extern int add_preferred_console(char *name, int idx, char *options);
|
||||
extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options);
|
||||
diff --git a/include/linux/printk.h b/include/linux/printk.h
|
||||
index f0e22f7..be10455 100644
|
||||
--- a/include/linux/printk.h
|
||||
+++ b/include/linux/printk.h
|
||||
Index: linux-3.4/include/linux/printk.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/printk.h
|
||||
+++ linux-3.4/include/linux/printk.h
|
||||
@@ -88,8 +88,13 @@ int no_printk(const char *fmt, ...)
|
||||
return 0;
|
||||
}
|
||||
|
@ -449,13 +448,13 @@ index f0e22f7..be10455 100644
|
|||
|
||||
extern int printk_needs_cpu(int cpu);
|
||||
extern void printk_tick(void);
|
||||
diff --git a/kernel/printk.c b/kernel/printk.c
|
||||
index 7982a0a..b7aa50e 100644
|
||||
--- a/kernel/printk.c
|
||||
+++ b/kernel/printk.c
|
||||
@@ -44,13 +44,6 @@
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
Index: linux-3.4/kernel/printk.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/printk.c
|
||||
+++ linux-3.4/kernel/printk.c
|
||||
@@ -47,13 +47,6 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/printk.h>
|
||||
|
||||
-/*
|
||||
- * Architectures can override it:
|
||||
|
@ -467,7 +466,7 @@ index 7982a0a..b7aa50e 100644
|
|||
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
|
||||
|
||||
/* printk's without a loglevel use this.. */
|
||||
@@ -521,6 +514,26 @@ static void __call_console_drivers(unsigned start, unsigned end)
|
||||
@@ -524,6 +517,29 @@ static void __call_console_drivers(unsig
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -476,24 +475,24 @@ index 7982a0a..b7aa50e 100644
|
|||
+
|
||||
+static void early_vprintk(const char *fmt, va_list ap)
|
||||
+{
|
||||
+ char buf[512];
|
||||
+ int n = vscnprintf(buf, sizeof(buf), fmt, ap);
|
||||
+ if (early_console)
|
||||
+ if (early_console) {
|
||||
+ char buf[512];
|
||||
+ int n = vscnprintf(buf, sizeof(buf), fmt, ap);
|
||||
+
|
||||
+ early_console->write(early_console, buf, n);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+asmlinkage void early_printk(const char *fmt, ...)
|
||||
+{
|
||||
+ va_list ap;
|
||||
+
|
||||
+ va_start(ap, fmt);
|
||||
+ early_vprintk(fmt, ap);
|
||||
+ va_end(ap);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static int __read_mostly ignore_loglevel;
|
||||
static bool __read_mostly ignore_loglevel;
|
||||
|
||||
static int __init ignore_loglevel_setup(char *str)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,18 +1,17 @@
|
|||
From b567a9a48741b5c6a271e478cc11149308ecd9b2 Mon Sep 17 00:00:00 2001
|
||||
Subject: epoll.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 8 Jul 2011 16:35:35 +0200
|
||||
Subject: [PATCH 224/267] epoll.patch
|
||||
Date: Fri, 08 Jul 2011 16:35:35 +0200
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
fs/eventpoll.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
|
||||
index ea54cde..34294b9 100644
|
||||
--- a/fs/eventpoll.c
|
||||
+++ b/fs/eventpoll.c
|
||||
@@ -464,12 +464,12 @@ static int ep_poll_wakeup_proc(void *priv, void *cookie, int call_nests)
|
||||
Index: linux-3.4/fs/eventpoll.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/eventpoll.c
|
||||
+++ linux-3.4/fs/eventpoll.c
|
||||
@@ -488,12 +488,12 @@ static int ep_poll_wakeup_proc(void *pri
|
||||
*/
|
||||
static void ep_poll_safewake(wait_queue_head_t *wq)
|
||||
{
|
||||
|
@ -27,6 +26,3 @@ index ea54cde..34294b9 100644
|
|||
}
|
||||
|
||||
static void ep_remove_wait_queue(struct eppoll_entry *pwq)
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 90e4703e2535c334bf845c719179075440e4fdca Mon Sep 17 00:00:00 2001
|
||||
Subject: filemap-fix-up.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 17 Jun 2011 18:56:24 +0200
|
||||
Subject: [PATCH 049/267] filemap-fix-up.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
Wrecked-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
|
@ -10,19 +9,16 @@ Link: http://lkml.kernel.org/n/tip-m6yuzd6ul717hlnl2gj6p3ou@git.kernel.org
|
|||
mm/filemap.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/mm/filemap.c b/mm/filemap.c
|
||||
index 03c5b0e..4a30d36 100644
|
||||
--- a/mm/filemap.c
|
||||
+++ b/mm/filemap.c
|
||||
@@ -2044,7 +2044,7 @@ size_t iov_iter_copy_from_user_atomic(struct page *page,
|
||||
Index: linux-3.4/mm/filemap.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/mm/filemap.c
|
||||
+++ linux-3.4/mm/filemap.c
|
||||
@@ -2036,7 +2036,7 @@ size_t iov_iter_copy_from_user_atomic(st
|
||||
char *kaddr;
|
||||
size_t copied;
|
||||
|
||||
- BUG_ON(!in_atomic());
|
||||
+ BUG_ON(!pagefault_disabled());
|
||||
kaddr = kmap_atomic(page, KM_USER0);
|
||||
kaddr = kmap_atomic(page);
|
||||
if (likely(i->nr_segs == 1)) {
|
||||
int left;
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
Subject: fix printk flush of messages
|
||||
From: Frank Rowand <frank.rowand@am.sony.com>
|
||||
Date: Wed, 16 May 2012 18:09:36 -0700
|
||||
|
||||
|
||||
Updates console-make-rt-friendly.patch
|
||||
|
||||
#ifdef CONFIG_PREEMPT_RT_FULL, printk() output is never flushed by
|
||||
printk() because:
|
||||
|
||||
# some liberties taken in this pseudo-code to make it easier to follow
|
||||
printk()
|
||||
vprintk()
|
||||
raw_spin_lock(&logbuf_lock)
|
||||
# increment preempt_count():
|
||||
preempt_disable()
|
||||
result = console_trylock_for_printk()
|
||||
retval = 0
|
||||
# lock will always be false, because preempt_count() will be >= 1
|
||||
lock = ... && !preempt_count()
|
||||
if (lock)
|
||||
retval = 1
|
||||
return retval
|
||||
# result will always be false since lock will always be false
|
||||
if (result)
|
||||
console_unlock()
|
||||
# this is where the printk() output would be flushed
|
||||
|
||||
|
||||
On system boot some printk() output is flushed because register_console()
|
||||
and tty_open() call console_unlock().
|
||||
|
||||
|
||||
This change also fixes the problem that was previously fixed by
|
||||
preempt-rt-allow-immediate-magic-sysrq-output-for-preempt_rt_full.patch
|
||||
|
||||
Signed-off-by: Frank Rowand <frank.rowand@am.sony.com>
|
||||
Cc: Frank <Frank_Rowand@sonyusa.com>
|
||||
Link: http://lkml.kernel.org/r/4FB44FD0.4090800@am.sony.com
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
kernel/printk.c | 2 1 + 1 - 0 !
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Index: b/kernel/printk.c
|
||||
===================================================================
|
||||
--- a/kernel/printk.c
|
||||
+++ b/kernel/printk.c
|
||||
@@ -847,7 +847,7 @@ static int console_trylock_for_printk(un
|
||||
int retval = 0, wake = 0;
|
||||
#ifdef CONFIG_PREEMPT_RT_FULL
|
||||
int lock = !early_boot_irqs_disabled && !irqs_disabled_flags(flags) &&
|
||||
- !preempt_count();
|
||||
+ (preempt_count() <= 1);
|
||||
#else
|
||||
int lock = 1;
|
||||
#endif
|
||||
|
||||
--
|
||||
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
|
||||
the body of a message to majordomo@vger.kernel.org
|
||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
||||
|
||||
|
|
@ -1,7 +1,5 @@
|
|||
From 31561541540fcec25c731c360a66fab17d50fa33 Mon Sep 17 00:00:00 2001
|
||||
Subject: x86: Do not disable preemption in int3 on 32bit
|
||||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Tue, 10 Apr 2012 14:33:57 -0400
|
||||
Subject: [PATCH 065/267] x86: Do not disable preemption in int3 on 32bit
|
||||
|
||||
Preemption must be disabled before enabling interrupts in do_trap
|
||||
on x86_64 because the stack in use for int3 and debug is a per CPU
|
||||
|
@ -19,15 +17,16 @@ when the stack is on the IST.
|
|||
Cc: stable-rt@vger.kernel.org
|
||||
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
arch/x86/kernel/traps.c | 32 +++++++++++++++++++++++---------
|
||||
1 file changed, 23 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
|
||||
index 31d9d0f..cc88aec 100644
|
||||
--- a/arch/x86/kernel/traps.c
|
||||
+++ b/arch/x86/kernel/traps.c
|
||||
@@ -87,9 +87,21 @@ static inline void conditional_sti(struct pt_regs *regs)
|
||||
Index: linux-3.4/arch/x86/kernel/traps.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/arch/x86/kernel/traps.c
|
||||
+++ linux-3.4/arch/x86/kernel/traps.c
|
||||
@@ -87,9 +87,21 @@ static inline void conditional_sti(struc
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
|
@ -50,7 +49,7 @@ index 31d9d0f..cc88aec 100644
|
|||
if (regs->flags & X86_EFLAGS_IF)
|
||||
local_irq_enable();
|
||||
}
|
||||
@@ -100,11 +112,13 @@ static inline void conditional_cli(struct pt_regs *regs)
|
||||
@@ -100,11 +112,13 @@ static inline void conditional_cli(struc
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
|
@ -65,54 +64,51 @@ index 31d9d0f..cc88aec 100644
|
|||
}
|
||||
|
||||
static void __kprobes
|
||||
@@ -222,9 +236,9 @@ dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code)
|
||||
@@ -226,9 +240,9 @@ dotraplinkage void do_stack_segment(stru
|
||||
if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
|
||||
12, SIGBUS) == NOTIFY_STOP)
|
||||
X86_TRAP_SS, SIGBUS) == NOTIFY_STOP)
|
||||
return;
|
||||
- preempt_conditional_sti(regs);
|
||||
+ conditional_sti_ist(regs);
|
||||
do_trap(12, SIGBUS, "stack segment", regs, error_code, NULL);
|
||||
do_trap(X86_TRAP_SS, SIGBUS, "stack segment", regs, error_code, NULL);
|
||||
- preempt_conditional_cli(regs);
|
||||
+ conditional_cli_ist(regs);
|
||||
}
|
||||
|
||||
dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
|
||||
@@ -316,9 +330,9 @@ dotraplinkage void __kprobes do_int3(struct pt_regs *regs, long error_code)
|
||||
return;
|
||||
#endif
|
||||
|
||||
@@ -320,9 +334,9 @@ dotraplinkage void __kprobes do_int3(str
|
||||
* as we may switch to the interrupt stack.
|
||||
*/
|
||||
debug_stack_usage_inc();
|
||||
- preempt_conditional_sti(regs);
|
||||
+ conditional_sti_ist(regs);
|
||||
do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
|
||||
do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL);
|
||||
- preempt_conditional_cli(regs);
|
||||
+ conditional_cli_ist(regs);
|
||||
debug_stack_usage_dec();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
@@ -412,12 +426,12 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
|
||||
return;
|
||||
@@ -423,12 +437,12 @@ dotraplinkage void __kprobes do_debug(st
|
||||
debug_stack_usage_inc();
|
||||
|
||||
/* It's safe to allow irq's after DR6 has been saved */
|
||||
- preempt_conditional_sti(regs);
|
||||
+ conditional_sti_ist(regs);
|
||||
|
||||
if (regs->flags & X86_VM_MASK) {
|
||||
handle_vm86_trap((struct kernel_vm86_regs *) regs,
|
||||
error_code, 1);
|
||||
handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code,
|
||||
X86_TRAP_DB);
|
||||
- preempt_conditional_cli(regs);
|
||||
+ conditional_cli_ist(regs);
|
||||
debug_stack_usage_dec();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -436,7 +450,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
|
||||
@@ -448,7 +462,7 @@ dotraplinkage void __kprobes do_debug(st
|
||||
si_code = get_si_code(tsk->thread.debugreg6);
|
||||
if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp)
|
||||
send_sigtrap(tsk, regs, error_code, si_code);
|
||||
- preempt_conditional_cli(regs);
|
||||
+ conditional_cli_ist(regs);
|
||||
debug_stack_usage_dec();
|
||||
|
||||
return;
|
||||
}
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From cfc9b78fd05098f317db725a3054e58d16e0da5e Mon Sep 17 00:00:00 2001
|
||||
Subject: fs-block-rt-support.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 14 Jun 2011 17:05:09 +0200
|
||||
Subject: [PATCH 217/267] fs-block-rt-support.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
|
@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
fs/file.c | 4 ++--
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/block/blk-core.c b/block/blk-core.c
|
||||
index 7366ad4..ca732c0 100644
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -235,7 +235,7 @@ EXPORT_SYMBOL(blk_delay_queue);
|
||||
Index: linux-3.4/block/blk-core.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/block/blk-core.c
|
||||
+++ linux-3.4/block/blk-core.c
|
||||
@@ -237,7 +237,7 @@ EXPORT_SYMBOL(blk_delay_queue);
|
||||
**/
|
||||
void blk_start_queue(struct request_queue *q)
|
||||
{
|
||||
|
@ -22,11 +21,11 @@ index 7366ad4..ca732c0 100644
|
|||
|
||||
queue_flag_clear(QUEUE_FLAG_STOPPED, q);
|
||||
__blk_run_queue(q);
|
||||
diff --git a/fs/file.c b/fs/file.c
|
||||
index 375472d..fd03258 100644
|
||||
--- a/fs/file.c
|
||||
+++ b/fs/file.c
|
||||
@@ -105,14 +105,14 @@ void free_fdtable_rcu(struct rcu_head *rcu)
|
||||
Index: linux-3.4/fs/file.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/file.c
|
||||
+++ linux-3.4/fs/file.c
|
||||
@@ -105,14 +105,14 @@ void free_fdtable_rcu(struct rcu_head *r
|
||||
kfree(fdt->open_fds);
|
||||
kfree(fdt);
|
||||
} else {
|
||||
|
@ -43,6 +42,3 @@ index 375472d..fd03258 100644
|
|||
}
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 1f3745ebd019755db68c544e5c9792988feebf52 Mon Sep 17 00:00:00 2001
|
||||
Subject: fs: dcache: Use cpu_chill() in trylock loops
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Wed, 7 Mar 2012 21:00:34 +0100
|
||||
Subject: [PATCH 262/267] fs: dcache: Use cpu_chill() in trylock loops
|
||||
Date: Wed, 07 Mar 2012 21:00:34 +0100
|
||||
|
||||
Retry loops on RT might loop forever when the modifying side was
|
||||
preempted. Use cpu_chill() instead of cpu_relax() to let the system
|
||||
|
@ -16,10 +15,10 @@ Cc: stable-rt@vger.kernel.org
|
|||
fs/namespace.c | 3 ++-
|
||||
4 files changed, 8 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h
|
||||
index 308a98b..67ed186 100644
|
||||
--- a/fs/autofs4/autofs_i.h
|
||||
+++ b/fs/autofs4/autofs_i.h
|
||||
Index: linux-3.4/fs/autofs4/autofs_i.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/autofs4/autofs_i.h
|
||||
+++ linux-3.4/fs/autofs4/autofs_i.h
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mount.h>
|
||||
|
@ -28,11 +27,11 @@ index 308a98b..67ed186 100644
|
|||
#include <asm/current.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c
|
||||
index 450f529..43afbb0 100644
|
||||
--- a/fs/autofs4/expire.c
|
||||
+++ b/fs/autofs4/expire.c
|
||||
@@ -170,7 +170,7 @@ again:
|
||||
Index: linux-3.4/fs/autofs4/expire.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/autofs4/expire.c
|
||||
+++ linux-3.4/fs/autofs4/expire.c
|
||||
@@ -171,7 +171,7 @@ again:
|
||||
parent = p->d_parent;
|
||||
if (!spin_trylock(&parent->d_lock)) {
|
||||
spin_unlock(&p->d_lock);
|
||||
|
@ -41,19 +40,19 @@ index 450f529..43afbb0 100644
|
|||
goto relock;
|
||||
}
|
||||
spin_unlock(&p->d_lock);
|
||||
diff --git a/fs/dcache.c b/fs/dcache.c
|
||||
index eb723d3..d47b266 100644
|
||||
--- a/fs/dcache.c
|
||||
+++ b/fs/dcache.c
|
||||
Index: linux-3.4/fs/dcache.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/dcache.c
|
||||
+++ linux-3.4/fs/dcache.c
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <linux/rculist_bl.h>
|
||||
#include <linux/prefetch.h>
|
||||
#include <linux/ratelimit.h>
|
||||
+#include <linux/delay.h>
|
||||
#include "internal.h"
|
||||
#include "mount.h"
|
||||
|
||||
/*
|
||||
@@ -410,7 +411,7 @@ static inline struct dentry *dentry_kill(struct dentry *dentry, int ref)
|
||||
@@ -454,7 +455,7 @@ static inline struct dentry *dentry_kill
|
||||
if (inode && !spin_trylock(&inode->i_lock)) {
|
||||
relock:
|
||||
spin_unlock(&dentry->d_lock);
|
||||
|
@ -62,7 +61,7 @@ index eb723d3..d47b266 100644
|
|||
return dentry; /* try again with same dentry */
|
||||
}
|
||||
if (IS_ROOT(dentry))
|
||||
@@ -796,7 +797,7 @@ relock:
|
||||
@@ -840,7 +841,7 @@ relock:
|
||||
|
||||
if (!spin_trylock(&dentry->d_lock)) {
|
||||
spin_unlock(&dcache_lru_lock);
|
||||
|
@ -71,7 +70,7 @@ index eb723d3..d47b266 100644
|
|||
goto relock;
|
||||
}
|
||||
|
||||
@@ -1975,7 +1976,7 @@ again:
|
||||
@@ -2022,7 +2023,7 @@ again:
|
||||
if (dentry->d_count == 1) {
|
||||
if (inode && !spin_trylock(&inode->i_lock)) {
|
||||
spin_unlock(&dentry->d_lock);
|
||||
|
@ -80,27 +79,24 @@ index eb723d3..d47b266 100644
|
|||
goto again;
|
||||
}
|
||||
dentry->d_flags &= ~DCACHE_CANT_MOUNT;
|
||||
diff --git a/fs/namespace.c b/fs/namespace.c
|
||||
index 63fd6d7..311264b 100644
|
||||
--- a/fs/namespace.c
|
||||
+++ b/fs/namespace.c
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/idr.h>
|
||||
#include <linux/fs_struct.h>
|
||||
#include <linux/fsnotify.h>
|
||||
Index: linux-3.4/fs/namespace.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/namespace.c
|
||||
+++ linux-3.4/fs/namespace.c
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/fs_struct.h> /* get_fs_root et.al. */
|
||||
#include <linux/fsnotify.h> /* fsnotify_vfsmount_delete */
|
||||
#include <linux/uaccess.h>
|
||||
+#include <linux/delay.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/unistd.h>
|
||||
#include "pnode.h"
|
||||
@@ -346,7 +347,7 @@ int mnt_want_write(struct vfsmount *mnt)
|
||||
*/
|
||||
while (mnt->mnt_flags & MNT_WRITE_HOLD) {
|
||||
#include "internal.h"
|
||||
|
||||
@@ -315,7 +316,7 @@ int mnt_want_write(struct vfsmount *m)
|
||||
smp_mb();
|
||||
while (mnt->mnt.mnt_flags & MNT_WRITE_HOLD) {
|
||||
preempt_enable();
|
||||
- cpu_relax();
|
||||
+ cpu_chill();
|
||||
preempt_disable();
|
||||
}
|
||||
/*
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,8 +1,6 @@
|
|||
From c9293d9a9b626e39108b276a74a6d4794374a973 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 18 Mar 2011 10:11:25 +0100
|
||||
Subject: [PATCH 094/267] fs: jbd/jbd2: Make state lock and journal head lock
|
||||
rt safe
|
||||
Subject: fs: jbd/jbd2: Make state lock and journal head lock rt safe
|
||||
|
||||
bit_spin_locks break under RT.
|
||||
|
||||
|
@ -14,15 +12,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
include/linux/buffer_head.h | 10 ++++++++++
|
||||
include/linux/jbd_common.h | 24 ++++++++++++++++++++++++
|
||||
2 files changed, 34 insertions(+)
|
||||
---
|
||||
include/linux/buffer_head.h | 10 ++++++++++
|
||||
include/linux/jbd_common.h | 24 ++++++++++++++++++++++++
|
||||
2 files changed, 34 insertions(+)
|
||||
|
||||
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
|
||||
index 5c16cf1..3f8e27b 100644
|
||||
--- a/include/linux/buffer_head.h
|
||||
+++ b/include/linux/buffer_head.h
|
||||
Index: linux-3.4/include/linux/buffer_head.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/buffer_head.h
|
||||
+++ linux-3.4/include/linux/buffer_head.h
|
||||
@@ -74,6 +74,11 @@ struct buffer_head {
|
||||
atomic_t b_count; /* users using this buffer_head */
|
||||
#ifdef CONFIG_PREEMPT_RT_BASE
|
||||
|
@ -35,7 +29,7 @@ index 5c16cf1..3f8e27b 100644
|
|||
#endif
|
||||
};
|
||||
|
||||
@@ -105,6 +110,11 @@ static inline void buffer_head_init_locks(struct buffer_head *bh)
|
||||
@@ -105,6 +110,11 @@ static inline void buffer_head_init_lock
|
||||
{
|
||||
#ifdef CONFIG_PREEMPT_RT_BASE
|
||||
spin_lock_init(&bh->b_uptodate_lock);
|
||||
|
@ -47,11 +41,11 @@ index 5c16cf1..3f8e27b 100644
|
|||
#endif
|
||||
}
|
||||
|
||||
diff --git a/include/linux/jbd_common.h b/include/linux/jbd_common.h
|
||||
index 6230f85..11c313e 100644
|
||||
--- a/include/linux/jbd_common.h
|
||||
+++ b/include/linux/jbd_common.h
|
||||
@@ -37,32 +37,56 @@ static inline struct journal_head *bh2jh(struct buffer_head *bh)
|
||||
Index: linux-3.4/include/linux/jbd_common.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/jbd_common.h
|
||||
+++ linux-3.4/include/linux/jbd_common.h
|
||||
@@ -37,32 +37,56 @@ static inline struct journal_head *bh2jh
|
||||
|
||||
static inline void jbd_lock_bh_state(struct buffer_head *bh)
|
||||
{
|
||||
|
@ -108,6 +102,3 @@ index 6230f85..11c313e 100644
|
|||
}
|
||||
|
||||
#endif
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 19 Jul 2009 08:44:27 -0500
|
||||
Subject: fs: namespace preemption fix
|
||||
|
||||
On RT we cannot loop with preemption disabled here as
|
||||
mnt_make_readonly() might have been preempted. We can safely enable
|
||||
preemption while waiting for MNT_WRITE_HOLD to be cleared. Safe on !RT
|
||||
as well.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
fs/namespace.c | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
Index: linux-3.4/fs/namespace.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/namespace.c
|
||||
+++ linux-3.4/fs/namespace.c
|
||||
@@ -313,8 +313,11 @@ int mnt_want_write(struct vfsmount *m)
|
||||
* incremented count after it has set MNT_WRITE_HOLD.
|
||||
*/
|
||||
smp_mb();
|
||||
- while (mnt->mnt.mnt_flags & MNT_WRITE_HOLD)
|
||||
+ while (mnt->mnt.mnt_flags & MNT_WRITE_HOLD) {
|
||||
+ preempt_enable();
|
||||
cpu_relax();
|
||||
+ preempt_disable();
|
||||
+ }
|
||||
/*
|
||||
* After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will
|
||||
* be set to match its requirements. So we must not load that until
|
|
@ -1,7 +1,6 @@
|
|||
From 9091cea711af39936f8b1378fdb38f616e1dd15d Mon Sep 17 00:00:00 2001
|
||||
From: Mike Galbraith <efault@gmx.de>
|
||||
Date: Fri, 3 Jul 2009 08:44:12 -0500
|
||||
Subject: [PATCH 218/267] fs: ntfs: disable interrupt only on !RT
|
||||
Subject: fs: ntfs: disable interrupt only on !RT
|
||||
|
||||
On Sat, 2007-10-27 at 11:44 +0200, Ingo Molnar wrote:
|
||||
> * Nick Piggin <nickpiggin@yahoo.com.au> wrote:
|
||||
|
@ -35,30 +34,28 @@ instead?
|
|||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
fs/ntfs/aops.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
|
||||
index 7fb7f1b..4c8095c 100644
|
||||
--- a/fs/ntfs/aops.c
|
||||
+++ b/fs/ntfs/aops.c
|
||||
@@ -144,13 +144,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
Index: linux-3.4/fs/ntfs/aops.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/ntfs/aops.c
|
||||
+++ linux-3.4/fs/ntfs/aops.c
|
||||
@@ -144,13 +144,13 @@ static void ntfs_end_buffer_async_read(s
|
||||
recs = PAGE_CACHE_SIZE / rec_size;
|
||||
/* Should have been verified before we got here... */
|
||||
BUG_ON(!recs);
|
||||
- local_irq_save(flags);
|
||||
+ local_irq_save_nort(flags);
|
||||
kaddr = kmap_atomic(page, KM_BIO_SRC_IRQ);
|
||||
kaddr = kmap_atomic(page);
|
||||
for (i = 0; i < recs; i++)
|
||||
post_read_mst_fixup((NTFS_RECORD*)(kaddr +
|
||||
i * rec_size), rec_size);
|
||||
kunmap_atomic(kaddr, KM_BIO_SRC_IRQ);
|
||||
kunmap_atomic(kaddr);
|
||||
- local_irq_restore(flags);
|
||||
+ local_irq_restore_nort(flags);
|
||||
flush_dcache_page(page);
|
||||
if (likely(page_uptodate && !PageError(page)))
|
||||
SetPageUptodate(page);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 0d6994d78eab6e6ebe324aa490ad10ddd2fc4e31 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 18 Mar 2011 09:18:52 +0100
|
||||
Subject: [PATCH 093/267] buffer_head: Replace bh_uptodate_lock for -rt
|
||||
Subject: buffer_head: Replace bh_uptodate_lock for -rt
|
||||
|
||||
Wrap the bit_spin_lock calls into a separate inline and add the RT
|
||||
replacements with a real spinlock.
|
||||
|
@ -13,11 +12,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
include/linux/buffer_head.h | 34 ++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 44 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/fs/buffer.c b/fs/buffer.c
|
||||
index 19d8eb7..32c4680 100644
|
||||
--- a/fs/buffer.c
|
||||
+++ b/fs/buffer.c
|
||||
@@ -331,8 +331,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
Index: linux-3.4/fs/buffer.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/buffer.c
|
||||
+++ linux-3.4/fs/buffer.c
|
||||
@@ -281,8 +281,7 @@ static void end_buffer_async_read(struct
|
||||
* decide that the page is now completely done.
|
||||
*/
|
||||
first = page_buffers(page);
|
||||
|
@ -27,7 +26,7 @@ index 19d8eb7..32c4680 100644
|
|||
clear_buffer_async_read(bh);
|
||||
unlock_buffer(bh);
|
||||
tmp = bh;
|
||||
@@ -345,8 +344,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
@@ -295,8 +294,7 @@ static void end_buffer_async_read(struct
|
||||
}
|
||||
tmp = tmp->b_this_page;
|
||||
} while (tmp != bh);
|
||||
|
@ -37,7 +36,7 @@ index 19d8eb7..32c4680 100644
|
|||
|
||||
/*
|
||||
* If none of the buffers had errors and they are all
|
||||
@@ -358,9 +356,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
@@ -308,9 +306,7 @@ static void end_buffer_async_read(struct
|
||||
return;
|
||||
|
||||
still_busy:
|
||||
|
@ -48,7 +47,7 @@ index 19d8eb7..32c4680 100644
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -394,8 +390,7 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate)
|
||||
@@ -344,8 +340,7 @@ void end_buffer_async_write(struct buffe
|
||||
}
|
||||
|
||||
first = page_buffers(page);
|
||||
|
@ -58,7 +57,7 @@ index 19d8eb7..32c4680 100644
|
|||
|
||||
clear_buffer_async_write(bh);
|
||||
unlock_buffer(bh);
|
||||
@@ -407,15 +402,12 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate)
|
||||
@@ -357,15 +352,12 @@ void end_buffer_async_write(struct buffe
|
||||
}
|
||||
tmp = tmp->b_this_page;
|
||||
}
|
||||
|
@ -76,7 +75,7 @@ index 19d8eb7..32c4680 100644
|
|||
}
|
||||
EXPORT_SYMBOL(end_buffer_async_write);
|
||||
|
||||
@@ -3223,6 +3215,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags)
|
||||
@@ -3185,6 +3177,7 @@ struct buffer_head *alloc_buffer_head(gf
|
||||
struct buffer_head *ret = kmem_cache_zalloc(bh_cachep, gfp_flags);
|
||||
if (ret) {
|
||||
INIT_LIST_HEAD(&ret->b_assoc_buffers);
|
||||
|
@ -84,11 +83,11 @@ index 19d8eb7..32c4680 100644
|
|||
preempt_disable();
|
||||
__this_cpu_inc(bh_accounting.nr);
|
||||
recalc_bh_state();
|
||||
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
|
||||
index 0b1e885b..7fb7f1b 100644
|
||||
--- a/fs/ntfs/aops.c
|
||||
+++ b/fs/ntfs/aops.c
|
||||
@@ -108,8 +108,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
Index: linux-3.4/fs/ntfs/aops.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/fs/ntfs/aops.c
|
||||
+++ linux-3.4/fs/ntfs/aops.c
|
||||
@@ -108,8 +108,7 @@ static void ntfs_end_buffer_async_read(s
|
||||
"0x%llx.", (unsigned long long)bh->b_blocknr);
|
||||
}
|
||||
first = page_buffers(page);
|
||||
|
@ -98,7 +97,7 @@ index 0b1e885b..7fb7f1b 100644
|
|||
clear_buffer_async_read(bh);
|
||||
unlock_buffer(bh);
|
||||
tmp = bh;
|
||||
@@ -124,8 +123,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
@@ -124,8 +123,7 @@ static void ntfs_end_buffer_async_read(s
|
||||
}
|
||||
tmp = tmp->b_this_page;
|
||||
} while (tmp != bh);
|
||||
|
@ -108,7 +107,7 @@ index 0b1e885b..7fb7f1b 100644
|
|||
/*
|
||||
* If none of the buffers had errors then we can set the page uptodate,
|
||||
* but we first have to perform the post read mst fixups, if the
|
||||
@@ -160,9 +158,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
@@ -160,9 +158,7 @@ static void ntfs_end_buffer_async_read(s
|
||||
unlock_page(page);
|
||||
return;
|
||||
still_busy:
|
||||
|
@ -119,10 +118,10 @@ index 0b1e885b..7fb7f1b 100644
|
|||
}
|
||||
|
||||
/**
|
||||
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
|
||||
index 458f497..5c16cf1 100644
|
||||
--- a/include/linux/buffer_head.h
|
||||
+++ b/include/linux/buffer_head.h
|
||||
Index: linux-3.4/include/linux/buffer_head.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/buffer_head.h
|
||||
+++ linux-3.4/include/linux/buffer_head.h
|
||||
@@ -72,8 +72,42 @@ struct buffer_head {
|
||||
struct address_space *b_assoc_map; /* mapping this buffer is
|
||||
associated with */
|
||||
|
@ -166,6 +165,3 @@ index 458f497..5c16cf1 100644
|
|||
/*
|
||||
* macro tricks to expand the set_buffer_foo(), clear_buffer_foo()
|
||||
* and buffer_foo() functions.
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 5af317e8a8abd8e488ee2a318229efc3177c81fc Mon Sep 17 00:00:00 2001
|
||||
Subject: ftrace-crap.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 9 Sep 2011 16:55:53 +0200
|
||||
Subject: [PATCH 175/267] ftrace-crap.patch
|
||||
Date: Fri, 09 Sep 2011 16:55:53 +0200
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
|
@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
kernel/trace/trace.h | 1 -
|
||||
2 files changed, 24 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
||||
index ff03353..f4de7ab 100644
|
||||
--- a/kernel/trace/trace.c
|
||||
+++ b/kernel/trace/trace.c
|
||||
@@ -359,11 +359,13 @@ static DECLARE_DELAYED_WORK(wakeup_work, wakeup_work_handler);
|
||||
Index: linux-3.4/kernel/trace/trace.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/trace/trace.c
|
||||
+++ linux-3.4/kernel/trace/trace.c
|
||||
@@ -414,11 +414,13 @@ EXPORT_SYMBOL_GPL(tracing_is_on);
|
||||
*/
|
||||
void trace_wake_up(void)
|
||||
{
|
||||
|
@ -27,7 +26,7 @@ index ff03353..f4de7ab 100644
|
|||
}
|
||||
|
||||
static int __init set_buf_size(char *str)
|
||||
@@ -719,6 +721,12 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
|
||||
@@ -775,6 +777,12 @@ update_max_tr_single(struct trace_array
|
||||
}
|
||||
#endif /* CONFIG_TRACER_MAX_TRACE */
|
||||
|
||||
|
@ -40,7 +39,7 @@ index ff03353..f4de7ab 100644
|
|||
/**
|
||||
* register_tracer - register a tracer with the ftrace system.
|
||||
* @type - the plugin for the tracer
|
||||
@@ -3196,6 +3204,7 @@ static int tracing_release_pipe(struct inode *inode, struct file *file)
|
||||
@@ -3303,6 +3311,7 @@ static int tracing_release_pipe(struct i
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -48,7 +47,7 @@ index ff03353..f4de7ab 100644
|
|||
static unsigned int
|
||||
tracing_poll_pipe(struct file *filp, poll_table *poll_table)
|
||||
{
|
||||
@@ -3217,8 +3226,7 @@ tracing_poll_pipe(struct file *filp, poll_table *poll_table)
|
||||
@@ -3324,8 +3333,7 @@ tracing_poll_pipe(struct file *filp, pol
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,7 +57,7 @@ index ff03353..f4de7ab 100644
|
|||
{
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
@@ -3229,6 +3237,20 @@ void default_wait_pipe(struct trace_iterator *iter)
|
||||
@@ -3336,6 +3344,20 @@ void default_wait_pipe(struct trace_iter
|
||||
|
||||
finish_wait(&trace_wait, &wait);
|
||||
}
|
||||
|
@ -79,11 +78,11 @@ index ff03353..f4de7ab 100644
|
|||
|
||||
/*
|
||||
* This is a make-shift waitqueue.
|
||||
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
|
||||
index 092e1f8..69b8700 100644
|
||||
--- a/kernel/trace/trace.h
|
||||
+++ b/kernel/trace/trace.h
|
||||
@@ -345,7 +345,6 @@ void trace_init_global_iter(struct trace_iterator *iter);
|
||||
Index: linux-3.4/kernel/trace/trace.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/trace/trace.h
|
||||
+++ linux-3.4/kernel/trace/trace.h
|
||||
@@ -354,7 +354,6 @@ void trace_init_global_iter(struct trace
|
||||
|
||||
void tracing_iter_reset(struct trace_iterator *iter, int cpu);
|
||||
|
||||
|
@ -91,6 +90,3 @@ index 092e1f8..69b8700 100644
|
|||
void poll_wait_pipe(struct trace_iterator *iter);
|
||||
|
||||
void ftrace(struct trace_array *tr,
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 14e283b0c6f5247b630dda78f0b4bb47c728dd7b Mon Sep 17 00:00:00 2001
|
||||
Subject: ftrace-migrate-disable-tracing.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 17 Jul 2011 21:56:42 +0200
|
||||
Subject: [PATCH 164/267] ftrace-migrate-disable-tracing.patch
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
|
@ -11,10 +10,10 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
kernel/trace/trace_output.c | 5 +++++
|
||||
4 files changed, 14 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h
|
||||
index c3da42d..7c5e176 100644
|
||||
--- a/include/linux/ftrace_event.h
|
||||
+++ b/include/linux/ftrace_event.h
|
||||
Index: linux-3.4/include/linux/ftrace_event.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/ftrace_event.h
|
||||
+++ linux-3.4/include/linux/ftrace_event.h
|
||||
@@ -49,7 +49,8 @@ struct trace_entry {
|
||||
unsigned char flags;
|
||||
unsigned char preempt_count;
|
||||
|
@ -25,11 +24,11 @@ index c3da42d..7c5e176 100644
|
|||
};
|
||||
|
||||
#define FTRACE_MAX_EVENT \
|
||||
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
|
||||
index 697e49d..c44456b 100644
|
||||
--- a/kernel/trace/trace.c
|
||||
+++ b/kernel/trace/trace.c
|
||||
@@ -1123,6 +1123,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags,
|
||||
Index: linux-3.4/kernel/trace/trace.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/trace/trace.c
|
||||
+++ linux-3.4/kernel/trace/trace.c
|
||||
@@ -1179,6 +1179,8 @@ tracing_generic_entry_update(struct trac
|
||||
((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
|
||||
((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
|
||||
(need_resched() ? TRACE_FLAG_NEED_RESCHED : 0);
|
||||
|
@ -38,7 +37,7 @@ index 697e49d..c44456b 100644
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tracing_generic_entry_update);
|
||||
|
||||
@@ -1854,9 +1856,10 @@ static void print_lat_help_header(struct seq_file *m)
|
||||
@@ -1937,9 +1939,10 @@ static void print_lat_help_header(struct
|
||||
seq_puts(m, "# | / _----=> need-resched \n");
|
||||
seq_puts(m, "# || / _---=> hardirq/softirq \n");
|
||||
seq_puts(m, "# ||| / _--=> preempt-depth \n");
|
||||
|
@ -51,12 +50,12 @@ index 697e49d..c44456b 100644
|
|||
+ seq_puts(m, "# \\ / ||||| \\ | / \n");
|
||||
}
|
||||
|
||||
static void print_func_help_header(struct seq_file *m)
|
||||
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
|
||||
index c212a7f..aca63cc 100644
|
||||
--- a/kernel/trace/trace_events.c
|
||||
+++ b/kernel/trace/trace_events.c
|
||||
@@ -116,6 +116,7 @@ static int trace_define_common_fields(void)
|
||||
static void print_event_info(struct trace_array *tr, struct seq_file *m)
|
||||
Index: linux-3.4/kernel/trace/trace_events.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/trace/trace_events.c
|
||||
+++ linux-3.4/kernel/trace/trace_events.c
|
||||
@@ -116,6 +116,7 @@ static int trace_define_common_fields(vo
|
||||
__common_field(unsigned char, flags);
|
||||
__common_field(unsigned char, preempt_count);
|
||||
__common_field(int, pid);
|
||||
|
@ -64,11 +63,11 @@ index c212a7f..aca63cc 100644
|
|||
__common_field(int, padding);
|
||||
|
||||
return ret;
|
||||
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c
|
||||
index 5199930..c93de84 100644
|
||||
--- a/kernel/trace/trace_output.c
|
||||
+++ b/kernel/trace/trace_output.c
|
||||
@@ -591,6 +591,11 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
|
||||
Index: linux-3.4/kernel/trace/trace_output.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/trace/trace_output.c
|
||||
+++ linux-3.4/kernel/trace/trace_output.c
|
||||
@@ -593,6 +593,11 @@ int trace_print_lat_fmt(struct trace_seq
|
||||
else
|
||||
ret = trace_seq_putc(s, '.');
|
||||
|
||||
|
@ -80,6 +79,3 @@ index 5199930..c93de84 100644
|
|||
return ret;
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,12 +1,11 @@
|
|||
From 3e18d19f9ef2d8e08827a5710c402485b169004c Mon Sep 17 00:00:00 2001
|
||||
Subject: futex: Fix bug on when a requeued RT task times out
|
||||
From: Steven Rostedt <rostedt@goodmis.org>
|
||||
Date: Tue, 10 Apr 2012 14:34:13 -0400
|
||||
Subject: [PATCH 193/267] futex: Fix bug on when a requeued RT task times out
|
||||
|
||||
Requeue with timeout causes a bug with PREEMPT_RT_FULL.
|
||||
|
||||
The bug comes from a timed out condition.
|
||||
|
||||
|
||||
TASK 1 TASK 2
|
||||
------ ------
|
||||
futex_wait_requeue_pi()
|
||||
|
@ -16,12 +15,13 @@ The bug comes from a timed out condition.
|
|||
double_lock_hb();
|
||||
|
||||
raw_spin_lock(pi_lock);
|
||||
if (current->pi_blocked_on) {
|
||||
if (current->pi_blocked_on) {
|
||||
} else {
|
||||
current->pi_blocked_on = PI_WAKE_INPROGRESS;
|
||||
run_spin_unlock(pi_lock);
|
||||
spin_lock(hb->lock); <-- blocked!
|
||||
|
||||
|
||||
plist_for_each_entry_safe(this) {
|
||||
rt_mutex_start_proxy_lock();
|
||||
task_blocks_on_rt_mutex();
|
||||
|
@ -47,16 +47,18 @@ appropriately.
|
|||
Cc: stable-rt@vger.kernel.org
|
||||
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
|
||||
---
|
||||
kernel/rtmutex.c | 32 +++++++++++++++++++++++++++++++-
|
||||
kernel/rtmutex_common.h | 1 +
|
||||
2 files changed, 32 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/kernel/rtmutex.c b/kernel/rtmutex.c
|
||||
index 13b3c92..f8dcb7b 100644
|
||||
--- a/kernel/rtmutex.c
|
||||
+++ b/kernel/rtmutex.c
|
||||
@@ -69,7 +69,8 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock)
|
||||
Index: linux-3.4/kernel/rtmutex.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/rtmutex.c
|
||||
+++ linux-3.4/kernel/rtmutex.c
|
||||
@@ -69,7 +69,8 @@ static void fixup_rt_mutex_waiters(struc
|
||||
|
||||
static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter)
|
||||
{
|
||||
|
@ -66,7 +68,7 @@ index 13b3c92..f8dcb7b 100644
|
|||
}
|
||||
|
||||
/*
|
||||
@@ -1010,6 +1011,35 @@ int rt_mutex_start_proxy_lock(struct rt_mutex *lock,
|
||||
@@ -1002,6 +1003,35 @@ int rt_mutex_start_proxy_lock(struct rt_
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -102,11 +104,11 @@ index 13b3c92..f8dcb7b 100644
|
|||
ret = task_blocks_on_rt_mutex(lock, waiter, task, detect_deadlock);
|
||||
|
||||
if (ret && !rt_mutex_owner(lock)) {
|
||||
diff --git a/kernel/rtmutex_common.h b/kernel/rtmutex_common.h
|
||||
index b43d832..47290ec 100644
|
||||
--- a/kernel/rtmutex_common.h
|
||||
+++ b/kernel/rtmutex_common.h
|
||||
@@ -104,6 +104,7 @@ static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock)
|
||||
Index: linux-3.4/kernel/rtmutex_common.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/rtmutex_common.h
|
||||
+++ linux-3.4/kernel/rtmutex_common.h
|
||||
@@ -104,6 +104,7 @@ static inline struct task_struct *rt_mut
|
||||
* PI-futex support (proxy locking functions, etc.):
|
||||
*/
|
||||
#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1)
|
||||
|
@ -114,6 +116,3 @@ index b43d832..47290ec 100644
|
|||
|
||||
extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock);
|
||||
extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,22 +1,21 @@
|
|||
From f105d10b4701b0b44c781bc0c37379f3468521a3 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:29:30 -0500
|
||||
Subject: [PATCH 036/267] generic: Use raw local irq variant for generic
|
||||
cmpxchg
|
||||
Subject: generic: Use raw local irq variant for generic cmpxchg
|
||||
|
||||
No point in tracing those.
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
include/asm-generic/cmpxchg-local.h | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/include/asm-generic/cmpxchg-local.h b/include/asm-generic/cmpxchg-local.h
|
||||
index 2533fdd..d8d4c89 100644
|
||||
--- a/include/asm-generic/cmpxchg-local.h
|
||||
+++ b/include/asm-generic/cmpxchg-local.h
|
||||
@@ -21,7 +21,7 @@ static inline unsigned long __cmpxchg_local_generic(volatile void *ptr,
|
||||
Index: linux-3.4/include/asm-generic/cmpxchg-local.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/asm-generic/cmpxchg-local.h
|
||||
+++ linux-3.4/include/asm-generic/cmpxchg-local.h
|
||||
@@ -21,7 +21,7 @@ static inline unsigned long __cmpxchg_lo
|
||||
if (size == 8 && sizeof(unsigned long) != 8)
|
||||
wrong_size_cmpxchg(ptr);
|
||||
|
||||
|
@ -25,7 +24,7 @@ index 2533fdd..d8d4c89 100644
|
|||
switch (size) {
|
||||
case 1: prev = *(u8 *)ptr;
|
||||
if (prev == old)
|
||||
@@ -42,7 +42,7 @@ static inline unsigned long __cmpxchg_local_generic(volatile void *ptr,
|
||||
@@ -42,7 +42,7 @@ static inline unsigned long __cmpxchg_lo
|
||||
default:
|
||||
wrong_size_cmpxchg(ptr);
|
||||
}
|
||||
|
@ -34,7 +33,7 @@ index 2533fdd..d8d4c89 100644
|
|||
return prev;
|
||||
}
|
||||
|
||||
@@ -55,11 +55,11 @@ static inline u64 __cmpxchg64_local_generic(volatile void *ptr,
|
||||
@@ -55,11 +55,11 @@ static inline u64 __cmpxchg64_local_gene
|
||||
u64 prev;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -48,6 +47,3 @@ index 2533fdd..d8d4c89 100644
|
|||
return prev;
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
Subject: genirq: Add default affinity mask command line option
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 25 May 2012 16:59:47 +0200
|
||||
|
||||
If we isolate CPUs, then we don't want random device interrupts on
|
||||
them. Even w/o the user space irq balancer enabled we can end up with
|
||||
irqs on non boot cpus.
|
||||
|
||||
Allow to restrict the default irq affinity mask.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
Documentation/kernel-parameters.txt | 9 +++++++++
|
||||
kernel/irq/irqdesc.c | 21 +++++++++++++++++++--
|
||||
2 files changed, 28 insertions(+), 2 deletions(-)
|
||||
|
||||
Index: linux-3.4/Documentation/kernel-parameters.txt
|
||||
===================================================================
|
||||
--- linux-3.4.orig/Documentation/kernel-parameters.txt
|
||||
+++ linux-3.4/Documentation/kernel-parameters.txt
|
||||
@@ -1126,6 +1126,15 @@ bytes respectively. Such letter suffixes
|
||||
See comment before ip2_setup() in
|
||||
drivers/char/ip2/ip2base.c.
|
||||
|
||||
+ irqaffinity= [SMP] Set the default irq affinity mask
|
||||
+ Format:
|
||||
+ <cpu number>,...,<cpu number>
|
||||
+ or
|
||||
+ <cpu number>-<cpu number>
|
||||
+ (must be a positive range in ascending order)
|
||||
+ or a mixture
|
||||
+ <cpu number>,...,<cpu number>-<cpu number>
|
||||
+
|
||||
irqfixup [HW]
|
||||
When an interrupt is not handled search all handlers
|
||||
for it. Intended to get systems with badly broken
|
||||
Index: linux-3.4/kernel/irq/irqdesc.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/irq/irqdesc.c
|
||||
+++ linux-3.4/kernel/irq/irqdesc.c
|
||||
@@ -23,10 +23,27 @@
|
||||
static struct lock_class_key irq_desc_lock_class;
|
||||
|
||||
#if defined(CONFIG_SMP)
|
||||
+static int __init irq_affinity_setup(char *str)
|
||||
+{
|
||||
+ zalloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT);
|
||||
+ cpulist_parse(str, irq_default_affinity);
|
||||
+ /*
|
||||
+ * Set at least the boot cpu. We don't want to end up with
|
||||
+ * bugreports caused by random comandline masks
|
||||
+ */
|
||||
+ cpumask_set_cpu(smp_processor_id(), irq_default_affinity);
|
||||
+ return 1;
|
||||
+}
|
||||
+__setup("irqaffinity=", irq_affinity_setup);
|
||||
+
|
||||
static void __init init_irq_default_affinity(void)
|
||||
{
|
||||
- alloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT);
|
||||
- cpumask_setall(irq_default_affinity);
|
||||
+#ifdef CONFIG_CPUMASK_OFFSTACK
|
||||
+ if (!irq_default_affinity)
|
||||
+ zalloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT);
|
||||
+#endif
|
||||
+ if (cpumask_empty(irq_default_affinity))
|
||||
+ cpumask_setall(irq_default_affinity);
|
||||
}
|
||||
#else
|
||||
static void __init init_irq_default_affinity(void)
|
|
@ -1,21 +1,21 @@
|
|||
From c52440d3a3faff677bbba7d09e44222de48b6cf2 Mon Sep 17 00:00:00 2001
|
||||
From: Ingo Molnar <mingo@elte.hu>
|
||||
Date: Fri, 3 Jul 2009 08:29:57 -0500
|
||||
Subject: [PATCH 097/267] genirq: disable irqpoll on -rt
|
||||
Subject: genirq: disable irqpoll on -rt
|
||||
|
||||
Creates long latencies for no value
|
||||
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
kernel/irq/spurious.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c
|
||||
index dc813a9..d09e0f5 100644
|
||||
--- a/kernel/irq/spurious.c
|
||||
+++ b/kernel/irq/spurious.c
|
||||
@@ -341,6 +341,11 @@ MODULE_PARM_DESC(noirqdebug, "Disable irq lockup detection when true");
|
||||
Index: linux-3.4/kernel/irq/spurious.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/irq/spurious.c
|
||||
+++ linux-3.4/kernel/irq/spurious.c
|
||||
@@ -341,6 +341,11 @@ MODULE_PARM_DESC(noirqdebug, "Disable ir
|
||||
|
||||
static int __init irqfixup_setup(char *str)
|
||||
{
|
||||
|
@ -39,6 +39,3 @@ index dc813a9..d09e0f5 100644
|
|||
irqfixup = 2;
|
||||
printk(KERN_WARNING "Misrouted IRQ fixup and polling support "
|
||||
"enabled\n");
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,21 +1,21 @@
|
|||
From f190b6f8506745170cbb3754f21ab36267847483 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Tue, 21 Jul 2009 16:07:37 +0200
|
||||
Subject: [PATCH 096/267] genirq: Disable random call on preempt-rt
|
||||
Subject: genirq: Disable random call on preempt-rt
|
||||
|
||||
The random call introduces high latencies and is almost
|
||||
unused. Disable it for -rt.
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
---
|
||||
kernel/irq/handle.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
|
||||
index 470d08c..634620c 100644
|
||||
--- a/kernel/irq/handle.c
|
||||
+++ b/kernel/irq/handle.c
|
||||
@@ -156,8 +156,11 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)
|
||||
Index: linux-3.4/kernel/irq/handle.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/irq/handle.c
|
||||
+++ linux-3.4/kernel/irq/handle.c
|
||||
@@ -172,8 +172,11 @@ handle_irq_event_percpu(struct irq_desc
|
||||
action = action->next;
|
||||
} while (action);
|
||||
|
||||
|
@ -27,6 +27,3 @@ index 470d08c..634620c 100644
|
|||
|
||||
if (!noirqdebug)
|
||||
note_interrupt(irq, desc, retval);
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
From 63d0b60e274fb76c5b8b1a2fd74a5d93eacc656a Mon Sep 17 00:00:00 2001
|
||||
Subject: genirq-force-threading.patch
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Sun, 3 Apr 2011 11:57:29 +0200
|
||||
Subject: [PATCH 098/267] genirq-force-threading.patch
|
||||
Date: Sun, 03 Apr 2011 11:57:29 +0200
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
|
@ -9,11 +8,11 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
kernel/irq/manage.c | 2 ++
|
||||
2 files changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
|
||||
index ddd6b2a..b9162dc 100644
|
||||
--- a/include/linux/interrupt.h
|
||||
+++ b/include/linux/interrupt.h
|
||||
@@ -396,9 +396,13 @@ static inline int disable_irq_wake(unsigned int irq)
|
||||
Index: linux-3.4/include/linux/interrupt.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/interrupt.h
|
||||
+++ linux-3.4/include/linux/interrupt.h
|
||||
@@ -394,9 +394,13 @@ static inline int disable_irq_wake(unsig
|
||||
|
||||
|
||||
#ifdef CONFIG_IRQ_FORCED_THREADING
|
||||
|
@ -29,10 +28,10 @@ index ddd6b2a..b9162dc 100644
|
|||
#endif
|
||||
|
||||
#ifndef __ARCH_SET_SOFTIRQ_PENDING
|
||||
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
|
||||
index 7600092..b3e6228 100644
|
||||
--- a/kernel/irq/manage.c
|
||||
+++ b/kernel/irq/manage.c
|
||||
Index: linux-3.4/kernel/irq/manage.c
|
||||
===================================================================
|
||||
--- linux-3.4.orig/kernel/irq/manage.c
|
||||
+++ linux-3.4/kernel/irq/manage.c
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "internals.h"
|
||||
|
||||
|
@ -41,7 +40,7 @@ index 7600092..b3e6228 100644
|
|||
__read_mostly bool force_irqthreads;
|
||||
|
||||
static int __init setup_forced_irqthreads(char *arg)
|
||||
@@ -26,6 +27,7 @@ static int __init setup_forced_irqthreads(char *arg)
|
||||
@@ -26,6 +27,7 @@ static int __init setup_forced_irqthread
|
||||
return 0;
|
||||
}
|
||||
early_param("threadirqs", setup_forced_irqthreads);
|
||||
|
@ -49,6 +48,3 @@ index 7600092..b3e6228 100644
|
|||
#endif
|
||||
|
||||
/**
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,17 +1,16 @@
|
|||
From 5b808390bbd3ef32efd5d44116bd0e5a17860200 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Gleixner <tglx@linutronix.de>
|
||||
Date: Fri, 18 Mar 2011 10:22:04 +0100
|
||||
Subject: [PATCH 095/267] genirq: Disable DEBUG_SHIRQ for rt
|
||||
Date: Sun, 18 Mar 2011 10:22:04 +0100
|
||||
Subject: genirq: Disable DEBUG_SHIRQ for rt
|
||||
|
||||
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
||||
---
|
||||
lib/Kconfig.debug | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
||||
index 82928f5..c347db3 100644
|
||||
--- a/lib/Kconfig.debug
|
||||
+++ b/lib/Kconfig.debug
|
||||
Index: linux-3.4/lib/Kconfig.debug
|
||||
===================================================================
|
||||
--- linux-3.4.orig/lib/Kconfig.debug
|
||||
+++ linux-3.4/lib/Kconfig.debug
|
||||
@@ -151,7 +151,7 @@ config DEBUG_KERNEL
|
||||
|
||||
config DEBUG_SHIRQ
|
||||
|
@ -21,6 +20,3 @@ index 82928f5..c347db3 100644
|
|||
help
|
||||
Enable this to generate a spurious interrupt as soon as a shared
|
||||
interrupt handler is registered, and just before one is deregistered.
|
||||
--
|
||||
1.7.10
|
||||
|
|
@ -1,11 +1,6 @@
|
|||
From ac220f3571639b8a16d5df2a4fd438938d82afc6 Mon Sep 17 00:00:00 2001
|
||||
Subject: hardirq.h: Define softirq_count() as OUL to kill build warning
|
||||
From: Yong Zhang <yong.zhang0@gmail.com>
|
||||
Date: Thu, 13 Oct 2011 17:19:09 +0800
|
||||
Subject: [PATCH 183/267] hardirq.h: Define softirq_count() as OUL to kill
|
||||
build warning
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
kernel/lockdep.c: In function ‘print_bad_irq_dependency’:
|
||||
kernel/lockdep.c:1476:3: warning: format ‘%lu’ expects type ‘long unsigned int’, but argument 7 has type ‘unsigned int’
|
||||
|
@ -27,10 +22,10 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|||
include/linux/hardirq.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h
|
||||
index 2f5d318..7059ce2 100644
|
||||
--- a/include/linux/hardirq.h
|
||||
+++ b/include/linux/hardirq.h
|
||||
Index: linux-3.4/include/linux/hardirq.h
|
||||
===================================================================
|
||||
--- linux-3.4.orig/include/linux/hardirq.h
|
||||
+++ linux-3.4/include/linux/hardirq.h
|
||||
@@ -84,7 +84,7 @@
|
||||
# define softirq_count() (preempt_count() & SOFTIRQ_MASK)
|
||||
# define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET)
|
||||
|
@ -40,6 +35,3 @@ index 2f5d318..7059ce2 100644
|
|||
extern int in_serving_softirq(void);
|
||||
#endif
|
||||
|
||||
--
|
||||
1.7.10
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue