我想释放一个嵌入了spin_lock的结构。
场景如下:
我有两个功能
f1 () {
*****************
spin_lock_irqsave(&my_obj_ptr->my_lock, flags)
....
.... ........................................ here f2 is called
spin_lock_irqstore(&my_obj_ptr->my_lock, flags)
*******************
kfree(my_obj_ptr)
}
和f2具有与f1类似的内容。
当调用f2时正在使用my_lock,f2必须忙着等待。 但是,当f2进入临界区时,my_obj_ptr是免费的。 内核崩溃......
我现在想的是在struct my_obj
中添加一个ref_count变量之前spin_lock_irqsave => ref_count ++
spin_lock_irqstore =>之后ref_count -
在免费之前,请检查ref_count变量。
现在似乎没有崩溃。
我只是想知道是否会有角落案件,我不会考虑? 或者有更好的方法来处理这个问题?
任何帮助都将受到赞赏。
由于
答案 0 :(得分:0)
在追踪linux源代码后,我找到了一个解决这类问题的例子。
正确的方法是将spin_lock与目标释放结构分开,以便在目标释放对象被销毁后不会被销毁。
并检查锁定保护区域中的目标空闲对象是否为NULL,这样您就不会再次释放它。
所以示例代码如下:
f1 () {
//Notice that my_lock is not in the structure my_obj any more
spin_lock_irqsave(my_lock, flags)
.....
//check if my_obj_ptr is NULL or not
//And kfree must be done in the lock protected region
//otherwise it will not be safe
if (my_obj_ptr != NULL)
kfree(my_obj_ptr)
......
spin_lock_irqstore(my_lock, flags)
}