spinlock_t在第一次使用时已经锁定

时间:2012-11-29 17:18:23

标签: c linux-kernel spinlock

我是第一次编程内核(2.6),我在使用自旋锁时遇到了问题。

我正在尝试添加这个系统调用(inserisci_nodo)来外化一个结构(ibrid list-hashtable)并尝试在这个结构中添加一个节点(Persona),如果该节点已经存在,它将被更新。 / p>

我在第一次“更新”时遇到问题,事实上,如果我尝试插入所有新节点,它会起作用!但是,如果我尝试插入已经存在的节点,这似乎已经锁定。我不明白为什么。

这是代码。

 asmlinkage long sys_inserisci_nodo(key_t id, char* nome, int eta){
    persona *p;
    spin_lock(&htable.lock);
    printk("<3> PRESO SPIN_LOCK TABELLA\n");

    if((p=lookup(id))!=NULL){   //Update an already existent node
        printk("<3> NODO %d, AGGIORNAMENTO IN CORSO....\n",id);    <--- system locked.
        spin_lock(&(p->lock));
        printk("<3> PRESO SPIN_LOCK NODO %d\n",id);

        p->eta=eta;
        strcpy(p->nome, nome);
        printk("<3> NODO %d, AGGIORNAMENTO... OK\n",id);

        spin_unlock(&p->lock);

        printk("<3> RILASCIATO SPIN_LOCK NODO %d\n",id);
        spin_unlock(&htable.lock);
        printk("<3> RILASCIATO SPIN_LOCK TABELLA\n");

        return p->id;
    }
    else{       //Insert new node.
        p = (persona *) kmalloc(sizeof(persona),GFP_KERNEL);
        if(p==NULL){
            printk("<3> ERRORE NELL'ALLOCARE MEMORIA PER PERSONA CON ID: %d\n",id);
            spin_unlock(&htable.lock);
            printk("<3> RILASCIATO SPIN_LOCK TABELLA\n");
            return -1;
        }
        p->id = id;
        p->eta=eta;
        p->nome = (char*) kmalloc(sizeof(nome),GFP_KERNEL);
        strcpy(p->nome, nome);
        printk("<3> NODO %d, AGGIUNTO\n",id);

        int h = hashfunc(id);
        p->next=htable.persone[h];
        htable.persone[h] = p;
        spin_unlock(&htable.lock);
        printk("<3> RILASCIATO SPIN_LOCK TABELLA\n");
        return h;   

    }
}

对于代码中的意大利语,我对代码添加了一些英文评论。

这是两个结构(哈希表和“人物”(节点))。

typedef struct _persona{
    key_t id;
    char *nome;
    int eta;
    spinlock_t lock;
    struct _persona *next;
}persona;

typedef struct _hashtable{
    spinlock_t lock;
    int occupati;
    persona* persone[MAX_NUM];
}hashtable;

“lookup(key)”和“hash(key)”是从结构中获取节点的两个简单函数。

我希望你对此有所了解:)

再见!

1 个答案:

答案 0 :(得分:2)

你需要初始化自旋锁:

p->id = id;
p->eta=eta;
p->nome = (char*) kmalloc(sizeof(nome),GFP_KERNEL);
spin_lock_init(&p->lock); // <- don't forget to initialize the locks!