2015-06-27 66 views
2

我已经替换系统调用表中的sys_open系统调用来实现统计系统。我必须使用什么锁? spin_lock_irqsave()函数冻结了系统。我在Linux 3.16.0-4-686-pae上使用Intel Core i3-4330。使用内核模块锁定系统调用

部分,但revelant代码:

static DEFINE_SPINLOCK(spin); 
static int tally = 0; 

static asmlinkage long my_sys_open(const char __user *filename, int flags, int mode) 
{ 
    unsigned long fl; 
    spin_lock_irqsave(&spin, fl); // system freeze 

    tally++; 

    spin_unlock_irqrestore(&spin, fl); 

    printk("sys_open used %i times\n", tally); 

    return old_sys_open(filename, flags, mode); 
} 
+0

您没有使用'mutex_lock'的任何特定原因? http://www.hep.by/gnu/kernel/kernel-locking/API-mutex-lock.html – VAndrei

+0

奇怪。你的代码看起来不错。你怎么知道冻结发生在'spin_lock_irqsave'?如果您注释掉锁定代码,它不会冻结?有没有其他的代码使用'spin'? –

回答

0

这不会直接解决您的锁定问题,其他人在你的问题的评论所指出的,该代码看起来不错。但作为替代方案,您可以使用atomic_t类型作为您的计数器并避免所有螺旋锁一起使用。沿着线的东西:

atomic_t tally = ATOMIC_INIT(0); 

,然后递增值使用:

atomic_inc(&tally); 

最后,你可以使用atomic_read(&tally)当你想最后读值

你可以阅读更多关于原子here

1

你在做什么?什么是“理货”系统?你是如何得出结论spin_lock_irqsave线路造成麻烦的?

首先,在syscall入口点中断被启用,所以这应该是spin_lock_irq。但是这段代码有0个理由关心禁止中断,所以这应该是spin_lock。除了你只增加一个计数器,这可以用原子操作来完成,因此不需要锁定。

无论如何,代码不应该引起麻烦,所以别的事情就会出错。在内核配置中启用调试工具并可能获得vmcore(阅读kdump)可能会在这里显示出来。