CXL (Compute Express Link) その13 - CXL.ioコマンド: Health Info

私はメモリデバイスの不揮発性メモリ制御やホストIFなどを扱うソフト屋をやっております。
仕事でCXL(Compute Express Link)まわりの技術に関わっています。
CXL技術に関連するメモ書きを残していこうと思います。
ホストのCPUとOS/Applicationまわりの経験・知識共に乏しいので、親切な方は教えて下さると幸いです。
また、間違い、アドバイス、その他、ご意見やご要望ありましたらお気軽にどうぞ。

---
CXLメモリデバイスのHealth Infoについてと、Health Infoの取得コマンドについて書こうと考えています。

#1. Health Info
CXLの仕様では、ホストシステムがCXLメモリデバイスの故障予測をするための情報として、Health Infoが定義されています。
ただし、現在のCXLの仕様で定められているHealth Infoの項目数は、NVMeで定められているSMART/Health Infoの項目数と比較すると少ないです。

NVMeは、IntelのOptane SSDなど一部のSSDを除けば、多値(MLC/TLC/QLC)のNAND Flash Memoryを記録媒体とするSSDのIFとして使用されるケースが殆どです。NAND Flash Memoryのコントローラは、SSDの内部で、Over Provisioning/Garbage Collection/Wear Levelingの技術を駆使し、保証期間中、ストレージとして最大限のパフォーマンスが出せるように設計されています。それぞれの技術は、NAND Flash Memoryの制御技術として枯れた技術となってきているので、SSDベンダー毎に実装に多少の違いはありますが、大きな差はありません。
従って、NVMeのSSDでは、使用されている記録媒体と技術は共通部分が多く、故障予測のために、ホストシステムがSMART/Health Infoとして取得したい情報は絞れており、NVMeの仕様では、具体的に必要な項目が羅列されている状態だと考えられます。

一方、CXLメモリデバイス場合は、記憶媒体として使用されるメモリは多くの場合で新規メモリが想定されます。使用される新規メモリはPCMやReRAM等の複数の候補があり、それぞれの新規メモリは、材料やプロセスが違ってメモリ特性も違います。さらに、コントローラで使われるメモリの制御技術もそれぞれの製品で違い、技術的にも成熟していない状態です。従って、CXLメモリデバイスの故障予測にどの情報をどう使うべきか分かっていない状態だと考えられます。
そのため、CXLの仕様ではHealth Infoの項目は最低限の項目を定め、仕様範囲外の情報はベンダー毎にメモリ特性や制御技術を考慮してVendor Specificな情報として取得できるようにし、それぞれのベンダーで故障予測に必要な情報が集まり、どの情報を使うべきか分かってきたら、CXLの仕様として標準化することになると思われます。

余談ですが、現状、市場で起こり得る新規メモリの不良や新規メモリを使った製品の不具合や故障に関する情報を一番多く持っているのはIntelです。Intelは、新規メモリであるPCMをOptaneと名前を付けてSSDに搭載し、製品としてリリースしました。
個人的には、IntelがOptaneをSSDに搭載して売り出した目的の一つは、PCMであるOptaneの量産技術の確立、市場で起こり得る不良・故障情報の収集、それらに対応するためのメモリ制御技術とモジュール製品の検証・量産テスト技術の確立だと考えています。Optaneは、SSDにはオーバースペックである上、NAND Flashに容量当たりのコストで勝てないため、IntelはそもそもOptane SSDで普及するとは考えていなかった、と想像しています。
Intelにとっては、CXLやGen-zなどで接続されたPersistent Memoryのメモリモジュール製品が本番のターゲット製品だろうと思われます。

さらにGen-zが出てきたついでの余談ですが、最近Gen-zのコンソーシアムがCXLのコンソーシアムに統合されました([参考1][1])。Cache CoherencyなInterfaceの技術の標準化を見ている人には、驚くことではないかと思います。CXL登場の当初から、Gen-zと統合になると考えるのが、それぞれの標準化を見ている人共通の考えだろうと思います。気が向いたらGen-zについて書くかもしれませんが、簡単には、CXLはブレード内での近距離の接続、Gen-zはブレード間やラック間など遠距離の接続の役割分担で、規格を統合することになると思います。
2016年にコンソーシアムが設立されたGen-zでは、以前からPoCのデモも頻繁に行われています([参考2][2])。最近ではデバイス間をCXLで接続したNodeにSwitchを接続し、SwitchでCXLをGen-zのプロトコルに変換しGen-zの機器に接続して動かすデモも行われています([参考3(youtube)][3])。

