2017-09-05 7 views
0

j'ai ajouté la ligne suivante dans sock_def_readable:Pourquoi sock_def_readable est-il appelé dans un contexte de processus?

printk("TT: %s\tcontext=%c\tpid=%d\tcomm=%s\n", 
     __FUNCTION__, 
     in_interrupt() ? 'i' : 'p', 
     current->pid, 
     current->comm); 

et a été surprise de voir sa sortie. C'est ce que je reçois dans une machine virtuelle en cours d'exécution lighttpd:

[ 626.627938] TT: sock_def_readable context=i pid=0 comm=swapper/0 
[ 626.628682] TT: sock_def_readable context=i pid=0 comm=swapper/0 
[ 626.629410] TT: sock_def_readable context=i pid=0 comm=swapper/0 
[ 626.630730] TT: sock_def_readable context=i pid=3123 comm=lighttpd 

sock_def_readable est toujours appelée dans un contexte d'interruption, comme prévu. Idem pour Apache httpd. Cependant, si je lance mysqld:

[ 750.271819] TT: sock_def_readable context=p pid=3809 comm=mysqld 
[ 750.276922] TT: sock_def_readable context=p pid=3742 comm=mysqld 
[ 750.278017] TT: sock_def_readable context=p pid=4333 comm=mysqld 

Question: Pourquoi sock_def_readable appelé dans un contexte de processus pour mysqld? Pourquoi sock_def_readable être appelé dans le contexte de processus du tout?

Dans le cas où il importe, je me sers:

  • noyau Linux 4.8-RC2
  • Lighttpd 1.4.34
  • Apache 2.4.10 (mod_prefork) + PHP 5.6
  • MySQL 5.5

Répondre

1

sock_def_readable fournit la version (par défaut) de l'opération "Réveiller tout processus en attente de réception sur ce socket." Normalement, pour une connexion TCP, cette opération est effectuée dans un contexte d'interruption car un nouveau message a été reçu à partir de l'interruption de réception du pilote de périphérique réseau. Est probablement l'envoi/la réception à partir d'un socket de domaine Unix. Les sockets de domaine Unix n'ont pas besoin d'interruptions car tout transfert de données se fait entre un processus et un autre.

Lorsque le processus A envoie un message sur un socket (unix) connecté, sock_def_readable est appelé (via sk->sk_data_ready) pour déterminer si un processus de réception attend des données sur le socket. Cet appel serait fait dans le contexte du processus de l'expéditeur.