xref: /DragonOS/kernel/src/driver/base/kset.rs (revision 91e9d4ab55ef960f57a1b6287bc523ca4341f67a)
106d5e247SLoGin use alloc::{
206d5e247SLoGin     string::String,
306d5e247SLoGin     sync::{Arc, Weak},
406d5e247SLoGin     vec::Vec,
506d5e247SLoGin };
606d5e247SLoGin 
706d5e247SLoGin use core::hash::Hash;
806d5e247SLoGin 
906d5e247SLoGin use super::kobject::{
107eda31b2SLoGin     DynamicKObjKType, KObjType, KObject, KObjectManager, KObjectState, LockedKObjectState,
1106d5e247SLoGin };
12*91e9d4abSLoGin use crate::{
13*91e9d4abSLoGin     filesystem::kernfs::KernFSInode,
14*91e9d4abSLoGin     libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
15*91e9d4abSLoGin };
16*91e9d4abSLoGin use system_error::SystemError;
1706d5e247SLoGin 
1806d5e247SLoGin #[derive(Debug)]
1906d5e247SLoGin pub struct KSet {
2006d5e247SLoGin     /// 属于当前kset的kobject
2106d5e247SLoGin     kobjects: RwLock<Vec<Weak<dyn KObject>>>,
2206d5e247SLoGin     /// 节点的一些信息
2306d5e247SLoGin     inner: RwLock<InnerKSet>,
2406d5e247SLoGin     /// kobject的状态
2506d5e247SLoGin     kobj_state: LockedKObjectState,
2606d5e247SLoGin     /// 与父节点有关的一些信息
2706d5e247SLoGin     parent_data: RwLock<KSetParentData>,
2806d5e247SLoGin     self_ref: Weak<KSet>,
2906d5e247SLoGin }
3006d5e247SLoGin 
3106d5e247SLoGin impl Hash for KSet {
321a72a751SLoGin     fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
3306d5e247SLoGin         self.self_ref.as_ptr().hash(state);
3406d5e247SLoGin         self.inner.read().name.hash(state);
3506d5e247SLoGin     }
3606d5e247SLoGin }
3706d5e247SLoGin 
3806d5e247SLoGin impl core::cmp::Eq for KSet {}
3906d5e247SLoGin 
4006d5e247SLoGin impl core::cmp::PartialEq for KSet {
4106d5e247SLoGin     fn eq(&self, other: &Self) -> bool {
4206d5e247SLoGin         self.self_ref.as_ptr() == other.self_ref.as_ptr()
4306d5e247SLoGin     }
4406d5e247SLoGin }
4506d5e247SLoGin 
4606d5e247SLoGin impl KSet {
4706d5e247SLoGin     pub fn new(name: String) -> Arc<Self> {
4806d5e247SLoGin         let r = Self {
4906d5e247SLoGin             kobjects: RwLock::new(Vec::new()),
5006d5e247SLoGin             inner: RwLock::new(InnerKSet::new(name)),
51a03c4f9dSLoGin             kobj_state: LockedKObjectState::new(None),
5206d5e247SLoGin             parent_data: RwLock::new(KSetParentData::new(None, None)),
5306d5e247SLoGin             self_ref: Weak::default(),
5406d5e247SLoGin         };
5506d5e247SLoGin 
5606d5e247SLoGin         let r = Arc::new(r);
5706d5e247SLoGin 
5806d5e247SLoGin         unsafe {
5906d5e247SLoGin             let p = r.as_ref() as *const Self as *mut Self;
6006d5e247SLoGin             (*p).self_ref = Arc::downgrade(&r);
6106d5e247SLoGin         }
6206d5e247SLoGin 
6306d5e247SLoGin         return r;
6406d5e247SLoGin     }
6506d5e247SLoGin 
6606d5e247SLoGin     /// 创建一个kset,并且设置它的父亲为parent_kobj。然后把这个kset注册到sysfs
6706d5e247SLoGin     ///
6806d5e247SLoGin     /// ## 参数
6906d5e247SLoGin     ///
7006d5e247SLoGin     /// - name: kset的名字
7106d5e247SLoGin     /// - parent_kobj: 父亲kobject
7206d5e247SLoGin     /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中
7306d5e247SLoGin     pub fn new_and_add(
7406d5e247SLoGin         name: String,
7506d5e247SLoGin         parent_kobj: Option<Arc<dyn KObject>>,
7606d5e247SLoGin         join_kset: Option<Arc<KSet>>,
7706d5e247SLoGin     ) -> Result<Arc<Self>, SystemError> {
7806d5e247SLoGin         let kset = KSet::new(name);
7906d5e247SLoGin         if let Some(parent_kobj) = parent_kobj {
8006d5e247SLoGin             kset.set_parent(Some(Arc::downgrade(&parent_kobj)));
8106d5e247SLoGin         }
8206d5e247SLoGin         kset.register(join_kset)?;
8306d5e247SLoGin         return Ok(kset);
8406d5e247SLoGin     }
8506d5e247SLoGin 
8608a2ee40SLoGin     /// 注册一个kset
8708a2ee40SLoGin     ///
8808a2ee40SLoGin     /// ## 参数
8908a2ee40SLoGin     ///
9008a2ee40SLoGin     /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中
9106d5e247SLoGin     pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> {
9206d5e247SLoGin         return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset);
9306d5e247SLoGin         // todo: 引入uevent之后,发送uevent
9406d5e247SLoGin     }
9506d5e247SLoGin 
9608a2ee40SLoGin     /// 注销一个kset
9708a2ee40SLoGin     #[allow(dead_code)]
9808a2ee40SLoGin     pub fn unregister(&self) {
9908a2ee40SLoGin         KObjectManager::remove_kobj(self.self_ref.upgrade().unwrap());
10008a2ee40SLoGin     }
10108a2ee40SLoGin 
10206d5e247SLoGin     /// 把一个kobject加入到当前kset中。
10306d5e247SLoGin     ///
10406d5e247SLoGin     /// 该函数不会修改kobj的parent,需要调用者自己视情况修改。
10506d5e247SLoGin     ///
10606d5e247SLoGin     /// ## Panic
10706d5e247SLoGin     ///
10806d5e247SLoGin     /// 这个kobject的kset必须是None,否则会panic
10906d5e247SLoGin     pub fn join(&self, kobj: &Arc<dyn KObject>) {
11006d5e247SLoGin         assert!(kobj.kset().is_none());
11106d5e247SLoGin         kobj.set_kset(self.self_ref.upgrade());
11206d5e247SLoGin         self.kobjects.write().push(Arc::downgrade(&kobj));
11306d5e247SLoGin     }
11406d5e247SLoGin 
11506d5e247SLoGin     /// 把一个kobject从当前kset中移除。
11606d5e247SLoGin     pub fn leave(&self, kobj: &Arc<dyn KObject>) {
11706d5e247SLoGin         let mut kobjects = self.kobjects.write();
11808a2ee40SLoGin         kobjects.retain(|x| x.upgrade().is_some());
11906d5e247SLoGin         let index = kobjects.iter().position(|x| {
12006d5e247SLoGin             if let Some(x) = x.upgrade() {
12106d5e247SLoGin                 return Arc::ptr_eq(&x, kobj);
12206d5e247SLoGin             }
12306d5e247SLoGin             return false;
12406d5e247SLoGin         });
12506d5e247SLoGin         if let Some(index) = index {
12606d5e247SLoGin             let x = kobjects.remove(index);
12706d5e247SLoGin             let x = x.upgrade().unwrap();
12806d5e247SLoGin             drop(kobjects);
12906d5e247SLoGin             x.set_kset(None);
13006d5e247SLoGin         }
13106d5e247SLoGin     }
13206d5e247SLoGin 
13306d5e247SLoGin     /// 清除所有已经被释放的kobject
13406d5e247SLoGin     #[allow(dead_code)]
13506d5e247SLoGin     pub fn cleanup_weak(&self) {
13606d5e247SLoGin         let mut kobjects = self.kobjects.write();
1371a72a751SLoGin         kobjects.retain(|x| x.upgrade().is_some());
13806d5e247SLoGin     }
13906d5e247SLoGin 
14006d5e247SLoGin     pub fn as_kobject(&self) -> Arc<dyn KObject> {
14106d5e247SLoGin         return self.self_ref.upgrade().unwrap();
14206d5e247SLoGin     }
14308a2ee40SLoGin 
14408a2ee40SLoGin     pub fn kobjects(&self) -> RwLockReadGuard<Vec<Weak<dyn KObject>>> {
14508a2ee40SLoGin         return self.kobjects.read();
14608a2ee40SLoGin     }
14706d5e247SLoGin }
14806d5e247SLoGin 
14906d5e247SLoGin impl KObject for KSet {
15006d5e247SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
15106d5e247SLoGin         self
15206d5e247SLoGin     }
15306d5e247SLoGin 
15406d5e247SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
15506d5e247SLoGin         self.inner.read().kern_inode.clone()
15606d5e247SLoGin     }
15706d5e247SLoGin 
15806d5e247SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
15906d5e247SLoGin         self.inner.write().kern_inode = inode;
16006d5e247SLoGin     }
16106d5e247SLoGin 
16206d5e247SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
16306d5e247SLoGin         self.parent_data.read().parent.clone()
16406d5e247SLoGin     }
16506d5e247SLoGin 
16606d5e247SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
16706d5e247SLoGin         self.parent_data.write().parent = parent;
16806d5e247SLoGin     }
16906d5e247SLoGin 
17006d5e247SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
17106d5e247SLoGin         self.kobj_state.read()
17206d5e247SLoGin     }
17306d5e247SLoGin 
17406d5e247SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
17506d5e247SLoGin         self.kobj_state.write()
17606d5e247SLoGin     }
17706d5e247SLoGin 
17806d5e247SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
1797eda31b2SLoGin         self.inner.read().ktype
18006d5e247SLoGin     }
18106d5e247SLoGin 
1827eda31b2SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
1837eda31b2SLoGin         self.inner.write().ktype = ktype;
184a03c4f9dSLoGin     }
185a03c4f9dSLoGin 
18606d5e247SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
18706d5e247SLoGin         self.parent_data.read().kset.clone()
18806d5e247SLoGin     }
18906d5e247SLoGin 
19006d5e247SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
19106d5e247SLoGin         self.parent_data.write().kset = kset;
19206d5e247SLoGin     }
19306d5e247SLoGin 
19406d5e247SLoGin     fn name(&self) -> String {
19506d5e247SLoGin         return self.inner.read().name.clone();
19606d5e247SLoGin     }
19706d5e247SLoGin 
19806d5e247SLoGin     fn set_name(&self, name: String) {
19906d5e247SLoGin         self.inner.write().name = name;
20006d5e247SLoGin     }
20106d5e247SLoGin 
20206d5e247SLoGin     fn set_kobj_state(&self, state: KObjectState) {
20306d5e247SLoGin         *self.kobj_state.write() = state;
20406d5e247SLoGin     }
20506d5e247SLoGin }
20606d5e247SLoGin 
20706d5e247SLoGin #[derive(Debug)]
20806d5e247SLoGin struct KSetParentData {
20906d5e247SLoGin     parent: Option<Weak<dyn KObject>>,
21006d5e247SLoGin     kset: Option<Arc<KSet>>,
21106d5e247SLoGin }
21206d5e247SLoGin 
21306d5e247SLoGin impl KSetParentData {
21406d5e247SLoGin     fn new(parent: Option<Weak<dyn KObject>>, kset: Option<Arc<KSet>>) -> Self {
21506d5e247SLoGin         Self { parent, kset }
21606d5e247SLoGin     }
21706d5e247SLoGin }
21806d5e247SLoGin 
21906d5e247SLoGin #[derive(Debug)]
22006d5e247SLoGin struct InnerKSet {
22106d5e247SLoGin     kern_inode: Option<Arc<KernFSInode>>,
22206d5e247SLoGin     name: String,
2237eda31b2SLoGin     ktype: Option<&'static dyn KObjType>,
22406d5e247SLoGin }
22506d5e247SLoGin 
22606d5e247SLoGin impl InnerKSet {
22706d5e247SLoGin     fn new(name: String) -> Self {
22806d5e247SLoGin         Self {
22906d5e247SLoGin             kern_inode: None,
23006d5e247SLoGin             name,
2317eda31b2SLoGin             ktype: Some(&DynamicKObjKType),
23206d5e247SLoGin         }
23306d5e247SLoGin     }
23406d5e247SLoGin }
235