[1]:https://eetimes.itmedia.co.jp/ee/articles/2201/06/news065.html
[2]:https://genzconsortium.org/in-the-news/
[3]:https://www.youtube.com/watch?v=nXEKIJwx_QY

#2. Health Information and Alerts Command Set
話を戻して、CXL.ioで実行するコマンドには、CXLメモリデバイスのヘルス情報の取得や、アラートの設定をするためのコマンドセットとして、コマンドセットが定められています。

下表に、Media and Poison Managementコマンドセットを構成するコマンドを示します。

| Command | Required | 概要 |
|:--|:-:|:--|
| Get Health Info | M | ヘルス情報を取得する。 |
| Get Alert Configuration | M | 設定されたアラートの情報を取得する。 |
| Set Alert Configuration | M | アラートの設定をする。|
| Get Shutdown State | PM | Shutdown Stateの情報を取得する。 |
| Set Shutdown State | PM | Shutdown Stateの情報を設定する。|

##2.1 コマンドパラメータ
Health Information and Alertsコマンドセットで定義されるコマンドの詳細を示します。
コマンドでCXLメモリデバイスに指定するパラメータをInput Payload、CXLメモリデバイスから応答として返されるパラメータをOutput Payloadで記載します。

###2.2.1 Get Health Info
CXLメモリデバイスのヘルス情報を取得します。
ヘルス情報は、CXLその11で紹介したEvent Recordで取得できる情報と共通する項目で構成されています。

**Output Payload**

| Byte Offset | Length | Description |
|:--|:-:|:--|
| 00h | 1 | Health Status CXLメモリデバイスの状態を示す。<br>　Bit[0]: CXLメモリデバイスのメインテナンスが必要とされている状態<br>　Bit\[1]: パフォーマンス低下が起こっている状態<br>　Bit\[2]: CXLメモリデバイスの交換が必要とされている状態|
| 01h | 1 |Media Status CXLメモリデバイスの記録媒体の状態を示す。<br>　00h = 正常な状態<br>　01h = アクセスができない状態<br>　02h = 書き込みが正常に行えない状態<br>　03h = 全てのデータが失われた状態<br>　04h = CXLメモリデバイスで電源断が検出されたことにより書き込みができない可能性のある状態<br>　05h = CXLメモリデバイスのシャットダウンにより書き込みができない可能性のある状態<br>　06h = イベント以降に受け付けた書き込みが正常にできない可能性のある状態<br>　07h = CXLメモリデバイスで電源断が検出されたことにより全てのデータが失われた可能性のある状態<br>　08h = CXLメモリデバイスでシャットダウンが行われたことにより全てのデータが失われた可能性のある状態<br>　09h = 全てのデータが失われた可能性のある状態 |
| 02h | 1 |Additional Status　CXLメモリデバイスの状態を示す。<br>　Bit[1:0]: 消費されたCXLメモリデバイスの寿命の状態(Normal/Warning/Critical)<br>　Bit[3:2]: CXLメモリデバイスの温度状態(Normal/Warning/Critical)<br>　Bit[4]: CXLメモリデバイスの揮発性メモリで発生した訂正可能エラーの発生状態(Normal/Warning)<br>　Bit[5]: CXLメモリデバイスの不揮発性メモリで発生した訂正可能エラーの発生状態(Normal/Warning) |
| 03h | 1 | Life Used CXLメモリデバイスの消費された寿命(%)。|
| 04h | 2 | Device Temperature CXLメモリデバイスの温度。|
| 06h | 4 | Dirty Shutdown Count CXLメモリデバイスに対して行われた電源瞬断の回数。 |
| 06h | 4 | Corrected Volatile Error Count CXLメモリデバイスの揮発性メモリで発生した訂正可能エラー数。 |
| 0Eh | 4 | Corrected Persistent Error Count CXLメモリデバイスの不揮発性メモリで発生した訂正可能エラー数。|

