在linux内核中嵌入锁定的动态分配/自由结构

我想释放一个嵌入了spin_lock的结构。

场景如下:

我有两个function

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变量。

现在似乎没有崩溃。

我只是想知道是否会有角落案件,我不考虑? 或者有更好的方法来处理这个问题?

任何帮助将不胜感激。

谢谢

在追踪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) }