Skip to main content

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 => FuseFsRenameLevel,
11    FuseFsRenameLevel => FuseDirEntryChildrenLevel,
12    FuseDirEntryChildrenLevel => FuseFsNodeInfoLevel,
13    FuseFsNodeInfoLevel => UninterruptibleLock,
14    // Artificial level for ResourceAccessor.add_file_with_flags(..)
15    Unlocked => ResourceAccessorLevel,
16    // Level for FileObject offset lock.
17    Unlocked => FileObjectOffset,
18    FileObjectOffset => BeforeFsNodeAppend,
19    // Artificial level for methods in FsNodeOps/FileOps that require access to the
20    // FsNode.append_lock
21    Unlocked => BeforeFsNodeAppend,
22    BeforeFsNodeAppend => FsNodeAppend,
23    // Artificial level for file operations.
24    FsNodeAppend => FileOpsCore,
25    ResourceAccessorLevel => FileOpsCore,
26    // FileOpsCore are interruptible
27    FileOpsCore => UninterruptibleLock,
28    // Artificial lock level for {Task, CurrentTask}.release()
29    Unlocked => TaskRelease,
30    // During task release, file must be closed.
31    TaskRelease => FileOpsCore,
32    // Kernel.iptables
33    UninterruptibleLock => KernelIpTables,
34    // Kernel.swap_files
35    UninterruptibleLock => KernelSwapFiles,
36    // ThreadGroup.limits
37    ProcessGroupState => ThreadGroupLimits,
38    MmDumpable => ThreadGroupLimits,
39    // MemoryManager.dumpable
40    UninterruptibleLock => MmDumpable,
41    // ProcessGroup.mutable_state.
42    // Needs to be before TaskRelease because of the dependency in CurrentTask.release()
43    TaskRelease => ProcessGroupState,
44    UninterruptibleLock => ProcessGroupState,
45    // ProcessGroup.mutable_state. Artificial locks above need to be before it because of
46    // dependencies in DevPtsFile.{read, write, ioctl}.
47    FileOpsCore => ProcessGroupState,
48    // Userfaultfd
49    FileOpsCore => UserFaultInner,
50    UninterruptibleLock => UserFaultInner,
51    // MemoryPressureMonitor
52    UninterruptibleLock => MemoryPressureMonitor,
53    FileOpsCore => MemoryPressureMonitor,
54    MemoryPressureMonitor => MemoryPressureMonitorClientState,
55    // Fastrpc
56    UninterruptibleLock => FastrpcInnerState,
57    // MemoryXattrStorage
58    UninterruptibleLock => MemoryXattrStorageLevel,
59    // DeviceRegistry
60    UninterruptibleLock => DeviceRegistryState,
61    FileOpsCore => DeviceRegistryState,
62
63    // Binderfs locks
64    UninterruptibleLock => RemoteBinderHandleLevel,
65    RemoteBinderHandleLevel => BinderProcsLevel,
66    FileObjectOffset => BinderFsDevicesLevel,
67    DirEntryChildrenLevel => BinderFsDevicesLevel,
68    BinderFsDevicesLevel => FsNodeInfoLevel,
69    FsNodeInfoLevel => TerminalLock,
70    BinderFsDevicesLevel => DeviceRegistryState,
71    BinderProcsLevel => BinderProcessSharedMemoryLevel,
72    BinderProcessSharedMemoryLevel => BinderFreezeLevel,
73    BinderFreezeLevel => BinderProcessStateLevel,
74    BinderProcessSharedMemoryLevel => DeviceRegistryState,
75    BinderProcessStateLevel => BinderContextManagerLevel,
76    BinderContextManagerLevel => TerminalLock,
77    FileOpsCore => BinderContextManagerLevel,
78    UninterruptibleLock => BinderObjectLevel,
79    FileOpsCore => BinderObjectLevel,
80    BinderProcessStateLevel => BinderObjectLevel,
81    BinderObjectLevel => TerminalLock,
82
83    // VFS locks
84    BinderProcessSharedMemoryLevel => FsRenameRecursive,
85    FsRenameRecursive => DirEntryChildrenRecursiveLevel,
86    DirEntryChildrenRecursiveLevel => FsNodeInfoRecursiveLevel,
87    FsNodeInfoRecursiveLevel => FsRename,
88    FsRename => DirEntryChildrenLevel,
89
90    // Terminal Level. No lock level should ever be defined after this. Can be used for any locks
91    // that is never acquired before any other lock.
92    UninterruptibleLock => TerminalLock,
93    FileOpsCore => TerminalLock,
94
95    // eBPF locks
96    UninterruptibleLock => EbpfStateLock,
97    UninterruptibleLock => EbpfMapStateLevel,
98    EbpfStateLock => EbpfSuspendLock,
99    EbpfMapStateLevel => EbpfSuspendLock,
100}