###2.2.2 Get Alert Configuration
CXLその11で紹介したEvent Interrupt Policyに関連するアラートの設定に関する情報を取得します。

**Output Payload**

| Byte Offset | Length | Description |
|:--|:-:|:--|
| 00h | 1 | Valid Alerts アラートが出される条件を示す<br>　Bit[0]: 消費した寿命が閾値を超えた際のWariningのアラートが有効<br>　Bit\[1]: 温度が閾値を超えた際のWariningのアラートが有効<br>　Bit\[2]: 温度が閾値より下がった際のWariningのアラートが有効<br>　Bit\[3]: CXLメモリデバイスの揮発性メモリで発生した訂正可能エラーが閾値を超えた際のWariningのアラートが有効<br>　Bit[4]: CXLメモリデバイスの不揮発性メモリで発生した訂正可能エラーが閾値を超えた際のWariningのアラートが有効 |
| 01h | 1 | Programable Alerts アラートを出す閾値のうちホストシステムが設定可能な閾値を示す。<br>　Bit[0]: 消費した際にWariningのアラートを出す寿命の閾値を設定可能<br>　Bit\[1]: 超えた際にWariningのアラートを出す温度の閾値を設定可能<br>　Bit\[2]: 下がった際にWariningのアラートを出す温度の閾値を設定可能<br>　Bit\[3]: 超えた際にWariningのアラートを出す揮発性メモリで発生した訂正可能エラー数の閾値を設定可能<br>　Bit[4]: 超えた際にWariningのアラートを出す不揮発性メモリで発生した訂正可能エラー数の閾値を設定可能|
| 02h | 1 | Life Used Critical Alert Threshood 消費した際にCriticalのアラートを出す寿命の閾値。 |
| 03h | 1 | Life Used Programmable Waining Alert Threshood 消費した際にWarningのアラートを出す寿命の閾値。 |
| 04h | 2 | Device Over-Temperature Critical Alert Threshood 超えた際にCriticalのアラートを出す温度の閾値。 |
| 06h | 2 | Device Under-Temperature Critical Alert Threshood 下がった際にCriticalのアラートを出す温度の閾値。 |
| 08h | 2 | Device Over-Temperature Programmable Warning Alert Threshood 超えた際にWarningのアラートを出す温度の閾値。 |
| 0Ah | 2 | Device Under-Temperature Programmable Warning Alert Threshood 下がった際にWarningのアラートを出す温度の閾値。 |
| 0Ch | 2 | Corrected Volatile Memory Error Programmable Warning Threshood 超えた際にWarningのアラートを出す揮発性メモリで発生した訂正可能エラー数の閾値。 |
| 0Eh | 2 | Corrected Persistent Memory Error Programmable Warning Threshood 下がった際にWarningのアラートを出す不揮発性メモリで発生した訂正可能エラー数の閾値。 |

###2.2.3 Set Alert Configuration
アラートの設定をする。ホストシステムが設定した閾値をアラートのトリガとして使用する場合は、Valid Alert ActionとEnable Programmable Alertの両方を有効にします。

**Input Payload**

