diff options
Diffstat (limited to 'debian/patches-rt/mm-perform-lru_add_drain_all-remotely.patch')
-rw-r--r-- | debian/patches-rt/mm-perform-lru_add_drain_all-remotely.patch | 103 |
1 files changed, 0 insertions, 103 deletions
diff --git a/debian/patches-rt/mm-perform-lru_add_drain_all-remotely.patch b/debian/patches-rt/mm-perform-lru_add_drain_all-remotely.patch deleted file mode 100644 index 4006bc3ac..000000000 --- a/debian/patches-rt/mm-perform-lru_add_drain_all-remotely.patch +++ /dev/null @@ -1,103 +0,0 @@ -From: Luiz Capitulino <lcapitulino@redhat.com> -Date: Fri, 27 May 2016 15:03:28 +0200 -Subject: [PATCH] mm: perform lru_add_drain_all() remotely -Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/5.2/older/patches-5.2.17-rt9.tar.xz - -lru_add_drain_all() works by scheduling lru_add_drain_cpu() to run -on all CPUs that have non-empty LRU pagevecs and then waiting for -the scheduled work to complete. However, workqueue threads may never -have the chance to run on a CPU that's running a SCHED_FIFO task. -This causes lru_add_drain_all() to block forever. - -This commit solves this problem by changing lru_add_drain_all() -to drain the LRU pagevecs of remote CPUs. This is done by grabbing -swapvec_lock and calling lru_add_drain_cpu(). - -PS: This is based on an idea and initial implementation by - Rik van Riel. - -Signed-off-by: Rik van Riel <riel@redhat.com> -Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> -Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> ---- - mm/swap.c | 36 ++++++++++++++++++++++++++++++------ - 1 file changed, 30 insertions(+), 6 deletions(-) - ---- a/mm/swap.c -+++ b/mm/swap.c -@@ -585,9 +585,15 @@ void lru_add_drain_cpu(int cpu) - unsigned long flags; - - /* No harm done if a racing interrupt already did this */ -+#ifdef CONFIG_PREEMPT_RT_BASE -+ local_lock_irqsave_on(rotate_lock, flags, cpu); -+ pagevec_move_tail(pvec); -+ local_unlock_irqrestore_on(rotate_lock, flags, cpu); -+#else - local_lock_irqsave(rotate_lock, flags); - pagevec_move_tail(pvec); - local_unlock_irqrestore(rotate_lock, flags); -+#endif - } - - pvec = &per_cpu(lru_deactivate_file_pvecs, cpu); -@@ -657,6 +663,16 @@ void lru_add_drain(void) - - #ifdef CONFIG_SMP - -+#ifdef CONFIG_PREEMPT_RT_BASE -+static inline void remote_lru_add_drain(int cpu, struct cpumask *has_work) -+{ -+ local_lock_on(swapvec_lock, cpu); -+ lru_add_drain_cpu(cpu); -+ local_unlock_on(swapvec_lock, cpu); -+} -+ -+#else -+ - static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); - - static void lru_add_drain_per_cpu(struct work_struct *dummy) -@@ -664,6 +680,16 @@ static void lru_add_drain_per_cpu(struct - lru_add_drain(); - } - -+static inline void remote_lru_add_drain(int cpu, struct cpumask *has_work) -+{ -+ struct work_struct *work = &per_cpu(lru_add_drain_work, cpu); -+ -+ INIT_WORK(work, lru_add_drain_per_cpu); -+ queue_work_on(cpu, mm_percpu_wq, work); -+ cpumask_set_cpu(cpu, has_work); -+} -+#endif -+ - /* - * Doesn't need any cpu hotplug locking because we do rely on per-cpu - * kworkers being shut down before our page_alloc_cpu_dead callback is -@@ -688,21 +714,19 @@ void lru_add_drain_all(void) - cpumask_clear(&has_work); - - for_each_online_cpu(cpu) { -- struct work_struct *work = &per_cpu(lru_add_drain_work, cpu); - - if (pagevec_count(&per_cpu(lru_add_pvec, cpu)) || - pagevec_count(&per_cpu(lru_rotate_pvecs, cpu)) || - pagevec_count(&per_cpu(lru_deactivate_file_pvecs, cpu)) || - pagevec_count(&per_cpu(lru_lazyfree_pvecs, cpu)) || -- need_activate_page_drain(cpu)) { -- INIT_WORK(work, lru_add_drain_per_cpu); -- queue_work_on(cpu, mm_percpu_wq, work); -- cpumask_set_cpu(cpu, &has_work); -- } -+ need_activate_page_drain(cpu)) -+ remote_lru_add_drain(cpu, &has_work); - } - -+#ifndef CONFIG_PREEMPT_RT_BASE - for_each_cpu(cpu, &has_work) - flush_work(&per_cpu(lru_add_drain_work, cpu)); -+#endif - - mutex_unlock(&lock); - } |