Je voudrais vérifier sur une machine Linux donnée si le passthrough PCI est pris en charge. Après un peu de recherche sur Google, j'ai trouvé que je devrais plutôt vérifier si IOMMU est pris en charge, et je l'ai fait en exécutant:
dmesg | grep IOMMU
S'il prend en charge IOMMU (et non IOMMUv2), j'obtiendrais:
IOMMU
[ 0.000000] DMAR: IOMMU enabled
[ 0.049734] DMAR-IR: IOAPIC id 8 under DRHD base 0xfbffc000 IOMMU 0
[ 0.049735] DMAR-IR: IOAPIC id 9 under DRHD base 0xfbffc000 IOMMU 0
[ 1.286567] AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
[ 1.286568] AMD IOMMUv2 functionality not available on this system
...où DMAR: IOMMU enabled
est ce que je recherche.
Maintenant, si la machine fonctionne depuis des jours sans redémarrage, ce premier message [ 0.000000] DMAR: IOMMU enabled
pourrait ne plus apparaître dans le journal avec la commande précédente.
Existe-t-il un moyen de vérifier la prise en charge IOMMU lorsque ce message disparaît du journal?
Depuis 2014, les iommu activés sont enregistrés dans le système de fichiers spécial/sys (sysfs) en tant que classe iommu
(documenté à ABI/testing/sysfs-class-iomm ): https: //patchwork.kernel.org/patch/4345491/ "[2/3] iommu/intel: utilisez la prise en charge des sysfs IOMMU" - 12 juin 2014
Enregistrez nos IOMMU DRHD, dispositifs de liaison croisée et fournissez un ensemble de base d'attributs pour l'IOMMU. ... Sur un système de bureau classique, cela fournit les éléments suivants (élagués):
$ find /sys | grep dmar /sys/devices/virtual/iommu/dmar0 ... /sys/class/iommu/dmar0 /sys/class/iommu/dmar1
Le code est iommu_device_create
( http://elixir.free-electrons.com/linux/v4.5/ident/iommu_device_create , environ 4,5) ou iommu_device_sysfs_add
( http://elixir.free-electrons.com/linux/v4.11/ident/iommu_device_sysfs_add ) dans les noyaux plus récents.
/*
* Create an IOMMU device and return a pointer to it. IOMMU specific
* attributes can be provided as an attribute group, allowing a unique
* namespace per IOMMU type.
*/
struct device *iommu_device_create(struct device *parent, void *drvdata,
const struct attribute_group **groups,
const char *fmt, ...)
L'enregistrement est effectué uniquement pour l'IOMMU activé. DMAR:
if (intel_iommu_enabled) {
iommu->iommu_dev = iommu_device_create(NULL, iommu,
intel_iommu_groups,
"%s", iommu->name);
AMD IOMMU:
static int iommu_init_pci(struct AMD_iommu *iommu)
{ ...
if (!iommu->dev)
return -ENODEV;
...
iommu->iommu_dev = iommu_device_create(&iommu->dev->dev, iommu,
AMD_iommu_groups, "ivhd%d",
iommu->index);
Intel:
int __init intel_iommu_init(void)
{ ...
pr_info("Intel(R) Virtualization Technology for Directed I/O\n");
...
for_each_active_iommu(iommu, drhd)
iommu->iommu_dev = iommu_device_create(NULL, iommu,
intel_iommu_groups,
"%s", iommu->name);
Avec la version 4.11 du noyau linux iommu_device_sysfs_add
est référencé dans de nombreux pilotes IOMM , il est donc préférable (plus universel) de vérifier/sys/class/iommu pour détecter par programme l'IOMMU activé que d'analyser la sortie dmesg
ou de rechercher dans /var/log/kern.log
ou /var/log/messages
pour les messages d'activation spécifiques au pilote:
Référencé dans 10 fichiers:
- drivers/iommu/AMD_iommu_init.c, ligne 1640
- pilotes/iommu/arm-smmu-v3.c, ligne 2709
- drivers/iommu/arm-smmu.c, ligne 2163
- drivers/iommu/dmar.c, ligne 1083
- drivers/iommu/exynos-iommu.c, ligne 623
- drivers/iommu/intel-iommu.c, ligne 4878
- drivers/iommu/iommu-sysfs.c, ligne 57
- drivers/iommu/msm_iommu.c, ligne 797
- drivers/iommu/mtk_iommu.c, ligne 581