Bonjour pam547,
En lisant la conversation j’ai pensé que des petites précisions s’imposent concernant ce que sont les MSIs et en quel est l’effet de pci=nomsi
.
Pour commencer, une interruption est un mécanisme qui permet à un périphérique d’interrompre ce que le CPU exécute pour qu’il traite un évènement concernant ce périphérique, par exemple quand un carte réseau a reçu un paquet. En effet, quand les interruptions n’existaient pas, le CPU devait périodiquement vérifier l’état de tout les périphériques, périodiquement, pour voir si il y avait des évènements à traiter. Ce qui pose d’évidents problèmes de performances. Avec les interruptions, le CPU n’a plus besoin de vérifier chaque périphérique un par un, il peut exécuter ce qu’il veut, puis quand un périphérique a un évènement pour le CPU, il peut demander au CPU de le traiter pour lui.
Historiquement, les interruptions étaient des entrées du CPU (je simplifie en oubliant volontairement contrôleur d’interruptions) sur lesquelles les périphériques signalaient un interruption en passant l’entrée de l’état bas à l’état haut (ou vice-versa selon le design hardware). Le problème c’est qu’au fur et à mesure que le nombre de périphériques augmente, il faut aussi augmenter le nombre d’interruptions disponibles, sinon le CPU se retrouve à faire du polling pour vérifier quel périphérique à des données à traiter.
Quand PCI-Express a été introduit, les Message Signaled Interrupts (MSI) on été ajoutées dans la version 2.2. Elles permettent de remplacer les interruptions « hardware » (avec un fil d’interruption dédié) par un message envoyé sur le bus PCI-E au contrôleur de bus disant « j’ai une interruption ». Ce qui permet d’avoir autant d’interruptions qu’on veut par périphérique PCI-E.
C’est un mécanisme courant sur les machines modernes. En revanche sur les PC plus anciens il était courant d’avoir un bus PCI-E sans que les MSI soient supportées. Dans ce cas, le noyau doit savoir qu’il doit utiliser les interruptions normales au lieu des MSI pour les périphériques en question.
En théorie cette information est indiquée par un flag dans l’une des tables ACPI, et le noyau est censé en déduire quel périphérique peut, ou non, utiliser les MSI. Mais lorsque ce n’est pas le cas, les drivers des périphériques en question pensent devoir utiliser les MSI, mais ça ne fonctionne pas, et donc le driver ne fonctionne pas. Dans ce cas, il faut indiquer manuellement au noyau que les MSI ne sont pas supportées, c’est à ça que sert pci=nomsi
: cette option indique au noyau que sur cette plateforme, il ne faut pas utiliser les interruptions MSI. Il est parfois également possible de le préciser par driver, avec un paramètre spécifique au driver.
Pour en revenir à la modification que tu essayes de faire dans /sys
celle-ci n’a aucun effet et c’est attendu. Seul un petit nombre de contrôleur ou de bridges PCI-E sont capable de changer dynamiquement leur configuration concernant les MSIs. Il est donc probable que modifier ce 1 en 0 ne fasse rien dans le driver. Si tu souhaites désactiver les MSI par périphérique, ta meilleure chance est de trouver pour chaque driver le paramètre adéquat. Par exemple pour le driver nouveau (cartes graphiques Nvidia) il faut passer nouveau.config=NvMSI=0
.
Voilà, en espérant que ça éclaircisse un peu la situation