2015-09-11 14 views
5

Supponiamo di aver registrato un'interfaccia netlink generica utilizzando genl_register_family_with_ops con più callback.Linux Kernel Netlink generico - È simultaneo?

Non vedo alcun avviso a riguardo e presumo che le richiamate siano chiamate in serie ma non ci sono informazioni su come i callback non vengano nemmeno chiamati.

È possibile che più richiami vengano chiamati contemporaneamente sulla stessa interfaccia di netlink generica che ho registrato? Ho bisogno di una sincronizzazione tra i callback?

per rendere la domanda più semplice:

Può un singolo callback netlink essere prevaricata o contemporaneamente eseguito in due core?

+0

Le chiamate vengono richiamate quando si verifica un evento. Se un altro evento si verifica prima della fine del callback, si otterrà una chiamata sovrapposta. – stark

+0

@stark Mi sto chiedendo in particolare se posso ottenere due eventi sulla stessa registrazione della famiglia netlink che può fare in modo che i callback si sovrappongano. Esiste una sola registrazione con più callback. I callback di Netlink modificheranno le stesse strutture e le strutture saranno modificate/accessibili solo tramite callback netlink. – Etherealone

+1

@Etherealone Sospetto che la risposta sia configurabile, ma disattivata per impostazione predefinita. Nella mia copia delle fonti del kernel 3.11, la 'struct genl_family' contiene un' bool parallel_ops'. In 'linux-3.11.10-21/net/netlink/genetlink.c: 674' o nearabouts, in' genl_rcv_msg() ', se questo flag non è impostato, allora un mutex globale è bloccato, la richiesta viene elaborata, e il mutex globale sbloccato. Se è impostato, questo blocco non si verifica. –

risposta

2

La risposta presuppone la versione del kernel Linux 3.11 o 4.2, probabilmente valida per molti altri. Risposta attuale come di settembre 2015.

Sia callback possono essere concomitante o non è una proprietà configurabile del struct genl_family al momento della registrazione, ma se non esplicitamente specificato, è probabilmente in default a off. Ciò è dovuto 1) La presenza di un membro bool parallel_ops in struct genl_family, e 2) i membri inizializzate di un statico-durata struct essendo default per 0 in C.

Su ricezione di un messaggio Netlink, infine la funzione genl_rcv_msg() è chiamato , che determina la famiglia e le condizioni del messaggio GeNetlink su parallel_ops per decidere se bloccare o meno il valore globale genl_mutex.

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; 
} 

volta genl_family_rcv_msg() viene invocato (protetti o non protetti dal mutex), la richiamata attuale viene richiamato here.