diff options
Diffstat (limited to 'mm/swap.c')
-rw-r--r-- | mm/swap.c | 27 |
1 files changed, 8 insertions, 19 deletions
@@ -670,30 +670,19 @@ static void lru_add_drain_per_cpu(struct work_struct *dummy) | |||
670 | 670 | ||
671 | static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); | 671 | static DEFINE_PER_CPU(struct work_struct, lru_add_drain_work); |
672 | 672 | ||
673 | /* | ||
674 | * lru_add_drain_wq is used to do lru_add_drain_all() from a WQ_MEM_RECLAIM | ||
675 | * workqueue, aiding in getting memory freed. | ||
676 | */ | ||
677 | static struct workqueue_struct *lru_add_drain_wq; | ||
678 | |||
679 | static int __init lru_init(void) | ||
680 | { | ||
681 | lru_add_drain_wq = alloc_workqueue("lru-add-drain", WQ_MEM_RECLAIM, 0); | ||
682 | |||
683 | if (WARN(!lru_add_drain_wq, | ||
684 | "Failed to create workqueue lru_add_drain_wq")) | ||
685 | return -ENOMEM; | ||
686 | |||
687 | return 0; | ||
688 | } | ||
689 | early_initcall(lru_init); | ||
690 | |||
691 | void lru_add_drain_all(void) | 673 | void lru_add_drain_all(void) |
692 | { | 674 | { |
693 | static DEFINE_MUTEX(lock); | 675 | static DEFINE_MUTEX(lock); |
694 | static struct cpumask has_work; | 676 | static struct cpumask has_work; |
695 | int cpu; | 677 | int cpu; |
696 | 678 | ||
679 | /* | ||
680 | * Make sure nobody triggers this path before mm_percpu_wq is fully | ||
681 | * initialized. | ||
682 | */ | ||
683 | if (WARN_ON(!mm_percpu_wq)) | ||
684 | return; | ||
685 | |||
697 | mutex_lock(&lock); | 686 | mutex_lock(&lock); |
698 | get_online_cpus(); | 687 | get_online_cpus(); |
699 | cpumask_clear(&has_work); | 688 | cpumask_clear(&has_work); |
@@ -707,7 +696,7 @@ void lru_add_drain_all(void) | |||
707 | pagevec_count(&per_cpu(lru_deactivate_pvecs, cpu)) || | 696 | pagevec_count(&per_cpu(lru_deactivate_pvecs, cpu)) || |
708 | need_activate_page_drain(cpu)) { | 697 | need_activate_page_drain(cpu)) { |
709 | INIT_WORK(work, lru_add_drain_per_cpu); | 698 | INIT_WORK(work, lru_add_drain_per_cpu); |
710 | queue_work_on(cpu, lru_add_drain_wq, work); | 699 | queue_work_on(cpu, mm_percpu_wq, work); |
711 | cpumask_set_cpu(cpu, &has_work); | 700 | cpumask_set_cpu(cpu, &has_work); |
712 | } | 701 | } |
713 | } | 702 | } |