うまく使いこなせる方法spinlocksストレステストの応募内にlinuxカーネル?

StackOverflow https://stackoverflow.com/questions/3610253

  •  25-09-2019
  •  | 
  •  

質問

の開発をしているパッチをlinuxカーネルです。今まで使っていた数 リストとしていますの保護の輪に対兼職の状況の変 マルチコア機です。私は利用しようとspinlocksのためこの目標のもの ができません。していますロックの作品の リストを使用しているlinuxのデフォルトの実装クリストで できるようになるプロセスを呼び出しの使用に対する強制削除の要素のひとつで のリストが同じ要素であるロックもあるので 変更が実際に行っています。ま挿入しspinlock リスト内の、この工程管理に取り付けられています。 ながら誰かがspinlockingか??べてのロック全体のリスト?私の作品のコードが説明できるどのような取り扱うこ ます。

例えば、このコードな仕事を参照のコメントの最終行の コード):

   struct lista{
    int c;
    spinlock_t lock;
    struct list_head;
}

spinlock_t list_lock;
struct lista lista;


//INSERT
struct lista* cursor;
struct lista* new = (struct lista*) kmalloc(sizeof(struct lista),GFP_KERNEL);

/*do something*/
spin_lock(&list_lock);     //Lock on the whole list
list_for_each_entry(cursor,&lista.list,list){
    if (cursor->c == something ){
        ...
        spin_unlock(&list_lock)  //unlock
        spin_lock(&cursor->lock) // Lock on list entry
        list_add(&new->list, &lista.list);
        spin_unlock(&cursor->lock)  // unlock of the list entry
        ...
    }
}


//REMOVAL
struct lista* cursor;

spin_lock(&list_lock);  
list_for_each_entry(cursor,&lista.list,list){
    if (cursor->c == something ){
        ...
        spin_unlock(&list_lock)  //unlock
        spin_lock(&cursor->lock) // Lock on list entry
        list_del(&cursor.list,&lista.list);
        spin_unlock(&cursor->lock)  // unlock of the list entry
        kfree(cursor);  //WHEN THE ENTRY IS FREED SOMEONE COULD HAVE TAKEN THE LOCK SINCE IT IS UNLOCKED
        ...
    }
}

ですか?

役に立ちましたか?

解決

なリリース list_lock うまで行を削除します。

だが、ややく手順:

  1. 取得のリストをロックして(ブロックのその他の受信スレッド)
  2. 取得項目ロック、リリースロック項目(このニーズに応するすべての以前のスレッドすることができます。
  3. 除項目
  4. リリース一覧ロックになっています。

変動:利用リーダー-ライターロックのリストロックになっています。

スレッドを変更リスト項目のリーダーロックこれは、複数のスレッドでの操作のリストを行なった。

スレッドを削除リスト項目のライターロックこの待機すべての読者に口を出て、ブロックしてください。この場合において、リストのロックをうまで行われを取り除く項目

このようにさせないように指定できますステップ2です。このという見方もあるかもしれないが概念的にはより明確にし、か説明しておく必要があるでは無意味見ロック/発売です。

他のヒント

ハードIRQコンテキストからの同時アクセスがありますしない限り、

あなたはほぼ確実に、すべてのスピンロックを使用すべきではありません。使用代わりにミューテックスます。

あなたのリストのための最も簡単なオプションは、あなたがそれを操作しながら、単にリスト全体をロックすることです。あなたは、あなたがそれを必要とする(その場合には、あなたはおそらくとにかく、代わりにRCUを使用して見てみたい)というリストロックに十分な競合があることを見つける場合を除きとなるまでアイテム単位のロックについての心配をしないでください。

リストヘッドである必要はありません、 struct lista, ではでき struct list_head.通知くことを &lista.list, るようにする list_head の"一覧"にあります。見たとえば、コード drivers/pci/msi.c, ので、こ dev->msi_listlist_head, ではなく、 struct msi_desc.

できない安全なドのリストをロックしながら、"みのカーソルロックになっています。まれてくる可能性があることで後を落としたリストロックが発生するカーソルロックかっているとの無いおでカーソルを移動させます。できる既存のロックが、それは 非常に 簡単に間違っています。

ほとんど間違った一つのロック全体のリストは、当項目によるロックを解除します。のリストをロックする mutex ない限り、必要な操作のリストからの割り込みコンテキスト

uが近いウルオフその後、Y 2使用スピンロック解除必ずしも意志、デバイスおよびまたはスピンロックが必須であるカーネルのクリティカルセクション(それはプリエンプションと割り込み(要リクエスト)を無効として)を扱っていない場合プリエンプション&割り込み。 あまりにもリストに&いないリスト項目がよりよい解決策に見えることをセマフォやミューテックスを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top