2015-04-05 8 views
2

Я пытаюсь понять, как обработка прерываний работает для устройства, назначенного виртуальной машине (гостевой KVM) через VFIO, но не понимает, как это происходит?Обработка прерываний для назначенного устройства через VFIO

Предположим, у меня есть устройство, которое напрямую назначено (Пропуск устройства) для гостевой VM через VFIO, и наступает аппаратное прерывание для этого конкретного устройства?

Что будет дальше?

ответ

3

Прерывание от устройства принимается ядром хоста и направляется обработчику прерываний, зарегистрированным драйвером шины vfio, vfio-pci или vfio-платформой. Этот обработчик прерываний просто передает прерывание на eventfd, который пользователь (QEMU) настроил через ioctl. Когда используется KVM, пользователь может подключить событие eventfd сигнализации прерывания от vfio непосредственно к прерыванию, впрыскивающему irqfd в KVM. Это позволяет избежать перехвата прерывания в пользовательском пространстве QEMU для вставки в гостевой, хотя этот путь является опцией, если поддержка KVM irqfd недоступна.

Для прерывания, вызванного уровнем, мы также должны маскировать прерывание прерывания на хосте, чтобы устройство не прерывало работу хоста, пока прерывание обслуживается гостем. Поэтому мы маскируем прерывание перед сигналом eventfd и используем несколько другой KVM irqfd, называемый resampling irqfd, который регистрирует вторую пару eventfd-irqfd для сигнализации об открытии маски с KVM на vfio.

Различные аппаратные технологии дополняют это для повышения эффективности. Intel APICv позволяет прерываниям вводиться непосредственно в гостевую систему без использования vmexit в некоторых случаях. Это полностью обрабатывается внутри KVM. Intel Отправленные прерывания позволят прерываниям обходить хост полностью, когда на процессоре, получающем аппаратное прерывание, выполняется правильный vCPU. ARM IRQ Forwarding позволяет гостю управлять разоблачением прерываний, избегая перераспределения ресурсов irqfd.

+0

Спасибо @Alex, это очень помогло мне :) –

+0

Просто выполните вопросы с исходной точки зрения, я вижу, что для vfio-платформы \t «eventfd_signal (irq_ctx-> trigger, 1);» будет сигнализировать прерывание Гость KVM, но я не мог узнать, где в QEMU запускается событие eventfd call и настраивается через IOCTL? Также я не получил этой точки, когда задействован KVM. QEMU может подключать событие eventfd сигнализации прерывания от VFIO напрямую к прерыванию, впрыскивающему irqfd в KVM. –

+0

В ветке V12 Eric соединение eventfd выполняется в platform.c: vfio_set_trigger_irqfd(). Это позволяет модулю ядра уведомлять об установке eventfd в уведомлении события intp-> interrupt. Irqfd настраивается через vfio_start_irqfd_injection() в том же файле. Eventfds - это механизм для ядра для отправки сигнала файловому дескриптору, как правило, для сигнализации пользовательского пространства. IRQfds - это механизм для того, чтобы пользовательское пространство сигнализировало ядро ​​через дескриптор файла с целью введения прерывания в виртуальную машину. Если мы используем один и тот же дескриптор файла для обоих, мы можем прозрачно подключать vfio к kvm. –