• Matt Redfearn's avatar
    MIPS: SMP: Fix deadlock & online race · 9e8c399a
    Matt Redfearn authored
    Commit 6f542ebe ("MIPS: Fix race on setting and getting
    cpu_online_mask") effectively reverted commit 8f46cca1 ("MIPS: SMP:
    Fix possibility of deadlock when bringing CPUs online") and thus has
    reinstated the possibility of deadlock.
    
    The commit was based on testing of kernel v4.4, where the CPU hotplug
    core code issued a BUG() if the starting CPU is not marked online when
    the boot CPU returns from __cpu_up. The commit fixes this race (in
    v4.4), but re-introduces the deadlock situation.
    
    As noted in the commit message, upstream differs in this area. Commit
    8df3e07e ("cpu/hotplug: Let upcoming cpu bring itself fully up")
    adds a completion event in the CPU hotplug core code, making this race
    impossible. However, people were unhappy with relying on the core code
    to do the right thing.
    
    To address the issues both commits were trying to fix, add a second
    completion event in the MIPS smp hotplug path. It removes the
    possibility of a race, since the MIPS smp hotplug code now synchronises
    both the boot and secondary CPUs before they return to the hotplug core
    code. It also addresses the deadlock by ensuring that the secondary CPU
    is not marked online before it's counters are synchronised.
    
    This fix should also be backported to fix the race condition introduced
    by the backport of commit 8f46cca1 ("MIPS: SMP: Fix possibility of
    deadlock when bringing CPUs online"), through really that race only
    existed before commit 8df3e07e ("cpu/hotplug: Let upcoming cpu
    bring itself fully up").
    Signed-off-by: default avatarMatt Redfearn <matt.redfearn@imgtec.com>
    Fixes: 6f542ebe ("MIPS: Fix race on setting and getting cpu_online_mask")
    CC: Matija Glavinic Pecotic <matija.glavinic-pecotic.ext@nokia.com>
    Cc: <stable@vger.kernel.org> # v4.1+: 8f46cca1: "MIPS: SMP: Fix possibility of deadlock when bringing CPUs online"
    Cc: <stable@vger.kernel.org> # v4.1+: a00eeede: "MIPS: SMP: Use a completion event to signal CPU up"
    Cc: <stable@vger.kernel.org> # v4.1+: 6f542ebe: "MIPS: Fix race on setting and getting cpu_online_mask"
    Cc: <stable@vger.kernel.org> # v4.1+
    Patchwork: https://patchwork.linux-mips.org/patch/17376/Signed-off-by: default avatarJames Hogan <jhogan@kernel.org>
    9e8c399a
smp.c 16.1 KB