| Byte Offset | Length | Description |
|:--|:-:|:--|
| 00h | 1 | Valid Alerts Action アラートを有効にする。<br>　Bit[0]: 消費した寿命が閾値を超えた際のWariningのアラートを有効にする<br>　Bit\[1]: 温度が閾値を超えた際のWariningのアラートを有効にする<br>　Bit\[2]: 温度が閾値より下がった際のWariningのアラートを有効にする<br>　Bit\[3]: CXLメモリデバイスの揮発性メモリで発生した訂正可能エラーが閾値を超えた際のWariningのアラートを有効にする<br>　Bit[4]: CXLメモリデバイスの不揮発性メモリで発生した訂正可能エラーが閾値を超えた際のWariningのアラートを有効にする |
| 01h | 1 | Enable Programmable Alerts ホストシステムが設定した閾値を有効にする。<br>　Bit[0]: 消費した際にWariningのアラートを出す寿命の閾値を有効にする<br>　Bit[1]: 超えた際にWariningのアラートを出す温度の閾値を有効にする<br>　Bit[2]: 下がった際にWariningのアラートを出す温度の閾値を有効にする能<br>　Bit[3]: 超えた際にWariningのアラートを出す揮発性メモリで発生した訂正可能エラー数の閾値を有効にする<br>　Bit[4]: 超えた際にWariningのアラートを出す不揮発性メモリで発生した訂正可能エラー数の閾値を有効にする|
| 02h | 1 | Life Used Programmable Waining Alert Threshood 消費した際にWarningのアラートを出す寿命の閾値。 |
| 03h | 1 | Reserved |
| 04h | 2 | Device Over-Temperature Programmable Warning Alert Threshood 超えた際にWarningのアラートを出す温度の閾値。 |
| 06h | 2 | Device Under-Temperature Programmable Warning Alert Threshood 下がった際にWarningのアラートを出す温度の閾値。 |
| 08h | 2 | Corrected Volatile Memory Error Programmable Warning Threshood 超えた際にWarningのアラートを出す揮発性メモリで発生した訂正可能エラー数の閾値。 |
| 0Ah | 2 | Corrected Persistent Memory Error Programmable Warning Threshood 下がった際にWarningのアラートを出す不揮発性メモリで発生した訂正可能エラー数の閾値。 |

アラートのうち、Criticalのアラートの閾値はホストシステムが設定はできません。Criticalのアラートの閾値は、ベンダーで予め設定された値が使用されます。

###2.2.4 Get Shutdown State
CXLメモリデバイスのShutdown Stateの情報を取得する。

**Output Payload**

| Byte Offset | Length | Description |
|:--|:-:|:--|
| 00h | 1 | State CXLメモリデバイスのShutdown State。<br>　Bit[0]: Clean/Dirty(=0/1)|

###2.2.5 Set Shutdown State
CXLメモリデバイスのShutdown Stateを設定する。

**Input Payload**

| Byte Offset | Length | Description |
|:--|:-:|:--|
| 00h | 1 | State CXLメモリデバイスのShutdown State。<br>　Bit[0]: Clean/Dirty(=0/1)を設定 |

##2.2 Shutdown State
Shutdown Stateは、CXLメモリデバイスへの電源の供給を停止した場合に、ホストシステムが書き込みを指示したデータを書き込めている状態であるかを示します。

Shutdown Stateは、Set Shutdown Stateコマンドで、ホストシステムが設定をすることができますが、GPF(Global Persisten Flush)が実行された後や、CXLメモリデバイスでデータの書き込みエラーが発生した場合は、CXLメモリモジュールが自発的にShutdown Stateを変更します。

GPFは、ホストシステムが実行指示する動作で、CPU/Acceleratorのキャッシュのデータ、及びCPUに接続された全てのメモリのデータ、の整合性を取り必要に応じて不揮発性メモリにデータを記録する動作です。GPFが行われた後のCXLメモリモジュールのShutdown StateはCleanとなります。
GPFは、システムのShutdownや、CXLメモリデバイスの取り外し前などに行われる手続きです。

書き込みエラーが発生した場合は、Shutdown StateはDirtyとなります。

Shutdown StateがDirtyの状態で、CXLメモリデバイスへの電源供給が停止されると、CXLメモリデバイスは、CXLその11の記事に記載されている「Dirty Shutdown Count」の値がカウントアップします。
また、「Dirty Shutdown Count」の値は、CXLメモリデバイスへの電源の供給が突然停止された場合には、電源供給の停止の直前のShutdown StateがCleanであっても、CXLメモリデバイスによりカウントアップされます。
「Dirty Shutdown Count」の値は、Shutdownされた状況に応じて、CXLメモリデバイスの生涯においてカウントアップされ続ける値であり、CXLメモリデバイスはこの値を不揮発性メモリに記録して管理する必要があります。

---

次回も、CXL.ioで実行されるコマンドセットからピックアップして詳細について書こうと思っています。