starnix_sync/lock_ordering.rs
1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::Unlocked;
6use lock_ordering_macro::lock_ordering;
7
8lock_ordering! {
9 // UninterruptibleLock represents a virtual level before which lock must be interruptible.
10 Unlocked => UninterruptibleLock,
11 // Artificial level for ResourceAccessor.add_file_with_flags(..)
12 Unlocked => ResourceAccessorAddFile,
13 // Artificial level for DeviceOps.open(..)
14 ResourceAccessorAddFile => DeviceOpen,
15 // Artificial level for several FileOps and FsNodeOps method forming a connected group
16 // because of dependencies between them: FileOps.read, FsNode.create_file_ops, ...
17 DeviceOpen => FileOpsCore,
18 // Artificial level for methods in FsNodeOps/FileOps that require access to the
19 // FsNode.append_lock
20 Unlocked => BeforeFsNodeAppend,
21 // FsNode.append_lock
22 BeforeFsNodeAppend => FsNodeAppend,
23 FsNodeAppend => FileOpsCore,
24 // FileOpsCore are interruptible
25 FileOpsCore => UninterruptibleLock,
26 // Artificial lock level for {Task, CurrentTask}.release()
27 Unlocked => TaskRelease,
28 // During task release, file must be closed.
29 TaskRelease => FileOpsCore,
30 // Kernel.iptables
31 UninterruptibleLock => KernelIpTables,
32 // Kernel.swap_files
33 UninterruptibleLock => KernelSwapFiles,
34 // MemoryManager.dumpable
35 UninterruptibleLock => MmDumpable,
36 // ProcessGroup.mutable_state.
37 // Needs to be before TaskRelease because of the dependency in CurrentTask.release()
38 TaskRelease => ProcessGroupState,
39 UninterruptibleLock => ProcessGroupState,
40 // ProcessGroup.mutable_state. Artificial locks above need to be before it because of
41 // dependencies in DevPtsFile.{read, write, ioctl}.
42 FileOpsCore => ProcessGroupState,
43 // Bpf locks
44 UninterruptibleLock => BpfPrograms,
45 // Userfaultfd
46 FileOpsCore => UserFaultInner,
47 UninterruptibleLock => UserFaultInner,
48 // MemoryPressureMonitor
49 UninterruptibleLock => MemoryPressureMonitor,
50 FileOpsCore => MemoryPressureMonitor,
51 MemoryPressureMonitor => MemoryPressureMonitorClientState
52}