xref: /DragonOS/kernel/src/driver/base/kset.rs (revision 06d5e247267cb65b84a80f219853ccd0f384b16e)
1*06d5e247SLoGin use alloc::{
2*06d5e247SLoGin     string::String,
3*06d5e247SLoGin     sync::{Arc, Weak},
4*06d5e247SLoGin     vec::Vec,
5*06d5e247SLoGin };
6*06d5e247SLoGin 
7*06d5e247SLoGin use core::hash::Hash;
8*06d5e247SLoGin 
9*06d5e247SLoGin use crate::{
10*06d5e247SLoGin     filesystem::{
11*06d5e247SLoGin         kernfs::KernFSInode,
12*06d5e247SLoGin         sysfs::{AttributeGroup, SysFSOps},
13*06d5e247SLoGin     },
14*06d5e247SLoGin     libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
15*06d5e247SLoGin     syscall::SystemError,
16*06d5e247SLoGin };
17*06d5e247SLoGin 
18*06d5e247SLoGin use super::kobject::{
19*06d5e247SLoGin     KObjType, KObject, KObjectManager, KObjectState, KObjectSysFSOps, LockedKObjectState,
20*06d5e247SLoGin };
21*06d5e247SLoGin 
22*06d5e247SLoGin #[derive(Debug)]
23*06d5e247SLoGin pub struct KSet {
24*06d5e247SLoGin     /// 属于当前kset的kobject
25*06d5e247SLoGin     kobjects: RwLock<Vec<Weak<dyn KObject>>>,
26*06d5e247SLoGin     /// 节点的一些信息
27*06d5e247SLoGin     inner: RwLock<InnerKSet>,
28*06d5e247SLoGin     /// kobject的状态
29*06d5e247SLoGin     kobj_state: LockedKObjectState,
30*06d5e247SLoGin     /// 与父节点有关的一些信息
31*06d5e247SLoGin     parent_data: RwLock<KSetParentData>,
32*06d5e247SLoGin     self_ref: Weak<KSet>,
33*06d5e247SLoGin }
34*06d5e247SLoGin 
35*06d5e247SLoGin impl Hash for KSet {
36*06d5e247SLoGin     fn hash<H: ~const core::hash::Hasher>(&self, state: &mut H) {
37*06d5e247SLoGin         self.self_ref.as_ptr().hash(state);
38*06d5e247SLoGin         self.inner.read().name.hash(state);
39*06d5e247SLoGin     }
40*06d5e247SLoGin }
41*06d5e247SLoGin 
42*06d5e247SLoGin impl core::cmp::Eq for KSet {}
43*06d5e247SLoGin 
44*06d5e247SLoGin impl core::cmp::PartialEq for KSet {
45*06d5e247SLoGin     fn eq(&self, other: &Self) -> bool {
46*06d5e247SLoGin         self.self_ref.as_ptr() == other.self_ref.as_ptr()
47*06d5e247SLoGin     }
48*06d5e247SLoGin }
49*06d5e247SLoGin 
50*06d5e247SLoGin impl KSet {
51*06d5e247SLoGin     pub fn new(name: String) -> Arc<Self> {
52*06d5e247SLoGin         let r = Self {
53*06d5e247SLoGin             kobjects: RwLock::new(Vec::new()),
54*06d5e247SLoGin             inner: RwLock::new(InnerKSet::new(name)),
55*06d5e247SLoGin             kobj_state: LockedKObjectState::new(KObjectState::empty()),
56*06d5e247SLoGin             parent_data: RwLock::new(KSetParentData::new(None, None)),
57*06d5e247SLoGin             self_ref: Weak::default(),
58*06d5e247SLoGin         };
59*06d5e247SLoGin 
60*06d5e247SLoGin         let r = Arc::new(r);
61*06d5e247SLoGin 
62*06d5e247SLoGin         unsafe {
63*06d5e247SLoGin             let p = r.as_ref() as *const Self as *mut Self;
64*06d5e247SLoGin             (*p).self_ref = Arc::downgrade(&r);
65*06d5e247SLoGin         }
66*06d5e247SLoGin 
67*06d5e247SLoGin         return r;
68*06d5e247SLoGin     }
69*06d5e247SLoGin 
70*06d5e247SLoGin     /// 创建一个kset,并且设置它的父亲为parent_kobj。然后把这个kset注册到sysfs
71*06d5e247SLoGin     ///
72*06d5e247SLoGin     /// ## 参数
73*06d5e247SLoGin     ///
74*06d5e247SLoGin     /// - name: kset的名字
75*06d5e247SLoGin     /// - parent_kobj: 父亲kobject
76*06d5e247SLoGin     /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中
77*06d5e247SLoGin     pub fn new_and_add(
78*06d5e247SLoGin         name: String,
79*06d5e247SLoGin         parent_kobj: Option<Arc<dyn KObject>>,
80*06d5e247SLoGin         join_kset: Option<Arc<KSet>>,
81*06d5e247SLoGin     ) -> Result<Arc<Self>, SystemError> {
82*06d5e247SLoGin         let kset = KSet::new(name);
83*06d5e247SLoGin         if let Some(parent_kobj) = parent_kobj {
84*06d5e247SLoGin             kset.set_parent(Some(Arc::downgrade(&parent_kobj)));
85*06d5e247SLoGin         }
86*06d5e247SLoGin         kset.register(join_kset)?;
87*06d5e247SLoGin         return Ok(kset);
88*06d5e247SLoGin     }
89*06d5e247SLoGin 
90*06d5e247SLoGin     pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> {
91*06d5e247SLoGin         return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset);
92*06d5e247SLoGin         // todo: 引入uevent之后,发送uevent
93*06d5e247SLoGin     }
94*06d5e247SLoGin 
95*06d5e247SLoGin     /// 把一个kobject加入到当前kset中。
96*06d5e247SLoGin     ///
97*06d5e247SLoGin     /// 该函数不会修改kobj的parent,需要调用者自己视情况修改。
98*06d5e247SLoGin     ///
99*06d5e247SLoGin     /// ## Panic
100*06d5e247SLoGin     ///
101*06d5e247SLoGin     /// 这个kobject的kset必须是None,否则会panic
102*06d5e247SLoGin     pub fn join(&self, kobj: &Arc<dyn KObject>) {
103*06d5e247SLoGin         assert!(kobj.kset().is_none());
104*06d5e247SLoGin         kobj.set_kset(self.self_ref.upgrade());
105*06d5e247SLoGin         self.kobjects.write().push(Arc::downgrade(&kobj));
106*06d5e247SLoGin     }
107*06d5e247SLoGin 
108*06d5e247SLoGin     /// 把一个kobject从当前kset中移除。
109*06d5e247SLoGin     pub fn leave(&self, kobj: &Arc<dyn KObject>) {
110*06d5e247SLoGin         let mut kobjects = self.kobjects.write();
111*06d5e247SLoGin         let index = kobjects.iter().position(|x| {
112*06d5e247SLoGin             if let Some(x) = x.upgrade() {
113*06d5e247SLoGin                 return Arc::ptr_eq(&x, kobj);
114*06d5e247SLoGin             }
115*06d5e247SLoGin             return false;
116*06d5e247SLoGin         });
117*06d5e247SLoGin         if let Some(index) = index {
118*06d5e247SLoGin             let x = kobjects.remove(index);
119*06d5e247SLoGin             let x = x.upgrade().unwrap();
120*06d5e247SLoGin             drop(kobjects);
121*06d5e247SLoGin             x.set_kset(None);
122*06d5e247SLoGin         }
123*06d5e247SLoGin     }
124*06d5e247SLoGin 
125*06d5e247SLoGin     /// 清除所有已经被释放的kobject
126*06d5e247SLoGin     #[allow(dead_code)]
127*06d5e247SLoGin     pub fn cleanup_weak(&self) {
128*06d5e247SLoGin         let mut kobjects = self.kobjects.write();
129*06d5e247SLoGin         kobjects.drain_filter(|x| x.upgrade().is_none());
130*06d5e247SLoGin     }
131*06d5e247SLoGin 
132*06d5e247SLoGin     pub fn as_kobject(&self) -> Arc<dyn KObject> {
133*06d5e247SLoGin         return self.self_ref.upgrade().unwrap();
134*06d5e247SLoGin     }
135*06d5e247SLoGin }
136*06d5e247SLoGin 
137*06d5e247SLoGin impl KObject for KSet {
138*06d5e247SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
139*06d5e247SLoGin         self
140*06d5e247SLoGin     }
141*06d5e247SLoGin 
142*06d5e247SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
143*06d5e247SLoGin         self.inner.read().kern_inode.clone()
144*06d5e247SLoGin     }
145*06d5e247SLoGin 
146*06d5e247SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
147*06d5e247SLoGin         self.inner.write().kern_inode = inode;
148*06d5e247SLoGin     }
149*06d5e247SLoGin 
150*06d5e247SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
151*06d5e247SLoGin         self.parent_data.read().parent.clone()
152*06d5e247SLoGin     }
153*06d5e247SLoGin 
154*06d5e247SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
155*06d5e247SLoGin         self.parent_data.write().parent = parent;
156*06d5e247SLoGin     }
157*06d5e247SLoGin 
158*06d5e247SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
159*06d5e247SLoGin         self.kobj_state.read()
160*06d5e247SLoGin     }
161*06d5e247SLoGin 
162*06d5e247SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
163*06d5e247SLoGin         self.kobj_state.write()
164*06d5e247SLoGin     }
165*06d5e247SLoGin 
166*06d5e247SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
167*06d5e247SLoGin         Some(&KSetKObjType)
168*06d5e247SLoGin     }
169*06d5e247SLoGin 
170*06d5e247SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
171*06d5e247SLoGin         self.parent_data.read().kset.clone()
172*06d5e247SLoGin     }
173*06d5e247SLoGin 
174*06d5e247SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
175*06d5e247SLoGin         self.parent_data.write().kset = kset;
176*06d5e247SLoGin     }
177*06d5e247SLoGin 
178*06d5e247SLoGin     fn name(&self) -> String {
179*06d5e247SLoGin         return self.inner.read().name.clone();
180*06d5e247SLoGin     }
181*06d5e247SLoGin 
182*06d5e247SLoGin     fn set_name(&self, name: String) {
183*06d5e247SLoGin         self.inner.write().name = name;
184*06d5e247SLoGin     }
185*06d5e247SLoGin 
186*06d5e247SLoGin     fn set_kobj_state(&self, state: KObjectState) {
187*06d5e247SLoGin         *self.kobj_state.write() = state;
188*06d5e247SLoGin     }
189*06d5e247SLoGin }
190*06d5e247SLoGin 
191*06d5e247SLoGin #[derive(Debug)]
192*06d5e247SLoGin struct KSetParentData {
193*06d5e247SLoGin     parent: Option<Weak<dyn KObject>>,
194*06d5e247SLoGin     kset: Option<Arc<KSet>>,
195*06d5e247SLoGin }
196*06d5e247SLoGin 
197*06d5e247SLoGin impl KSetParentData {
198*06d5e247SLoGin     fn new(parent: Option<Weak<dyn KObject>>, kset: Option<Arc<KSet>>) -> Self {
199*06d5e247SLoGin         Self { parent, kset }
200*06d5e247SLoGin     }
201*06d5e247SLoGin }
202*06d5e247SLoGin 
203*06d5e247SLoGin #[derive(Debug)]
204*06d5e247SLoGin struct InnerKSet {
205*06d5e247SLoGin     kern_inode: Option<Arc<KernFSInode>>,
206*06d5e247SLoGin     name: String,
207*06d5e247SLoGin }
208*06d5e247SLoGin 
209*06d5e247SLoGin impl InnerKSet {
210*06d5e247SLoGin     fn new(name: String) -> Self {
211*06d5e247SLoGin         Self {
212*06d5e247SLoGin             kern_inode: None,
213*06d5e247SLoGin             name,
214*06d5e247SLoGin         }
215*06d5e247SLoGin     }
216*06d5e247SLoGin }
217*06d5e247SLoGin 
218*06d5e247SLoGin #[derive(Debug)]
219*06d5e247SLoGin pub struct KSetKObjType;
220*06d5e247SLoGin 
221*06d5e247SLoGin impl KObjType for KSetKObjType {
222*06d5e247SLoGin     fn sysfs_ops(&self) -> Option<&dyn SysFSOps> {
223*06d5e247SLoGin         Some(&KObjectSysFSOps)
224*06d5e247SLoGin     }
225*06d5e247SLoGin 
226*06d5e247SLoGin     fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
227*06d5e247SLoGin         None
228*06d5e247SLoGin     }
229*06d5e247SLoGin }
230