ファイバチャネル PF ドライバで SR - IOV サポートを追加するには、DDI_CB_FLAG_SRIOV フラグを指定して ddi_cb_register() を呼び出す必要があります。詳細は、ドライバのコールバックセクションを参照してください。
SR-IOV コールバックを登録したファイバチャネル PF ドライバは、action パラメータとして DDI_CB_PCIV_CLASS_CONFIG が設定されたコールバックを受けます。コールバックには、fciov_conf_t 構造体へのポインタである cbarg パラメータが含まれています。
typedef struct fciov_conf { fciov_config_cmd_t fci_cmd; /* configuration op to be performed */ uint16_t fci_vf_id; /* Index of the VF to be configured */ fciov_cfg_flags fci_flags; /* Flags, indicate which info is valid */ uint8_t fci_node_wwn[8];/* node WWN for the VF */ uint8_t fci_port_wwn[8];/* port WWN for the VF */ uint16_t fci_bandwidth; /* percentile bandwidth for the VF */ } fciov_conf_t;
指定された VF に対して実行する操作を示します。定義されている有効な値は次のとおりです。
typedef enum { FCIOV_VF_CONFIG = 0x1, /* Configure a FC VF */ FCIOV_VF_UPDCONFIG = 0x2,/* Update configuration of FC VF */ FCIOV_VF_UNCONFIG = 0x4 /* Unconfigure a FC VF*/ }fciov_config_cmd_t;
コールバックを受ける PF の VF 索引番号。このフィールドの有効な値は、0 から N-1 です (N は受け側の PF で有効になっている仮想機能の番号)。
含まれているデータフィールド中の有効なフィールドを示すビットマスク。サポートされている値は次のように定義されています。
typedef enum { FCIOV_NODE_WWN = 0x1, /* node WWN info is valid */ FCIOV_PORT_WWN = 0x2, /* port WWN info is valid */ FCIOV_BANDWIDTH = 0x4 /* bandwidth info is valid */ }fciov_cfg_flags;
指定された VF のノード world wide name (WWN)。
指定された VF のポート world wide name (WWN)。
仮想機能に割り当てる必要がある帯域幅 (パーセンタイル値) を示します。詳細は、ファイバチャネル仮想機能の帯域幅構成を参照してください。
ファイバチャネル PF ドライバが正常にアタッチされ必要な数の仮想機能が有効化されたあとのある時点で、IOV フレームワークは、指定された VF の構成を完了するために PF ドライバに対してコールバックを発行します。このコールバックでは、action パラメータには DDI_CB_PCIV_CLASS_CONFIG が、cbarg パラメータには VF に関する情報が格納された fciov_conf_t 構造体へのポインタが、fciov_conf_t 構造体の fc_cmd フィールドには FCIOV_VF_CONFIG が、それぞれ設定されます。
このコールバックが、PF に関連付けられた一連の仮想機能によって受信されるタイミングと順番は保証されません。IOV フレームワークにより、このコールバックが VF に対して発行されてから VF が使用可能になることが保証されます。ファイバチャネル VF を構成するコールバックには、有効なノード WWN と有効なポート WWN が含まれている必要があります。したがって、fci_flags には常に、FCIOV_NODE_WWN と FCIOV_PORT_WWN が設定されます。帯域幅の指定はオプションです。構成操作で帯域幅が指定されないケースの処理方法の詳細については、ファイバチャネル仮想機能の帯域幅構成を参照してください。
ファイバチャネル VF が有効化および構成されたあとにファイバチャネル VF の構成が変更されると、IOV フレームワークは PF ドライバに対してコールバックを発行します。このコールバックでは、action パラメータには DDI_CB_PCIV_CLASS_CONFIG が、cbarg パラメータには VF に関する情報が格納された fciov_conf_t 構造体へのポインタが、fciov_conf_t 構造体の fc_cmd フィールドには FCIOV_VF_UPDCONFIG が、それぞれ設定されます。
PF ドライバは、このコールバックを受け取ると、fci_flags フィールドを調べて、どの VF 属性が変更されたのかを確認する必要があります。この設定に基づき、適切な情報をデータフィールドから抽出し、VF 構成の更新に使用する必要があります。
ファイバチャネル VF が構成解除される場合、IOV フレームワークは PF ドライバに対してコールバックを発行します。このコールバックでは、action パラメータには DDI_CB_PCIV_CLASS_CONFIG が、cbarg パラメータには VF に関する情報が格納された fciov_conf_t 構造体へのポインタが、fciov_conf_t 構造体の fc_cmd フィールドには FCIOV_VF_UNCONFIG が、それぞれ設定されます。
このコールバックを受け取ったら、PF ドライバは、VF のすべての属性を構成解除し、VF を使用不可としてマークする必要があります。通常の状況では、このコールバックのあとさらに、DDI_CB_PCIV_VF_CONFIG action が設定されたコールバックが発行され、VF が無効化されます。詳細は、ドライバのコールバックセクションを参照してください。
ファイバチャネル SR-IOV コールバックで提供される帯域幅値は、帯域幅の絶対パーセンテージではなく、パーセンタイル (百分位数) 形式で指定されています。パーセンタイルで指定することにより、PF ドライバと HBA ファームウェアは、指定されたパーセンタイルに近いサービス品質 (QoS) を満たすように柔軟にハードウェアを調整できます。デバイスは、QoS をできるだけ正確に提供することが要求されます。
帯域幅パーセンタイルは、PF に関連付けられた一連の仮想機能で使用可能な帯域幅のみに適用されます。PF 自体によって使用される帯域幅はほかの何らかの方法で予約しておく必要があります。
帯域幅構成は、特定の VF 用に予約しておく必要がある下限値として指定されます。PF ドライバは、VF に割り当てる使用可能帯域幅を増やすこともできますが、それによって、ほかの仮想機能が自身の指定下限値を下回ることがあってはなりません。次のガイドラインに、PF ドライバが、コールバックの帯域幅パラメータを解釈する方法を説明します。
明示的な帯域幅パーセンタイルが設定されていないか帯域幅パーセンタイルがゼロのすべての仮想機能は、ほかの VF 用に予約されていない帯域幅の相応分の割り当てを受けるべきです。
たとえば、帯域幅の 60% が 1 つ以上の仮想機能に割り当てられている場合、帯域幅の残り (40%) は帯域幅パーセンタイルが指定されていないすべての仮想機能間の公平配分割り当てに使用されます。
この PF に関連付けられた仮想機能の使用可能な帯域幅のパーセンタイルです。
PF ドライバは、帯域幅パーセンタイルが指定されていない仮想機能がある場合、それらの仮想機能で使用できる帯域幅が残されているかどうかを確認する必要があります。VF が使用可能な帯域幅がない状況にならないようにする必要があります。
帯域幅の割り当ては、満たす必要がある厳格な要件を意図したものではありません。PF ドライバおよび HBA ファームウェアによる最大限の努力を求めているだけです。
SPARC プラットフォームでファイバチャネル SR-IOV を構成するには、OVM Server for SPARC を使用します。ldm list-io コマンドを使用するとファイバチャネル SR-IOV の物理機能を表示できます。これらのデバイスは、TYPE 列の PF の値によって識別されます。ファイバチャネル物理機能の NAME 列には、文字列に IOVFC が含まれています。ファイバチャネル VF を作成するには、ldm create-vf コマンドを使用します。
ldm create-vf [port-wwn=<value> node-wwn=<value>] [bw_percent=[<value>]] <fc_pf_name>
port-wwn 引数と node-wwn 引数は、両方とも指定するか、両方とも省略するかのどちらかにする必要があります。省略すると、Logical Domains Manager によって、ほかの既存の WWN 値と衝突しない有効な値が生成されます。これらのコマンドの形式は、MAC アドレスに使用されるコロンで区切られた 16 進バイト値に似ていますが、6 バイトではなく 8 バイトである必要があります。bw_percent を指定しないと、値 0 が使用されます。有効値は 0 - 100 です。VF のパラメータを作成したら、ldm set-io コマンドを使用してそれらのパラメータを変更します。
ldm set-io [port-wwn=<value> node-wwn=<value>] [bw-percent=<value>] <fc_vf_name>
VF を破棄するには、ldm destroy-vfコマンドを使用します。
ldm destroy-vf <vf_name>
こうした点、およびファイバチャネル SR-IOV の操作に使用するそのほかのコマンドの詳細については、『Oracle VM Server for SPARC 3.1 管理ガイド』を参照してください。
x86 プラットフォーム上では、開発中に /etc/pci.conf ファイルを使用して、ファイバチャネル仮想機能を指定および構成できます。VF 構成はすべて、Device_Configuration と呼ばれるセクションに記述されます。このセクションでは、VF ごとに新しいエントリが追加され、port-wwn、node-wwn、および bw_percent の各プロパティーが設定されます。このファイルを /boot/solaris/filelist.ramdisk に追加して、システムをリブートすると、変更内容が有効になります。
[Device_Configuration] [[path=/pci@0,0/pci8086,340c@5/pci10df,e20e@0]] VF[0] = { port_wwn=0x2000123456789018 node_wwn=0x1000123456789018 bandwidth = 80 } VF[1] = { port_wwn=0x2000123456789019 node_wwn=0x1000123456789019 bandwidth = 20 } [[path=/pci@0,0/pci8086,340c@5/pci10df,e20e@0,1]] VF[0] = { port_wwn=0x2000123456789028 node_wwn=0x1000123456789028 bandwidth = 20 } VF[1] = { port_wwn=0x2000123456789029 node_wwn=0x1000123456789029 bandwidth = 80 }