Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何正确释放使用vmalloc分配的结构work_struct_C_Linux_Module_Vmalloc - Fatal编程技术网

如何正确释放使用vmalloc分配的结构work_struct

如何正确释放使用vmalloc分配的结构work_struct,c,linux,module,vmalloc,C,Linux,Module,Vmalloc,我正在为Linux内核开发一个内核模块。基本上,我需要做的是用一些特殊的char设备填充/dev。在此类设备上执行写入操作时,我需要存储消息,然后在超时后将其提供给读者。 我曾想过用Linux工作队列实现这一点,但它确实有效,但我不得不为每个写入请求使用vmalloc()分配动态内存: struct delayed\u消息{ 结构延迟工作延迟工作; 结构列表\标题列表; 结构组*组; 结构消息*消息; }; 延迟_消息=vmalloc(sizeof(struct delayed_消息)); 如果

我正在为Linux内核开发一个内核模块。基本上,我需要做的是用一些特殊的char设备填充/dev。在此类设备上执行写入操作时,我需要存储消息,然后在超时后将其提供给读者。 我曾想过用Linux工作队列实现这一点,但它确实有效,但我不得不为每个写入请求使用vmalloc()分配动态内存:

struct delayed\u消息{
结构延迟工作延迟工作;
结构列表\标题列表;
结构组*组;
结构消息*消息;
};
延迟_消息=vmalloc(sizeof(struct delayed_消息));
如果(!延迟_消息){
printk(内核错误“%s:延迟写入错误:vmalloc在延迟消息分配上失败\n”,
KBUILD_MODNAME);
ret=-ENOMEM;
转到空闲消息缓冲区;
}
初始化延迟工作(&延迟消息->延迟工作,&发布者工作);
延迟消息->组=组;
延迟消息->消息=消息;
队列延迟工作(组->工作队列和延迟消息->延迟工作,毫秒到办公室(组->延迟毫秒));
//保持指针指向延迟消息
自旋锁定(&组->延迟的自旋锁定消息);
列表\添加\尾(&延迟\消息->列表,&组->延迟\消息);
旋转\解锁(&组->延迟\消息\旋转锁定);

是否有一种安全的方法可以在不干扰工作队列的情况下回收内存?

这是一种环形缓冲区可以帮助的方法吗?我已经在使用列表跟踪延迟的\u消息结构分配。您可以始终拥有一个“少量使用”的池如果分配被证明是一个可测量的性能问题,则可以从中提取结构,而不是进行分配。如果为此目的添加指向结构的
next
指针,或者为了更紧凑的内存,为此目的使用
union
,那么这很容易做到。您还可以使用
struct message*
进行一些必要的转换。当然,这是可行的。但是,我无法对设备接收的消息数量做出任何假设。如果环形缓冲区在第一条消息发送之前被填满,则模块开始丢弃消息。我会通过将分配成本基准化,以一个荒谬的因子进行过度分配,比如1000x,只是为了看看它是否会造成伤害(例如,1000次分配,1000次释放,然后再为“real”分配1次)。如果你没有注意到,就忘了它。如果这是痛苦的使用链表的方法来存储备用结构,你可以回收。