在自定义的linux内核系统调用中强制执行代码段

我一直在试图实施一个linux system_call一直给我的问题,我怀疑这是因为没有locking(或可能抢占)与我的代码进行。

我有一个非常频繁调用的函数(每次调用system_call时会调用此自定义函数)中的一个关键部分,并且它也由system_calls启动/停止。 有什么方法可以确保每次在Linux内核中进行系统调用时发生的这个关键段都是不可抢占的,并且必须在发生其他任何事情之前完成执行?

如果我正确地理解了这个问题,最简单的方法是使用自旋锁:

#include <linux/spinlock.h> static DEFINE_SPINLOCK(foo_lock); int my_system_call(...) { ... /* critical section starts */ spin_lock(&foo_lock); /* critical section goes here */ ... /* critical section ends */ spin_unlock(&foo_lock); ... } 

这样的关键部分将是不可抢占的,并且关键部分的并发执行不会重叠。