海思 PCIe 效能監控單元 (PMU)

在 Hip09 上,海思 PCIe 效能監控單元 (PMU) 可以監控 PCIe 的頻寬、延遲、匯流排利用率和緩衝區佔用率資料。

每個 PCIe Core 都有一個 PMU 來監控此 PCIe Core 的多個 Root Port 以及這些 Root Port 下游的所有 Endpoint。

海思 PCIe PMU 驅動

PCIe PMU 驅動程式使用其 sicl-id 和 PCIe Core id 的名稱註冊 perf PMU。

/sys/bus/event_source/hisi_pcie<sicl>_core<core>

PMU 驅動程式在 sysfs 中提供可用事件和過濾器選項的描述,請參閱 /sys/bus/event_source/devices/hisi_pcie<sicl>_core<core>。

“format” 目錄描述 perf_event_attr 結構的 config (事件) 和 config1 (過濾器選項) 欄位的所有格式。“events” 目錄描述 perf list 中顯示的所有已記錄事件。

“identifier” sysfs 檔案允許使用者識別 PMU 硬體裝置的版本。

“bus” sysfs 檔案允許使用者獲取 PMU 監控的 Root Port 的匯流排編號。此外,使用者可以分別從 “bdf_min” 和 “bdf_max” sysfs 屬性中獲取 [bdf_min, bdf_max] 中的 Root Port 範圍。

perf 的用法示例

$# perf list
hisi_pcie0_core0/rx_mwr_latency/ [kernel PMU event]
hisi_pcie0_core0/rx_mwr_cnt/ [kernel PMU event]
------------------------------------------

$# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0xffff/
$# perf stat -e hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/

相關事件通常用於計算頻寬、延遲或其他指標。 它們需要在同一時間開始和結束計數,因此相關事件最好在同一事件組中使用以獲得預期值。 有兩種方法可以知道它們是否是相關事件

  1. 按事件名稱,例如延遲事件 “xxx_latency, xxx_cnt” 或頻寬事件 “xxx_flux, xxx_time”。

  2. 按事件型別,例如 “event=0xXXXX, event=0x1XXXX”。

perf group 的用法示例

$# perf stat -e "{hisi_pcie0_core0/rx_mwr_latency,port=0xffff/,hisi_pcie0_core0/rx_mwr_cnt,port=0xffff/}"

當前的驅動程式不支援取樣。 因此不支援 “perf record”。 並且 PCIe PMU 也不支援附加到任務。

過濾器選項

  1. 目標過濾器

    PMU 只能監控下游目標 Root Port 或下游目標 Endpoint 的流量效能。 PCIe PMU 驅動程式支援 “port” 和 “bdf” 介面供使用者使用。 請注意,必須設定這兩個介面之一,並且不支援同時設定這兩個介面。 如果它們都被設定,則只有 “port” 過濾器有效。 如果 “port” 過濾器未被設定或顯式設定為零 (預設),則 “bdf” 過濾器將生效,因為 “bdf=0” 意味著 0000:00:00.0。

    • port

      “port” 過濾器可用於所有 PCIe PMU 事件,可以透過配置 16 位點陣圖 “port” 來選擇目標 Root Port。 可以為 AP 層事件選擇多個埠,並且只能為 TL/DL 層事件選擇一個埠。

      例如,如果目標 Root Port 是 0000:00:00.0 (x8 lanes),則應設定點陣圖的 bit0,port=0x1;如果目標 Root Port 是 0000:00:04.0 (x4 lanes),則設定 bit8,port=0x100;如果同時監控這兩個 Root Port,port=0x101。

      perf 的用法示例

      $# perf stat -e hisi_pcie0_core0/rx_mwr_latency,port=0x1/ sleep 5
      
    • bdf

      “bdf” 過濾器只能在頻寬事件中使用,透過將 BDF 配置為 “bdf” 來選擇目標 Endpoint。 計數器僅計算目標 Endpoint 請求的訊息的頻寬。

      例如,“bdf=0x3900” 表示目標 Endpoint 的 BDF 是 0000:39:00.0。

      perf 的用法示例

      $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,bdf=0x3900/ sleep 5
      
  2. 觸發過濾器

    當第一個 TLP 長度大於/小於觸發條件時,事件統計開始。 您可以透過寫入 “trig_len” 來設定觸發條件,並透過寫入 “trig_mode” 來設定觸發模式。 此過濾器只能在頻寬事件中使用。

    例如,“trig_len=4” 表示觸發條件是 2^4 DW,“trig_mode=0” 表示當 TLP 長度 > 觸發條件時統計開始,“trig_mode=1” 表示當 TLP 長度 < 條件時開始。

    perf 的用法示例

    $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,trig_len=0x4,trig_mode=1/ sleep 5
    
  3. 閾值過濾器

    當 TLP 長度在指定範圍內時,計數器計數。 您可以透過寫入 “thr_len” 來設定閾值,並透過寫入 “thr_mode” 來設定閾值模式。 此過濾器只能在頻寬事件中使用。

    例如,“thr_len=4” 表示閾值是 2^4 DW,“thr_mode=0” 表示當 TLP 長度 >= 閾值時計數器計數,而 “thr_mode=1” 表示當 TLP 長度 < 閾值時計數。

    perf 的用法示例

    $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,thr_len=0x4,thr_mode=1/ sleep 5
    
  4. TLP 長度過濾器

    在計算頻寬時,資料可以由 TLP 資料包的某些部分組成。 您可以透過 “len_mode” 指定它

    • 2’b00:保留(不要使用它,因為行為未定義)

    • 2’b01:TLP 有效負載的頻寬

    • 2’b10:TLP 標頭的頻寬

    • 2’b11:TLP 有效負載和標頭的頻寬

    例如,“len_mode=2” 表示僅計算 TLP 標頭的頻寬,而 “len_mode=3” 表示最終頻寬資料由 TLP 標頭和有效負載組成。 如果未指定,則預設值為 2’b11。

    perf 的用法示例

    $# perf stat -e hisi_pcie0_core0/rx_mrd_flux,port=0xffff,len_mode=0x1/ sleep 5