diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-02-29 09:34:47 +0100 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-02-29 12:21:06 +0100 |
commit | 02d11b73d8133f94f5384bcf80d82bb7df6eff95 (patch) | |
tree | 03a8f17bf2c65260e9f778077cbbbdfe79f3c785 | |
parent | 1f5b31cf66208183133b983dc0ac196663418885 (diff) | |
download | linux-rt-02d11b73d8133f94f5384bcf80d82bb7df6eff95.tar.gz |
[ANNOUNCE] v4.4.3-rt9v4.4.3-rt9-patches
Dear RT folks!
I'm pleased to announce the v4.4.3-rt9 patch set. v4.4.2-rt7 and v4.4.3-rt8
are non-announced updates to incorporate the linux-4.4.y stable tree.
There is one change caused by the 4.4.3 update:
The relaxed handling of dump_stack() on RT has been dropped as there is
actually a potential deadlock lurking around the corner. See: commit
d7ce36924344 upstream. This does not effect the other facilities which
gather stack traces.
RT changes since v4.4.3-rt8:
Clark Williams (1):
rcu/torture: Comment out rcu_bh ops on PREEMPT_RT_FULL
Josh Cartwright (1):
sc16is7xx: Drop bogus use of IRQF_ONESHOT
Mike Galbraith (4):
sched,rt: __always_inline preemptible_lazy()
locking/lglocks: Use preempt_enable/disable_nort() in lg_double_[un]lock
drm,radeon,i915: Use preempt_disable/enable_rt() where recommended
drm,i915: Use local_lock/unlock_irq() in intel_pipe_update_start/end()
Sebastian Andrzej Siewior (1):
kernel: sched: Fix preempt_disable_ip recording for preempt_disable()
Thomas Gleixner (4):
iommu/amd: Use WARN_ON_NORT in __attach_device()
tick/broadcast: Make broadcast hrtimer irqsafe
trace/writeback: Block cgroup path tracing on RT
v4.4.3-rt9
Yang Shi (2):
trace: Use rcuidle version for preemptoff_hist trace point
f2fs: Mutex can't be used by down_write_nest_lock()
Known issues:
- bcache stays disabled
- CPU hotplug is not better than before
- The netlink_release() OOPS, reported by Clark, is still on the
list, but unsolved due to lack of information
The delta patch against 4.4.3-rt8 is appended below and can be found here:
https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/incr/patch-4.4.3-rt8-rt9.patch.xz
You can get this release via the git tree at:
git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git v4.4.3-rt9
The RT patch against 4.4.3 can be found here:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.4/patch-4.4.3-rt9.patch.xz
The split quilt queue is available at:
https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.4/patches-4.4.3-rt9.tar.xz
Enjoy!
tglx
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
14 files changed, 726 insertions, 6 deletions
diff --git a/patches/drmi915_Use_local_lockunlock_irq()_in_intel_pipe_update_startend().patch b/patches/drmi915_Use_local_lockunlock_irq()_in_intel_pipe_update_startend().patch new file mode 100644 index 000000000000..a277bf8ce524 --- /dev/null +++ b/patches/drmi915_Use_local_lockunlock_irq()_in_intel_pipe_update_startend().patch @@ -0,0 +1,112 @@ +Subject: drm,i915: Use local_lock/unlock_irq() in intel_pipe_update_start/end() +From: Mike Galbraith <umgwanakikbuti@gmail.com> +Date: Sat, 27 Feb 2016 09:01:42 +0100 + + +[ 8.014039] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:918 +[ 8.014041] in_atomic(): 0, irqs_disabled(): 1, pid: 78, name: kworker/u4:4 +[ 8.014045] CPU: 1 PID: 78 Comm: kworker/u4:4 Not tainted 4.1.7-rt7 #5 +[ 8.014055] Workqueue: events_unbound async_run_entry_fn +[ 8.014059] 0000000000000000 ffff880037153748 ffffffff815f32c9 0000000000000002 +[ 8.014063] ffff88013a50e380 ffff880037153768 ffffffff815ef075 ffff8800372c06c8 +[ 8.014066] ffff8800372c06c8 ffff880037153778 ffffffff8107c0b3 ffff880037153798 +[ 8.014067] Call Trace: +[ 8.014074] [<ffffffff815f32c9>] dump_stack+0x4a/0x61 +[ 8.014078] [<ffffffff815ef075>] ___might_sleep.part.93+0xe9/0xee +[ 8.014082] [<ffffffff8107c0b3>] ___might_sleep+0x53/0x80 +[ 8.014086] [<ffffffff815f9064>] rt_spin_lock+0x24/0x50 +[ 8.014090] [<ffffffff8109368b>] prepare_to_wait+0x2b/0xa0 +[ 8.014152] [<ffffffffa016c04c>] intel_pipe_update_start+0x17c/0x300 [i915] +[ 8.014156] [<ffffffff81093b40>] ? prepare_to_wait_event+0x120/0x120 +[ 8.014201] [<ffffffffa0158f36>] intel_begin_crtc_commit+0x166/0x1e0 [i915] +[ 8.014215] [<ffffffffa00c806d>] drm_atomic_helper_commit_planes+0x5d/0x1a0 [drm_kms_helper] +[ 8.014260] [<ffffffffa0171e9b>] intel_atomic_commit+0xab/0xf0 [i915] +[ 8.014288] [<ffffffffa00654c7>] drm_atomic_commit+0x37/0x60 [drm] +[ 8.014298] [<ffffffffa00c6fcd>] drm_atomic_helper_plane_set_property+0x8d/0xd0 [drm_kms_helper] +[ 8.014301] [<ffffffff815f77d9>] ? __ww_mutex_lock+0x39/0x40 +[ 8.014319] [<ffffffffa0053b3d>] drm_mode_plane_set_obj_prop+0x2d/0x90 [drm] +[ 8.014328] [<ffffffffa00c8edb>] restore_fbdev_mode+0x6b/0xf0 [drm_kms_helper] +[ 8.014337] [<ffffffffa00cae49>] drm_fb_helper_restore_fbdev_mode_unlocked+0x29/0x80 [drm_kms_helper] +[ 8.014346] [<ffffffffa00caec2>] drm_fb_helper_set_par+0x22/0x50 [drm_kms_helper] +[ 8.014390] [<ffffffffa016dfba>] intel_fbdev_set_par+0x1a/0x60 [i915] +[ 8.014394] [<ffffffff81327dc4>] fbcon_init+0x4f4/0x580 +[ 8.014398] [<ffffffff8139ef4c>] visual_init+0xbc/0x120 +[ 8.014401] [<ffffffff813a1623>] do_bind_con_driver+0x163/0x330 +[ 8.014405] [<ffffffff813a1b2c>] do_take_over_console+0x11c/0x1c0 +[ 8.014408] [<ffffffff813236e3>] do_fbcon_takeover+0x63/0xd0 +[ 8.014410] [<ffffffff81328965>] fbcon_event_notify+0x785/0x8d0 +[ 8.014413] [<ffffffff8107c12d>] ? __might_sleep+0x4d/0x90 +[ 8.014416] [<ffffffff810775fe>] notifier_call_chain+0x4e/0x80 +[ 8.014419] [<ffffffff810779cd>] __blocking_notifier_call_chain+0x4d/0x70 +[ 8.014422] [<ffffffff81077a06>] blocking_notifier_call_chain+0x16/0x20 +[ 8.014425] [<ffffffff8132b48b>] fb_notifier_call_chain+0x1b/0x20 +[ 8.014428] [<ffffffff8132d8fa>] register_framebuffer+0x21a/0x350 +[ 8.014439] [<ffffffffa00cb164>] drm_fb_helper_initial_config+0x274/0x3e0 [drm_kms_helper] +[ 8.014483] [<ffffffffa016f1cb>] intel_fbdev_initial_config+0x1b/0x20 [i915] +[ 8.014486] [<ffffffff8107912c>] async_run_entry_fn+0x4c/0x160 +[ 8.014490] [<ffffffff81070ffa>] process_one_work+0x14a/0x470 +[ 8.014493] [<ffffffff81071489>] worker_thread+0x169/0x4c0 +[ 8.014496] [<ffffffff81071320>] ? process_one_work+0x470/0x470 +[ 8.014499] [<ffffffff81076606>] kthread+0xc6/0xe0 +[ 8.014502] [<ffffffff81070000>] ? queue_work_on+0x80/0x110 +[ 8.014506] [<ffffffff81076540>] ? kthread_worker_fn+0x1c0/0x1c0 + +Signed-off-by: Mike Galbraith <umgwanakikbuti@gmail.com> +Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Cc: linux-rt-users <linux-rt-users@vger.kernel.org> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + drivers/gpu/drm/i915/intel_sprite.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +--- a/drivers/gpu/drm/i915/intel_sprite.c ++++ b/drivers/gpu/drm/i915/intel_sprite.c +@@ -38,6 +38,7 @@ + #include "intel_drv.h" + #include <drm/i915_drm.h> + #include "i915_drv.h" ++#include <linux/locallock.h> + + static bool + format_is_yuv(uint32_t format) +@@ -64,6 +65,8 @@ static int usecs_to_scanlines(const stru + 1000 * adjusted_mode->crtc_htotal); + } + ++static DEFINE_LOCAL_IRQ_LOCK(pipe_update_lock); ++ + /** + * intel_pipe_update_start() - start update of a set of display registers + * @crtc: the crtc of which the registers are going to be updated +@@ -96,7 +99,7 @@ void intel_pipe_update_start(struct inte + min = vblank_start - usecs_to_scanlines(adjusted_mode, 100); + max = vblank_start - 1; + +- local_irq_disable(); ++ local_lock_irq(pipe_update_lock); + + if (min <= 0 || max <= 0) + return; +@@ -126,11 +129,11 @@ void intel_pipe_update_start(struct inte + break; + } + +- local_irq_enable(); ++ local_unlock_irq(pipe_update_lock); + + timeout = schedule_timeout(timeout); + +- local_irq_disable(); ++ local_lock_irq(pipe_update_lock); + } + + finish_wait(wq, &wait); +@@ -164,7 +167,7 @@ void intel_pipe_update_end(struct intel_ + + trace_i915_pipe_update_end(crtc, end_vbl_count, scanline_end); + +- local_irq_enable(); ++ local_unlock_irq(pipe_update_lock); + + if (crtc->debug.start_vbl_count && + crtc->debug.start_vbl_count != end_vbl_count) { diff --git a/patches/drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch b/patches/drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch new file mode 100644 index 000000000000..89fa033e879a --- /dev/null +++ b/patches/drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch @@ -0,0 +1,51 @@ +Subject: drm,radeon,i915: Use preempt_disable/enable_rt() where recommended +From: Mike Galbraith <umgwanakikbuti@gmail.com> +Date: Sat, 27 Feb 2016 08:09:11 +0100 + +DRM folks identified the spots, so use them. + +Signed-off-by: Mike Galbraith <umgwanakikbuti@gmail.com> +Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Cc: linux-rt-users <linux-rt-users@vger.kernel.org> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + drivers/gpu/drm/i915/i915_irq.c | 2 ++ + drivers/gpu/drm/radeon/radeon_display.c | 2 ++ + 2 files changed, 4 insertions(+) + +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -812,6 +812,7 @@ static int i915_get_crtc_scanoutpos(stru + spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); + + /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_disable_rt(); + + /* Get optional system timestamp before query. */ + if (stime) +@@ -863,6 +864,7 @@ static int i915_get_crtc_scanoutpos(stru + *etime = ktime_get(); + + /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_enable_rt(); + + spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); + +--- a/drivers/gpu/drm/radeon/radeon_display.c ++++ b/drivers/gpu/drm/radeon/radeon_display.c +@@ -1849,6 +1849,7 @@ int radeon_get_crtc_scanoutpos(struct dr + struct radeon_device *rdev = dev->dev_private; + + /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_disable_rt(); + + /* Get optional system timestamp before query. */ + if (stime) +@@ -1941,6 +1942,7 @@ int radeon_get_crtc_scanoutpos(struct dr + *etime = ktime_get(); + + /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_enable_rt(); + + /* Decode into vertical and horizontal scanout position. */ + *vpos = position & 0x1fff; diff --git a/patches/f2fs_Mutex_cant_be_used_by_down_write_nest_lock().patch b/patches/f2fs_Mutex_cant_be_used_by_down_write_nest_lock().patch new file mode 100644 index 000000000000..070c842d6c2e --- /dev/null +++ b/patches/f2fs_Mutex_cant_be_used_by_down_write_nest_lock().patch @@ -0,0 +1,66 @@ +Subject: f2fs: Mutex can't be used by down_write_nest_lock() +From: Yang Shi <yang.shi@linaro.org> +Date: Fri, 26 Feb 2016 16:25:25 -0800 + +fsf2_lock_all() calls down_write_nest_lock() to acquire a rw_sem and check +a mutex, but down_write_nest_lock() is designed for two rw_sem accoring to the +comment in include/linux/rwsem.h. And, other than f2fs, it is just called in +mm/mmap.c with two rwsem. + +So, it looks it is used wrongly by f2fs. And, it causes the below compile +warning on -rt kernel too. + +In file included from fs/f2fs/xattr.c:25:0: +fs/f2fs/f2fs.h: In function 'f2fs_lock_all': +fs/f2fs/f2fs.h:962:34: warning: passing argument 2 of 'down_write_nest_lock' from + incompatible pointer type [-Wincompatible-pointer-types] + f2fs_down_write(&sbi->cp_rwsem, &sbi->cp_mutex); + ^ + +The nest annotation was anyway bogus as nested annotations for lockdep are +only required if one nests two locks of the same lock class, which is not the +case here. + +Signed-off-by: Yang Shi <yang.shi@linaro.org> +Cc: cm224.lee@samsung.com +Cc: chao2.yu@samsung.com +Cc: linaro-kernel@lists.linaro.org +Cc: linux-rt-users@vger.kernel.org +Cc: bigeasy@linutronix.de +Cc: rostedt@goodmis.org +Cc: linux-f2fs-devel@lists.sourceforge.net +Cc: linux-fsdevel@vger.kernel.org +Cc: jaegeuk@kernel.org +Link: http://lkml.kernel.org/r/1456532725-4126-1-git-send-email-yang.shi@linaro.org +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + fs/f2fs/f2fs.h | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -24,7 +24,6 @@ + + #ifdef CONFIG_F2FS_CHECK_FS + #define f2fs_bug_on(sbi, condition) BUG_ON(condition) +-#define f2fs_down_write(x, y) down_write_nest_lock(x, y) + #else + #define f2fs_bug_on(sbi, condition) \ + do { \ +@@ -33,7 +32,6 @@ + set_sbi_flag(sbi, SBI_NEED_FSCK); \ + } \ + } while (0) +-#define f2fs_down_write(x, y) down_write(x) + #endif + + /* +@@ -959,7 +957,7 @@ static inline void f2fs_unlock_op(struct + + static inline void f2fs_lock_all(struct f2fs_sb_info *sbi) + { +- f2fs_down_write(&sbi->cp_rwsem, &sbi->cp_mutex); ++ down_write(&sbi->cp_rwsem); + } + + static inline void f2fs_unlock_all(struct f2fs_sb_info *sbi) diff --git a/patches/iommu-amd--Use-WARN_ON_NORT.patch b/patches/iommu-amd--Use-WARN_ON_NORT.patch new file mode 100644 index 000000000000..32dcbd0b94f8 --- /dev/null +++ b/patches/iommu-amd--Use-WARN_ON_NORT.patch @@ -0,0 +1,46 @@ +Subject: iommu/amd: Use WARN_ON_NORT in __attach_device() +From: Thomas Gleixner <tglx@linutronix.de> +Date: Sat, 27 Feb 2016 10:22:23 +0100 + +RT does not disable interrupts here, but the protection is still +correct. Fixup the WARN_ON so it won't yell on RT. + +Note: This WARN_ON is bogus anyway. The real thing this needs to check is that +amd_iommu_devtable_lock is held. + +Reported-by: DIXLOR <dixlor@gmail.com> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + drivers/iommu/amd_iommu.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -1952,10 +1952,10 @@ static int __attach_device(struct iommu_ + int ret; + + /* +- * Must be called with IRQs disabled. Warn here to detect early +- * when its not. ++ * Must be called with IRQs disabled on a non RT kernel. Warn here to ++ * detect early when its not. + */ +- WARN_ON(!irqs_disabled()); ++ WARN_ON_NONRT(!irqs_disabled()); + + /* lock domain */ + spin_lock(&domain->lock); +@@ -2118,10 +2118,10 @@ static void __detach_device(struct iommu + struct protection_domain *domain; + + /* +- * Must be called with IRQs disabled. Warn here to detect early +- * when its not. ++ * Must be called with IRQs disabled on a non RT kernel. Warn here to ++ * detect early when its not. + */ +- WARN_ON(!irqs_disabled()); ++ WARN_ON_NONRT(!irqs_disabled()); + + if (WARN_ON(!dev_data->domain)) + return; diff --git a/patches/kernel-sched-fix-preempt_disable_ip-recodring-for-pr.patch b/patches/kernel-sched-fix-preempt_disable_ip-recodring-for-pr.patch new file mode 100644 index 000000000000..1729d528df3d --- /dev/null +++ b/patches/kernel-sched-fix-preempt_disable_ip-recodring-for-pr.patch @@ -0,0 +1,106 @@ +From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Date: Thu, 11 Feb 2016 22:06:28 +0100 +Subject: kernel: sched: Fix preempt_disable_ip recodring for preempt_disable() + +preempt_disable() invokes preempt_count_add() which saves the caller in +current->preempt_disable_ip. It uses CALLER_ADDR1 which does not look for its +caller but for the parent of the caller. Which means we get the correct caller +for something like spin_lock() unless the architectures inlines those +invocations. It is always wrong for preempt_disable() or local_bh_disable(). + +This patch makes the function get_parent_ip() which tries CALLER_ADDR0,1,2 if +the former is a locking function. This seems to record the preempt_disable() +caller properly for preempt_disable() itself as well as for get_cpu_var() or +local_bh_disable(). + +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +--- + include/linux/ftrace.h | 12 ++++++++++++ + include/linux/sched.h | 2 -- + kernel/sched/core.c | 14 ++------------ + kernel/softirq.c | 4 ++-- + 4 files changed, 16 insertions(+), 16 deletions(-) + +--- a/include/linux/ftrace.h ++++ b/include/linux/ftrace.h +@@ -694,6 +694,18 @@ static inline void __ftrace_enabled_rest + #define CALLER_ADDR5 ((unsigned long)ftrace_return_address(5)) + #define CALLER_ADDR6 ((unsigned long)ftrace_return_address(6)) + ++static inline unsigned long get_lock_parent_ip(void) ++{ ++ unsigned long addr = CALLER_ADDR0; ++ ++ if (!in_lock_functions(addr)) ++ return addr; ++ addr = CALLER_ADDR1; ++ if (!in_lock_functions(addr)) ++ return addr; ++ return CALLER_ADDR2; ++} ++ + #ifdef CONFIG_IRQSOFF_TRACER + extern void time_hardirqs_on(unsigned long a0, unsigned long a1); + extern void time_hardirqs_off(unsigned long a0, unsigned long a1); +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -183,8 +183,6 @@ extern void update_cpu_load_nohz(void); + static inline void update_cpu_load_nohz(void) { } + #endif + +-extern unsigned long get_parent_ip(unsigned long addr); +- + extern void dump_cpu_task(int cpu); + + struct seq_file; +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -3039,16 +3039,6 @@ u64 scheduler_tick_max_deferment(void) + } + #endif + +-notrace unsigned long get_parent_ip(unsigned long addr) +-{ +- if (in_lock_functions(addr)) { +- addr = CALLER_ADDR2; +- if (in_lock_functions(addr)) +- addr = CALLER_ADDR3; +- } +- return addr; +-} +- + #if defined(CONFIG_PREEMPT) && (defined(CONFIG_DEBUG_PREEMPT) || \ + defined(CONFIG_PREEMPT_TRACER)) + +@@ -3070,7 +3060,7 @@ void preempt_count_add(int val) + PREEMPT_MASK - 10); + #endif + if (preempt_count() == val) { +- unsigned long ip = get_parent_ip(CALLER_ADDR1); ++ unsigned long ip = get_lock_parent_ip(); + #ifdef CONFIG_DEBUG_PREEMPT + current->preempt_disable_ip = ip; + #endif +@@ -3097,7 +3087,7 @@ void preempt_count_sub(int val) + #endif + + if (preempt_count() == val) +- trace_preempt_on(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1)); ++ trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip()); + __preempt_count_sub(val); + } + EXPORT_SYMBOL(preempt_count_sub); +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -287,9 +287,9 @@ void __local_bh_disable_ip(unsigned long + + if (preempt_count() == cnt) { + #ifdef CONFIG_DEBUG_PREEMPT +- current->preempt_disable_ip = get_parent_ip(CALLER_ADDR1); ++ current->preempt_disable_ip = get_lock_parent_ip(); + #endif +- trace_preempt_off(CALLER_ADDR0, get_parent_ip(CALLER_ADDR1)); ++ trace_preempt_off(CALLER_ADDR0, get_lock_parent_ip()); + } + } + EXPORT_SYMBOL(__local_bh_disable_ip); diff --git a/patches/localversion.patch b/patches/localversion.patch index 2f21b4400748..cc6efb1dc585 100644 --- a/patches/localversion.patch +++ b/patches/localversion.patch @@ -1,4 +1,4 @@ -Subject: v4.4.2-rt7 +Subject: v4.4.3-rt9 From: Thomas Gleixner <tglx@linutronix.de> Date: Fri, 08 Jul 2011 20:25:16 +0200 @@ -10,4 +10,4 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- /dev/null +++ b/localversion-rt @@ -0,0 +1 @@ -+-rt8 ++-rt9 diff --git a/patches/lockinglglocks_Use_preempt_enabledisable_nort()_in_lg_double_locklg_double_unlock.patch b/patches/lockinglglocks_Use_preempt_enabledisable_nort()_in_lg_double_locklg_double_unlock.patch new file mode 100644 index 000000000000..8c13841b08f4 --- /dev/null +++ b/patches/lockinglglocks_Use_preempt_enabledisable_nort()_in_lg_double_locklg_double_unlock.patch @@ -0,0 +1,34 @@ +Subject: locking/lglocks: Use preempt_enable/disable_nort() in lg_double_[un]lock +From: Mike Galbraith <umgwanakikbuti@gmail.com> +Date: Sat, 27 Feb 2016 08:34:43 +0100 + +Let's not do that when snagging an rtmutex. + +Signed-off-by: Mike Galbraith <umgwanakilbuti@gmail.com> +Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Cc: linux-rt-users <linux-rt-users@vger.kernel.org> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + kernel/locking/lglock.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/kernel/locking/lglock.c ++++ b/kernel/locking/lglock.c +@@ -86,7 +86,7 @@ void lg_double_lock(struct lglock *lg, i + if (cpu2 < cpu1) + swap(cpu1, cpu2); + +- preempt_disable(); ++ preempt_disable_nort(); + lock_acquire_shared(&lg->lock_dep_map, 0, 0, NULL, _RET_IP_); + lg_do_lock(per_cpu_ptr(lg->lock, cpu1)); + lg_do_lock(per_cpu_ptr(lg->lock, cpu2)); +@@ -97,7 +97,7 @@ void lg_double_unlock(struct lglock *lg, + lock_release(&lg->lock_dep_map, 1, _RET_IP_); + lg_do_unlock(per_cpu_ptr(lg->lock, cpu1)); + lg_do_unlock(per_cpu_ptr(lg->lock, cpu2)); +- preempt_enable(); ++ preempt_enable_nort(); + } + + void lg_global_lock(struct lglock *lg) diff --git a/patches/preempt-lazy-check-preempt_schedule.patch b/patches/preempt-lazy-check-preempt_schedule.patch index cd3f869cdfd5..04036a9f4fda 100644 --- a/patches/preempt-lazy-check-preempt_schedule.patch +++ b/patches/preempt-lazy-check-preempt_schedule.patch @@ -13,7 +13,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -3460,6 +3460,30 @@ static void __sched notrace preempt_sche +@@ -3450,6 +3450,30 @@ static void __sched notrace preempt_sche } while (need_resched()); } @@ -23,7 +23,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> + * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as + * preempt_lazy_count counter >0. + */ -+static int preemptible_lazy(void) ++static __always_inline int preemptible_lazy(void) +{ + if (test_thread_flag(TIF_NEED_RESCHED)) + return 1; @@ -44,7 +44,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> #ifdef CONFIG_PREEMPT /* * this is the entry point to schedule() from in-kernel preemption -@@ -3474,6 +3498,8 @@ asmlinkage __visible void __sched notrac +@@ -3464,6 +3488,8 @@ asmlinkage __visible void __sched notrac */ if (likely(!preemptible())) return; @@ -53,7 +53,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> preempt_schedule_common(); } -@@ -3500,15 +3526,9 @@ asmlinkage __visible void __sched notrac +@@ -3490,15 +3516,9 @@ asmlinkage __visible void __sched notrac if (likely(!preemptible())) return; diff --git a/patches/rcutorture-comment-out-rcu_bh-ops-on-PREEMPT_RT_FULL.patch b/patches/rcutorture-comment-out-rcu_bh-ops-on-PREEMPT_RT_FULL.patch new file mode 100644 index 000000000000..9270dcbf6f30 --- /dev/null +++ b/patches/rcutorture-comment-out-rcu_bh-ops-on-PREEMPT_RT_FULL.patch @@ -0,0 +1,36 @@ +From: Clark Williams <williams@redhat.com> +Date: Fri, 26 Feb 2016 13:19:20 -0600 +Subject: rcu/torture: Comment out rcu_bh ops on PREEMPT_RT_FULL + +RT has dropped support of rcu_bh, comment out in rcutorture. + +Signed-off-by: Clark Williams <williams@redhat.com> +Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + kernel/rcu/rcutorture.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/kernel/rcu/rcutorture.c ++++ b/kernel/rcu/rcutorture.c +@@ -390,6 +390,7 @@ static struct rcu_torture_ops rcu_ops = + .name = "rcu" + }; + ++#ifndef CONFIG_PREEMPT_RT_FULL + /* + * Definitions for rcu_bh torture testing. + */ +@@ -429,6 +430,12 @@ static struct rcu_torture_ops rcu_bh_ops + .name = "rcu_bh" + }; + ++#else ++static struct rcu_torture_ops rcu_bh_ops = { ++ .ttype = INVALID_RCU_FLAVOR, ++}; ++#endif ++ + /* + * Don't even think about trying any of these in real life!!! + * The names includes "busted", and they really means it! diff --git a/patches/sc16is7xx_Drop_bogus_use_of_IRQF_ONESHOT.patch b/patches/sc16is7xx_Drop_bogus_use_of_IRQF_ONESHOT.patch new file mode 100644 index 000000000000..b87293766678 --- /dev/null +++ b/patches/sc16is7xx_Drop_bogus_use_of_IRQF_ONESHOT.patch @@ -0,0 +1,54 @@ +Subject: sc16is7xx: Drop bogus use of IRQF_ONESHOT +From: Josh Cartwright <joshc@ni.com> +Date: Thu, 18 Feb 2016 11:26:12 -0600 + +The use of IRQF_ONESHOT when registering an interrupt handler with +request_irq() is non-sensical. + +Not only that, it also prevents the handler from being threaded when it +otherwise should be w/ IRQ_FORCED_THREADING is enabled. This causes the +following deadlock observed by Sean Nyekjaer on -rt: + +Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM +[..] + rt_spin_lock_slowlock from (queue_kthread_work+0x18/0x74) + queue_kthread_work) from (sc16is7xx_irq+0x10/0x18 [sc16is7xx]) + sc16is7xx_irq [sc16is7xx]) from (handle_irq_event_percpu+0x70/0x158) + handle_irq_event_percpu) from (handle_irq_event+0x68/0xa8) + handle_irq_event) from (handle_level_irq+0x10c/0x184) + handle_level_irq) from (generic_handle_irq+0x2c/0x3c) + generic_handle_irq) from (mxc_gpio_irq_handler+0x3c/0x108) + mxc_gpio_irq_handler) from (mx3_gpio_irq_handler+0x80/0xcc) + mx3_gpio_irq_handler) from (generic_handle_irq+0x2c/0x3c) + generic_handle_irq) from (__handle_domain_irq+0x7c/0xe8) + __handle_domain_irq) from (gic_handle_irq+0x24/0x5c) + gic_handle_irq) from (__irq_svc+0x40/0x88) + (__irq_svc) from (rt_spin_unlock+0x1c/0x68) + (rt_spin_unlock) from (kthread_worker_fn+0x104/0x17c) + (kthread_worker_fn) from (kthread+0xd0/0xe8) + (kthread) from (ret_from_fork+0x14/0x2c) + +Fixes: 9e6f4ca3e567 ("sc16is7xx: use kthread_worker for tx_work and irq") +Reported-by: Sean Nyekjaer <sean.nyekjaer@prevas.dk> +Signed-off-by: Josh Cartwright <joshc@ni.com> +Cc: linux-rt-users@vger.kernel.org +Cc: Jakub Kicinski <moorray3@wp.pl> +Cc: stable@vger.kernel.org +Cc: linux-serial@vger.kernel.org +Link: http://lkml.kernel.org/r/1455816372-13989-1-git-send-email-joshc@ni.com +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + drivers/tty/serial/sc16is7xx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/tty/serial/sc16is7xx.c ++++ b/drivers/tty/serial/sc16is7xx.c +@@ -1230,7 +1230,7 @@ static int sc16is7xx_probe(struct device + + /* Setup interrupt */ + ret = devm_request_irq(dev, irq, sc16is7xx_irq, +- IRQF_ONESHOT | flags, dev_name(dev), s); ++ flags, dev_name(dev), s); + if (!ret) + return 0; + diff --git a/patches/series b/patches/series index d74c34bd5902..1f378249fdc4 100644 --- a/patches/series +++ b/patches/series @@ -20,6 +20,8 @@ sched-use-tsk_cpus_allowed-instead-of-accessing-cpus.patch sched-provide-a-tsk_nr_cpus_allowed-helper.patch drivers-cpuidle-coupled-fix-warning-cpuidle_coupled_.patch drivers-media-vsp1_video-fix-compile-error.patch +sc16is7xx_Drop_bogus_use_of_IRQF_ONESHOT.patch +f2fs_Mutex_cant_be_used_by_down_write_nest_lock().patch ############################################################ # Stuff which needs addressing upstream, but requires more @@ -31,6 +33,11 @@ rfc-arm-smp-__cpu_disable-fix-sleeping-function-called-from-invalid-context.patc # Stuff broken upstream, need to be sent ############################################################ rtmutex--Handle-non-enqueued-waiters-gracefully +kernel-sched-fix-preempt_disable_ip-recodring-for-pr.patch + +# Wants a different fix for upstream +iommu-amd--Use-WARN_ON_NORT.patch +trace-writeback--Block-cgroup-path-tracing-on-RT.patch ############################################################ # Submitted on LKML @@ -144,6 +151,7 @@ latencyhist-disable-jump-labels.patch latency-hist.patch latency_hist-update-sched_wakeup-probe.patch trace-latency-hist-Consider-new-argument-when-probin.patch +trace_Use_rcuidle_version_for_preemptoff_hist_trace_point.patch # HW LATENCY DETECTOR - this really wants a rewrite hwlatdetect.patch @@ -263,6 +271,7 @@ hrtimer-fixup-hrtimer-callback-changes-for-preempt-r.patch sched-deadline-dl_task_timer-has-to-be-irqsafe.patch timer-fd-avoid-live-lock.patch hrtimer-Move-schedule_work-call-to-helper-thread.patch +tick-broadcast--Make-hrtimer-irqsafe.patch # POSIX-CPU-TIMERS posix-timers-thread-posix-cpu-timers-on-rt.patch @@ -340,9 +349,11 @@ rcu-merge-rcu-bh-into-rcu-preempt-for-rt.patch patch-to-introduce-rcu-bh-qs-where-safe-from-softirq.patch rcutree-rcu_bh_qs-disable-irq-while-calling-rcu_pree.patch rcu-disable-more-spots-of-rcu_bh.patch +rcutorture-comment-out-rcu_bh-ops-on-PREEMPT_RT_FULL.patch # LGLOCKS - lovely lglocks-rt.patch +lockinglglocks_Use_preempt_enabledisable_nort()_in_lg_double_locklg_double_unlock.patch # STOP machine (depend on lglock & rtmutex) stomp-machine-create-lg_global_trylock_relax-primiti.patch @@ -565,6 +576,8 @@ cpufreq-drop-K8-s-driver-from-beeing-selected.patch i915_compile_fix.patch drm-i915-drop-trace_i915_gem_ring_dispatch-onrt.patch i915-bogus-warning-from-i915-when-running-on-PREEMPT.patch +drmradeoni915_Use_preempt_disableenable_rt()_where_recommended.patch +drmi915_Use_local_lockunlock_irq()_in_intel_pipe_update_startend().patch # CGROUPS cgroups-use-simple-wait-in-css_release.patch diff --git a/patches/tick-broadcast--Make-hrtimer-irqsafe.patch b/patches/tick-broadcast--Make-hrtimer-irqsafe.patch new file mode 100644 index 000000000000..1123a4de5e43 --- /dev/null +++ b/patches/tick-broadcast--Make-hrtimer-irqsafe.patch @@ -0,0 +1,57 @@ +Subject: tick/broadcast: Make broadcast hrtimer irqsafe +From: Thomas Gleixner <tglx@linutronix.de> +Date: Sat, 27 Feb 2016 10:47:10 +0100 + +Otherwise we end up with the following: + +|================================= +|[ INFO: inconsistent lock state ] +|4.4.2-rt7+ #5 Not tainted +|--------------------------------- +|inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage. +|ktimersoftd/0/4 [HC0[0]:SC0[0]:HE1:SE1] takes: +| (tick_broadcast_lock){?.....}, at: [<ffffffc000150db4>] tick_handle_oneshot_broadcast+0x58/0x27c +|{IN-HARDIRQ-W} state was registered at: +| [<ffffffc000118198>] mark_lock+0x19c/0x6a0 +| [<ffffffc000119728>] __lock_acquire+0xb1c/0x2100 +| [<ffffffc00011b560>] lock_acquire+0xf8/0x230 +| [<ffffffc00061bf08>] _raw_spin_lock_irqsave+0x50/0x68 +| [<ffffffc000152188>] tick_broadcast_switch_to_oneshot+0x20/0x60 +| [<ffffffc0001529f4>] tick_switch_to_oneshot+0x64/0xd8 +| [<ffffffc000152b00>] tick_init_highres+0x1c/0x24 +| [<ffffffc000141e58>] hrtimer_run_queues+0x78/0x100 +| [<ffffffc00013f804>] update_process_times+0x38/0x74 +| [<ffffffc00014fc5c>] tick_periodic+0x60/0x140 +| [<ffffffc00014fd68>] tick_handle_periodic+0x2c/0x94 +| [<ffffffc00052b878>] arch_timer_handler_phys+0x3c/0x48 +| [<ffffffc00012d078>] handle_percpu_devid_irq+0x100/0x390 +| [<ffffffc000127f34>] generic_handle_irq+0x34/0x4c +| [<ffffffc000128300>] __handle_domain_irq+0x90/0xf8 +| [<ffffffc000082554>] gic_handle_irq+0x5c/0xa4 +| [<ffffffc0000855ac>] el1_irq+0x6c/0xec +| [<ffffffc000112bec>] default_idle_call+0x2c/0x44 +| [<ffffffc000113058>] cpu_startup_entry+0x3cc/0x410 +| [<ffffffc0006169f8>] rest_init+0x158/0x168 +| [<ffffffc000888954>] start_kernel+0x3a0/0x3b4 +| [<0000000080621000>] 0x80621000 +|irq event stamp: 18723 +|hardirqs last enabled at (18723): [<ffffffc00061c188>] _raw_spin_unlock_irq+0x38/0x80 +|hardirqs last disabled at (18722): [<ffffffc000140a4c>] run_hrtimer_softirq+0x2c/0x2f4 +|softirqs last enabled at (0): [<ffffffc0000c4744>] copy_process.isra.50+0x300/0x16d4 +|softirqs last disabled at (0): [< (null)>] (null) + +Reported-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + kernel/time/tick-broadcast-hrtimer.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/kernel/time/tick-broadcast-hrtimer.c ++++ b/kernel/time/tick-broadcast-hrtimer.c +@@ -106,5 +106,6 @@ void tick_setup_hrtimer_broadcast(void) + { + hrtimer_init(&bctimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); + bctimer.function = bc_handler; ++ bctimer.irqsafe = true; + clockevents_register_device(&ce_broadcast_hrtimer); + } diff --git a/patches/trace-writeback--Block-cgroup-path-tracing-on-RT.patch b/patches/trace-writeback--Block-cgroup-path-tracing-on-RT.patch new file mode 100644 index 000000000000..d3c45f35b1dd --- /dev/null +++ b/patches/trace-writeback--Block-cgroup-path-tracing-on-RT.patch @@ -0,0 +1,55 @@ +Subject: trace/writeback: Block cgroup path tracing on RT +From: Thomas Gleixner <tglx@linutronix.de> +Date: Sun, 28 Feb 2016 15:14:43 +0100 + +Yang reported that with CGROUP_WRITEBACK enabled the tracer triggers the +following backtrace: + +BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:930 +in_atomic(): 1, irqs_disabled(): 0, pid: 625, name: kworker/u16:3 +INFO: lockdep is turned off. +Preemption disabled at:[<ffffffc000374a5c>] wb_writeback+0xec/0x830 + +CPU: 7 PID: 625 Comm: kworker/u16:3 Not tainted 4.4.1-rt5 #20 +Hardware name: Freescale Layerscape 2085a RDB Board (DT) +Workqueue: writeback wb_workfn (flush-7:0) +Call trace: +[<ffffffc00008d708>] dump_backtrace+0x0/0x200 +[<ffffffc00008d92c>] show_stack+0x24/0x30 +[<ffffffc0007b0f40>] dump_stack+0x88/0xa8 +[<ffffffc000127d74>] ___might_sleep+0x2ec/0x300 +[<ffffffc000d5d550>] rt_spin_lock+0x38/0xb8 +[<ffffffc0003e0548>] kernfs_path_len+0x30/0x90 +[<ffffffc00036b360>] trace_event_raw_event_writeback_work_class+0xe8/0x2e8 +[<ffffffc000374f90>] wb_writeback+0x620/0x830 +[<ffffffc000376224>] wb_workfn+0x61c/0x950 +[<ffffffc000110adc>] process_one_work+0x3ac/0xb30 +[<ffffffc0001112fc>] worker_thread+0x9c/0x7a8 +[<ffffffc00011a9e8>] kthread+0x190/0x1b0 +[<ffffffc000086ca0>] ret_from_fork+0x10/0x30 + +Yang proposed to provide an unlocked function for accessing the cgroup path, +but that'd involve synchronize_sched() in a syscall, which is not desired +either. There was some discussion about using the inode number or the cgroup +id, but so far we have no working solution. + +Disable the CGROUP_WRITEBACK path tracing for now when RT is enabled. + +Reported-by: Yang Shi <yang.shi@linaro.org> +Link: http://lkml.kernel.org/r/1456528481-15936-1-git-send-email-yang.shi@linaro.org +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- + include/trace/events/writeback.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/include/trace/events/writeback.h ++++ b/include/trace/events/writeback.h +@@ -132,7 +132,7 @@ DEFINE_EVENT(writeback_dirty_inode_templ + ); + + #ifdef CREATE_TRACE_POINTS +-#ifdef CONFIG_CGROUP_WRITEBACK ++#if defined(CONFIG_CGROUP_WRITEBACK) && !defined(CONFIG_PREEMPT_RT_FULL) + + static inline size_t __trace_wb_cgroup_size(struct bdi_writeback *wb) + { diff --git a/patches/trace_Use_rcuidle_version_for_preemptoff_hist_trace_point.patch b/patches/trace_Use_rcuidle_version_for_preemptoff_hist_trace_point.patch new file mode 100644 index 000000000000..cc2e0deed35a --- /dev/null +++ b/patches/trace_Use_rcuidle_version_for_preemptoff_hist_trace_point.patch @@ -0,0 +1,90 @@ +Subject: trace: Use rcuidle version for preemptoff_hist trace point +From: Yang Shi <yang.shi@windriver.com> +Date: Tue, 23 Feb 2016 13:23:23 -0800 + +When running -rt kernel with both PREEMPT_OFF_HIST and LOCKDEP enabled, +the below error is reported: + + [ INFO: suspicious RCU usage. ] + 4.4.1-rt6 #1 Not tainted + include/trace/events/hist.h:31 suspicious rcu_dereference_check() usage! + + other info that might help us debug this: + + RCU used illegally from idle CPU! + rcu_scheduler_active = 1, debug_locks = 0 + RCU used illegally from extended quiescent state! + no locks held by swapper/0/0. + + stack backtrace: + CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.4.1-rt6-WR8.0.0.0_standard #1 + Stack : 0000000000000006 0000000000000000 ffffffff81ca8c38 ffffffff81c8fc80 + ffffffff811bdd68 ffffffff81cb0000 0000000000000000 ffffffff81cb0000 + 0000000000000000 0000000000000000 0000000000000004 0000000000000000 + 0000000000000004 ffffffff811bdf50 0000000000000000 ffffffff82b60000 + 0000000000000000 ffffffff812897ac ffffffff819f0000 000000000000000b + ffffffff811be460 ffffffff81b7c588 ffffffff81c8fc80 0000000000000000 + 0000000000000000 ffffffff81ec7f88 ffffffff81d70000 ffffffff81b70000 + ffffffff81c90000 ffffffff81c3fb00 ffffffff81c3fc28 ffffffff815e6f98 + 0000000000000000 ffffffff81c8fa87 ffffffff81b70958 ffffffff811bf2c4 + 0707fe32e8d60ca5 ffffffff81126d60 0000000000000000 0000000000000000 + ... + Call Trace: + [<ffffffff81126d60>] show_stack+0xe8/0x108 + [<ffffffff815e6f98>] dump_stack+0x88/0xb0 + [<ffffffff8124b88c>] time_hardirqs_off+0x204/0x300 + [<ffffffff811aa5dc>] trace_hardirqs_off_caller+0x24/0xe8 + [<ffffffff811a4ec4>] cpu_startup_entry+0x39c/0x508 + [<ffffffff81d7dc68>] start_kernel+0x584/0x5a0 + +Replace regular trace_preemptoff_hist to rcuidle version to avoid the error. + +Signed-off-by: Yang Shi <yang.shi@windriver.com> +Cc: bigeasy@linutronix.de +Cc: rostedt@goodmis.org +Cc: linux-rt-users@vger.kernel.org +Link: http://lkml.kernel.org/r/1456262603-10075-1-git-send-email-yang.shi@windriver.com +Signed-off-by: Thomas Gleixner <tglx@linutronix.de> +--- +I recall the rcuidle version is used by 4.1-rt, but not sure why it is dropped +in 4.4-rt. It looks such fix is still needed. + + kernel/trace/trace_irqsoff.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/kernel/trace/trace_irqsoff.c ++++ b/kernel/trace/trace_irqsoff.c +@@ -421,13 +421,13 @@ void start_critical_timings(void) + { + if (preempt_trace() || irq_trace()) + start_critical_timing(CALLER_ADDR0, CALLER_ADDR1); +- trace_preemptirqsoff_hist(TRACE_START, 1); ++ trace_preemptirqsoff_hist_rcuidle(TRACE_START, 1); + } + EXPORT_SYMBOL_GPL(start_critical_timings); + + void stop_critical_timings(void) + { +- trace_preemptirqsoff_hist(TRACE_STOP, 0); ++ trace_preemptirqsoff_hist_rcuidle(TRACE_STOP, 0); + if (preempt_trace() || irq_trace()) + stop_critical_timing(CALLER_ADDR0, CALLER_ADDR1); + } +@@ -437,7 +437,7 @@ EXPORT_SYMBOL_GPL(stop_critical_timings) + #ifdef CONFIG_PROVE_LOCKING + void time_hardirqs_on(unsigned long a0, unsigned long a1) + { +- trace_preemptirqsoff_hist(IRQS_ON, 0); ++ trace_preemptirqsoff_hist_rcuidle(IRQS_ON, 0); + if (!preempt_trace() && irq_trace()) + stop_critical_timing(a0, a1); + } +@@ -446,7 +446,7 @@ void time_hardirqs_off(unsigned long a0, + { + if (!preempt_trace() && irq_trace()) + start_critical_timing(a0, a1); +- trace_preemptirqsoff_hist(IRQS_OFF, 1); ++ trace_preemptirqsoff_hist_rcuidle(IRQS_OFF, 1); + } + + #else /* !CONFIG_PROVE_LOCKING */ |