diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-05-06 11:45:16 +0200 |
---|---|---|
committer | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2016-05-06 11:45:16 +0200 |
commit | a52e3317edc58fd536845127ccd9e2e4174261d3 (patch) | |
tree | 65bb2b4f62669b578d6826996c71bd01e2e42548 | |
parent | 67e59dd0c366160e17d4fd773b848394173c30a2 (diff) | |
download | 4.9-rt-patches-a52e3317edc58fd536845127ccd9e2e4174261d3.tar.gz |
[ANNOUNCE] 4.4.9-rt17
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
21 files changed, 73 insertions, 167 deletions
diff --git a/patches/arm64-replace-read_lock-to-rcu-lock-in-call_step_hoo.patch b/patches/arm64-replace-read_lock-to-rcu-lock-in-call_step_hoo.patch deleted file mode 100644 index 835fcae8ff92f0..00000000000000 --- a/patches/arm64-replace-read_lock-to-rcu-lock-in-call_step_hoo.patch +++ /dev/null @@ -1,93 +0,0 @@ -From: Yang Shi <yang.shi@linaro.org> -Date: Mon, 8 Feb 2016 14:49:24 -0800 -Subject: arm64: replace read_lock to rcu lock in call_step_hook - -BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917 -in_atomic(): 1, irqs_disabled(): 128, pid: 383, name: sh -Preemption disabled at:[<ffff800000124c18>] kgdb_cpu_enter+0x158/0x6b8 - -CPU: 3 PID: 383 Comm: sh Tainted: G W 4.1.13-rt13 #2 -Hardware name: Freescale Layerscape 2085a RDB Board (DT) -Call trace: -[<ffff8000000885e8>] dump_backtrace+0x0/0x128 -[<ffff800000088734>] show_stack+0x24/0x30 -[<ffff80000079a7c4>] dump_stack+0x80/0xa0 -[<ffff8000000bd324>] ___might_sleep+0x18c/0x1a0 -[<ffff8000007a20ac>] __rt_spin_lock+0x2c/0x40 -[<ffff8000007a2268>] rt_read_lock+0x40/0x58 -[<ffff800000085328>] single_step_handler+0x38/0xd8 -[<ffff800000082368>] do_debug_exception+0x58/0xb8 -Exception stack(0xffff80834a1e7c80 to 0xffff80834a1e7da0) -7c80: ffffff9c ffffffff 92c23ba0 0000ffff 4a1e7e40 ffff8083 001bfcc4 ffff8000 -7ca0: f2000400 00000000 00000000 00000000 4a1e7d80 ffff8083 0049501c ffff8000 -7cc0: 00005402 00000000 00aaa210 ffff8000 4a1e7ea0 ffff8083 000833f4 ffff8000 -7ce0: ffffff9c ffffffff 92c23ba0 0000ffff 4a1e7ea0 ffff8083 001bfcc0 ffff8000 -7d00: 4a0fc400 ffff8083 00005402 00000000 4a1e7d40 ffff8083 00490324 ffff8000 -7d20: ffffff9c 00000000 92c23ba0 0000ffff 000a0000 00000000 00000000 00000000 -7d40: 00000008 00000000 00080000 00000000 92c23b8b 0000ffff 92c23b8e 0000ffff -7d60: 00000038 00000000 00001cb2 00000000 00000005 00000000 92d7b498 0000ffff -7d80: 01010101 01010101 92be9000 0000ffff 00000000 00000000 00000030 00000000 -[<ffff8000000833f4>] el1_dbg+0x18/0x6c - -This issue is similar with 62c6c61("arm64: replace read_lock to rcu lock in -call_break_hook"), but comes to single_step_handler. - -This also solves kgdbts boot test silent hang issue on 4.4 -rt kernel. - -Cc: stable-rt@vger.kernel.org -Signed-off-by: Yang Shi <yang.shi@linaro.org> -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - arch/arm64/kernel/debug-monitors.c | 21 +++++++++++---------- - 1 file changed, 11 insertions(+), 10 deletions(-) - ---- a/arch/arm64/kernel/debug-monitors.c -+++ b/arch/arm64/kernel/debug-monitors.c -@@ -186,20 +186,21 @@ static void clear_regs_spsr_ss(struct pt - - /* EL1 Single Step Handler hooks */ - static LIST_HEAD(step_hook); --static DEFINE_RWLOCK(step_hook_lock); -+static DEFINE_SPINLOCK(step_hook_lock); - - void register_step_hook(struct step_hook *hook) - { -- write_lock(&step_hook_lock); -- list_add(&hook->node, &step_hook); -- write_unlock(&step_hook_lock); -+ spin_lock(&step_hook_lock); -+ list_add_rcu(&hook->node, &step_hook); -+ spin_unlock(&step_hook_lock); - } - - void unregister_step_hook(struct step_hook *hook) - { -- write_lock(&step_hook_lock); -- list_del(&hook->node); -- write_unlock(&step_hook_lock); -+ spin_lock(&step_hook_lock); -+ list_del_rcu(&hook->node); -+ spin_unlock(&step_hook_lock); -+ synchronize_rcu(); - } - - /* -@@ -213,15 +214,15 @@ static int call_step_hook(struct pt_regs - struct step_hook *hook; - int retval = DBG_HOOK_ERROR; - -- read_lock(&step_hook_lock); -+ rcu_read_lock(); - -- list_for_each_entry(hook, &step_hook, node) { -+ list_for_each_entry_rcu(hook, &step_hook, node) { - retval = hook->fn(regs, esr); - if (retval == DBG_HOOK_HANDLED) - break; - } - -- read_unlock(&step_hook_lock); -+ rcu_read_unlock(); - - return retval; - } diff --git a/patches/cgroups-scheduling-while-atomic-in-cgroup-code.patch b/patches/cgroups-scheduling-while-atomic-in-cgroup-code.patch index d1e4403850f3cc..c57144635c9d9f 100644 --- a/patches/cgroups-scheduling-while-atomic-in-cgroup-code.patch +++ b/patches/cgroups-scheduling-while-atomic-in-cgroup-code.patch @@ -42,7 +42,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- a/mm/memcontrol.c +++ b/mm/memcontrol.c -@@ -1938,14 +1938,17 @@ static void drain_local_stock(struct wor +@@ -1939,14 +1939,17 @@ static void drain_local_stock(struct wor */ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages) { diff --git a/patches/cgroups-use-simple-wait-in-css_release.patch b/patches/cgroups-use-simple-wait-in-css_release.patch index 9e9708de4ea242..6982596fd9746b 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> /* --- a/kernel/cgroup.c +++ b/kernel/cgroup.c -@@ -4733,10 +4733,10 @@ static void css_free_rcu_fn(struct rcu_h +@@ -4737,10 +4737,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; -@@ -4775,8 +4775,8 @@ static void css_release(struct percpu_re +@@ -4779,8 +4779,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, -@@ -5392,6 +5392,7 @@ static int __init cgroup_wq_init(void) +@@ -5396,6 +5396,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/completion-use-simple-wait-queues.patch b/patches/completion-use-simple-wait-queues.patch index 10c178ec64b5be..2346eb9572ef57 100644 --- a/patches/completion-use-simple-wait-queues.patch +++ b/patches/completion-use-simple-wait-queues.patch @@ -35,7 +35,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> break; --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c -@@ -1405,7 +1405,7 @@ static void ffs_data_put(struct ffs_data +@@ -1404,7 +1404,7 @@ static void ffs_data_put(struct ffs_data pr_info("%s(): freeing\n", __func__); ffs_data_clear(ffs); BUG_ON(waitqueue_active(&ffs->ev.waitq) || diff --git a/patches/fs-dcache-use-cpu-chill-in-trylock-loops.patch b/patches/fs-dcache-use-cpu-chill-in-trylock-loops.patch index 5fa0de70046dcd..ead334bd603c2c 100644 --- a/patches/fs-dcache-use-cpu-chill-in-trylock-loops.patch +++ b/patches/fs-dcache-use-cpu-chill-in-trylock-loops.patch @@ -55,7 +55,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return dentry; /* try again with same dentry */ } -@@ -2388,7 +2389,7 @@ void d_delete(struct dentry * dentry) +@@ -2391,7 +2392,7 @@ void d_delete(struct dentry * dentry) if (dentry->d_lockref.count == 1) { if (!spin_trylock(&inode->i_lock)) { spin_unlock(&dentry->d_lock); diff --git a/patches/iommu-amd--Use-WARN_ON_NORT.patch b/patches/iommu-amd--Use-WARN_ON_NORT.patch index 32dcbd0b94f8ca..3bde9d093027cf 100644 --- a/patches/iommu-amd--Use-WARN_ON_NORT.patch +++ b/patches/iommu-amd--Use-WARN_ON_NORT.patch @@ -16,7 +16,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c -@@ -1952,10 +1952,10 @@ static int __attach_device(struct iommu_ +@@ -2017,10 +2017,10 @@ static int __attach_device(struct iommu_ int ret; /* @@ -30,7 +30,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* lock domain */ spin_lock(&domain->lock); -@@ -2118,10 +2118,10 @@ static void __detach_device(struct iommu +@@ -2183,10 +2183,10 @@ static void __detach_device(struct iommu struct protection_domain *domain; /* diff --git a/patches/localversion.patch b/patches/localversion.patch index 35c628ed6d79e3..d061f44f02ca0f 100644 --- a/patches/localversion.patch +++ b/patches/localversion.patch @@ -1,4 +1,4 @@ -Subject: v4.4.7-rt16 +Subject: v4.4.9-rt17 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 @@ -+-rt16 ++-rt17 diff --git a/patches/mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch b/patches/mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch index 822cda34344af2..ee1066f21fc557 100644 --- a/patches/mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch +++ b/patches/mm-memcontrol-Don-t-call-schedule_work_on-in-preempt.patch @@ -48,7 +48,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- a/mm/memcontrol.c +++ b/mm/memcontrol.c -@@ -1958,7 +1958,7 @@ static void drain_all_stock(struct mem_c +@@ -1959,7 +1959,7 @@ static void drain_all_stock(struct mem_c return; /* Notify other cpus that system-wide "drain" is running */ get_online_cpus(); @@ -57,7 +57,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> for_each_online_cpu(cpu) { struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); struct mem_cgroup *memcg; -@@ -1975,7 +1975,7 @@ static void drain_all_stock(struct mem_c +@@ -1976,7 +1976,7 @@ static void drain_all_stock(struct mem_c schedule_work_on(cpu, &stock->work); } } diff --git a/patches/mm-memcontrol-do_not_disable_irq.patch b/patches/mm-memcontrol-do_not_disable_irq.patch index ffc50724fa6327..9d7f3cc6e693b6 100644 --- a/patches/mm-memcontrol-do_not_disable_irq.patch +++ b/patches/mm-memcontrol-do_not_disable_irq.patch @@ -59,7 +59,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> static const char * const mem_cgroup_stat_names[] = { "cache", "rss", -@@ -4617,12 +4620,12 @@ static int mem_cgroup_move_account(struc +@@ -4618,12 +4621,12 @@ static int mem_cgroup_move_account(struc ret = 0; @@ -74,7 +74,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> out_unlock: unlock_page(page); out: -@@ -5410,10 +5413,10 @@ void mem_cgroup_commit_charge(struct pag +@@ -5411,10 +5414,10 @@ void mem_cgroup_commit_charge(struct pag VM_BUG_ON_PAGE(!PageTransHuge(page), page); } @@ -87,7 +87,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> if (do_swap_account && PageSwapCache(page)) { swp_entry_t entry = { .val = page_private(page) }; -@@ -5469,14 +5472,14 @@ static void uncharge_batch(struct mem_cg +@@ -5470,14 +5473,14 @@ static void uncharge_batch(struct mem_cg memcg_oom_recover(memcg); } @@ -104,7 +104,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> if (!mem_cgroup_is_root(memcg)) css_put_many(&memcg->css, nr_pages); -@@ -5668,6 +5671,7 @@ void mem_cgroup_swapout(struct page *pag +@@ -5669,6 +5672,7 @@ void mem_cgroup_swapout(struct page *pag { struct mem_cgroup *memcg; unsigned short oldid; @@ -112,7 +112,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> VM_BUG_ON_PAGE(PageLRU(page), page); VM_BUG_ON_PAGE(page_count(page), page); -@@ -5696,9 +5700,13 @@ void mem_cgroup_swapout(struct page *pag +@@ -5697,9 +5701,13 @@ void mem_cgroup_swapout(struct page *pag * important here to have the interrupts disabled because it is the * only synchronisation we have for udpating the per-CPU variables. */ diff --git a/patches/net-wireless-warn-nort.patch b/patches/net-wireless-warn-nort.patch index 688a8e0fbff4be..e3b49fc3a372a0 100644 --- a/patches/net-wireless-warn-nort.patch +++ b/patches/net-wireless-warn-nort.patch @@ -12,7 +12,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c -@@ -3573,7 +3573,7 @@ void ieee80211_rx_napi(struct ieee80211_ +@@ -3574,7 +3574,7 @@ void ieee80211_rx_napi(struct ieee80211_ struct ieee80211_supported_band *sband; struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); diff --git a/patches/rt-add-rt-locks.patch b/patches/rt-add-rt-locks.patch index 6d76a2329563e5..94ae7bc4d54608 100644 --- a/patches/rt-add-rt-locks.patch +++ b/patches/rt-add-rt-locks.patch @@ -922,7 +922,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> bool deboost; int ret = 0; -@@ -1268,7 +1269,8 @@ static int wake_futex_pi(u32 __user *uad +@@ -1278,7 +1279,8 @@ static int wake_futex_pi(u32 __user *uad raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); @@ -932,7 +932,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* * First unlock HB so the waiter does not spin on it once he got woken -@@ -1278,6 +1280,7 @@ static int wake_futex_pi(u32 __user *uad +@@ -1288,6 +1290,7 @@ static int wake_futex_pi(u32 __user *uad */ spin_unlock(&hb->lock); wake_up_q(&wake_q); @@ -940,7 +940,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> if (deboost) rt_mutex_adjust_prio(current); -@@ -2709,10 +2712,7 @@ static int futex_wait_requeue_pi(u32 __u +@@ -2728,10 +2731,7 @@ static int futex_wait_requeue_pi(u32 __u * The waiter is allocated on our stack, manipulated by the requeue * code while we sleep on uaddr. */ diff --git a/patches/rtmutex-Make-wait_lock-irq-safe.patch b/patches/rtmutex-Make-wait_lock-irq-safe.patch index 7befb3baf97982..d36807b15a4b7d 100644 --- a/patches/rtmutex-Make-wait_lock-irq-safe.patch +++ b/patches/rtmutex-Make-wait_lock-irq-safe.patch @@ -51,9 +51,9 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); /* -@@ -1249,22 +1249,22 @@ static int wake_futex_pi(u32 __user *uad - else if (curval != uval) - ret = -EINVAL; +@@ -1259,22 +1259,22 @@ static int wake_futex_pi(u32 __user *uad + ret = -EINVAL; + } if (ret) { - raw_spin_unlock(&pi_state->pi_mutex.wait_lock); + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); @@ -80,7 +80,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> deboost = rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q); -@@ -2129,11 +2129,11 @@ static int fixup_owner(u32 __user *uaddr +@@ -2139,11 +2139,11 @@ static int fixup_owner(u32 __user *uaddr * we returned due to timeout or signal without taking the * rt_mutex. Too late. */ diff --git a/patches/rtmutex-futex-prepare-rt.patch b/patches/rtmutex-futex-prepare-rt.patch index 236ba8714e7f50..80f6adab1059d0 100644 --- a/patches/rtmutex-futex-prepare-rt.patch +++ b/patches/rtmutex-futex-prepare-rt.patch @@ -15,7 +15,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- a/kernel/futex.c +++ b/kernel/futex.c -@@ -1812,6 +1812,16 @@ static int futex_requeue(u32 __user *uad +@@ -1822,6 +1822,16 @@ static int futex_requeue(u32 __user *uad requeue_pi_wake_futex(this, &key2, hb2); drop_count++; continue; @@ -32,7 +32,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } else if (ret) { /* -EDEADLK */ this->pi_state = NULL; -@@ -2672,7 +2682,7 @@ static int futex_wait_requeue_pi(u32 __u +@@ -2691,7 +2701,7 @@ static int futex_wait_requeue_pi(u32 __u struct hrtimer_sleeper timeout, *to = NULL; struct rt_mutex_waiter rt_waiter; struct rt_mutex *pi_mutex = NULL; @@ -41,7 +41,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> union futex_key key2 = FUTEX_KEY_INIT; struct futex_q q = futex_q_init; int res, ret; -@@ -2731,20 +2741,55 @@ static int futex_wait_requeue_pi(u32 __u +@@ -2750,20 +2760,55 @@ static int futex_wait_requeue_pi(u32 __u /* Queue the futex_q, drop the hb lock, wait for wakeup. */ futex_wait_queue_me(hb, &q, to); @@ -108,7 +108,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* Check if the requeue code acquired the second futex for us. */ if (!q.rt_waiter) { -@@ -2753,14 +2798,15 @@ static int futex_wait_requeue_pi(u32 __u +@@ -2772,14 +2817,15 @@ static int futex_wait_requeue_pi(u32 __u * did a lock-steal - fix up the PI-state in that case. */ if (q.pi_state && (q.pi_state->owner != current)) { @@ -126,7 +126,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } } else { /* -@@ -2773,7 +2819,8 @@ static int futex_wait_requeue_pi(u32 __u +@@ -2792,7 +2838,8 @@ static int futex_wait_requeue_pi(u32 __u ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter); debug_rt_mutex_free_waiter(&rt_waiter); diff --git a/patches/series b/patches/series index 6bce9da7dfb631..d754ddd9c918e6 100644 --- a/patches/series +++ b/patches/series @@ -6,7 +6,6 @@ # UPSTREAM changes queued ############################################################ rtmutex-Make-wait_lock-irq-safe.patch -arm64-replace-read_lock-to-rcu-lock-in-call_step_hoo.patch tracing-writeback-Replace-cgroup-path-to-cgroup-ino.patch kvm-rt-change-async-pagefault-code-locking-for-PREEM.patch panic-x86-Fix-re-entrance-problem-due-to-panic-on-NM.patch diff --git a/patches/skbufhead-raw-lock.patch b/patches/skbufhead-raw-lock.patch index 983b721b674a6c..fc2f5dcc3fece9 100644 --- a/patches/skbufhead-raw-lock.patch +++ b/patches/skbufhead-raw-lock.patch @@ -15,7 +15,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h -@@ -2546,6 +2546,7 @@ struct softnet_data { +@@ -2564,6 +2564,7 @@ struct softnet_data { unsigned int dropped; struct sk_buff_head input_pkt_queue; struct napi_struct backlog; diff --git a/patches/work-queue-work-around-irqsafe-timer-optimization.patch b/patches/work-queue-work-around-irqsafe-timer-optimization.patch index 1a2df1275485c0..9d123ada69abce 100644 --- a/patches/work-queue-work-around-irqsafe-timer-optimization.patch +++ b/patches/work-queue-work-around-irqsafe-timer-optimization.patch @@ -121,7 +121,7 @@ Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> #include "workqueue_internal.h" -@@ -1256,7 +1257,7 @@ static int try_to_grab_pending(struct wo +@@ -1285,7 +1286,7 @@ static int try_to_grab_pending(struct wo local_unlock_irqrestore(pendingb_lock, *flags); if (work_is_canceling(work)) return -ENOENT; diff --git a/patches/workqueue-distangle-from-rq-lock.patch b/patches/workqueue-distangle-from-rq-lock.patch index b243acb8abdfc6..30d1fd1d1b2152 100644 --- a/patches/workqueue-distangle-from-rq-lock.patch +++ b/patches/workqueue-distangle-from-rq-lock.patch @@ -155,7 +155,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- a/kernel/workqueue.c +++ b/kernel/workqueue.c -@@ -821,44 +821,31 @@ static void wake_up_worker(struct worker +@@ -850,44 +850,31 @@ static void wake_up_worker(struct worker } /** @@ -212,7 +212,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> struct worker_pool *pool; /* -@@ -867,14 +854,15 @@ struct task_struct *wq_worker_sleeping(s +@@ -896,14 +883,15 @@ struct task_struct *wq_worker_sleeping(s * checking NOT_RUNNING. */ if (worker->flags & WORKER_NOT_RUNNING) @@ -232,7 +232,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* * The counterpart of the following dec_and_test, implied mb, * worklist not empty test sequence is in insert_work(). -@@ -887,9 +875,12 @@ struct task_struct *wq_worker_sleeping(s +@@ -916,9 +904,12 @@ struct task_struct *wq_worker_sleeping(s * lock is safe. */ if (atomic_dec_and_test(&pool->nr_running) && diff --git a/patches/workqueue-prevent-deadlock-stall.patch b/patches/workqueue-prevent-deadlock-stall.patch index 4254cf6239f6a8..765da8c9d53023 100644 --- a/patches/workqueue-prevent-deadlock-stall.patch +++ b/patches/workqueue-prevent-deadlock-stall.patch @@ -111,7 +111,7 @@ Cc: Steven Rostedt <rostedt@goodmis.org> #ifdef CONFIG_DEBUG_OBJECTS_WORK static struct debug_obj_descr work_debug_descr; -@@ -814,10 +844,16 @@ static struct worker *first_idle_worker( +@@ -843,10 +873,16 @@ static struct worker *first_idle_worker( */ static void wake_up_worker(struct worker_pool *pool) { @@ -129,7 +129,7 @@ Cc: Steven Rostedt <rostedt@goodmis.org> } /** -@@ -845,7 +881,7 @@ void wq_worker_running(struct task_struc +@@ -874,7 +910,7 @@ void wq_worker_running(struct task_struc */ void wq_worker_sleeping(struct task_struct *task) { @@ -138,7 +138,7 @@ Cc: Steven Rostedt <rostedt@goodmis.org> struct worker_pool *pool; /* -@@ -862,25 +898,18 @@ void wq_worker_sleeping(struct task_stru +@@ -891,25 +927,18 @@ void wq_worker_sleeping(struct task_stru return; worker->sleeping = 1; @@ -168,7 +168,7 @@ Cc: Steven Rostedt <rostedt@goodmis.org> } /** -@@ -1571,7 +1600,9 @@ static void worker_enter_idle(struct wor +@@ -1600,7 +1629,9 @@ static void worker_enter_idle(struct wor worker->last_active = jiffies; /* idle_list is LIFO */ @@ -178,7 +178,7 @@ Cc: Steven Rostedt <rostedt@goodmis.org> if (too_many_workers(pool) && !timer_pending(&pool->idle_timer)) mod_timer(&pool->idle_timer, jiffies + IDLE_WORKER_TIMEOUT); -@@ -1604,7 +1635,9 @@ static void worker_leave_idle(struct wor +@@ -1633,7 +1664,9 @@ static void worker_leave_idle(struct wor return; worker_clr_flags(worker, WORKER_IDLE); pool->nr_idle--; @@ -188,7 +188,7 @@ Cc: Steven Rostedt <rostedt@goodmis.org> } static struct worker *alloc_worker(int node) -@@ -1770,7 +1803,9 @@ static void destroy_worker(struct worker +@@ -1799,7 +1832,9 @@ static void destroy_worker(struct worker pool->nr_workers--; pool->nr_idle--; diff --git a/patches/workqueue-use-locallock.patch b/patches/workqueue-use-locallock.patch index 44df5c5dedda3d..34761ce1f34141 100644 --- a/patches/workqueue-use-locallock.patch +++ b/patches/workqueue-use-locallock.patch @@ -29,7 +29,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> static int worker_thread(void *__worker); static void workqueue_sysfs_unregister(struct workqueue_struct *wq); -@@ -1082,9 +1085,9 @@ static void put_pwq_unlocked(struct pool +@@ -1111,9 +1114,9 @@ static void put_pwq_unlocked(struct pool * As both pwqs and pools are RCU protected, the * following lock operations are safe. */ @@ -41,7 +41,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } } -@@ -1186,7 +1189,7 @@ static int try_to_grab_pending(struct wo +@@ -1215,7 +1218,7 @@ static int try_to_grab_pending(struct wo struct worker_pool *pool; struct pool_workqueue *pwq; @@ -50,7 +50,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* try to steal the timer if it exists */ if (is_dwork) { -@@ -1250,7 +1253,7 @@ static int try_to_grab_pending(struct wo +@@ -1279,7 +1282,7 @@ static int try_to_grab_pending(struct wo spin_unlock(&pool->lock); fail: rcu_read_unlock(); @@ -59,7 +59,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> if (work_is_canceling(work)) return -ENOENT; cpu_relax(); -@@ -1322,7 +1325,7 @@ static void __queue_work(int cpu, struct +@@ -1351,7 +1354,7 @@ static void __queue_work(int cpu, struct * queued or lose PENDING. Grabbing PENDING and queueing should * happen with IRQ disabled. */ @@ -68,7 +68,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> debug_work_activate(work); -@@ -1427,14 +1430,14 @@ bool queue_work_on(int cpu, struct workq +@@ -1456,14 +1459,14 @@ bool queue_work_on(int cpu, struct workq bool ret = false; unsigned long flags; @@ -85,7 +85,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return ret; } EXPORT_SYMBOL(queue_work_on); -@@ -1501,14 +1504,14 @@ bool queue_delayed_work_on(int cpu, stru +@@ -1530,14 +1533,14 @@ bool queue_delayed_work_on(int cpu, stru unsigned long flags; /* read the comment in __queue_work() */ @@ -102,7 +102,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return ret; } EXPORT_SYMBOL(queue_delayed_work_on); -@@ -1543,7 +1546,7 @@ bool mod_delayed_work_on(int cpu, struct +@@ -1572,7 +1575,7 @@ bool mod_delayed_work_on(int cpu, struct if (likely(ret >= 0)) { __queue_delayed_work(cpu, wq, dwork, delay); @@ -111,7 +111,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } /* -ENOENT from try_to_grab_pending() becomes %true */ -@@ -2817,7 +2820,7 @@ static bool __cancel_work_timer(struct w +@@ -2846,7 +2849,7 @@ static bool __cancel_work_timer(struct w /* tell other tasks trying to grab @work to back off */ mark_work_canceling(work); @@ -120,7 +120,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> flush_work(work); clear_work_data(work); -@@ -2872,10 +2875,10 @@ EXPORT_SYMBOL_GPL(cancel_work_sync); +@@ -2901,10 +2904,10 @@ EXPORT_SYMBOL_GPL(cancel_work_sync); */ bool flush_delayed_work(struct delayed_work *dwork) { @@ -133,7 +133,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return flush_work(&dwork->work); } EXPORT_SYMBOL(flush_delayed_work); -@@ -2910,7 +2913,7 @@ bool cancel_delayed_work(struct delayed_ +@@ -2939,7 +2942,7 @@ bool cancel_delayed_work(struct delayed_ set_work_pool_and_clear_pending(&dwork->work, get_work_pool_id(&dwork->work)); diff --git a/patches/workqueue-use-rcu.patch b/patches/workqueue-use-rcu.patch index 3a156db3d78380..8a70b6cb026ce8 100644 --- a/patches/workqueue-use-rcu.patch +++ b/patches/workqueue-use-rcu.patch @@ -104,7 +104,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> * read locked. * If the pwq needs to be used beyond the locking in effect, the caller is * responsible for guaranteeing that the pwq stays online. -@@ -672,8 +672,8 @@ static struct pool_workqueue *get_work_p +@@ -701,8 +701,8 @@ static struct pool_workqueue *get_work_p * @work: the work item of interest * * Pools are created and destroyed under wq_pool_mutex, and allows read @@ -115,7 +115,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> * * All fields of the returned pool are accessible as long as the above * mentioned locking is in effect. If the returned pool needs to be used -@@ -1079,7 +1079,7 @@ static void put_pwq_unlocked(struct pool +@@ -1108,7 +1108,7 @@ static void put_pwq_unlocked(struct pool { if (pwq) { /* @@ -124,7 +124,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> * following lock operations are safe. */ spin_lock_irq(&pwq->pool->lock); -@@ -1205,6 +1205,7 @@ static int try_to_grab_pending(struct wo +@@ -1234,6 +1234,7 @@ static int try_to_grab_pending(struct wo if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, work_data_bits(work))) return 0; @@ -132,7 +132,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* * The queueing is in progress, or it is already queued. Try to * steal it from ->worklist without clearing WORK_STRUCT_PENDING. -@@ -1243,10 +1244,12 @@ static int try_to_grab_pending(struct wo +@@ -1272,10 +1273,12 @@ static int try_to_grab_pending(struct wo set_work_pool_and_keep_pending(work, pool->id); spin_unlock(&pool->lock); @@ -145,7 +145,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> local_irq_restore(*flags); if (work_is_canceling(work)) return -ENOENT; -@@ -1327,6 +1330,8 @@ static void __queue_work(int cpu, struct +@@ -1356,6 +1359,8 @@ static void __queue_work(int cpu, struct if (unlikely(wq->flags & __WQ_DRAINING) && WARN_ON_ONCE(!is_chained_work(wq))) return; @@ -154,7 +154,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> retry: if (req_cpu == WORK_CPU_UNBOUND) cpu = raw_smp_processor_id(); -@@ -1383,10 +1388,8 @@ static void __queue_work(int cpu, struct +@@ -1412,10 +1417,8 @@ static void __queue_work(int cpu, struct /* pwq determined, queue */ trace_workqueue_queue_work(req_cpu, pwq, work); @@ -167,7 +167,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> pwq->nr_in_flight[pwq->work_color]++; work_flags = work_color_to_flags(pwq->work_color); -@@ -1402,7 +1405,9 @@ static void __queue_work(int cpu, struct +@@ -1431,7 +1434,9 @@ static void __queue_work(int cpu, struct insert_work(pwq, work, worklist, work_flags); @@ -177,7 +177,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } /** -@@ -2687,14 +2692,14 @@ static bool start_flush_work(struct work +@@ -2716,14 +2721,14 @@ static bool start_flush_work(struct work might_sleep(); @@ -195,7 +195,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> /* see the comment in try_to_grab_pending() with the same code */ pwq = get_work_pwq(work); if (pwq) { -@@ -2721,10 +2726,11 @@ static bool start_flush_work(struct work +@@ -2750,10 +2755,11 @@ static bool start_flush_work(struct work else lock_map_acquire_read(&pwq->wq->lockdep_map); lock_map_release(&pwq->wq->lockdep_map); @@ -208,7 +208,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return false; } -@@ -3132,7 +3138,7 @@ static void rcu_free_pool(struct rcu_hea +@@ -3161,7 +3167,7 @@ static void rcu_free_pool(struct rcu_hea * put_unbound_pool - put a worker_pool * @pool: worker_pool to put * @@ -217,7 +217,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> * safe manner. get_unbound_pool() calls this function on its failure path * and this function should be able to release pools which went through, * successfully or not, init_worker_pool(). -@@ -3186,8 +3192,8 @@ static void put_unbound_pool(struct work +@@ -3215,8 +3221,8 @@ static void put_unbound_pool(struct work del_timer_sync(&pool->idle_timer); del_timer_sync(&pool->mayday_timer); @@ -228,7 +228,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } /** -@@ -3294,14 +3300,14 @@ static void pwq_unbound_release_workfn(s +@@ -3323,14 +3329,14 @@ static void pwq_unbound_release_workfn(s put_unbound_pool(pool); mutex_unlock(&wq_pool_mutex); @@ -245,7 +245,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } /** -@@ -3954,7 +3960,7 @@ void destroy_workqueue(struct workqueue_ +@@ -3983,7 +3989,7 @@ void destroy_workqueue(struct workqueue_ * The base ref is never dropped on per-cpu pwqs. Directly * schedule RCU free. */ @@ -254,7 +254,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } else { /* * We're the sole accessor of @wq at this point. Directly -@@ -4047,7 +4053,8 @@ bool workqueue_congested(int cpu, struct +@@ -4076,7 +4082,8 @@ bool workqueue_congested(int cpu, struct struct pool_workqueue *pwq; bool ret; @@ -264,7 +264,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> if (cpu == WORK_CPU_UNBOUND) cpu = smp_processor_id(); -@@ -4058,7 +4065,8 @@ bool workqueue_congested(int cpu, struct +@@ -4087,7 +4094,8 @@ bool workqueue_congested(int cpu, struct pwq = unbound_pwq_by_node(wq, cpu_to_node(cpu)); ret = !list_empty(&pwq->delayed_works); @@ -274,7 +274,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return ret; } -@@ -4084,15 +4092,15 @@ unsigned int work_busy(struct work_struc +@@ -4113,15 +4121,15 @@ unsigned int work_busy(struct work_struc if (work_pending(work)) ret |= WORK_BUSY_PENDING; @@ -294,7 +294,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> return ret; } -@@ -4281,7 +4289,7 @@ void show_workqueue_state(void) +@@ -4310,7 +4318,7 @@ void show_workqueue_state(void) unsigned long flags; int pi; @@ -303,7 +303,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> pr_info("Showing busy workqueues and worker pools:\n"); -@@ -4332,7 +4340,7 @@ void show_workqueue_state(void) +@@ -4361,7 +4369,7 @@ void show_workqueue_state(void) spin_unlock_irqrestore(&pool->lock, flags); } @@ -312,7 +312,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } /* -@@ -4682,16 +4690,16 @@ bool freeze_workqueues_busy(void) +@@ -4711,16 +4719,16 @@ bool freeze_workqueues_busy(void) * nr_active is monotonically decreasing. It's safe * to peek without lock. */ @@ -332,7 +332,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> } out_unlock: mutex_unlock(&wq_pool_mutex); -@@ -4881,7 +4889,8 @@ static ssize_t wq_pool_ids_show(struct d +@@ -4910,7 +4918,8 @@ static ssize_t wq_pool_ids_show(struct d const char *delim = ""; int node, written = 0; @@ -342,7 +342,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> for_each_node(node) { written += scnprintf(buf + written, PAGE_SIZE - written, "%s%d:%d", delim, node, -@@ -4889,7 +4898,8 @@ static ssize_t wq_pool_ids_show(struct d +@@ -4918,7 +4927,8 @@ static ssize_t wq_pool_ids_show(struct d delim = " "; } written += scnprintf(buf + written, PAGE_SIZE - written, "\n"); diff --git a/patches/x86-kvm-require-const-tsc-for-rt.patch b/patches/x86-kvm-require-const-tsc-for-rt.patch index 0df27e3f7e2a7e..5fa84b0893b128 100644 --- a/patches/x86-kvm-require-const-tsc-for-rt.patch +++ b/patches/x86-kvm-require-const-tsc-for-rt.patch @@ -14,7 +14,7 @@ Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c -@@ -5789,6 +5789,13 @@ int kvm_arch_init(void *opaque) +@@ -5788,6 +5788,13 @@ int kvm_arch_init(void *opaque) goto out; } |