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}