Я обнаружил, что задержка чтения / записи моего MMIO неоправданно высока. Я надеюсь, что кто-нибудь может дать мне несколько предложений.
В пространстве ядра я написал простую программу для чтения 4-байтового значения в адресе BAR0 устройства PCIe. Это сетевая карта PCIe Intel 10G, подключенная к шине PCIe x16 на моем сервере Xeon E5. Я использую rdtsc для измерения времени между началом чтения MMIO и концом, фрагмент кода выглядит так:
vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device
rdtscl(init);
ret = readl(vaddr);
rmb();
rdtscl(end);
Я ожидаю, что время, прошедшее между (end, init), будет меньше 1 мкс, в конце концов, данные, проходящие по каналу данных PCIe, должны занимать всего несколько наносекунд. Однако результаты моих тестов показывают, что по крайней мере 5.5use выполняет чтение устройства MMIO PCIe. Мне интересно, разумно ли это. Я меняю свой код на удаленный барьер памяти (rmb), но все равно получаю задержку около 5 мкс.
В этом документе упоминается об измерении задержки PCIe. Обычно меньше 1 мкс. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Нужно ли мне выполнять какие-либо особые настройки, такие как ядро или устройство, для уменьшения задержки доступа MMIO? или Кто-нибудь уже делал это раньше?