• Will Deacon's avatar
    ARM: 7659/1: mm: make mm->context.id an atomic64_t variable · 8a4e3a9e
    Will Deacon authored
    mm->context.id is updated under asid_lock when a new ASID is allocated
    to an mm_struct. However, it is also read without the lock when a task
    is being scheduled and checking whether or not the current ASID
    generation is up-to-date.
    If two threads of the same process are being scheduled in parallel and
    the bottom bits of the generation in their mm->context.id match the
    current generation (that is, the mm_struct has not been used for ~2^24
    rollovers) then the non-atomic, lockless access to mm->context.id may
    yield the incorrect ASID.
    This patch fixes this issue by making mm->context.id and atomic64_t,
    ensuring that the generation is always read consistently. For code that
    only requires access to the ASID bits (e.g. TLB flushing by mm), then
    the value is accessed directly, which GCC converts to an ldrb.
    Cc: <stable@vger.kernel.org> # 3.8
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>