如何使LKM多进程安全?

时间:2016-03-29 10:32:34

标签: linux linux-kernel thread-safety linux-device-driver

我使用简单的LKM(Linux内核模块)在用户级别与内核级别信息交互我的MPI应用程序(每个计算节点的多进程)。我需要在运行时从内核向用户级应用程序提取一些数据。我的MPI应用程序使用同时在同一计算节点上运行的几个进程。

我的LKM在/proc中提供了两个文件。文件/proc/mylkm_input用于向LKM提供一些虚拟地址。文件/proc/mylkm_output用于通过我的MPI应用程序从LKM读取信息。

该应用程序是多进程。至少有两个进程可以向LKM提供数据,并期望LKM(通过/proc/mylkm_output)响应特定进程的唯一数据。

此外,文件/proc/mylkm_output可以由不同的进程同时读取。要阅读信息,请执行lseek(fileId, 0, SEEK_SET),然后read(fileId, buffer, size)

是否有任何解决方案可以使LKM多进程安全?

谢谢

塞吉

  

更新

我按照以下建议实施了以下代码。我希望这有助于我使LKM过程安全。

#define CPES_MAX_PPN 128

typedef struct CPESProcessInfoT {
    pid_t localPID;
    unsigned long virtualAddress;
} CPESProcessInfo;

static CPESProcessInfo addrVA[CPES_MAX_PPN];//using this due many processes use this LKM on the machine (PPN>1)
static int maxItemInAddrVA = 0;//number of cells allocated by the process PID

CPESProcessInfo *findAddress(void) {
    int i = 0;
    struct task_struct *callerTask = current;
    for(i = 0; i < CPES_MAX_PPN; ++i) {
        CPESProcessInfo *walkAddr = addrVA + i;
        if(walkAddr) {
            if(walkAddr->localPID == callerTask->pid) {
                return walkAddr;
            }
            if(0 == walkAddr->localPID) {
                walkAddr->localPID = callerTask->pid;
                ++maxItemInAddrVA;
                return walkAddr;
            }
        } else {
            printk(KERN_WARNING "CPES LKM error in findAddress PPN %d maxUsed %d", CPES_MAX_PPN, maxItemInAddrVA);
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

内核模块可以使用变量struct task_struct* accessor = NULL; ssize_t my_write(...) { accessor = current; ... } ssize_t my_read(...) { if(accessor != current) { // This is not a process which performed .write before return -EBUSY; } ... } 来区分访问文件的进程:

accessor

当然,存储和加载sysdig变量应该以某种方式保护并发访问(例如,使用互斥锁)。