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

时间:2015-09-10 05:51:28

标签: c linux linux-kernel locking linux-device-driver

我想释放一个嵌入了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变量。

现在似乎没有崩溃。

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

任何帮助都将受到赞赏。

由于

1 个答案:

答案 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)
}