4.14.137-rt65
Subsystems (15)
Hello RT Folks!
I'm pleased to announce the 4.14.137-rt65 stable release.
You can get this release via the git tree at:
git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git
branch: v4.14-rt
Head SHA1: 99fb7f1893d07e9ff67f78488cda74a2be903213
Or to build 4.14.137-rt65 directly, the following patches should be applied:
https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.tar.xz
https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.14.137.xz
https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.137-rt65.patch.xz
You can also build from 4.14.137-rt64 by applying the incremental patch:
https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/incr/patch-4.14.137-rt64-rt65.patch.xz
Enjoy!
Tom
Changes from v4.14.137-rt64:
---
Corey Minyard (1):
sched/completion: Fix a lockup in wait_for_completion()
Luis Claudio R. Goncalves (1):
mm/zswap: Do not disable preemption in zswap_frontswap_store()
Sebastian Andrzej Siewior (13):
kthread: add a global worker thread.
genirq: Do not invoke the affinity callback via a workqueue on RT
genirq: Handle missing work_struct in irq_set_affinity_notifier() locking/rwsem: Rename rwsem_rt.h to rwsem-rt.h
locking/lockdep: Don't complain about incorrect name for no validate class
arm: imx6: cpuidle: Use raw_spinlock_t
rcu: Don't allow to change rcu_normal_after_boot on RT sched/core: Drop a preempt_disable_rt() statement
Revert "futex: Ensure lock/unlock symetry versus pi_lock and hash bucket lock" Revert "futex: Fix bug on when a requeued RT task times out" Revert "rtmutex: Handle the various new futex race conditions" Revert "futex: workaround migrate_disable/enable in different context"
futex: Make the futex_hash_bucket lock raw
Thomas Gleixner (1):
futex: Delay deallocation of pi_state
Tom Zanussi (2):
kthread: Use __RAW_SPIN_LOCK_UNLOCK to initialize kthread_worker lock Linux 4.14.137-rt65
kbuild test robot (1):
pci/switchtec: fix stream_open.cocci warnings
---arch/arm/mach-imx/cpuidle-imx6q.c | 10 +-
drivers/block/loop.c | 2 +-
drivers/pci/switch/switchtec.c | 2 +-
drivers/spi/spi-rockchip.c | 1 +
include/linux/blk-cgroup.h | 1 +
include/linux/interrupt.h | 5 +-
include/linux/kthread-cgroup.h | 17 +++
include/linux/kthread.h | 10 +-
include/linux/{rwsem_rt.h => rwsem-rt.h} | 0
include/linux/rwsem.h | 2 +-
init/main.c | 1 +
kernel/futex.c | 232 +++++++++++++------------------
kernel/irq/manage.c | 23 +--
kernel/kthread.c | 13 ++
kernel/locking/lockdep.c | 3 +-
kernel/locking/rtmutex.c | 65 +--------
kernel/locking/rtmutex_common.h | 3 -
kernel/rcu/update.c | 2 +
kernel/sched/completion.c | 2 +-
kernel/sched/core.c | 9 +-
localversion-rt | 2 +-
mm/zswap.c | 12 +-
22 files changed, 179 insertions(+), 238 deletions(-)---
arch/arm/mach-imx/cpuidle-imx6q.c +5 -5
@@ -17,22 +17,22 @@#include "hardware.h" static int num_idle_cpus =0 ; -static DEFINE_SPINLOCK (cpuidle_lock); +static DEFINE_RAW_SPINLOCK (cpuidle_lock);static int imx6q_enter_wait (struct cpuidle_device *dev,struct cpuidle_driver *drv,int index) { -spin_lock (&cpuidle_lock); +raw_spin_lock (&cpuidle_lock);if (++num_idle_cpus ==num_online_cpus ())imx6_set_lpm (WAIT_UNCLOCKED ); -spin_unlock (&cpuidle_lock); +raw_spin_unlock (&cpuidle_lock);cpu_do_idle (); -spin_lock (&cpuidle_lock); +raw_spin_lock (&cpuidle_lock);if (num_idle_cpus-- ==num_online_cpus ())imx6_set_lpm (WAIT_CLOCKED ); -spin_unlock (&cpuidle_lock); +raw_spin_unlock (&cpuidle_lock);return index; }
drivers/block/loop.c +1 -1
@@ -70,7 +70,7 @@#include <linux/writeback.h> #include <linux/completion.h> #include <linux/highmem.h> -#include <linux/kthread.h> +#include <linux/kthread-cgroup.h> #include <linux/splice.h> #include <linux/sysfs.h> #include <linux/miscdevice.h>
drivers/pci/switch/switchtec.c +1 -1
@@ -625,7 +625,7 @@ static int switchtec_dev_open(struct inode *inode, struct file *filp)return PTR_ERR (stuser); filp->private_data = stuser; -nonseekable_open (inode, filp); +stream_open (inode, filp);dev_dbg (&stdev->dev,"%s: %p\n" , __func__, stuser);
drivers/spi/spi-rockchip.c +1 -0
@@ -22,6 +22,7 @@#include <linux/spi/spi.h> #include <linux/pm_runtime.h> #include <linux/scatterlist.h> +#include <linux/interrupt.h> #define DRIVER_NAME "rockchip-spi"
include/linux/blk-cgroup.h +1 -0
@@ -20,6 +20,7 @@#include <linux/radix-tree.h> #include <linux/blkdev.h> #include <linux/atomic.h> +#include <linux/kthread-cgroup.h> /* percpu_counter batch for blkg_[rw]stats, per-cpu drift doesn't matter */ #define BLKG_STAT_CPU_BATCH (INT_MAX / 2)
include/linux/interrupt.h +2 -3
@@ -15,7 +15,7 @@#include <linux/hrtimer.h> #include <linux/kref.h> #include <linux/workqueue.h> -#include <linux/swork.h> +#include <linux/kthread.h> #include <linux/atomic.h> #include <asm/ptrace.h>
@@ -230,7 +230,6 @@ extern void resume_device_irqs(void);* struct irq_affinity_notify - context for notification of IRQ affinity changes * @irq: Interrupt to which notification applies * @kref: Reference count, for internal use -* @swork: Swork item, for internal use * @work: Work item, for internal use * @notify: Function to be called on change. This will be * called in process context.
@@ -243,7 +242,7 @@ struct irq_affinity_notify {unsigned int irq;struct kref kref;#ifdef CONFIG_PREEMPT_RT_BASE -struct swork_event swork; +struct kthread_work work;#else struct work_struct work;#endif
include/linux/kthread-cgroup.h new file +17 -0
@@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _LINUX_KTHREAD_CGROUP_H +#define _LINUX_KTHREAD_CGROUP_H +#include <linux/kthread.h> +#include <linux/cgroup.h> + +#ifdef CONFIG_BLK_CGROUP +void kthread_associate_blkcg (struct cgroup_subsys_state *css); +struct cgroup_subsys_state *kthread_blkcg (void ); +#else +static inline void kthread_associate_blkcg (struct cgroup_subsys_state *css) { } +static inline struct cgroup_subsys_state *kthread_blkcg (void ) +{ +return NULL ; +} +#endif +#endif
include/linux/kthread.h +9 -1
@@ -105,7 +105,7 @@ struct kthread_delayed_work { };#define KTHREAD_WORKER_INIT (worker) { \ - .lock = __SPIN_LOCK_UNLOCKED((worker).lock), \ + .lock = __RAW_SPIN_LOCK_UNLOCKED((worker).lock), \ .work_list = LIST_HEAD_INIT((worker).work_list), \ .delayed_work_list = LIST_HEAD_INIT((worker).delayed_work_list),\ }
@@ -199,4 +199,12 @@ bool kthread_cancel_delayed_work_sync(struct kthread_delayed_work *work);void kthread_destroy_worker (struct kthread_worker *worker); +extern struct kthread_worker kthread_global_worker; +void kthread_init_global_worker (void ); + +static inline bool kthread_schedule_work (struct kthread_work *work) +{ +return kthread_queue_work (&kthread_global_worker, work); +} +#endif /* _LINUX_KTHREAD_H */
include/linux/rwsem-rt.h renamed from include/linux/rwsem_rt.h +0 -0
include/linux/rwsem.h +1 -1
@@ -21,7 +21,7 @@#endif #ifdef CONFIG_PREEMPT_RT_FULL -#include <linux/rwsem_rt.h> +#include <linux/rwsem-rt.h> #else /* PREEMPT_RT_FULL */ struct rw_semaphore ;
init/main.c +1 -0
@@ -1059,6 +1059,7 @@ static noinline void __init kernel_init_freeable(void)smp_prepare_cpus (setup_max_cpus);workqueue_init (); +kthread_init_global_worker ();init_mm_internals ();
kernel/futex.c +99 -133
521 lines not on this page · raw message
kernel/irq/manage.c +7 -16
@@ -228,7 +228,7 @@ int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask,kref_get (&desc->affinity_notify->kref);#ifdef CONFIG_PREEMPT_RT_BASE -swork_queue (&desc->affinity_notify->swork); +kthread_schedule_work (&desc->affinity_notify->work);#else schedule_work (&desc->affinity_notify->work);#endif
@@ -293,21 +293,11 @@ static void _irq_affinity_notify(struct irq_affinity_notify *notify) }#ifdef CONFIG_PREEMPT_RT_BASE -static void init_helper_thread (void ) -{ -static int init_sworker_once; - -if (init_sworker_once) -return ; -if (WARN_ON (swork_get ())) -return ; - init_sworker_once =1 ; -} -static void irq_affinity_notify (struct swork_event *swork) +static void irq_affinity_notify (struct kthread_work *work) {struct irq_affinity_notify *notify = - container_of(swork, struct irq_affinity_notify, swork); + container_of(work, struct irq_affinity_notify, work);_irq_affinity_notify (notify); }
@@ -350,8 +340,7 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify) notify->irq = irq;kref_init (¬ify->kref);#ifdef CONFIG_PREEMPT_RT_BASE -INIT_SWORK (¬ify->swork, irq_affinity_notify); -init_helper_thread (); +kthread_init_work (¬ify->work, irq_affinity_notify);#else INIT_WORK (¬ify->work, irq_affinity_notify);#endif
@@ -363,7 +352,9 @@ irq_set_affinity_notifier(unsigned int irq, struct irq_affinity_notify *notify)raw_spin_unlock_irqrestore (&desc->lock, flags);if (old_notify) { -#ifndef CONFIG_PREEMPT_RT_BASE +#ifdef CONFIG_PREEMPT_RT_BASE +kthread_cancel_work_sync (¬ify->work); +#else cancel_work_sync (&old_notify->work);#endif kref_put (&old_notify->kref, old_notify->release);
kernel/kthread.c +13 -0
@@ -1161,3 +1161,16 @@ void kthread_destroy_worker(struct kthread_worker *worker)kfree (worker); }EXPORT_SYMBOL (kthread_destroy_worker); + +DEFINE_KTHREAD_WORKER (kthread_global_worker); +EXPORT_SYMBOL (kthread_global_worker); + +__init void kthread_init_global_worker (void ) +{ + kthread_global_worker.task =kthread_create (kthread_worker_fn, + &kthread_global_worker, +"kswork" ); +if (WARN_ON (IS_ERR (kthread_global_worker.task))) +return ; +wake_up_process (kthread_global_worker.task); +}
kernel/locking/lockdep.c +2 -1
@@ -719,7 +719,8 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass)* Huh! same key, different name? Did someone trample * on some memory? We're most confused. */ -WARN_ON_ONCE (class->name != lock->name); +WARN_ON_ONCE (class->name != lock->name && + lock->key != &__lockdep_no_validate__);return class; } }
kernel/locking/rtmutex.c +6 -59
119 lines not on this page · raw message
kernel/locking/rtmutex_common.h +0 -3
@@ -131,9 +131,6 @@ enum rtmutex_chainwalk {/* * PI-futex support (proxy locking functions, etc.): */ -#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) -#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) -extern struct task_struct *rt_mutex_next_owner (struct rt_mutex *lock);extern void rt_mutex_init_proxy_locked (struct rt_mutex *lock,struct task_struct *proxy_owner);
kernel/rcu/update.c +2 -0
@@ -67,7 +67,9 @@ module_param(rcu_expedited, int, 0);extern int rcu_normal;/* from sysctl */ module_param (rcu_normal, int,0 );static int rcu_normal_after_boot =IS_ENABLED (CONFIG_PREEMPT_RT_FULL ); +#ifndef CONFIG_PREEMPT_RT_FULL module_param (rcu_normal_after_boot, int,0 ); +#endif #endif /* #ifndef CONFIG_TINY_RCU */ #ifdef CONFIG_DEBUG_LOCK_ALLOC
kernel/sched/completion.c +1 -1
@@ -80,12 +80,12 @@ do_wait_for_common(struct completion *x,if (!x->done) {DECLARE_SWAITQUEUE (wait); -__prepare_to_swait (&x->wait, &wait); do { if (signal_pending_state(state, current)) { timeout = -ERESTARTSYS; break; } + __prepare_to_swait(&x->wait, &wait); __set_current_state(state); raw_spin_unlock_irq(&x->wait.lock); timeout = action(timeout);
kernel/sched/core.c +2 -7
@@ -583,14 +583,11 @@ void resched_cpu(int cpu)*/ int get_nohz_timer_target (void ) { -int i, cpu; +int i, cpu =smp_processor_id ();struct sched_domain *sd; -preempt_disable_rt (); - cpu =smp_processor_id (); -if (!idle_cpu (cpu) &&is_housekeeping_cpu (cpu)) - goto preempt_en_rt; +return cpu;rcu_read_lock ();for_each_domain (cpu, sd) {
@@ -609,8 +606,6 @@ int get_nohz_timer_target(void) cpu =housekeeping_any_cpu (); unlock:rcu_read_unlock (); -preempt_en_rt: -preempt_enable_rt ();return cpu; }
localversion-rt +1 -1
@@ -1 +1 @@ --rt64 +-rt65
mm/zswap.c +7 -5
@@ -27,6 +27,7 @@#include <linux/highmem.h> #include <linux/slab.h> #include <linux/spinlock.h> +#include <linux/locallock.h> #include <linux/types.h> #include <linux/atomic.h> #include <linux/frontswap.h>
@@ -953,6 +954,8 @@ static int zswap_shrink(void)return ret; } +/* protect zswap_dstmem from concurrency */ +static DEFINE_LOCAL_IRQ_LOCK (zswap_dstmem_lock);/********************************* * frontswap hooks **********************************/
@@ -1016,12 +1019,11 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, }/* compress */ - dst =get_cpu_var (zswap_dstmem); - tfm = *get_cpu_ptr (entry->pool->tfm); + dst =get_locked_var (zswap_dstmem_lock, zswap_dstmem); + tfm = *this_cpu_ptr (entry->pool->tfm); src =kmap_atomic (page); ret =crypto_comp_compress (tfm, src,PAGE_SIZE , dst, &dlen);kunmap_atomic (src); -put_cpu_ptr (entry->pool->tfm);if (ret) { ret = -EINVAL ; goto put_dstmem;
@@ -1045,7 +1047,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, buf = (u8 *)(zhdr +1 );memcpy (buf, dst, dlen);zpool_unmap_handle (entry->pool->zpool, handle); -put_cpu_var (zswap_dstmem); +put_locked_var (zswap_dstmem_lock, zswap_dstmem);/* populate entry */ entry->offset = offset;
@@ -1072,7 +1074,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset,return 0 ; put_dstmem: -put_cpu_var (zswap_dstmem); +put_locked_var (zswap_dstmem_lock, zswap_dstmem);zswap_pool_put (entry->pool); freepage:zswap_entry_cache_free (entry);