Skip to content
  • Sebastian Andrzej Siewior's avatar
    Revert mm/vmstat.c: fix vmstat_update() preemption BUG · 28557cc1
    Sebastian Andrzej Siewior authored
    Revert commit c7f26ccf ("mm/vmstat.c: fix vmstat_update() preemption
    BUG").  Steven saw a "using smp_processor_id() in preemptible" message
    and added a preempt_disable() section around it to keep it quiet.  This
    is not the right thing to do it does not fix the real problem.
    
    vmstat_update() is invoked by a kworker on a specific CPU.  This worker
    it bound to this CPU.  The name of the worker was "kworker/1:1" so it
    should have been a worker which was bound to CPU1.  A worker which can
    run on any CPU would have a `u' before the first digit.
    
    smp_processor_id() can be used in a preempt-enabled region as long as
    the task is bound to a single CPU which is the case here.  If it could
    run on an arbitrary CPU then this is the problem we have an should seek
    to resolve.
    
    Not only this smp_processor_id() must not be migrated to another CPU but
    also refresh_cpu_vm_stats() which might access wrong per-CPU variables.
    Not to mention that other code relies on the fact that such a worker
    runs on one specific CPU only.
    
    Therefore revert that commit and we should look instead what broke the
    affinity mask of the kworker.
    
    Link: http://lkml.kernel.org/r/20180504104451.20278-1-bigeasy@linutronix.de
    
    
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Steven J. Hill <steven.hill@cavium.com>
    Cc: Tejun Heo <htejun@gmail.com>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    28557cc1