3.4.4-rt14-rc2 stable review
Subsystems (7)
Steven Rostedt
maintainercover 3.4.4-rt14-rc2 stable review
Dear RT Folks,
This is the RT stable review cycle of patch 3.4.4-rt14-rc2.
Please scream at me if I messed something up. Please test the patches too.
The -rc release will be uploaded to kernel.org and will be deleted when the final release is out. This is just a review release (or release candidate).
The pre-releases will not be pushed to the git repository, only the final release is.
If all goes well, this patch will be converted to the next main release on 7/18/2012.
What changed between -rc1:
Patch was added:
cpu/rt: Fix cpu_hotplug variable initialization
Enjoy,
-- Steve
To build 3.4.4-rt14-rc2 directly, the following patches should be applied:
http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.xz
http://www.kernel.org/pub/linux/kernel/v3.x/patch-3.4.4.xz
http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4.4-rt14-rc2.patch.xz
You can also build from 3.4.4-rt13 by applying the incremental patch:
http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/incr/patch-3.4.4-rt13-rt14-rc2.patch.xz
Changes from 3.4.4-rt13:
---
Carsten Emde (4):
Latency histogramms: Cope with backwards running local trace clock Latency histograms: Adjust timer, if already elapsed when programmed Disable RT_GROUP_SCHED in PREEMPT_RT_FULL
Latency histograms: Detect another yet overlooked sharedprio condition
Mike Galbraith (1):
fs, jbd: pull your plug when waiting for space
Steven Rostedt (5):
cpu/rt: Rework cpu down for PREEMPT_RT cpu/rt: Fix cpu_hotplug variable initialization
workqueue: Revert workqueue: Fix PF_THREAD_BOUND abuse
workqueue: Revert workqueue: Fix cpuhotplug trainwreck Linux 3.4.4-rt14-rc2
Thomas Gleixner (1):
slab: Prevent local lock deadlock
Yong Zhang (1):
perf: Make swevent hrtimer run in irq instead of softirq
----
fs/jbd/checkpoint.c | 2 + include/linux/cpu.h | 6 +- include/linux/hrtimer.h | 3 + include/linux/sched.h | 9 +- include/linux/workqueue.h | 5 +- init/Kconfig | 1 + kernel/cpu.c | 240 ++++++++++++++---- kernel/events/core.c | 1 + kernel/hrtimer.c | 16 +- kernel/sched/core.c | 82 +++++- kernel/trace/latency_hist.c | 74 +++--- kernel/workqueue.c | 578 +++++++++++++++++++++++++++++++------------ localversion-rt | 2 +- mm/slab.c | 26 +- 14 files changed, 788 insertions(+), 257 deletions(-)
Steven Rostedt
maintainerPATCH 1/12 Latency histogramms: Cope with backwards running local trace clock
From: Carsten Emde <[email protected]>
Thanks to the wonders of modern technology, the local trace clock can now run backwards. Since this never happened before, the time difference between now and somewhat earlier was expected to never become negative and, thus, stored in an unsigned integer variable. Nowadays, we need a signed integer to ensure that the value is stored as underflow in the related histogram. (In cases where this is not a misfunction, bipolar histograms can be used.)
This patch takes care that all latency variables are represented as signed integers and negative numbers are considered as histogram underflows.
In one of the misbehaving processors switching to global clock solved the problem:
echo global >/sys/kernel/debug/tracing/trace_clock
--- include/linux/sched.h | 2 +- kernel/trace/latency_hist.c | 71 ++++++++++++++++++++++--------------------- 2 files changed, 38 insertions(+), 35 deletions(-)
include/linux/sched.h +1 -1
@@ -1629,7 +1629,7 @@ struct task_struct {#ifdef CONFIG_WAKEUP_LATENCY_HIST u64 preempt_timestamp_hist;#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST -unsigned long timer_offset; +long timer_offset;#endif #endif #endif /* CONFIG_TRACING */
kernel/trace/latency_hist.c +37 -34
198 lines not on this page · raw message
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 2/12 Latency histograms: Adjust timer, if already elapsed when programmed
In reply to Steven RostedtFrom: Carsten Emde <[email protected]>
Nothing prevents a programmer from calling clock_nanosleep() with an already elapsed wakeup time in absolute time mode or with a too small delay in relative time mode. Such timers cannot wake up in time and, thus, should be corrected when entered into the missed timers latency histogram (CONFIG_MISSED_TIMERS_HIST).
This patch marks such timers and uses a corrected expiration time.
--- include/linux/hrtimer.h | 3 +++ kernel/hrtimer.c | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-)
include/linux/hrtimer.h +3 -0
@@ -113,6 +113,9 @@ struct hrtimer {unsigned long state;struct list_head cb_entry;int irqsafe; +#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST +ktime_t praecox; +#endif #ifdef CONFIG_TIMER_STATS int start_pid;void *start_site;
kernel/hrtimer.c +14 -2
@@ -1021,6 +1021,17 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,#endif } +#ifdef CONFIG_MISSED_TIMER_OFFSETS_HIST + { +ktime_t now = new_base->get_time (); + +if (ktime_to_ns (tim) <ktime_to_ns (now)) + timer->praecox = now; +else + timer->praecox =ktime_set (0 ,0 ); + } +#endif +hrtimer_set_expires_range_ns (timer, tim, delta_ns);timer_stats_hrtimer_set_start_info (timer);
@@ -1458,8 +1469,9 @@ retry: timer = container_of(node, struct hrtimer, node); trace_hrtimer_interrupt(raw_smp_processor_id(), - ktime_to_ns(ktime_sub( - hrtimer_get_expires(timer), basenow)), + ktime_to_ns(ktime_sub(ktime_to_ns(timer->praecox) ? + timer->praecox : hrtimer_get_expires(timer), + basenow)), current, timer->function == hrtimer_wakeup ? container_of(timer, struct hrtimer_sleeper,
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 3/12 Disable RT_GROUP_SCHED in PREEMPT_RT_FULL
In reply to Steven RostedtFrom: Carsten Emde <[email protected]>
Strange CPU stalls have been observed in RT when RT_GROUP_SCHED was configured.
Disable it for now.
--- init/Kconfig | 1 + 1 file changed, 1 insertion(+)
init/Kconfig +1 -0
@@ -746,6 +746,7 @@ config RT_GROUP_SCHED bool "Group scheduling for SCHED_RR/FIFO" depends on EXPERIMENTAL depends on CGROUP_SCHED + depends on !PREEMPT_RT_FULL default n help This feature lets you explicitly allocate real CPU bandwidth
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 4/12 Latency histograms: Detect another yet overlooked sharedprio condition
In reply to Steven RostedtFrom: Carsten Emde <[email protected]>
While waiting for an RT process to be woken up, the previous process may go to wait and switch to another one with the same priority which then becomes current. This condition was not correctly recognized and led to erroneously high latency recordings during periods of low CPU load.
This patch correctly marks such latencies as sharedprio and prevents them from being recorded as actual system latency.
--- kernel/trace/latency_hist.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/trace/latency_hist.c +3 -0
@@ -935,6 +935,9 @@ static notrace void probe_wakeup_latency_hist_stop(void *v, goto out; } +if (current->prio == cpu_wakeup_task->prio) +per_cpu (wakeup_sharedprio, cpu) =1 ; +/* * The task we are waiting for is about to be switched to. * Calculate latency and store it in histogram.
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 5/12 slab: Prevent local lock deadlock
In reply to Steven RostedtFrom: Thomas Gleixner <[email protected]>
On RT we avoid the cross cpu function calls and take the per cpu local locks instead. Now the code missed that taking the local lock on the cpu which runs the code must use the proper local lock functions and not a simple spin_lock(). Otherwise it deadlocks later when trying to acquire the local lock with the proper function.
--- mm/slab.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
mm/slab.c +22 -4
@@ -743,8 +743,26 @@ slab_on_each_cpu(void (*func)(void *arg, int this_cpu), void *arg) {unsigned int i; +get_cpu_light ();for_each_online_cpu (i)func (arg, i); +put_cpu_light (); +} + +static void lock_slab_on (unsigned int cpu) +{ +if (cpu ==smp_processor_id ()) +local_lock_irq (slab_lock); +else +local_spin_lock_irq (slab_lock, &per_cpu (slab_lock, cpu).lock); +} + +static void unlock_slab_on (unsigned int cpu) +{ +if (cpu ==smp_processor_id ()) +local_unlock_irq (slab_lock); +else +local_spin_unlock_irq (slab_lock, &per_cpu (slab_lock, cpu).lock); }#endif
@@ -2692,10 +2710,10 @@ static void do_drain(void *arg, int cpu) {LIST_HEAD (tmp); -spin_lock_irq (&per_cpu (slab_lock, cpu).lock); +lock_slab_on (cpu);__do_drain (arg, cpu);list_splice_init (&per_cpu (slab_free_list, cpu), &tmp); -spin_unlock_irq (&per_cpu (slab_lock, cpu).lock); +unlock_slab_on (cpu);free_delayed (&tmp); }#endif
@@ -4163,9 +4181,9 @@ static void do_ccupdate_local(void *info)#else static void do_ccupdate_local (void *info,int cpu) { -spin_lock_irq (&per_cpu (slab_lock, cpu).lock); +lock_slab_on (cpu);__do_ccupdate_local (info, cpu); -spin_unlock_irq (&per_cpu (slab_lock, cpu).lock); +unlock_slab_on (cpu); }#endif
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 6/12 fs, jbd: pull your plug when waiting for space
In reply to Steven RostedtFrom: Mike Galbraith <[email protected]>
With an -rt kernel, and a heavy sync IO load, tasks can jam up on journal locks without unplugging, which can lead to terminal IO starvation. Unplug and schedule when waiting for space.
--- fs/jbd/checkpoint.c | 2 ++ 1 file changed, 2 insertions(+)
fs/jbd/checkpoint.c +2 -0
@@ -129,6 +129,8 @@ void __log_wait_for_space(journal_t *journal)if (journal->j_flags &JFS_ABORT )return ;spin_unlock (&journal->j_state_lock); +if (current->plug) +io_schedule ();mutex_lock (&journal->j_checkpoint_mutex);/*
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 7/12 perf: Make swevent hrtimer run in irq instead of softirq
In reply to Steven RostedtFrom: Yong Zhang <[email protected]>
Otherwise we get a deadlock like below:
[ 1044.042749] BUG: scheduling while atomic: ksoftirqd/21/141/0x00010003 [ 1044.042752] INFO: lockdep is turned off. [ 1044.042754] Modules linked in: [ 1044.042757] Pid: 141, comm: ksoftirqd/21 Tainted: G W 3.4.0-rc2-rt3-23676-ga723175-dirty #29 [ 1044.042759] Call Trace: [ 1044.042761] <IRQ> [<ffffffff8107d8e5>] __schedule_bug+0x65/0x80 [ 1044.042770] [<ffffffff8168978c>] __schedule+0x83c/0xa70 [ 1044.042775] [<ffffffff8106bdd2>] ? prepare_to_wait+0x32/0xb0 [ 1044.042779] [<ffffffff81689a5e>] schedule+0x2e/0xa0 [ 1044.042782] [<ffffffff81071ebd>] hrtimer_wait_for_timer+0x6d/0xb0 [ 1044.042786] [<ffffffff8106bb30>] ? wake_up_bit+0x40/0x40 [ 1044.042790] [<ffffffff81071f20>] hrtimer_cancel+0x20/0x40 [ 1044.042794] [<ffffffff8111da0c>] perf_swevent_cancel_hrtimer+0x3c/0x50 [ 1044.042798] [<ffffffff8111da31>] task_clock_event_stop+0x11/0x40 [ 1044.042802] [<ffffffff8111da6e>] task_clock_event_del+0xe/0x10 [ 1044.042805] [<ffffffff8111c568>] event_sched_out+0x118/0x1d0 [ 1044.042809] [<ffffffff8111c649>] group_sched_out+0x29/0x90 [ 1044.042813] [<ffffffff8111ed7e>] __perf_event_disable+0x18e/0x200 [ 1044.042817] [<ffffffff8111c343>] remote_function+0x63/0x70 [ 1044.042821] [<ffffffff810b0aae>] generic_smp_call_function_single_interrupt+0xce/0x120 [ 1044.042826] [<ffffffff81022bc7>] smp_call_function_single_interrupt+0x27/0x40 [ 1044.042831] [<ffffffff8168d50c>] call_function_single_interrupt+0x6c/0x80 [ 1044.042833] <EOI> [<ffffffff811275b0>] ? perf_event_overflow+0x20/0x20 [ 1044.042840] [<ffffffff8168b970>] ? _raw_spin_unlock_irq+0x30/0x70 [ 1044.042844] [<ffffffff8168b976>] ? _raw_spin_unlock_irq+0x36/0x70 [ 1044.042848] [<ffffffff810702e2>] run_hrtimer_softirq+0xc2/0x200 [ 1044.042853] [<ffffffff811275b0>] ? perf_event_overflow+0x20/0x20 [ 1044.042857] [<ffffffff81045265>] __do_softirq_common+0xf5/0x3a0 [ 1044.042862] [<ffffffff81045c3d>] __thread_do_softirq+0x15d/0x200 [ 1044.042865] [<ffffffff81045dda>] run_ksoftirqd+0xfa/0x210 [ 1044.042869] [<ffffffff81045ce0>] ? __thread_do_softirq+0x200/0x200 [ 1044.042873] [<ffffffff81045ce0>] ? __thread_do_softirq+0x200/0x200 [ 1044.042877] [<ffffffff8106b596>] kthread+0xb6/0xc0 [ 1044.042881] [<ffffffff8168b97b>] ? _raw_spin_unlock_irq+0x3b/0x70 [ 1044.042886] [<ffffffff8168d994>] kernel_thread_helper+0x4/0x10 [ 1044.042889] [<ffffffff8107d98c>] ? finish_task_switch+0x8c/0x110 [ 1044.042894] [<ffffffff8168b97b>] ? _raw_spin_unlock_irq+0x3b/0x70 [ 1044.042897] [<ffffffff8168bd5d>] ? retint_restore_args+0xe/0xe [ 1044.042900] [<ffffffff8106b4e0>] ? kthreadd+0x1e0/0x1e0 [ 1044.042902] [<ffffffff8168d990>] ? gs_change+0xb/0xb
--- kernel/events/core.c | 1 + 1 file changed, 1 insertion(+)
kernel/events/core.c +1 -0
@@ -5403,6 +5403,7 @@ static void perf_swevent_init_hrtimer(struct perf_event *event)hrtimer_init (&hwc->hrtimer,CLOCK_MONOTONIC ,HRTIMER_MODE_REL ); hwc->hrtimer.function = perf_swevent_hrtimer; + hwc->hrtimer.irqsafe =1 ;/* * Since hrtimers have a fixed rate, we can do a static freq->period
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 8/12 cpu/rt: Rework cpu down for PREEMPT_RT
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Bringing a CPU down is a pain with the PREEMPT_RT kernel because tasks can be preempted in many more places than in non-RT. In order to handle per_cpu variables, tasks may be pinned to a CPU for a while, and even sleep. But these tasks need to be off the CPU if that CPU is going down.
Several synchronization methods have been tried, but when stressed they failed. This is a new approach.
A sync_tsk thread is still created and tasks may still block on a lock when the CPU is going down, but how that works is a bit different. When cpu_down() starts, it will create the sync_tsk and wait on it to inform that current tasks that are pinned on the CPU are no longer pinned. But new tasks that are about to be pinned will still be allowed to do so at this time.
Then the notifiers are called. Several notifiers will bring down tasks that will enter these locations. Some of these tasks will take locks of other tasks that are on the CPU. If we don't let those other tasks continue, but make them block until CPU down is done, the tasks that the notifiers are waiting on will never complete as they are waiting for the locks held by the tasks that are blocked.
Thus we still let the task pin the CPU until the notifiers are done. After the notifiers run, we then make new tasks entering the pinned CPU sections grab a mutex and wait. This mutex is now a per CPU mutex in the hotplug_pcp descriptor.
To help things along, a new function in the scheduler code is created called migrate_me(). This function will try to migrate the current task off the CPU this is going down if possible. When the sync_tsk is created, all tasks will then try to migrate off the CPU going down. There are several cases that this wont work, but it helps in most cases.
After the notifiers are called and if a task can't migrate off but enters the pin CPU sections, it will be forced to wait on the hotplug_pcp mutex until the CPU down is complete. Then the scheduler will force the migration anyway.
Also, I found that THREAD_BOUND need to also be accounted for in the pinned CPU, and the migrate_disable no longer treats them special. This helps fix issues with ksoftirqd and workqueue that unbind on CPU down.
--- include/linux/sched.h | 7 ++ kernel/cpu.c | 236 +++++++++++++++++++++++++++++++++++++++++-------- kernel/sched/core.c | 82 ++++++++++++++++- 3 files changed, 285 insertions(+), 40 deletions(-)
include/linux/sched.h +7 -0
@@ -1973,6 +1973,10 @@ extern void do_set_cpus_allowed(struct task_struct *p,extern int set_cpus_allowed_ptr (struct task_struct *p,const struct cpumask *new_mask); +int migrate_me (void ); +void tell_sched_cpu_down_begin (int cpu); +void tell_sched_cpu_down_done (int cpu); +#else static inline void do_set_cpus_allowed (struct task_struct *p,const struct cpumask *new_mask)
@@ -1985,6 +1989,9 @@ static inline int set_cpus_allowed_ptr(struct task_struct *p,return -EINVAL ; return 0; } +static inline int migrate_me (void ) {return 0 ; } +static inline void tell_sched_cpu_down_begin (int cpu) { } +static inline void tell_sched_cpu_down_done (int cpu) { }#endif #ifndef CONFIG_CPUMASK_OFFSTACK
kernel/cpu.c +198 -38
340 lines not on this page · raw message
kernel/sched/core.c +80 -2
100 lines not on this page · raw message
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 9/12 cpu/rt: Fix cpu_hotplug variable initialization
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
The commit "cpu/rt: Rework cpu down for PREEMPT_RT" changed the double meaning of the cpu_hotplug.lock, where it was a spinlock for RT and a mutex for non-RT, to just a mutex for both. But the initialization of the variable was not updated to reflect this change.
--- kernel/cpu.c | 4 ---- 1 file changed, 4 deletions(-)
kernel/cpu.c +0 -4
@@ -54,11 +54,7 @@ static struct {int refcount; } cpu_hotplug = { .active_writer = NULL, -#ifdef CONFIG_PREEMPT_RT_FULL - .lock = __SPIN_LOCK_UNLOCKED(cpu_hotplug.lock), -#else .lock = __MUTEX_INITIALIZER(cpu_hotplug.lock), -#endif .refcount = 0, };
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 10/12 workqueue: Revert workqueue: Fix PF_THREAD_BOUND abuse
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Revert commit
Author: Peter Zijlstra <[email protected]>
Date: Mon Oct 3 12:43:25 2011 +0200
workqueue: Fix PF_THREAD_BOUND abuse
As TREAD_BOUND no longer affects cpu down, and this code introduced a lot of races with taking down a CPU.
--- kernel/workqueue.c | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-)
kernel/workqueue.c +9 -20
@@ -1283,14 +1283,8 @@ __acquires(&gcwq->lock)return false;if (task_cpu (task) == gcwq->cpu &&cpumask_equal (¤t->cpus_allowed, -get_cpu_mask (gcwq->cpu))) { -/* -* Since we're binding to a particular cpu and need to -* stay there for correctness, mark us PF_THREAD_BOUND. -*/ - task->flags |=PF_THREAD_BOUND ; +get_cpu_mask (gcwq->cpu)))return true; - }spin_unlock_irq (&gcwq->lock);/*
@@ -1304,18 +1298,6 @@ __acquires(&gcwq->lock) } } -static void worker_unbind_and_unlock (struct worker *worker) -{ -struct global_cwq *gcwq = worker->gcwq; -struct task_struct *task = worker->task; - -/* -* Its no longer required we're PF_THREAD_BOUND, the work is done. -*/ - task->flags &= ~PF_THREAD_BOUND ; -spin_unlock_irq (&gcwq->lock); -} -static struct worker *alloc_worker (void ) {struct worker *worker;
@@ -1378,9 +1360,15 @@ static struct worker *create_worker(struct global_cwq *gcwq, bool bind)if (IS_ERR (worker->task)) goto fail; +/* +* A rogue worker will become a regular one if CPU comes +* online later on. Make sure every worker has +* PF_THREAD_BOUND set. +*/ if (bind && !on_unbound_cpu)kthread_bind (worker->task, gcwq->cpu);else { + worker->task->flags |=PF_THREAD_BOUND ;if (on_unbound_cpu) worker->flags |=WORKER_UNBOUND ; }
@@ -2057,7 +2045,7 @@ repeat:if (keep_working (gcwq))wake_up_worker (gcwq); -worker_unbind_and_unlock (rescuer); +spin_unlock_irq (&gcwq->lock); }schedule ();
@@ -3007,6 +2995,7 @@ struct workqueue_struct *__alloc_workqueue_key(const char *fmt,if (IS_ERR (rescuer->task)) goto err; + rescuer->task->flags |=PF_THREAD_BOUND ;wake_up_process (rescuer->task); }
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 11/12 workqueue: Revert workqueue: Fix cpuhotplug trainwreck
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
Revert
Author: Peter Zijlstra <[email protected]>
Date: Fri Sep 30 11:57:58 2011 +0200
workqueue: Fix cpuhotplug trainwreck
As TREAD_BOUND no longer affects cpu down, and this code introduced a lot of races with taking down a CPU.
--- include/linux/cpu.h | 6 +- include/linux/workqueue.h | 5 +- kernel/workqueue.c | 561 +++++++++++++++++++++++++++++++++------------ 3 files changed, 415 insertions(+), 157 deletions(-)
include/linux/cpu.h +2 -4
@@ -75,10 +75,8 @@ enum {/* migration should happen before other stuff but after perf */ CPU_PRI_PERF =20 ,CPU_PRI_MIGRATION =10 , - -CPU_PRI_WORKQUEUE_ACTIVE =5 ,/* prepare workqueues for others */ -CPU_PRI_NORMAL =0 , - CPU_PRI_WORKQUEUE_INACTIVE = -5, /* flush workqueues after others */ +/* prepare workqueues for other notifiers */ + CPU_PRI_WORKQUEUE = 5, };#define CPU_ONLINE 0x0002/* CPU (unsigned)v is up */
include/linux/workqueue.h +2 -3
@@ -254,10 +254,9 @@ enum {WQ_MEM_RECLAIM =1 <<3 ,/* may be used for memory reclaim */ WQ_HIGHPRI =1 <<4 ,/* high priority */ WQ_CPU_INTENSIVE =1 <<5 ,/* cpu instensive workqueue */ -WQ_NON_AFFINE =1 <<6 ,/* free to move works around cpus */ -WQ_DRAINING =1 <<7 ,/* internal: workqueue is draining */ -WQ_RESCUER =1 <<8 ,/* internal: workqueue has rescuer */ +WQ_DRAINING =1 <<6 ,/* internal: workqueue is draining */ +WQ_RESCUER =1 <<7 ,/* internal: workqueue has rescuer */ WQ_MAX_ACTIVE =512 ,/* I like 512, better ideas? */ WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */
kernel/workqueue.c +411 -150
722 lines not on this page · raw message
Signature · 1 line
1.7.10.4
Steven Rostedt
maintainerPATCH 12/12 Linux 3.4.4-rt14-rc2
In reply to Steven RostedtFrom: Steven Rostedt <[email protected]>
--- localversion-rt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
localversion-rt +1 -1
@@ -1 +1 @@ --rt13 +-rt14-rc2
Signature · 1 line
1.7.10.4