spinlock_t уже заблокирован при первом использовании

Привет, я впервые программирую ядро ​​​​(2.6), и у меня проблема с использованием спин-блокировок.

Я пытаюсь добавить этот системный вызов (inserisci_nodo), который экстернализует структуру (список-хеш-таблица ibrid) и пытаюсь добавить узел (Persona) в эту структуру, если узел уже существует, он будет обновлен.

У меня проблема с первым "обновлением", на самом деле, если я пытаюсь вставить все новые узлы, это работает! Но если я попытаюсь вставить уже существующий узел, он уже будет заблокирован. Я не могу понять, почему.

Это код.

 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)» — две простые функции для получения узлов из структуры.

Надеюсь, у вас есть представление об этом :)

до свидания!


person Pietro Luciani    schedule 29.11.2012    source источник


Ответы (1)


Вам нужно инициализировать спин-блокировку:

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!
person user7116    schedule 29.11.2012
comment
спасибо за ответ sixlettervariables, попробую. Теперь мой второй вопрос: почему спин-блокировка хеш-таблицы работает и без ее инициализации??. - person Pietro Luciani; 29.11.2012
comment
Я предполагаю, что htable является статическим распределением и было обнулено, в то время как ваша динамически распределенная блокировка инициализируется мусором (эффективно). Если вы не инициализируете htable.lock, вы все равно должны это сделать. - person user7116; 29.11.2012