2015-09-11 5 views
5

genl_register_family_with_opsを複数のコールバックで使用して汎用ネットリンクインターフェイスを登録したとします。Linuxカーネル汎用Netlink - それは同時ですか?

私はそれに関する警告は表示されず、コールバックがシリアルに呼び出されると仮定しますが、コールバックの呼び出し方法に関する情報はありません。

私が登録した同じ汎用ネットリンクインターフェイスで複数のコールバックが同時に呼び出される可能性はありますか?コールバック間の同期は必要ですか?

は、単一のネットリンクコールバックが横取りまたは同時に二つのコアで実行することができます:

は疑問を簡単にするには?

+0

イベントが発生するとコールバックが呼び出されます。コールバックが終了する前に別のイベントが発生した場合、重複した呼び出しが発生します。 – stark

+0

@stark私はより具体的には、コールバックが重複する可能性のある同じnetlinkファミリの登録で2つのイベントを取得できるかどうかを尋ねています。複数のコールバックを持つ登録は1つだけです。 Netlinkコールバックは同じ構造を変更し、構造はnetlinkコールバックによってのみ変更/アクセスされます。 – Etherealone

+1

@Etherealone私は、これは構成可能だが、デフォルトでは無効であると答えていると思う。私のカーネル3.11のソースでは、 'struct genl_family'は' bool parallel_ops'を含んでいます。 'linux-3.11.10-21/net/netlink/genetlink.c:674'またはnearaboutsの' genl_rcv_msg() 'に、そのフラグが設定されていない場合、グローバルミューテックスがロックされ、要求が処理され、グローバル・ミューテックスがロック解除されました。設定されている場合、このロックは発生しません。 –

答えて

2

Linuxカーネルバージョン3.11または4.2を前提としていますが、おそらく他の多くのバージョンで有効です。コールバックは、登録時にstruct genl_familyの設定可能なプロパティです同時であってもなくてもよいかどうか

9月、2015年現在のもの回答が、明示的に指定しない場合は、おそらくはオフにデフォルト設定です。これは)により、1 struct genl_familybool parallel_ops部材の存在であり、及び2)静的継続時間の初期化されていないメンバーはstructはネットリンクメッセージを受信するとC.

0にデフォルト設定され、最終的には機能genl_rcv_msg()が呼び出されグローバルgenl_mutexをロックするかどうかを決定するために、メッセージのGeNetlinkファミリと条件を決定するparallel_opsを決定します。 genl_family_rcv_msg()一旦

static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) 
{ 
     struct genl_family *family; 
     int err; 

     family = genl_family_find_byid(nlh->nlmsg_type); 
     if (family == NULL) 
       return -ENOENT; 

     if (!family->parallel_ops) 
       genl_lock(); 

     err = genl_family_rcv_msg(family, skb, nlh); 

     if (!family->parallel_ops) 
       genl_unlock(); 

     return err; 
} 

が(mutexによって保護されていてもよい)が呼び出され、実際のコールバックがhere呼び出されます。

関連する問題