xref: /DragonOS/kernel/src/driver/base/kset.rs (revision 7eda31b2f07c6ef41dc0d2bd13051f0fce5e5976)
106d5e247SLoGin use alloc::{
206d5e247SLoGin     string::String,
306d5e247SLoGin     sync::{Arc, Weak},
406d5e247SLoGin     vec::Vec,
506d5e247SLoGin };
606d5e247SLoGin 
706d5e247SLoGin use core::hash::Hash;
806d5e247SLoGin 
906d5e247SLoGin use crate::{
10*7eda31b2SLoGin     filesystem::kernfs::KernFSInode,
1106d5e247SLoGin     libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
1206d5e247SLoGin     syscall::SystemError,
1306d5e247SLoGin };
1406d5e247SLoGin 
1506d5e247SLoGin use super::kobject::{
16*7eda31b2SLoGin     DynamicKObjKType, KObjType, KObject, KObjectManager, KObjectState, LockedKObjectState,
1706d5e247SLoGin };
1806d5e247SLoGin 
1906d5e247SLoGin #[derive(Debug)]
2006d5e247SLoGin pub struct KSet {
2106d5e247SLoGin     /// 属于当前kset的kobject
2206d5e247SLoGin     kobjects: RwLock<Vec<Weak<dyn KObject>>>,
2306d5e247SLoGin     /// 节点的一些信息
2406d5e247SLoGin     inner: RwLock<InnerKSet>,
2506d5e247SLoGin     /// kobject的状态
2606d5e247SLoGin     kobj_state: LockedKObjectState,
2706d5e247SLoGin     /// 与父节点有关的一些信息
2806d5e247SLoGin     parent_data: RwLock<KSetParentData>,
2906d5e247SLoGin     self_ref: Weak<KSet>,
3006d5e247SLoGin }
3106d5e247SLoGin 
3206d5e247SLoGin impl Hash for KSet {
3306d5e247SLoGin     fn hash<H: ~const core::hash::Hasher>(&self, state: &mut H) {
3406d5e247SLoGin         self.self_ref.as_ptr().hash(state);
3506d5e247SLoGin         self.inner.read().name.hash(state);
3606d5e247SLoGin     }
3706d5e247SLoGin }
3806d5e247SLoGin 
3906d5e247SLoGin impl core::cmp::Eq for KSet {}
4006d5e247SLoGin 
4106d5e247SLoGin impl core::cmp::PartialEq for KSet {
4206d5e247SLoGin     fn eq(&self, other: &Self) -> bool {
4306d5e247SLoGin         self.self_ref.as_ptr() == other.self_ref.as_ptr()
4406d5e247SLoGin     }
4506d5e247SLoGin }
4606d5e247SLoGin 
4706d5e247SLoGin impl KSet {
4806d5e247SLoGin     pub fn new(name: String) -> Arc<Self> {
4906d5e247SLoGin         let r = Self {
5006d5e247SLoGin             kobjects: RwLock::new(Vec::new()),
5106d5e247SLoGin             inner: RwLock::new(InnerKSet::new(name)),
52a03c4f9dSLoGin             kobj_state: LockedKObjectState::new(None),
5306d5e247SLoGin             parent_data: RwLock::new(KSetParentData::new(None, None)),
5406d5e247SLoGin             self_ref: Weak::default(),
5506d5e247SLoGin         };
5606d5e247SLoGin 
5706d5e247SLoGin         let r = Arc::new(r);
5806d5e247SLoGin 
5906d5e247SLoGin         unsafe {
6006d5e247SLoGin             let p = r.as_ref() as *const Self as *mut Self;
6106d5e247SLoGin             (*p).self_ref = Arc::downgrade(&r);
6206d5e247SLoGin         }
6306d5e247SLoGin 
6406d5e247SLoGin         return r;
6506d5e247SLoGin     }
6606d5e247SLoGin 
6706d5e247SLoGin     /// 创建一个kset,并且设置它的父亲为parent_kobj。然后把这个kset注册到sysfs
6806d5e247SLoGin     ///
6906d5e247SLoGin     /// ## 参数
7006d5e247SLoGin     ///
7106d5e247SLoGin     /// - name: kset的名字
7206d5e247SLoGin     /// - parent_kobj: 父亲kobject
7306d5e247SLoGin     /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中
7406d5e247SLoGin     pub fn new_and_add(
7506d5e247SLoGin         name: String,
7606d5e247SLoGin         parent_kobj: Option<Arc<dyn KObject>>,
7706d5e247SLoGin         join_kset: Option<Arc<KSet>>,
7806d5e247SLoGin     ) -> Result<Arc<Self>, SystemError> {
7906d5e247SLoGin         let kset = KSet::new(name);
8006d5e247SLoGin         if let Some(parent_kobj) = parent_kobj {
8106d5e247SLoGin             kset.set_parent(Some(Arc::downgrade(&parent_kobj)));
8206d5e247SLoGin         }
8306d5e247SLoGin         kset.register(join_kset)?;
8406d5e247SLoGin         return Ok(kset);
8506d5e247SLoGin     }
8606d5e247SLoGin 
8706d5e247SLoGin     pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> {
8806d5e247SLoGin         return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset);
8906d5e247SLoGin         // todo: 引入uevent之后,发送uevent
9006d5e247SLoGin     }
9106d5e247SLoGin 
9206d5e247SLoGin     /// 把一个kobject加入到当前kset中。
9306d5e247SLoGin     ///
9406d5e247SLoGin     /// 该函数不会修改kobj的parent,需要调用者自己视情况修改。
9506d5e247SLoGin     ///
9606d5e247SLoGin     /// ## Panic
9706d5e247SLoGin     ///
9806d5e247SLoGin     /// 这个kobject的kset必须是None,否则会panic
9906d5e247SLoGin     pub fn join(&self, kobj: &Arc<dyn KObject>) {
10006d5e247SLoGin         assert!(kobj.kset().is_none());
10106d5e247SLoGin         kobj.set_kset(self.self_ref.upgrade());
10206d5e247SLoGin         self.kobjects.write().push(Arc::downgrade(&kobj));
10306d5e247SLoGin     }
10406d5e247SLoGin 
10506d5e247SLoGin     /// 把一个kobject从当前kset中移除。
10606d5e247SLoGin     pub fn leave(&self, kobj: &Arc<dyn KObject>) {
10706d5e247SLoGin         let mut kobjects = self.kobjects.write();
10806d5e247SLoGin         let index = kobjects.iter().position(|x| {
10906d5e247SLoGin             if let Some(x) = x.upgrade() {
11006d5e247SLoGin                 return Arc::ptr_eq(&x, kobj);
11106d5e247SLoGin             }
11206d5e247SLoGin             return false;
11306d5e247SLoGin         });
11406d5e247SLoGin         if let Some(index) = index {
11506d5e247SLoGin             let x = kobjects.remove(index);
11606d5e247SLoGin             let x = x.upgrade().unwrap();
11706d5e247SLoGin             drop(kobjects);
11806d5e247SLoGin             x.set_kset(None);
11906d5e247SLoGin         }
12006d5e247SLoGin     }
12106d5e247SLoGin 
12206d5e247SLoGin     /// 清除所有已经被释放的kobject
12306d5e247SLoGin     #[allow(dead_code)]
12406d5e247SLoGin     pub fn cleanup_weak(&self) {
12506d5e247SLoGin         let mut kobjects = self.kobjects.write();
12606d5e247SLoGin         kobjects.drain_filter(|x| x.upgrade().is_none());
12706d5e247SLoGin     }
12806d5e247SLoGin 
12906d5e247SLoGin     pub fn as_kobject(&self) -> Arc<dyn KObject> {
13006d5e247SLoGin         return self.self_ref.upgrade().unwrap();
13106d5e247SLoGin     }
13206d5e247SLoGin }
13306d5e247SLoGin 
13406d5e247SLoGin impl KObject for KSet {
13506d5e247SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
13606d5e247SLoGin         self
13706d5e247SLoGin     }
13806d5e247SLoGin 
13906d5e247SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
14006d5e247SLoGin         self.inner.read().kern_inode.clone()
14106d5e247SLoGin     }
14206d5e247SLoGin 
14306d5e247SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
14406d5e247SLoGin         self.inner.write().kern_inode = inode;
14506d5e247SLoGin     }
14606d5e247SLoGin 
14706d5e247SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
14806d5e247SLoGin         self.parent_data.read().parent.clone()
14906d5e247SLoGin     }
15006d5e247SLoGin 
15106d5e247SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
15206d5e247SLoGin         self.parent_data.write().parent = parent;
15306d5e247SLoGin     }
15406d5e247SLoGin 
15506d5e247SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
15606d5e247SLoGin         self.kobj_state.read()
15706d5e247SLoGin     }
15806d5e247SLoGin 
15906d5e247SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
16006d5e247SLoGin         self.kobj_state.write()
16106d5e247SLoGin     }
16206d5e247SLoGin 
16306d5e247SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
164*7eda31b2SLoGin         self.inner.read().ktype
16506d5e247SLoGin     }
16606d5e247SLoGin 
167*7eda31b2SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
168*7eda31b2SLoGin         self.inner.write().ktype = ktype;
169a03c4f9dSLoGin     }
170a03c4f9dSLoGin 
17106d5e247SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
17206d5e247SLoGin         self.parent_data.read().kset.clone()
17306d5e247SLoGin     }
17406d5e247SLoGin 
17506d5e247SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
17606d5e247SLoGin         self.parent_data.write().kset = kset;
17706d5e247SLoGin     }
17806d5e247SLoGin 
17906d5e247SLoGin     fn name(&self) -> String {
18006d5e247SLoGin         return self.inner.read().name.clone();
18106d5e247SLoGin     }
18206d5e247SLoGin 
18306d5e247SLoGin     fn set_name(&self, name: String) {
18406d5e247SLoGin         self.inner.write().name = name;
18506d5e247SLoGin     }
18606d5e247SLoGin 
18706d5e247SLoGin     fn set_kobj_state(&self, state: KObjectState) {
18806d5e247SLoGin         *self.kobj_state.write() = state;
18906d5e247SLoGin     }
19006d5e247SLoGin }
19106d5e247SLoGin 
19206d5e247SLoGin #[derive(Debug)]
19306d5e247SLoGin struct KSetParentData {
19406d5e247SLoGin     parent: Option<Weak<dyn KObject>>,
19506d5e247SLoGin     kset: Option<Arc<KSet>>,
19606d5e247SLoGin }
19706d5e247SLoGin 
19806d5e247SLoGin impl KSetParentData {
19906d5e247SLoGin     fn new(parent: Option<Weak<dyn KObject>>, kset: Option<Arc<KSet>>) -> Self {
20006d5e247SLoGin         Self { parent, kset }
20106d5e247SLoGin     }
20206d5e247SLoGin }
20306d5e247SLoGin 
20406d5e247SLoGin #[derive(Debug)]
20506d5e247SLoGin struct InnerKSet {
20606d5e247SLoGin     kern_inode: Option<Arc<KernFSInode>>,
20706d5e247SLoGin     name: String,
208*7eda31b2SLoGin     ktype: Option<&'static dyn KObjType>,
20906d5e247SLoGin }
21006d5e247SLoGin 
21106d5e247SLoGin impl InnerKSet {
21206d5e247SLoGin     fn new(name: String) -> Self {
21306d5e247SLoGin         Self {
21406d5e247SLoGin             kern_inode: None,
21506d5e247SLoGin             name,
216*7eda31b2SLoGin             ktype: Some(&DynamicKObjKType),
21706d5e247SLoGin         }
21806d5e247SLoGin     }
21906d5e247SLoGin }
220