aboutsummaryrefslogtreecommitdiff
path: root/drivers/message/fusion/lsi/mpi_raid.h
diff options
context:
space:
mode:
authorMarc Zyngier <[email protected]>2013-06-21 12:06:19 +0100
committerRussell King <[email protected]>2013-06-24 15:24:54 +0100
commitae120d9edfe96628f03d87634acda0bfa7110632 (patch)
tree440fd50064b5745afc7613178fff7a5e5436be76 /drivers/message/fusion/lsi/mpi_raid.h
parent8121cf312a1908f67173ec3773da1688e04437e7 (diff)
ARM: 7767/1: let the ASID allocator handle suspended animation
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. Cc: <[email protected]> # 3.9 Acked-by: Will Deacon <[email protected]> Acked-by: Catalin Carinas <[email protected]> Signed-off-by: Marc Zyngier <[email protected]> Signed-off-by: Russell King <[email protected]>
Diffstat (limited to 'drivers/message/fusion/lsi/mpi_raid.h')
0 files changed, 0 insertions, 0 deletions