Linux devfreq framework 剖析【轉】

轉自:https://www.cnblogs.com/Linux-tech/p/12961282.html

當今的複雜SoC由多個子模塊協同工作組成。在執行各種用例的操作系統中,並非SoC中的所有模塊都需要始終保持最高性能。爲方便起見,將SoC中的子模塊分組爲域,從而允許某些域以較低的電壓和頻率運行,而其他域以較高的電壓/頻率對運行。

對於這些設備支持的頻率和電壓對,我們稱之爲OPP(Operating Performance Point)。對於具有OPP功能的非CPU設備,本文稱之爲OPP device,需要通過devfreq進行動態的調頻調壓。

devfreq:Generic Dynamic Voltage and Frequency Scaling (DVFS) Framework for Non-CPU Devices。是由三星電子MyungJoo Ham <[email protected]>,提交到社區。原理和/deivers/cpufreq 非常近似。但是cpufreq驅動並不允許多個設備來註冊,而且也不適合不同的設備具有不同的governor。devfreq則支持多個設備,並且允許每個設備有自己對應的governor。


如下圖,devfreq framework是功耗子系統的一部分,與cpufreq,cpuidle,powermanager相互配合協作,已達到節省系統功耗的目的。

圖1

標準化接口

devfreq framework作爲Linux Kernel一個子系統,需要爲user space和其他子系統提供接口,已完成功能交互。本章從Kernel空間和user空間的角度,介紹devfreq framework的相關接口。

1. Kernel空間數據結構和接口

1) devfreq profile結構體,是OPP device註冊到devfreq framework的數據結構,主要包含OPP設備的頻率相關信息和相關的回調函數,是devfreq framework和OPP device driver的交互接口。

類似設備驅動模型,將OPP device driver對devfreq使用,簡化爲devfreq profile結構體的填充。大大簡化了開發複雜度,減少了重複的工作。

下面對devfreq_dev_profile的主要屬性進一步的介紹。

2) devfreq governor結構體,是governor註冊到devfreq framework的數據結構,主要包含governor的相關屬性和具體的函數實現。是devfreq framework和governor交互接口。

下面對devfreq_governor 的主要屬性進一步的介紹。

3) devfreq設備結構體,這個是devfreq設備的核心數據結構。將上述的OPP device driver的devfreq_dev_profile和governor的devfreq_governor連接到一起,並通過設備驅動模型中device類,爲user 空間提供接口。

下面對devfreq的主要屬性進一步的介紹。

2. 用戶空間文件節點

devfreq framework不僅爲Kernel空間的設備驅動提供了標準化接口,也爲user空間提供了標準化的文件節點,方便user空間的程序,更好的監控和修改。

相關文件節點介紹:kernel/Documentation/ABI/testing/sysfs-class-devfreq。

  • available_frequencies: 可用的頻率列表

  • available_governors:可用的governor

  • cur_freq:當前頻率

  • governor: 當前governor

  • max_freq:最大頻率

  • min_freq :最小頻率

  • polling_interval:governor調度的時間間隔,單位是ms

  • target_freq:目標頻率

  • trans_stat:狀態調整表

代碼實現:kernel/drivers/devfreq/devfreq.c

工作流程

本章節主要介紹devfreq framework在系統中的工作流程,從初始化,頻率調整,退出機制幾個方便介紹devfreq framework的運行機制和函數調用邏輯。

1. 初始化

初始化,主要包括devfreq framework,governor的初始化和OPP device創建devfreq設備的流程。如圖2所示。下面的章節,將對各個初始化過程,進行更進一步的介紹。

圖2

1) Devfreq framework初始化,邏輯非常簡單清晰,主要完成以下的任務,然後爲governor的初始化和OPP device 創建devfreq device做好準備。

代碼實現:kernel/drivers/devfreq/

a.創建devfreq設備類

b.創建工作隊列,用於負載監控work調用運行

c.加入到subsys_initcall,系統啓動時初始化

2) governors 初始化

