今天沒意外的話,會是 Supporting PMUs on RISC-V platforms
的最後一篇,會整理一下,perf
使用情境、RISC-V
架構上的限制、Andes
提出的解決方案、以及目前社群上提出的解決方案!
perf 是一個 profiling 的工具,可分為兩種模式,perf stat
、perf record
:
perf stat
:直接測量一個程序 (process) 執行,事件發生 (e.g. context switch、cycle) 的次數。
perf record
:取樣 (sampling) 模式,基本有 2 種取樣方式,第一種在一個程序執行過程,事件每發生 x 次,紀錄一次;第二種,每秒取樣 x 次,下面以第一種取樣方式為例;
perf record
;perf stat
最基本的功能是可以實作出來的,大致上,在程序開始執行時,讀一次 mcycle
,結束時,再讀一次,計算,整個程序所耗費的 cycle 數就計算出來了;perf record
不同,就如同前兩天所提到的:
將計數器設定成某個適當的值
這件事就無法達成;kernel mode
下的某特定事件發生次數)若要支援 perf record
,那麼至少以上提到的這些限制,全部都需要有方法能夠處理。
在當時 Alan (筆者的團長兼組長) 就有提出相關的解決方案,以解決上面提到的限制。
就結論來說是新增 6 個 m mode 的暫存器:
mcounterinen(Machine Counter Interrupt Enable)
、mcounterovf(Machine Counter Overflow)
mcounterwen (Machine Counter-Write-Enable)
mcountermask_[m|s|u] (Machine Counter Mask for M-/S-/U-mode)
這篇提案是目前 Andes 在 RISC-V 平台上支援 perf 的方案,並提出到社群上與大家討論。
(印象中是社群中第一個提出 HPM 相關解決方案的!XD)
提出方案後,社群討論的狀況很是踴躍,而且也有不少不同的廠家 (vendor) 正在準備相關的提案,後來由 Ventana: Greg Favor 提出的提案成為社群青睞的解決方案。
mhpmevent
的第 63 位元,並且連 H extension
都考慮到了,並在 interrupt 相關的暫存器上新增欄位 (mie/mip/sie/sip
的第 13 位元)bit [63] OF - Overflow status and interrupt disable bit that is set when counter overflows
63 位元的 OF 同時代表 overflow interrupt enable/disable 的狀態,
和是否有 overflow 發生:
當 overflow 發生時,OF 會被設置成 1;
而當 overflow interrupt 發生時,會去檢查 OF。
若這時候 OF 是 0,代表 interrupt 是 enable 的狀態,
所以會產生 interrupt 並同時把 OF 設成 1;
若這時候 OF 是 1,代表 interrupt 是 disable 的狀態,
所以不會產生 interrupt。
mhpmevent
的 58-62 位元,來限制各個 mode 下,計數器該不該運作bit [62] MINH - If set, then counting of events in M-mode is inhibited
bit [61] SINH - If set, then counting of events in S/HS-mode is inhibited
bit [60] UINH - If set, then counting of events in U-mode is inhibited
bit [59] VSINH - If set, then counting of events in VS-mode is inhibited
bit [58] VUINH - If set, then counting of events in VU-mode is inhibited
Although one such feature worth highlighting is having a WrEn bit in mhpmevent that allows lower privilege modes that can read the associated hpmcounter CSR (based on the *counteren CSRs) to also be able to write it. In essence enabling direct S/VS-mode and U/VU-mode write access instead of always requiring OpenSBI calls up to M-mode. But this feature has had some contention, involves some details to properly support virtualization, and requires allocating a second set of "User-Read-Write" hpmcounter CSR numbers (since the current hpmcounter CSRs are "User-Read-Only"). If there is a broad upwelling of support and justification for this feature, and some party willing to put together a complete spec (including virtualization support), then this could be another fast-track extension.
scountovf(Supervisor Count Overflow)
暫存器
mhpmcounter
的第 63 位元,用來快速辨認是哪一個 event 的計數器溢位了這是目前這個新擴充指令集(sscof)的簡介,而目前 Linux kernel 和 QEMU 都有相關的 patch 正在被 review
Supporting PMUs on RISC-V platforms
這系列就到這裡告一個段落啦!感謝各位觀看,我們明天休息一下,接下來應該就是 Cache and TLB Flushing Under Linux
的文件系列囉!別再一直捧我了,很害羞R。
其實當時是迴避了參考 nds32 的做法。我當時選擇的是 ppc/tile 系列的比較簡單的做法,而非 nds32/arm 那種 platform_driver 的做法,結果現在也還是要被刪掉了。
話說回來有些歷史共業的現場更妙。我從來沒有想過後來跟 Anup/Greg 他們討論的時候,他們會那麼抗拒 S-mode 可寫入的 M-mode CSR!Anup 是很堅定的拿 H-ext 來回擊,但我們當時還沒有開始考慮虛擬化,當然會覺得說,如果是 M-S-U 的話有何不可?所以有自己的架構師和硬體部門就是可以抄很多不太能夠成為正史的捷徑。