当前位置: 技术问答>linux和unix
高分求教:softirq中还用得着bh版本spin_lock_bh吗?
来源: 互联网 发布时间:2016-05-09
本文导语: spin_lock_bh通常用在进程中,用来禁止抢断和禁止软中断。 而软中断本身不可嵌套,所以,在软中断中就不需要bh版本的spin_lock_bh。 但kernel中br_fdb.c中的br_fdb_cleanup()为什么用spin_lock_bh? void br_fdb_cleanup(unsigned long _dat...
spin_lock_bh通常用在进程中,用来禁止抢断和禁止软中断。
而软中断本身不可嵌套,所以,在软中断中就不需要bh版本的spin_lock_bh。
但kernel中br_fdb.c中的br_fdb_cleanup()为什么用spin_lock_bh?
void br_fdb_cleanup(unsigned long _data)
{
struct net_bridge *br = (struct net_bridge *)_data;
unsigned long delay = hold_time(br);
int i;
spin_lock_bh(&br->hash_lock);
for (i = 0; i hash[i], hlist) {
if (!f->is_static &&
time_before_eq(f->ageing_timer + delay, jiffies))
fdb_delete(f);
}
}
spin_unlock_bh(&br->hash_lock);
mod_timer(&br->gc_timer, jiffies + HZ/10);
}
恳请大家来讨论下。
而软中断本身不可嵌套,所以,在软中断中就不需要bh版本的spin_lock_bh。
但kernel中br_fdb.c中的br_fdb_cleanup()为什么用spin_lock_bh?
void br_fdb_cleanup(unsigned long _data)
{
struct net_bridge *br = (struct net_bridge *)_data;
unsigned long delay = hold_time(br);
int i;
spin_lock_bh(&br->hash_lock);
for (i = 0; i hash[i], hlist) {
if (!f->is_static &&
time_before_eq(f->ageing_timer + delay, jiffies))
fdb_delete(f);
}
}
spin_unlock_bh(&br->hash_lock);
mod_timer(&br->gc_timer, jiffies + HZ/10);
}
恳请大家来讨论下。
|
这主要是发生在多CPU的情况下
|
定时器的实现和CPU体系结构关系比较大,有些是对CPU COUNT计数溢出发生硬件中断实现的
这些处理完了才会唤醒软中断
单个CPU的i386上有没有bh的确没有区别
这些处理完了才会唤醒软中断
单个CPU的i386上有没有bh的确没有区别