Как протестировать shpc на qemuLinux

Ответить
Anonymous
 Как протестировать shpc на qemu

Сообщение Anonymous »

Вот переведенная и отформатированная версия статьи «Переполнение стека» на английском языке:

Контекстуализация проблемы

Я новичок в разработке ядра Linux.

Недавно я внес изменения в драйверы SHPC (стандартного контроллера горячей замены), заменив функцию request_irq() с помощью функции request_threaded_irq(). Это было предложение Лукаса Вуннера в коммите a0d58937404f5.

Таким образом, когда получено прерывание с номером IRQ, предоставленным для request_threaded_irq(), оно выполняет небольшую часть контекста прерывания. , а основная часть обработки горячего подключения выполняется в отдельном потоке. Поэтому мне нужно было создать две функции: одну функцию с некоторыми базовыми правилами обработки прерывания в контексте прерывания и другую функцию с «остатком» кода горячего подключения, который будет выполняться вне контекста прерывания, в потоке.< /p>
Вот полная разница моих изменений:
diff --git a/drivers/pci/hotplug/shpchp_hpc.c b/drivers/pci/hotplug/shpchp_hpc.c
index 012b9e3fe5b0..b82d2bc4b777 100644
--- a/drivers/pci/hotplug/shpchp_hpc.c
+++ b/drivers/pci/hotplug/shpchp_hpc.c
@@ -166,6 +166,8 @@
#define SLOT_SERR_INT_MASK 0x3

static irqreturn_t shpc_isr(int irq, void *dev_id);
+static irqreturn_t shpc_ist(int irq, void *dev_id);
+
static void start_int_poll_timer(struct controller *ctrl, int sec);

static inline u8 shpc_readb(struct controller *ctrl, int reg)
@@ -746,7 +748,7 @@ int shpchp_set_bus_speed_mode(struct slot *slot, enum pci_bus_speed value)
return retval;
}

-static irqreturn_t shpc_isr(int irq, void *dev_id)
+static irqreturn_t shpc_ist(int irq, void *dev_id)
{
struct controller *ctrl = (struct controller *)dev_id;
u32 serr_int, slot_reg, intr_loc, intr_loc2;
@@ -825,6 +827,21 @@ static irqreturn_t shpc_isr(int irq, void *dev_id)
return IRQ_HANDLED;
}

+static irqreturn_t shpc_isr(int irq, void *dev_id)
+{
+ pr_info("%s: isr for interrupt handler\n", __func__);
+
+ struct controller *ctrl = dev_id;
+ struct pci_dev *pdev = ctrl->pci_dev;
+
+ if (pdev->ignore_hotplug) {
+ pr_info("ignoring hotplug");
+ return IRQ_HANDLED;
+ }
+
+ return IRQ_WAKE_THREAD;
+}
+
static int shpc_get_max_bus_speed(struct controller *ctrl)
{
int retval = 0;
@@ -1001,8 +1018,9 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
pci_set_master(pdev);
}

- rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED,
- MY_NAME, (void *)ctrl);
+ rc = request_threaded_irq(ctrl->pci_dev->irq, shpc_isr, shpc_ist,
+ IRQF_SHARED, MY_NAME, (void *)ctrl);
+
ctrl_dbg(ctrl, "request_irq %d (returns %d)\n",
ctrl->pci_dev->irq, rc);
if (rc) {

Чтобы проверить это самостоятельно, вы можете использовать:
git apply

Задача

Основная проблема — найти способ протестировать это изменение. Я не могу найти метод для моделирования устройства, совместимого с SHPC, которое могло бы взять на себя управление горячим подключением PCI, позволяя выполнять функции, переданные в request_threaded_irq().
Попытки на данный момент

QEMU

Я привык тестировать в QEMU и на своей машине. После обширных исследований я обнаружил, что ближе всего к тестированию SHPC-совместимых устройств в QEMU я могу использовать опцию pci-bridge, передавая параметр shpc=on.

Вот команда, которую я использовал для запуска вновь скомпилированного ядра в QEMU с помощью моста SHPC:
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -append "root=/dev/sda1 console=ttyS0 earlyprintk=serial" -drive file=ubuntu.qcow2,format=qcow2 -m 1024 -enable-kvm -net nic -net user,hostfwd=tcp::2222-:22 -nographic -d int,cpu_reset -device pci-bridge,id=pci.1,chassis_nr=1,shpc=on

Ядро запускается нормально, драйвер SHPC инициализируется. Однако он не «берёт на себя» управление горячим подключением PCI, поскольку является корневым мостом. Будучи мостом, он является лишь «связующим звеном» для других соединений PCI и не должен обеспечивать горячее подключение подключенных к нему устройств. Поэтому мое изменение, касающееся request_threaded_irq(), не выполняется, поскольку мост не предполагает управление горячим подключением PCI.
После долгих поисков я не смог найти другое устройство. что я мог бы подключиться для запуска драйвера SHPC.
QEMU + Telnet

Я также пробовал запустить QEMU с монитором в качестве параметра :
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -append "root=/dev/sda1 console=ttyS0 earlyprintk=serial" -drive file=ubuntu.qcow2,format=qcow2 -m 1024 -enable-kvm -monitor telnet:127.0.0.1:5555,server,nowait -nographic

Подключено к Telnet:
telnet localhost

Затем попыталась добавить мост:
device_add pci-bridge,id=pci.1,chassis_nr=1,shpc=on

Нет успеха, поскольку он остается корневым мостом, как я упоминал ранее.
QEMU + Telnet + e1000 (и другие устройства)

Я также пробовал добавить устройство e1000 через telnet:
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -append "root=/dev/sda1 console=ttyS0 earlyprintk=serial" -drive file=ubuntu.qcow2,format=qcow2 -m 1024 -enable-kvm -monitor telnet:127.0.0.1:5555,server,nowait -nographic -device pci-bridge,id=pci.1,chassis_nr=1,shpc=on

device_add e1000 id=net1,bus=pci.1

Это тоже не сработало, поскольку e1000 не совместим с SHPC. Я также пробовал другие устройства, но ни одно из них не совместимо с SHPC, за исключением мостов.
Соединение моста с мостом
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -append "root=/dev/sda1 console=ttyS0 earlyprintk=serial" -drive file=ubuntu.qcow2,format=qcow2 -m 1024 -enable-kvm -monitor telnet:127.0.0.1:5555,server,nowait -nographic -device pci-bridge,id=pci.1,chassis_nr=1,shpc=on

device_add pci-bridge,id=pci.2,bus=pci.1,shpc=on

Это также не сработало, поскольку второй мост также является корневым мостом и не обрабатывает IRQ.
Другие виртуальные машины
  • KVM + Libvirt + Virt-Manager: Те же результаты, что и у QEMU
    < li>VMware и VirtualBox: ограниченная поддержка моделирования горячего подключения PCIe
На моей собственной машине (Dell Latitude E7450)

Ни одно устройство PCIe не было SHPC-совместимым.
My Kernel .config
CONFIG_PCI=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_SHPC=y
# CONFIG_HOTPLUG_PCI_ACPI is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set


Подробнее здесь: https://stackoverflow.com/questions/791 ... pc-on-qemu
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»