xref: /DragonOS/kernel/src/process/resource.rs (revision da152319797436368304cbc3f85a3b9ec049134b)
1 use num_traits::FromPrimitive;
2 use system_error::SystemError;
3 
4 use crate::time::TimeSpec;
5 
6 use super::ProcessControlBlock;
7 
8 #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
9 #[repr(C)]
10 pub struct RUsage {
11     /// User time used
12     pub ru_utime: TimeSpec,
13     /// System time used
14     pub ru_stime: TimeSpec,
15 
16     // 以下是linux的rusage结构体扩展
17     /// Maximum resident set size
18     pub ru_maxrss: usize,
19     /// Integral shared memory size
20     pub ru_ixrss: usize,
21     /// Integral unshared data size
22     pub ru_idrss: usize,
23     /// Integral unshared stack size
24     pub ru_isrss: usize,
25     /// Page reclaims (soft page faults)
26     pub ru_minflt: usize,
27     /// Page faults (hard page faults)
28     pub ru_majflt: usize,
29     /// Swaps
30     pub ru_nswap: usize,
31     /// Block input operations
32     pub ru_inblock: usize,
33     /// Block output operations
34     pub ru_oublock: usize,
35     /// IPC messages sent
36     pub ru_msgsnd: usize,
37     /// IPC messages received
38     pub ru_msgrcv: usize,
39     /// Signals received
40     pub ru_nsignals: usize,
41     /// Voluntary context switches
42     pub ru_nvcsw: usize,
43     /// Involuntary context switches
44     pub ru_nivcsw: usize,
45 }
46 
47 ///
48 ///  Definition of struct rusage taken from BSD 4.3 Reno
49 ///
50 ///  We don't support all of these yet, but we might as well have them....
51 ///  Otherwise, each time we add new items, programs which depend on this
52 ///  structure will lose.  This reduces the chances of that happening.
53 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
54 pub enum RUsageWho {
55     RUsageSelf = 0,
56     RUsageChildren = -1,
57     /// sys_wait4() uses this
58     RUsageBoth = -2,
59     /// only the calling thread
60     RusageThread = 1,
61 }
62 
63 impl TryFrom<i32> for RUsageWho {
64     type Error = SystemError;
65 
66     fn try_from(value: i32) -> Result<Self, Self::Error> {
67         match value {
68             0 => Ok(RUsageWho::RUsageSelf),
69             -1 => Ok(RUsageWho::RUsageChildren),
70             -2 => Ok(RUsageWho::RUsageBoth),
71             1 => Ok(RUsageWho::RusageThread),
72             _ => Err(SystemError::EINVAL),
73         }
74     }
75 }
76 
77 /// Resource limit
78 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
79 #[repr(C)]
80 pub struct RLimit64 {
81     /// The current (soft) limit
82     pub rlim_cur: u64,
83     /// The hard limit
84     pub rlim_max: u64,
85 }
86 
87 /// Resource limit IDs
88 ///
89 /// ## Note
90 ///
91 /// 有些架构中,这里[5,9]的值是不同的,我们将来需要在这里增加条件编译
92 #[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive)]
93 pub enum RLimitID {
94     /// CPU time in sec
95     Cpu = 0,
96     /// Maximum file size
97     Fsize = 1,
98     /// Max data size
99     Data = 2,
100     /// Max stack size
101     Stack = 3,
102     /// Max core file size
103     Core = 4,
104     /// Max resident set size
105     Rss = 5,
106 
107     /// Max number of processes
108     Nproc = 6,
109     /// Max number of open files
110     Nofile = 7,
111     /// Max locked-in-memory address space
112     Memlock = 8,
113     /// Address space limit
114     As = 9,
115     /// Max number of file locks held
116     Locks = 10,
117 
118     /// Max number of pending signals
119     Sigpending = 11,
120     /// Max bytes in POSIX mqueues
121     Msgqueue = 12,
122     /// Max nice prio allowed to raise to
123     ///  0-39 for nice level 19 .. -20
124     Nice = 13,
125     /// Max realtime priority
126     Rtprio = 14,
127     /// Timeout for RT tasks in us
128     Rttime = 15,
129     Nlimits = 16,
130 }
131 
132 impl TryFrom<usize> for RLimitID {
133     type Error = SystemError;
134 
135     fn try_from(value: usize) -> Result<Self, Self::Error> {
136         <Self as FromPrimitive>::from_usize(value).ok_or(SystemError::EINVAL)
137     }
138 }
139 
140 impl ProcessControlBlock {
141     /// 获取进程资源使用情况
142     ///
143     /// ## TODO
144     ///
145     /// 当前函数尚未实现,只是返回了一个默认的RUsage结构体
146     pub fn get_rusage(&self, _who: RUsageWho) -> Option<RUsage> {
147         let rusage = RUsage::default();
148 
149         Some(rusage)
150     }
151 }
152