こんにちは、初めてカーネル (2.6) をプログラミングしていますが、スピンロックの使用に問題があります。
構造体 (ibrid リスト ハッシュテーブル) を外部化するこのシステム コール (inserisci_nodo) を追加し、この構造体にノード (ペルソナ) を追加しようとしています。ノードが既に存在する場合は更新されます。
最初の「更新」で問題が発生しました。実際、すべての新しいノードを挿入しようとすると機能します。しかし、既存のノードを挿入しようとすると、これはすでにロックされているようです。理由がわかりません。
これがコードです。
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;
}
}
コードのイタリア語で申し訳ありませんが、コードに英語のコメントを追加します。
これらは 2 つの構造 (ハッシュテーブルと「ペルソナ」(ノード)) です。
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)」は、構造体からノードを取得するための 2 つの単純な関数です。
私はあなたがそれについての考えを持っていることを願っています:)
さよなら!