• KeMeng Shi's avatar
    sched/core: Fix migration to invalid CPU in __set_cpus_allowed_ptr() · 714e501e
    KeMeng Shi authored
    An oops can be triggered in the scheduler when running qemu on arm64:
    
     Unable to handle kernel paging request at virtual address ffff000008effe40
     Internal error: Oops: 96000007 [#1] SMP
     Process migration/0 (pid: 12, stack limit = 0x00000000084e3736)
     pstate: 20000085 (nzCv daIf -PAN -UAO)
     pc : __ll_sc___cmpxchg_case_acq_4+0x4/0x20
     lr : move_queued_task.isra.21+0x124/0x298
     ...
     Call trace:
      __ll_sc___cmpxchg_case_acq_4+0x4/0x20
      __migrate_task+0xc8/0xe0
      migration_cpu_stop+0x170/0x180
      cpu_stopper_thread+0xec/0x178
      smpboot_thread_fn+0x1ac/0x1e8
      kthread+0x134/0x138
      ret_from_fork+0x10/0x18
    
    __set_cpus_allowed_ptr() will choose an active dest_cpu in affinity mask to
    migrage the process if process is not currently running on any one of the
    CPUs specified in affinity mask. __set_cpus_allowed_ptr() will choose an
    invalid dest_cpu (dest_cpu >= nr_cpu_ids, 1024 in my virtual machine) if
    CPUS in an affinity mask are deactived by cpu_down after cpumask_intersects
    check. cpumask_test_cpu() of dest_cpu afterwards is overflown and may pass if
    corresponding bit is coincidentally set. As a consequence, kernel will
    access an invalid rq address associate with the invalid CPU in
    migration_cpu_stop->__migrate_task->move_queued_task and the Oops occurs.
    
    The reproduce the crash:
    
      1) A process repeatedly binds itself to cpu0 and cpu1 in turn by calling
      sched_setaffinity.
    
      2) A shell script repeatedly does "echo 0 > /sys/devices/system/cpu/cpu1/online"
      and "echo 1 > /sys/devices/system/cpu/cpu1/online" in turn.
    
      3) Oops appears if the invalid CPU is set in memory after tested cpumask.
    Signed-off-by: default avatarKeMeng Shi <shikemeng@huawei.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: https://lkml.kernel.org/r/1568616808-16808-1-git-send-email-shikemeng@huawei.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    714e501e
core.c 198 KB