• Maksim Rayskiy's avatar
    MIPS: ASID conflict after CPU hotplug · 5c200197
    Maksim Rayskiy authored
    I am running SMP Linux 2.6.37-rc1 on BMIPS5000 (single core dual thread)
    and observe some abnormalities when doing system suspend/resume which I
    narrowed down to cpu hotplugging. The suspend brings the second thread
    processor down and then restarts it, after which I see memory corruption
    in userspace. I started digging and found out that problem occurs because
    while doing execve() the child process is getting the same ASID as the
    parent, which obviously corrupts parent's address space.
    
    Further digging showed that activate_mm() calls get_new_mmu_context() to
    get a new ASID, but at this time ASID field in entryHi is 1, and
    asid_cache(cpu) is 0x100 (it was just reset to ASID_FIRST_VERSION when
    the secondary TP was booting).
    
    So, get_new_mmu_context() increments the asid_cache(cpu) value to
    0x101, and thus puts 0x01 into entryHi. The result - ASID field does
    not get changed as it was supposed to.
    
    My solution is very simple - do not reset asid_cache(cpu) on TP warm
    restart.
    
    Patchwork: https://patchwork.linux-mips.org/patch/1797/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    5c200197
traps.c 43.5 KB