系統中可支持多個governors,在系統啓動時進行初始化,並註冊到devfreq framework中, 後續OPP device創建devfreq設備,會根據governor名字從已經初始化好的governor 列表中,查找對應的governor實例。

a.填充governor的結構體,不同的governor,會有不同的實現。

b.將governor加入到devfreq framework的governor列表中。

c.加入到subsys_initcall,系統啓動時初始化。

目前系統默認支持下面:

  • simple_ondemand:按需調整模式;根據系統負載動態頻率,平衡性能和功耗

  • Performance:性能優先模式,調整到最大頻率

  • Powersave:功耗優先模式,調整到最小頻率

  • Userspace:用戶指定模式,調整到用戶設置的頻率.

  • Passive:被動模式,使用設備指定方法做調整或跟隨父devfreq設備的governor

可以根據自己的設備特性,通過填充devfreq_governor結構體和實現get_target_freq方法和event_handler,完成的自己的governor。devfreq framework的架構設計對governor擴展,支持極好。

3) OPP device通過devfreq framework創建devfreq device。

以UFS設備爲例,介紹OPP device用devfreq framework來添加devfreq設備的過程。

代碼位置:kernel/drivers/scsi/ufs/ufshcd.c

① OPP device driver通過devfreq framework創建devfreq設備。

a.將ufs設備的core clk的添加到opp子系統中,devfreq_add_device函數中,會從opp子系統中獲取clk信息。

b.將OPP device相關頻率信息和回調函數,並填充devfreq profile數據結構。

c.調用devfreq_add_device函數,將devfreq profile數據結構,governor名字,添加到devfreq framework。

②devfreq_add_device 創建devfreq設備的流程如下:

a. devfreq device申請內存空間 初始化devfreq device結構體後,註冊設備。

b. 根據傳入的governor名字,從governor列表中,獲取對應的governor實例。

c.發送DEVFREQ_GOV_START到governor,開始管理OPP device的頻率。

2.頻率調整過程

圖3

如圖3所示,頻率調整過程中,分工非常明確,devfreq framework是大管家負責監控程序的運行,governor提供管理算法,OPP device提供自身的負載狀態和頻率設置的方法實現。

系統中有不同的governor,而且不同的governor有不同的管理算法,但是頻率調整過程是一樣的。本小節,以simple_ondemand governor爲例,講述governor的管理過程。

1)governor的event_handler收到 DEVFREQ_GOV_START事件,調用對應的函數,調度工作隊列,運行負載監控程序。

2)負載監控程序。

a.調用governor的get_target_freq方法,獲取下一次的調頻結果。

b.調用OPP device註冊到devfreq framework 的target函數,設置新的頻率信息。

c.調度延遲工作隊列,延遲OPP device 設置的輪詢間隔後,再次運行。

3)governor的get_target_freq方法,調用opp device註冊到devfreq framework的回調函數,獲取當前device負載信息,根據算法,返回調整頻率。

3. 刪除devfreq設備

1)直接調用device_unregister函數註銷devfreq設備。

2)device_unregister註銷過程中會調用devfreq_dev_release函數,完成下面的事務。

a.發送DEVFREQ_GOV_STOP event,governor停止運行;

b.回調OPP device註冊到devfreq framework的exit函數;

c.釋放devfreq device申請的資源。

架構設計

devfreq framework將多種OPP device和多種governor進行抽象,對OPP device提供了統一的接口,來滿足其對devfreq的需求。對governor提供統一的實現格式,爲後續擴展不同governor,提供很好的架構支持。是一個典型的子系統實現模式。爲後續在我們自己做子系統架構設計,提供了一個很好的參考。

綜述

本文從需求背景、接口、數據結構、工作流程和架構設計幾個維度,介紹Linux Kernel的devfreq framework 子系統。希望能對大家的工作學習有所幫助。因個人能力所限,如有錯誤,歡迎大家斧正。

掃碼關注
“內核工匠”微信公衆號
Linux 內核黑科技 | 技術文章 | 精選教程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章