summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>2015-07-25 12:09:45 +0200
committerSebastian Andrzej Siewior <bigeasy@linutronix.de>2015-07-25 12:09:45 +0200
commitf1798d5675c82009eb9e04ad8f755f42312625a4 (patch)
treebb3eae91312f651f554988c7b43baae6a03e37c3
parent20b977d0da7c4098b0271b447edfcb975b921c45 (diff)
download4.9-rt-patches-f1798d5675c82009eb9e04ad8f755f42312625a4.tar.gz
[ANNOUNCE] 4.1.3-rt3
Dear RT folks! I'm pleased to announce the v4.1.3-rt3 patch set. Changes since v4.1.3-rt2: - fix compile of locktorture. Patch by Wolfgang M. Reimer. - fix compile pid_namespace without lockdep on ARM. Patch by Grygorii Strashko - The annoying "cpufreq_stat_notifier_trans: No policy found" is finally gone. - xor / raid_pq The max latency will increase into the ms range if the raid6_pq is loaded. This should not matter under normal circumstances because that module should only be loaded at boot time if required (and not while a -RT task is active in production). It might also get loaded at run-time manually. Dropping the preempt_disable() might cause different results for the individual implementations. People who don't care (load it at run-time) don't need to load it at all. People who care (load it boot time) would prefer to stick with the best implementation. Therefore I think it is enough to document this (don't load it at run time if you don't need it) and I cross it off my list. Patches are welcome if someone needs / has an improvement. Known issues: - bcache is disabled. - CPU hotplug works in general. Steven's test script however deadlocks usually on the second invocation. You can get this release via the git tree at: git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git linux-4.1.y-rt git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git linux-4.1.y-rt-rebase git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git linux-4.1.y-rt-queue The RT patch against 4.1.3 can be found here: https://www.kernel.org/pub/linux/kernel/projects/rt/4.1/patch-4.1.3-rt3.patch.xz The split quilt queue is available at: https://www.kernel.org/pub/linux/kernel/projects/rt/4.1/patches-4.1.3-rt3.tar.xz Sebastian Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
-rw-r--r--patches/arch-arm64-Add-lazy-preempt-support.patch2
-rw-r--r--patches/cgroups-use-simple-wait-in-css_release.patch6
-rw-r--r--patches/cpufreq-Remove-cpufreq_rwsem.patch195
-rw-r--r--patches/localversion.patch2
-rw-r--r--patches/locking-locktorture-Do-NOT-include-rwlock.h-directly.patch26
-rw-r--r--patches/pid.h-include-atomic.h.patch36
-rw-r--r--patches/series3
7 files changed, 265 insertions, 5 deletions
diff --git a/patches/arch-arm64-Add-lazy-preempt-support.patch b/patches/arch-arm64-Add-lazy-preempt-support.patch
index 5952089d3dde0..de7aa8b52aad8 100644
--- a/patches/arch-arm64-Add-lazy-preempt-support.patch
+++ b/patches/arch-arm64-Add-lazy-preempt-support.patch
@@ -93,7 +93,7 @@ Signed-off-by: Anders Roxell <anders.roxell@linaro.org>
ret x24
#endif
-@@ -621,6 +627,7 @@ ENDPROC(cpu_switch_to)
+@@ -622,6 +628,7 @@ ENDPROC(cpu_switch_to)
str x0, [sp, #S_X0] // returned x0
work_pending:
tbnz x1, #TIF_NEED_RESCHED, work_resched
diff --git a/patches/cgroups-use-simple-wait-in-css_release.patch b/patches/cgroups-use-simple-wait-in-css_release.patch
index b4e6bdc8b97fd..3baff121f282f 100644
--- a/patches/cgroups-use-simple-wait-in-css_release.patch
+++ b/patches/cgroups-use-simple-wait-in-css_release.patch
@@ -52,7 +52,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
/* bits in struct cgroup_subsys_state flags field */
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
-@@ -4423,10 +4423,10 @@ static void css_free_rcu_fn(struct rcu_h
+@@ -4421,10 +4421,10 @@ static void css_free_rcu_fn(struct rcu_h
queue_work(cgroup_destroy_wq, &css->destroy_work);
}
@@ -65,7 +65,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
struct cgroup_subsys *ss = css->ss;
struct cgroup *cgrp = css->cgroup;
-@@ -4465,8 +4465,8 @@ static void css_release(struct percpu_re
+@@ -4463,8 +4463,8 @@ static void css_release(struct percpu_re
struct cgroup_subsys_state *css =
container_of(ref, struct cgroup_subsys_state, refcnt);
@@ -76,7 +76,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
}
static void init_and_link_css(struct cgroup_subsys_state *css,
-@@ -5070,6 +5070,7 @@ static int __init cgroup_wq_init(void)
+@@ -5068,6 +5068,7 @@ static int __init cgroup_wq_init(void)
*/
cgroup_destroy_wq = alloc_workqueue("cgroup_destroy", 0, 1);
BUG_ON(!cgroup_destroy_wq);
diff --git a/patches/cpufreq-Remove-cpufreq_rwsem.patch b/patches/cpufreq-Remove-cpufreq_rwsem.patch
new file mode 100644
index 0000000000000..434d35083ee03
--- /dev/null
+++ b/patches/cpufreq-Remove-cpufreq_rwsem.patch
@@ -0,0 +1,195 @@
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Tue, 21 Jul 2015 15:28:49 +0200
+Subject: cpufreq: Remove cpufreq_rwsem
+
+cpufreq_rwsem was introduced in commit 6eed9404ab3c4 ("cpufreq: Use
+rwsem for protecting critical sections) in order to replace
+try_module_get() on the cpu-freq driver. That try_module_get() worked
+well until the refcount was so heavily used that module removal became
+more or less impossible.
+
+Though when looking at the various (undocumented) protection
+mechanisms in that code, the randomly sprinkeled around cpufreq_rwsem
+locking sites are superfluous.
+
+The policy, which is acquired in cpufreq_cpu_get() and released in
+cpufreq_cpu_put() is sufficiently protected already.
+
+ cpufreq_cpu_get(cpu)
+ /* Protects against concurrent driver removal */
+ read_lock_irqsave(&cpufreq_driver_lock, flags);
+ policy = per_cpu(cpufreq_cpu_data, cpu);
+ kobject_get(&policy->kobj);
+ read_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+The reference on the policy serializes versus module unload already:
+
+ cpufreq_unregister_driver()
+ subsys_interface_unregister()
+ __cpufreq_remove_dev_finish()
+ per_cpu(cpufreq_cpu_data) = NULL;
+ cpufreq_policy_put_kobj()
+
+If there is a reference held on the policy, i.e. obtained prior to the
+unregister call, then cpufreq_policy_put_kobj() will wait until that
+reference is dropped. So once subsys_interface_unregister() returns
+there is no policy pointer in flight and no new reference can be
+obtained. So that rwsem protection is useless.
+
+The other usage of cpufreq_rwsem in show()/store() of the sysfs
+interface is redundant as well because sysfs already does the proper
+kobject_get()/put() pairs.
+
+That leaves CPU hotplug versus module removal. The current
+down_write() around the write_lock() in cpufreq_unregister_driver() is
+silly at best as it protects actually nothing.
+
+The trivial solution to this is to prevent hotplug across
+cpufreq_unregister_driver completely.
+
+[upstream: rafael/linux-pm 454d3a2500a4eb33be85dde3bfba9e5f6b5efadc]
+[fixes: "cpufreq_stat_notifier_trans: No policy found" since v4.0-rt]
+Cc: stable-rt@vger.kernel.org
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ drivers/cpufreq/cpufreq.c | 35 +++--------------------------------
+ 1 file changed, 3 insertions(+), 32 deletions(-)
+
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -64,12 +64,6 @@ static inline bool has_target(void)
+ return cpufreq_driver->target_index || cpufreq_driver->target;
+ }
+
+-/*
+- * rwsem to guarantee that cpufreq driver module doesn't unload during critical
+- * sections
+- */
+-static DECLARE_RWSEM(cpufreq_rwsem);
+-
+ /* internal prototypes */
+ static int __cpufreq_governor(struct cpufreq_policy *policy,
+ unsigned int event);
+@@ -215,9 +209,6 @@ struct cpufreq_policy *cpufreq_cpu_get(u
+ if (cpu >= nr_cpu_ids)
+ return NULL;
+
+- if (!down_read_trylock(&cpufreq_rwsem))
+- return NULL;
+-
+ /* get the cpufreq driver */
+ read_lock_irqsave(&cpufreq_driver_lock, flags);
+
+@@ -230,9 +221,6 @@ struct cpufreq_policy *cpufreq_cpu_get(u
+
+ read_unlock_irqrestore(&cpufreq_driver_lock, flags);
+
+- if (!policy)
+- up_read(&cpufreq_rwsem);
+-
+ return policy;
+ }
+ EXPORT_SYMBOL_GPL(cpufreq_cpu_get);
+@@ -240,7 +228,6 @@ EXPORT_SYMBOL_GPL(cpufreq_cpu_get);
+ void cpufreq_cpu_put(struct cpufreq_policy *policy)
+ {
+ kobject_put(&policy->kobj);
+- up_read(&cpufreq_rwsem);
+ }
+ EXPORT_SYMBOL_GPL(cpufreq_cpu_put);
+
+@@ -765,9 +752,6 @@ static ssize_t show(struct kobject *kobj
+ struct freq_attr *fattr = to_attr(attr);
+ ssize_t ret;
+
+- if (!down_read_trylock(&cpufreq_rwsem))
+- return -EINVAL;
+-
+ down_read(&policy->rwsem);
+
+ if (fattr->show)
+@@ -776,7 +760,6 @@ static ssize_t show(struct kobject *kobj
+ ret = -EIO;
+
+ up_read(&policy->rwsem);
+- up_read(&cpufreq_rwsem);
+
+ return ret;
+ }
+@@ -793,9 +776,6 @@ static ssize_t store(struct kobject *kob
+ if (!cpu_online(policy->cpu))
+ goto unlock;
+
+- if (!down_read_trylock(&cpufreq_rwsem))
+- goto unlock;
+-
+ down_write(&policy->rwsem);
+
+ if (fattr->store)
+@@ -804,8 +784,6 @@ static ssize_t store(struct kobject *kob
+ ret = -EIO;
+
+ up_write(&policy->rwsem);
+-
+- up_read(&cpufreq_rwsem);
+ unlock:
+ put_online_cpus();
+
+@@ -1117,16 +1095,12 @@ static int __cpufreq_add_dev(struct devi
+ if (unlikely(policy))
+ return 0;
+
+- if (!down_read_trylock(&cpufreq_rwsem))
+- return 0;
+-
+ /* Check if this cpu was hot-unplugged earlier and has siblings */
+ read_lock_irqsave(&cpufreq_driver_lock, flags);
+ for_each_policy(policy) {
+ if (cpumask_test_cpu(cpu, policy->related_cpus)) {
+ read_unlock_irqrestore(&cpufreq_driver_lock, flags);
+ ret = cpufreq_add_policy_cpu(policy, cpu, dev);
+- up_read(&cpufreq_rwsem);
+ return ret;
+ }
+ }
+@@ -1269,8 +1243,6 @@ static int __cpufreq_add_dev(struct devi
+
+ kobject_uevent(&policy->kobj, KOBJ_ADD);
+
+- up_read(&cpufreq_rwsem);
+-
+ /* Callback for handling stuff after policy is ready */
+ if (cpufreq_driver->ready)
+ cpufreq_driver->ready(policy);
+@@ -1304,8 +1276,6 @@ static int __cpufreq_add_dev(struct devi
+ cpufreq_policy_free(policy);
+
+ nomem_out:
+- up_read(&cpufreq_rwsem);
+-
+ return ret;
+ }
+
+@@ -2499,19 +2469,20 @@ int cpufreq_unregister_driver(struct cpu
+
+ pr_debug("unregistering driver %s\n", driver->name);
+
++ /* Protect against concurrent cpu hotplug */
++ get_online_cpus();
+ subsys_interface_unregister(&cpufreq_interface);
+ if (cpufreq_boost_supported())
+ cpufreq_sysfs_remove_file(&boost.attr);
+
+ unregister_hotcpu_notifier(&cpufreq_cpu_notifier);
+
+- down_write(&cpufreq_rwsem);
+ write_lock_irqsave(&cpufreq_driver_lock, flags);
+
+ cpufreq_driver = NULL;
+
+ write_unlock_irqrestore(&cpufreq_driver_lock, flags);
+- up_write(&cpufreq_rwsem);
++ put_online_cpus();
+
+ return 0;
+ }
diff --git a/patches/localversion.patch b/patches/localversion.patch
index d3322791bb4ff..1149c8b97772a 100644
--- a/patches/localversion.patch
+++ b/patches/localversion.patch
@@ -12,4 +12,4 @@ Link: http://lkml.kernel.org/n/tip-8vdw4bfcsds27cvox6rpb334@git.kernel.org
--- /dev/null
+++ b/localversion-rt
@@ -0,0 +1 @@
-+-rt2
++-rt3
diff --git a/patches/locking-locktorture-Do-NOT-include-rwlock.h-directly.patch b/patches/locking-locktorture-Do-NOT-include-rwlock.h-directly.patch
new file mode 100644
index 0000000000000..66849317cfb81
--- /dev/null
+++ b/patches/locking-locktorture-Do-NOT-include-rwlock.h-directly.patch
@@ -0,0 +1,26 @@
+From: "Wolfgang M. Reimer" <linuxball@gmail.com>
+Date: Tue, 21 Jul 2015 16:20:07 +0200
+Subject: locking: locktorture: Do NOT include rwlock.h directly
+
+Including rwlock.h directly will cause kernel builds to fail
+if CONFIG_PREEMPT_RT_FULL is defined. The correct header file
+(rwlock_rt.h OR rwlock.h) will be included by spinlock.h which
+is included by locktorture.c anyway.
+
+Cc: stable-rt@vger.kernel.org
+Signed-off-by: Wolfgang M. Reimer <linuxball@gmail.com>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/locking/locktorture.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/kernel/locking/locktorture.c
++++ b/kernel/locking/locktorture.c
+@@ -24,7 +24,6 @@
+ #include <linux/module.h>
+ #include <linux/kthread.h>
+ #include <linux/spinlock.h>
+-#include <linux/rwlock.h>
+ #include <linux/mutex.h>
+ #include <linux/rwsem.h>
+ #include <linux/smp.h>
diff --git a/patches/pid.h-include-atomic.h.patch b/patches/pid.h-include-atomic.h.patch
new file mode 100644
index 0000000000000..8277468fba677
--- /dev/null
+++ b/patches/pid.h-include-atomic.h.patch
@@ -0,0 +1,36 @@
+From: Grygorii Strashko <Grygorii.Strashko@linaro.org>
+Date: Tue, 21 Jul 2015 19:43:56 +0300
+Subject: wait.h: include atomic.h
+
+This patch fixes build error:
+ CC kernel/pid_namespace.o
+In file included from kernel/pid_namespace.c:11:0:
+include/linux/pid.h: In function 'get_pid':
+include/linux/pid.h:78:3: error: implicit declaration of function 'atomic_inc' [-Werror=implicit-function-declaration]
+ atomic_inc(&pid->count);
+ ^
+which happens when
+ CONFIG_PROVE_LOCKING=n
+ CONFIG_DEBUG_SPINLOCK=n
+ CONFIG_DEBUG_MUTEXES=n
+ CONFIG_DEBUG_LOCK_ALLOC=n
+ CONFIG_PID_NS=y
+
+Vanilla gets this via spinlock.h.
+
+Signed-off-by: Grygorii Strashko <Grygorii.Strashko@linaro.org>
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ include/linux/pid.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/include/linux/pid.h
++++ b/include/linux/pid.h
+@@ -2,6 +2,7 @@
+ #define _LINUX_PID_H
+
+ #include <linux/rcupdate.h>
++#include <linux/atomic.h>
+
+ enum pid_type
+ {
diff --git a/patches/series b/patches/series
index 96745dc20015b..616e9bfc5e62b 100644
--- a/patches/series
+++ b/patches/series
@@ -33,6 +33,7 @@ mm-slub-move-slab-initialization-into-irq-enabled-region.patch
############################################################
# Stuff broken upstream, patches submitted
############################################################
+cpufreq-Remove-cpufreq_rwsem.patch
############################################################
# Stuff which needs addressing upstream, but requires more
@@ -329,6 +330,8 @@ futex-requeue-pi-fix.patch
0005-futex-Ensure-lock-unlock-symetry-versus-pi_lock-and-.patch
# RTMUTEX
+pid.h-include-atomic.h.patch
+locking-locktorture-Do-NOT-include-rwlock.h-directly.patch
rtmutex-lock-killable.patch
spinlock-types-separate-raw.patch
rtmutex-avoid-include-hell.patch