Циклы питания диска NVMe PCIe

Вопрос или проблема

Я хочу протестировать NVMe SSD, который подключен к слоту PCIe на моей материнской плате. Процедура тестирования – это специфический алгоритм, который записывает нагрузки на SSD, в то время как SSD подвергается радиации (например, нейтронам).

Я использую Fedora 22 с ядром 4.4.6.

Мое текущее программное обеспечение успешно работает с SATA SSD. Поскольку SSD может перестать реагировать из-за радиации, иногда требуется его перезагрузка для возобновления операций. Это становится возможным благодаря внешнему управляемому блоку питания.

Теперь я хотел бы портировать свое программное обеспечение для тестирования NVMe SSD PCIe. Я модифицировал расширитель PCIe для внешнего применения напряжения к SSD; полученные линии питания (+12В и 3,3В) изолированы от линий питания разъема PCIe. С этой конфигурацией SSD хорошо распознается и работает при загрузке с включенным внешним источником питания.

Удаление устройства и повторное сканирование шины PCI работают, пока NVMe SSD включен, а именно:

echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove

после:

echo 1 > /sys/bus/pci/rescan

работает. Однако, если я выключаю и затем включаю устройство после его удаления, повторное сканирование шины PCI rescan не работает (и никаких сообщений не появляется в dmesg).

Если я “жестко” выключаю SSD (с помощью моего контролируемого блока питания) без удаления SSD в sysfs, я получаю следующее:

[  192.688934] nvme 0000:01:00.0: Статус сбоя: ffffffff, сброс контроллера
[  192.689274] Попытка освободить несуществующий ресурс <000000000000e000-000000000000e0ff>
[  192.699900] nvme 0000:01:00.0: Отказ в изменении состояния питания, в настоящее время в D3
[  192.699946] Попытка освободить несуществующий ресурс <000000000000e000-000000000000e0ff>
[  192.699953] nvme 0000:01:00.0: Устройство не удалось возобновить

Очевидно, что повторное сканирование шины PCI ничего не дает.

Вопрос: что необходимо сделать, чтобы обеспечить циклическое выключение SSD без перезагрузки моей тестовой станции? Из аналогичных тем я понимаю, что эта проблема не тривиальна, поэтому я был бы рад широкому спектру решений (или подсказок), включая:

  • Добавление параметров загрузки ядра
  • Использование команд setpci (подсказки?)
  • Использование дополнительной логики, например, модификации проводки на расширителе PCIe, чтобы “обмануть” шину PCIe
  • Модификации в исходном коде ядра (подсказки?)

Это маловероятно, чтобы снова заставить устройство работать, но может сделать устройство достаточно отзывчивым, чтобы ответить на удаление. Пока устройство в порядке, сохраните все регистры конфигурации PCI, а после циклического отключения восстановите их. Вы можете продвинуться в этом, найдя слот контроллера.

$ lspci | grep SATA
00:1f.2 SATA контроллер: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04)

Затем перечислите имена регистров и передайте каждый из них в setpci (вам не нужно быть root):

$ setpci --dumpregs |
awk -v slot="00:1f.2" 'NR>1 && !/ E?CAP/{
  reg = tolower($NF)
  printf "%s=",reg
  system("setpci -s " slot " " reg)
}'

Это даст вам строки похожие на

vendor_id=8086
device_id=1e03
command=0407
status=02b0
base_address_0=0000f0b1
base_address_1=0000f0a1
base_address_2=0000f091
base_address_3=0000f081
base_address_4=0000f061
base_address_5=f7c06000

Очевидно, что некоторые из этих регистров только для чтения или имеют только для чтения биты. Идея заключается в том, чтобы вызвать sudo setpci -s "$slot" с каждой из этих строк, игнорируя этот аспект.

Вышеуказанное обрабатывает только базовые регистры конфигурации PCI. Однако вам также нужно сохранить и восстановить некоторые регистры возможностей. Это потребует больше усилий, в зависимости от регистра. Вам также нужно быть root, чтобы их прочитать. Например,

sudo setpci -s 00:1f.2   CAP_MSI+0.l CAP_MSI+4.l CAP_MSI+8.l

выведет регистры возможностей MSI:

00017005
fee0200c
000041b1

Сравните это с значениями, показанными командой

sudo lspci -s "$slot" -vvv
    ...
    Возможности: [80] MSI: Включить+ Количество=1/1 Маскируемый- 64bit-
            Адрес: fee0200c  Данные: 41b1

Ответ или решение

Циклическое питание NVMe SSD, подключенного через PCIe: Руководство по решению проблемы

Тестирование твердотельного накопителя (SSD) NVMe при воздействии радиации – это сложная задача, требующая тщательного подхода при управлении питанием и состоянием устройства. Данная статья опишет, какие шаги можно предпринять для успешного циклического питания NVMe SSD, подключенного к слоту PCIe на материнской плате, без необходимости перезагрузки тестовой станции.

Проблема

Вы столкнулись с несколькими проблемами:

  1. SSD NVMe перестает отвечать на команды после обесточивания.
  2. Повторное сканирование шины PCI не фиксирует устройство после его повторного включения.
  3. Невозможность восстановления работы накопителя без перезагрузки системы.

Пути решения

Существует несколько методов, которые могут помочь в решении указанных проблем:

  1. Корректное управление питанием и сброс устройства:

    • Для того чтобы эффективно управлять состоянием NVMe SSD, рекомендуется использовать команды, связанные с setpci, для сброса конфигурационных и управляющих регистров устройства после его повторного включения.
  2. Использование setpci для сохранения и восстановления конфигурации:

    • Перед отключением питания накопителя сохраните текущие регистры конфигурации устройства. Это может помочь восстановить его состояние после повторного включения.
    • Пример команды для создания резервной копии регистров:
      setpci --dumpregs | awk -v slot="00:01.0" 'NR>1 {print "setpci -s " slot " " $1 " = " $3}'
    • После повторного включения выполните сохраненные команды для восстановления состояния устройства.
  3. Добавление параметров загрузки ядра:

    • В некоторых случаях вам может понадобиться настроить параметры ядра для более лучшего управления состоянием PCIe устройств. Попробуйте добавление параметра pci=nocrs (если не требуется включение ресурсов PCI) при загрузке, чтобы отключить автоматическую настройку ресурсов.
  4. Использование логики управления на уровне аппаратного обеспечения:

    • Если есть возможность, дополните вашу модификацию PCIe-удлинителя элементами, которые могут "обмануть" PCIe шину о том, что устройство было совершено нормально отключено и повторно подключено. Например, можно использовать логические элементы или другие схемы, которые обеспечивают временное наличие устройства на шине.
  5. Изменения в исходном коде ядра:

    • Если традиционные подходы не помогают, можно рассмотреть возможность внести изменения в исходный код ядра Linux для улучшения обработки состояния устройства. Это, конечно, требует глубоких знаний и понимания внутренностей ядра Linux и PCIe.

Заключение

Процесс циклического питания NVMe SSD через PCIe является сложной задачей, которая требует как программного, так и аппаратного подхода к решению. Успешный подход включает в себя управление питанием устройства, использование команд для работы с регистрами PCIe, применение необходимых параметров загрузки ядра и возможные изменения в аппаратной конфигурации устройства.

Запомните, что подобные эксперименты несут в себе риск, и необходимо тщательно планировать действия, чтобы минимизировать вероятность повреждений как аппаратных, так и программных.

Оцените материал
Добавить комментарий

Капча загружается...