DragonOS icon indicating copy to clipboard operation
DragonOS copied to clipboard

file对epoll add和epoll remove的处理,扩展性较差

Open fslongjin opened this issue 1 year ago • 12 comments

问题

File对象的add_epoll和remove_epoll方法,里面对文件类型进行了特判。 我认为可以统一处理这个事情,给IndexNode这个trait加add_epoll()和remove_epoll()函数会比较好。

@Godones 另一个问题,对于代码:https://github.com/DragonOS-Community/DragonOS/pull/894/files#diff-08d0c277f75d9d64222b3634cc6c86f177e35c79e7cda7ca1161a1211cde4922R522 不能认为,“不是pipe,且不是socket的,那么这种inode就是EventFdInode” 这个跟上面Add的时候的语义完全就对应不上,需要修改。

抄送:@GnoCiYeH @Chiichen

fslongjin avatar Aug 21 '24 16:08 fslongjin

问题

File对象的add_epoll和remove_epoll方法,里面对文件类型进行了特判。 我认为可以统一处理这个事情,给IndexNode这个trait加add_epoll()和remove_epoll()函数会比较好。

@Godones 另一个问题,对于代码:https://github.com/DragonOS-Community/DragonOS/pull/894/files#diff-08d0c277f75d9d64222b3634cc6c86f177e35c79e7cda7ca1161a1211cde4922R522 不能认为,“不是pipe,且不是socket的,那么这种inode就是EventFdInode” 这个跟上面Add的时候的语义完全就对应不上,需要修改。

抄送:@GnoCiYeH @Chiichen

这里并不是说“不是pipe,且不是socket的,那么这种inode就是EventFdInode”,因为这里只是尝试向下转换为EventFdInode,如果成功了,那它就是EventFdInode,如果不是,那就按照原来的方式返回SystemError::ENOSYS

Godones avatar Aug 22 '24 02:08 Godones

给IndexNode这个trait加add_epoll()和remove_epoll()函数后,我觉得可以对这些进行统一,因为还有其它类型的Inode也会使用这些函数。

Godones avatar Aug 22 '24 02:08 Godones

问题

File对象的add_epoll和remove_epoll方法,里面对文件类型进行了特判。 我认为可以统一处理这个事情,给IndexNode这个trait加add_epoll()和remove_epoll()函数会比较好。

@Godones 另一个问题,对于代码:https://github.com/DragonOS-Community/DragonOS/pull/894/files#diff-08d0c277f75d9d64222b3634cc6c86f177e35c79e7cda7ca1161a1211cde4922R522 不能认为,“不是pipe,且不是socket的,那么这种inode就是EventFdInode” 这个跟上面Add的时候的语义完全就对应不上,需要修改。

抄送:@GnoCiYeH @Chiichen

只有pollable的iNode才支持epoll,这里感觉统一加在iNode里有点奇怪,是否新加一个trait:Pollable来管理这个更好?

GnoCiYeH avatar Aug 22 '24 02:08 GnoCiYeH

@GnoCiYeH 请问一下在进程进行epoll时,判断是否有就绪事件的代码如下:

 // 判断epoll上有没有就绪事件
let mut available = epoll_guard.ep_events_available();

这只是简单判断了队列是否为空。这意味着如果一个文件有就绪事件,它需要主动把事件放到队列中。这是怎么实现的?

Godones avatar Aug 22 '24 03:08 Godones

@GnoCiYeH 请问一下在进程进行epoll时,判断是否有就绪事件的代码如下:

 // 判断epoll上有没有就绪事件
let mut available = epoll_guard.ep_events_available();

这只是简单判断了队列是否为空。这意味着如果一个文件有就绪事件,它需要主动把事件放到队列中。这是怎么实现的?

这个目前是暴力实现的,比如我把一个epitem绑定在socket上,那网卡来数据时,就会通知这个socket对应的epoll。

GnoCiYeH avatar Aug 22 '24 03:08 GnoCiYeH

这个地方应该感觉需要做一个重构吧,内核中不止socket会产生事件。

Godones avatar Aug 22 '24 03:08 Godones

这个地方应该感觉需要做一个重构吧,内核中不止socket会产生事件。

是的,要是可以在wq里面注册回调来实现是最好的,但是目前wq没有这样的功能。这种方式rust也不太好设计。。

GnoCiYeH avatar Aug 22 '24 03:08 GnoCiYeH

是否可以在poll的时候主动轮询一下?

Godones avatar Aug 22 '24 03:08 Godones

是否可以在poll的时候主动轮询一下?

epoll最核心的地方在于:有数据来才唤醒。在poll的时候主动轮询解决不了问题,因为poll这个动作是在唤醒epoll后来做的,但是问题在于该如何唤醒epoll?

GnoCiYeH avatar Aug 22 '24 03:08 GnoCiYeH

是否可以在poll的时候主动轮询一下?

epoll最核心的地方在于:有数据来才唤醒。在poll的时候主动轮询解决不了问题,因为poll这个动作是在唤醒epoll后来做的,但是问题在于该如何唤醒epoll?

我大概理解怎么唤醒了,按照现在的pipe相关的代码,在对特殊文件进行操作的时候,可以检查是否需要唤醒epoll,比如pipe文件就在读写操作的时候进行了唤醒。

Godones avatar Aug 22 '24 08:08 Godones

@Godones

这个pr添加的宏,可以在wq被唤醒之后,检查条件是否满足,如果满足才返回。 不过目前只应用到了wq,而event wq没有用到。虽然但是我感觉这两个wq将来是不是可以统一一下。 https://github.com/DragonOS-Community/DragonOS/pull/889

fslongjin avatar Aug 22 '24 16:08 fslongjin

问题

File对象的add_epoll和remove_epoll方法,里面对文件类型进行了特判。 我认为可以统一处理这个事情,给IndexNode这个trait加add_epoll()和remove_epoll()函数会比较好。 @Godones 另一个问题,对于代码:https://github.com/DragonOS-Community/DragonOS/pull/894/files#diff-08d0c277f75d9d64222b3634cc6c86f177e35c79e7cda7ca1161a1211cde4922R522 不能认为,“不是pipe,且不是socket的,那么这种inode就是EventFdInode” 这个跟上面Add的时候的语义完全就对应不上,需要修改。 抄送:@GnoCiYeH @Chiichen

只有pollable的iNode才支持epoll,这里感觉统一加在iNode里有点奇怪,是否新加一个trait:Pollable来管理这个更好?

+1 是否Pollable应该是一个类型绑定的Inode属性,目前依赖错误返回来判断是否Pollable也影响到socket的实现的简洁度

Samuka007 avatar Sep 10 '24 06:09 Samuka007