diff options
Diffstat (limited to 'mm/vmstat.c')
-rw-r--r-- | mm/vmstat.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/mm/vmstat.c b/mm/vmstat.c index b1947f0cbee2..809025ed97ea 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -1552,7 +1552,6 @@ static const struct file_operations proc_vmstat_file_operations = { | |||
1552 | #endif /* CONFIG_PROC_FS */ | 1552 | #endif /* CONFIG_PROC_FS */ |
1553 | 1553 | ||
1554 | #ifdef CONFIG_SMP | 1554 | #ifdef CONFIG_SMP |
1555 | static struct workqueue_struct *vmstat_wq; | ||
1556 | static DEFINE_PER_CPU(struct delayed_work, vmstat_work); | 1555 | static DEFINE_PER_CPU(struct delayed_work, vmstat_work); |
1557 | int sysctl_stat_interval __read_mostly = HZ; | 1556 | int sysctl_stat_interval __read_mostly = HZ; |
1558 | 1557 | ||
@@ -1623,7 +1622,7 @@ static void vmstat_update(struct work_struct *w) | |||
1623 | * to occur in the future. Keep on running the | 1622 | * to occur in the future. Keep on running the |
1624 | * update worker thread. | 1623 | * update worker thread. |
1625 | */ | 1624 | */ |
1626 | queue_delayed_work_on(smp_processor_id(), vmstat_wq, | 1625 | queue_delayed_work_on(smp_processor_id(), mm_percpu_wq, |
1627 | this_cpu_ptr(&vmstat_work), | 1626 | this_cpu_ptr(&vmstat_work), |
1628 | round_jiffies_relative(sysctl_stat_interval)); | 1627 | round_jiffies_relative(sysctl_stat_interval)); |
1629 | } | 1628 | } |
@@ -1702,7 +1701,7 @@ static void vmstat_shepherd(struct work_struct *w) | |||
1702 | struct delayed_work *dw = &per_cpu(vmstat_work, cpu); | 1701 | struct delayed_work *dw = &per_cpu(vmstat_work, cpu); |
1703 | 1702 | ||
1704 | if (!delayed_work_pending(dw) && need_update(cpu)) | 1703 | if (!delayed_work_pending(dw) && need_update(cpu)) |
1705 | queue_delayed_work_on(cpu, vmstat_wq, dw, 0); | 1704 | queue_delayed_work_on(cpu, mm_percpu_wq, dw, 0); |
1706 | } | 1705 | } |
1707 | put_online_cpus(); | 1706 | put_online_cpus(); |
1708 | 1707 | ||
@@ -1718,7 +1717,6 @@ static void __init start_shepherd_timer(void) | |||
1718 | INIT_DEFERRABLE_WORK(per_cpu_ptr(&vmstat_work, cpu), | 1717 | INIT_DEFERRABLE_WORK(per_cpu_ptr(&vmstat_work, cpu), |
1719 | vmstat_update); | 1718 | vmstat_update); |
1720 | 1719 | ||
1721 | vmstat_wq = alloc_workqueue("vmstat", WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); | ||
1722 | schedule_delayed_work(&shepherd, | 1720 | schedule_delayed_work(&shepherd, |
1723 | round_jiffies_relative(sysctl_stat_interval)); | 1721 | round_jiffies_relative(sysctl_stat_interval)); |
1724 | } | 1722 | } |
@@ -1764,11 +1762,16 @@ static int vmstat_cpu_dead(unsigned int cpu) | |||
1764 | 1762 | ||
1765 | #endif | 1763 | #endif |
1766 | 1764 | ||
1767 | static int __init setup_vmstat(void) | 1765 | struct workqueue_struct *mm_percpu_wq; |
1766 | |||
1767 | void __init init_mm_internals(void) | ||
1768 | { | 1768 | { |
1769 | #ifdef CONFIG_SMP | 1769 | int ret __maybe_unused; |
1770 | int ret; | 1770 | |
1771 | mm_percpu_wq = alloc_workqueue("mm_percpu_wq", | ||
1772 | WQ_FREEZABLE|WQ_MEM_RECLAIM, 0); | ||
1771 | 1773 | ||
1774 | #ifdef CONFIG_SMP | ||
1772 | ret = cpuhp_setup_state_nocalls(CPUHP_MM_VMSTAT_DEAD, "mm/vmstat:dead", | 1775 | ret = cpuhp_setup_state_nocalls(CPUHP_MM_VMSTAT_DEAD, "mm/vmstat:dead", |
1773 | NULL, vmstat_cpu_dead); | 1776 | NULL, vmstat_cpu_dead); |
1774 | if (ret < 0) | 1777 | if (ret < 0) |
@@ -1792,9 +1795,7 @@ static int __init setup_vmstat(void) | |||
1792 | proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); | 1795 | proc_create("vmstat", S_IRUGO, NULL, &proc_vmstat_file_operations); |
1793 | proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations); | 1796 | proc_create("zoneinfo", S_IRUGO, NULL, &proc_zoneinfo_file_operations); |
1794 | #endif | 1797 | #endif |
1795 | return 0; | ||
1796 | } | 1798 | } |
1797 | module_init(setup_vmstat) | ||
1798 | 1799 | ||
1799 | #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_COMPACTION) | 1800 | #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_COMPACTION) |
1800 | 1801 | ||