是否有一个带有自旋锁保护桶的哈希表的linux头?

时间:2017-01-13 08:52:11

标签: linux-kernel synchronization hashtable rcu softirq

我编写的代码很少创建/删除对象(最多数千个),但经常在软IRQ上下文中修改它们。这些对象也很少从任务上下文中读取(也可能很少被修改)(通过procfs:每个对象的文件)。目前,我的代码包含全局每CPU数据块,每个数据块都由一个自旋锁保护。这样的块包含用于对象存储的固定大小的哈希表。

显然当前的设计并不是最优的,特别是在具有非常高的对象更新负载时:从procfs读取对象将导致更新软IRQ时的数据丢失。我需要重写同步方案以摆脱全局锁。最明显的选择 - 为每个哈希表桶提供一个自旋锁 - 它应该可以很好地扩展。问题是我可能需要使用我自己的哈希表实现,或者至少重新实现几个顶级宏(没有在linux / hashtable.h中找到那些用于自旋锁保护的桶)。我是否应该关注启用RCU的哈希表(但我对这种同步方法还没有充分的理解)?

1 个答案:

答案 0 :(得分:3)

具有锁定保护的存储桶在标头linux/list_bl.h中声明。它们使用头指针的最低位作为锁定位

RCU保护的访问权限是使用标头linux/hashtable.h中的其他哈希表函数定义的(它们具有_rcu后缀)。

在锁和RCU之间进行选择取决于您。请注意,RCU本身无法解决修改 - 修改冲突。它主要用于频繁读取数据,这似乎不是你的情况。

由于只为hlist_bl_lock声明了一个锁定函数 - struct hlist_bl_head - 并且此函数不知道irq,因此当在irq中使用哈希表时,应执行其他操作下半部分:

  • spin_lock_irqsave:

    local_irq_save(flags);
    hlist_bl_lock(...);
    
  • spin_unlock_irqrestore:

    hlist_bl_unlock(...);
    local_irq_restore(flags);
    
  • 使用spin_lock_bh:

    local_bh_disable();
    hlist_bl_lock(...);
    
  • spin_unlock_bh:

    hlist_bl_unlock(...);
    local_bh_enable();