]> git.karo-electronics.de Git - karo-tx-linux.git/commit
ARM: 7767/1: let the ASID allocator handle suspended animation
authorMarc Zyngier <Marc.Zyngier@arm.com>
Fri, 21 Jun 2013 11:06:19 +0000 (12:06 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 22 Jul 2013 01:21:33 +0000 (18:21 -0700)
commitb7dc4032cd44843ea93119adb00a5f15b7b05943
tree52faa078648b8fa6418ee78ae4abca59265bca66
parentc9f3f7f79f3ee852f253bdb1dbbb43d79bcaa6c2
ARM: 7767/1: let the ASID allocator handle suspended animation

commit ae120d9edfe96628f03d87634acda0bfa7110632 upstream.

When a CPU is running a process, the ASID for that process is
held in a per-CPU variable (the "active ASIDs" array). When
the ASID allocator handles a rollover, it copies the active
ASIDs into a "reserved ASIDs" array to ensure that a process
currently running on another CPU will continue to run unaffected.
The active array is zero-ed to indicate that a rollover occurred.

Because of this mechanism, a reserved ASID is only remembered for
a single rollover. A subsequent rollover will completely refill
the reserved ASIDs array.

In a severely oversubscribed environment where a CPU can be
prevented from running for extended periods of time (think virtual
machines), the above has a horrible side effect:

[P{a} denotes process P running with ASID a]

CPU-0 CPU-1

A{x} [active = <x 0>]

[suspended] runs B{y} [active = <x y>]

[rollover:
 active = <0 0>
 reserved = <x y>]

runs B{y} [active = <0 y>
 reserved = <x y>]

[rollover:
 active = <0 0>
 reserved = <0 y>]

runs C{x} [active = <0 x>]

[resumes]

runs A{x}

At that stage, both A and C have the same ASID, with deadly
consequences.

The fix is to preserve reserved ASIDs across rollovers if
the CPU doesn't have an active ASID when the rollover occurs.

Acked-by: Will Deacon <will.deacon@arm.com>
Acked-by: Catalin Carinas <catalin.marinas@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm/mm/context.c