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