【问题标题】:Dynamic allocate/free structure with embedding lock in linux kernellinux内核中嵌入锁的动态分配/释放结构
【发布时间】:2015-09-10 05:51:27
【问题描述】:

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

而且现在似乎没有崩溃。

我只是想知道是否会有极端情况,我不考虑? 或者有什么更好的方法来处理这个问题?

任何帮助将不胜感激。

谢谢

【问题讨论】:

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


    【解决方案1】:

    在跟踪linux-source code之后,我找到了一个解决这类问题的例子。

    正确的做法是将spin_lock从target freeing结构中拆分出来,这样target freeing object被销毁后就不会被销毁了。

    并检查目标空闲对象是否在锁保护区域中是否为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)
    } 
    

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2013-11-06
      相关资源
      最近更新 更多