diff --git a/fs/proc/internal.h b/fs/proc/internal.h index e05deaee80d93..041af21ebc0bc 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -298,6 +298,7 @@ struct proc_maps_private { #ifdef CONFIG_NUMA struct mempolicy *task_mempolicy; #endif + unsigned long old_cpus_allowed; } __randomize_layout; struct mm_struct *proc_mem_open(struct inode *inode, unsigned int mode); diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index b4a6e797dea4c..2a923a3606f96 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -182,6 +182,9 @@ static void vma_stop(struct proc_maps_private *priv) release_task_mempolicy(priv); up_read(&mm->mmap_sem); mmput(mm); + + sched_migrate_to_cpumask_end(to_cpumask(&priv->old_cpus_allowed), + cpu_lp_mask); } static struct vm_area_struct * @@ -218,6 +221,9 @@ static void *m_start(struct seq_file *m, loff_t *ppos) if (!mm || !mmget_not_zero(mm)) return NULL; + sched_migrate_to_cpumask_start(to_cpumask(&priv->old_cpus_allowed), + cpu_lp_mask); + if (down_read_killable(&mm->mmap_sem)) { mmput(mm); return ERR_PTR(-EINTR);