NVMe PCIeディスク電源サイクリング

NVMe PCIeディスク電源サイクリング

マザーボードのPCIeスロットに接続されているNVMe SSDをテストしたいと思います。テストプロセスは、SSDが放射線(中性子など)にさらされている間にSSDにワークロードを記録する特定のアルゴリズムです。

私はカーネル4.4.6でFedora 22を実行しています。

現在のソフトウェアはSATA SSDで正常に動作します。放射線によってSSDが応答しなくなる可能性があるため、操作を再開するためにSSDを再起動する必要がある場合があります。これは外部制御電源を介して達成できます。

次に、NVMe SSD PCIeをテストするためにソフトウェアを移植したいと思います。 SSDに外部から電圧を印加するようにPCIeエキスパンダを修正しました。派生電源ライン(+12Vおよび3.3V)は、PCIeコネクタの電源ラインから分離されています。このように設定すると、外部電源を入れた状態で起動時にSSDが正しく認識され、正常に動作します。

NVMe SSDの電源が入っている間にデバイスを取り外し、PCIバスを再スキャンしてください。つまり、次のようになります。

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: Failed status: ffffffff, reset controller
[  192.689274] Trying to free nonexistent resource <000000000000e000-000000000000e0ff>
[  192.699900] nvme 0000:01:00.0: Refused to change power state, currently in D3
[  192.699946] Trying to free nonexistent resource <000000000000e000-000000000000e0ff>
[  192.699953] nvme 0000:01:00.0: Device failed to resume

明らかに、PCIバスを再検索しても効果はありません。

Q:テストステーションを再起動せずにSSDの電源を入れ直すには何が必要ですか?同様のスレッドでこの問題は些細なことではないことを理解しているので、次のようなさまざまなソリューション(またはヒント)に満足しています。

  • カーネルブートパラメータの追加
  • コマンドの使い方setpci(ヒント?)
  • PCIe エクスパンダのラインを変更して PCIe バスを「なりすまし」するなど、追加のロジックを使用します。
  • カーネルソースコードの修正(ヒント?)

ベストアンサー1

これにより、デバイスが再び動作することに成功する可能性は低くなりますが、デバイスが削除に応答するのに十分な反応を引き起こす可能性があります。デバイスが正常な場合は、すべてのPCI設定レジスタを保存し、電源を入れ直してから復元してください。コントローラスロットを見つけてこれを行うことができます。

$ lspci | grep SATA
00:1f.2 SATA controller: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04)

次に、レジスタ名をリストし、各レジスタ名をsetpciに渡します(ルートである必要はありません)。

$ 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
    ...
    Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit-
            Address: fee0200c  Data: 41b1

おすすめ記事