0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

電源管理入門:PM QoS框架介紹

yzcdx ? 來源:OS與AUTOSAR研究 ? 2023-11-29 10:12 ? 次閱讀

QoS(Quality Of Service,服務質(zhì)量),一般在網(wǎng)絡(luò)報文中,某個報文的優(yōu)先級比較高優(yōu)先傳輸,例如我們覺得微信聊天比看網(wǎng)頁更重要,我們就可以提高微信報文的等級即服務質(zhì)量QoS,來提供好的網(wǎng)絡(luò)服務解決延遲、網(wǎng)絡(luò)阻塞等問題。

電源管理里面的策略就各種governor,例如什么時候進入cpuidle、什么時候DevFreq等,這些策略是很單一的,算法也都是很單調(diào)的,未考慮到消費者的實際需求,那怎么樣把用戶的需求也在電源管理里面生效呢?

答案就是在governor中引入QoS,在governor中會去查QoS的策略,綜合起來進行決策。

1. 系統(tǒng)框架介紹

1.1 功耗控制可能影響用戶體驗的一些痛點

而且功耗管理會引入對性能的缺點,主要兩方面:

延時(latency)增加:時間的開銷,尤其是在恢復的過程中需要時間。比如,系統(tǒng)喚醒需要經(jīng)過各驅(qū)動的恢復,power domain的上電過程也有時間開銷。

吞吐量(Throughput)減少:低功耗也會帶來算力的影響,會降低算力及網(wǎng)路的吞吐量。比如,cpu dvfs、cpu hotplug、cpu idle等會影響到cpu算力。

比如在usb傳輸?shù)臅r候把dma給限制了,導致傳輸速率下降,這些是用戶不希望看到的。

又比如延時和性能開銷,影響到用戶的體驗,比如界面操作不流暢、卡頓,響應時間過長。

這就像蘋果手機很流暢優(yōu)先響應用戶的需求,安卓可能更高效但是有點卡,用戶就覺得屏幕劃不動了。但是很明顯蘋果手機更有市場,用戶體驗才是王道!

在面對用戶場景的情況下,我們需要在策略中考慮到用戶使用感受。在用戶眼里更多的看中應用服務,而且不是一味的強調(diào)功耗低,為了核心業(yè)務和用戶體驗是可以適當?shù)臓奚牡模?a target="_blank">產(chǎn)品做出來最終還是要用戶用的,技術(shù)再好,功耗再低,不滿足用戶習慣就是0.

如果把Linux PM當做一種服務,那么他對其他模塊的影響就類比為服務的質(zhì)量,要滿足其他指標不受到影響的情況下最大化的省電,這才是最終目標。那么這里PM QoS的作用就是定義一套框架,以滿足系統(tǒng)(如設(shè)備驅(qū)動等)對QoS的期望為終極目標,通俗的講:根據(jù)實際場景,這些期望可以描述為:xxx不大于某個值等等。

1.2 QoS框架

3a79fc10-8dda-11ee-939d-92fbcf53809c.png

PM QOS使用constraint(約束)作為指標,用于各模塊對PM的訴求及限制。當前系統(tǒng)的指標主要有兩類,分別對應兩個PM QOS framework。

系統(tǒng)級constraint:包括cpu&dma latency(5.4內(nèi)核),它的實際意義是,當產(chǎn)生一個事件之后(如一個中斷),CPU或DMA的響應延遲。例如有些CPU的串口控制器,只有幾個byte的FIFO,當接收數(shù)據(jù)時,CPU或DMA必須在FIFO填滿前,將數(shù)據(jù)讀走,否則就可能丟失數(shù)據(jù)或者降低數(shù)據(jù)的傳輸速率。由PM QoS classes framework管理,定義在kernel/power/qos.c中。

設(shè)備級constraint:包括從低功耗狀態(tài)resume的latency、active狀態(tài)的latency和一些QoS flag(如是否允許power off)。由per-device PM QoS framework管理,定義在drivers/base/power/qos.c。

3a9ed076-8dda-11ee-939d-92fbcf53809c.png

整個PM QOS框架分為三部分:

需求方:各service、各driver。他們根據(jù)自己的功能需求,提出系統(tǒng)或某些功能的QOS約束,比如cpu&dma latency。

框架層:PM QOS framework,包含PM QOS classes、per device PM QOS。向需求方提供request的add、modify、remove等接口,用于管理QoS requests。對需求方的約束進行分類,計算出極值,比如cpu&dma latency不小于某個值。向執(zhí)行方提供request value的查詢接口。PM QoS classes framework位于kernel/power/qos.c中,負責系統(tǒng)級別的PM QoS管理,通過misc設(shè)備(/dev/cpu_dma_latency),向用戶空間程序提供PM QoS的request、modify、remove功能,以便滿足各service對PM QoS的需求。per-device PM QoS framework位于drivers/base/power/qos.c中,負責per-device的PM QoS管理。

執(zhí)行方:power management的機制,比如cpuidle、cpu dvfs等。需要滿足由框架層根據(jù)需求方提供的約束計算的極值,才能執(zhí)行相應的低功耗機制。

2. 用戶空間操作流程

3aaeaaaa-8dda-11ee-939d-92fbcf53809c.png

2.2 用戶空間數(shù)據(jù)結(jié)構(gòu)和API

struct pm_qos_object {
struct pm_qos_constraints *constraints;
struct miscdevice pm_qos_power_miscdev;
char *name;
};

struct pm_qos_object,在給每個class定義pm_qos_constraints結(jié)構(gòu)體的同時也為每個class定義了miscdev變量,用于給用戶空間提供接口。

這些接口主要實現(xiàn)各類PM QoS需求的匯總和計算極值的工作:add/update/remove等,并且提供接口給到用戶空間process,用于用戶空間的QoS需求,另外還提供了一些notifier API,用于跟蹤指定的PM QoS的變化。

主要API:

void pm_qos_add_request(struct pm_qos_request *req,int pm_qos_class, s32 value)

1)用于向PM QoS framework添加一個QoS請求,主要是根據(jù)指定的pm_qos_class,向pm_qos_class鏈表中插入一個新的pm_qos_request節(jié)點,并且更新target value。

3ada1758-8dda-11ee-939d-92fbcf53809c.png

void pm_qos_update_request(struct pm_qos_request *req,s32 new_value)

3af9eda8-8dda-11ee-939d-92fbcf53809c.png

void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value, unsigned long timeout_us)//在update的基礎(chǔ)上多出來一個定時器,用于特定需求的延遲更新

2) pm_qos_update_request/pm_qos_update_request_timeout,如果應用場景變化需要滿足不同的要求(比如串口波特率變大,相應的響應延遲需要變小),則需要調(diào)用該接口來更新相應的qos請求。函數(shù)體的主要部分pm_qos_update_target和Add相似,這里就不再介紹。

3) pm_qos_remove_request,如果對該class沒有需求,則可以調(diào)用該接口將請求移除。

4) 借助misc設(shè)備向用戶空間提供的接口(open/read/write等),調(diào)用的接口和上面提到的add/remove等類似,這里就不再贅述。

5) pm_qos_add_notifier/ pm_qos_remove_notifier,有部分實體(如cpuidle,比較關(guān)注cpu_dma_latency的指標)會比較關(guān)注某一個pm qos class的target value的變化,kernel提供了這樣一個notifier的機制,該實體可以通過pm_qos_add_notifier接口添加一個notifier,這樣當value變化時,framework便會通過notifier的回調(diào)函數(shù),通知該實體。

需求方:

3b0e9438-8dda-11ee-939d-92fbcf53809c.png

執(zhí)行方:

3b276e72-8dda-11ee-939d-92fbcf53809c.png

2.1 struct pm_qos_constraints

struct pm_qos_constraints {
struct plist_head list;
s32 target_value;/* Do not change to 64 bit */
s32 default_value;
s32 no_constraint_value;
enum pm_qos_type type;
struct blocking_notifier_head *notifiers;
};

struct pm_qos_request {
struct plist_node node;
int pm_qos_class;
struct delayed_work work; /* for pm_qos_update_request_timeout */
};

struct pm_qos_request用于request的add/update/remove等操作。

struct pm_qos_constraints,pm qos約束,用于抽象某一個特定的PM QoS class。

target_value、default_value,分別是該指標的目標值(滿足所有需求的value,可以是極大值或者極小值等,某一個指標關(guān)注的是極大值還是極小值在初始化的時候已經(jīng)確定),默認值(該指標的默認值,通常是0,表示沒有限制)。

3. 初始化流程

3b3218c2-8dda-11ee-939d-92fbcf53809c.png

static int __init pm_qos_power_init(void)
{
for (i = PM_QOS_CPU_DMA_LATENCY; i < PM_QOS_NUM_CLASSES; i++) {
ret = register_pm_qos_misc(pm_qos_array[i], d);
if (ret < 0) {
printk(KERN_ERR "pm_qos_param: %s setup failed
",
       pm_qos_array[i]->name);
return ret;
}
}

系統(tǒng)支持的QOS類型:

enum {
PM_QOS_RESERVED = 0,
PM_QOS_CPU_DMA_LATENCY,
PM_QOS_NETWORK_LATENCY,
PM_QOS_NETWORK_THROUGHPUT,
PM_QOS_MEMORY_BANDWIDTH,

/* insert new class ID */
PM_QOS_NUM_CLASSES,
};

debugfs_create_file()會創(chuàng)建sysfs供用戶空間調(diào)用。

4. DMA舉例

例如啟動攝像頭的時候,我們系統(tǒng)即便在省電的情況下,也需要cpu_dma允許的延遲時間不能超過50us,否則影響畫面質(zhì)量。

drivers/media/platform/via-camera.c中

3b423c70-8dda-11ee-939d-92fbcf53809c.png

pm_qos_add_request:在啟動camera的時候,這里請求了一個cpu_dma_latency的指標,為50us,即camera driver申請的cpu_dma允許的延遲時間不能超過50us

cpuidle初始化的時候會調(diào)用:

static inline void latency_notifier_init(struct notifier_block *n)
{
pm_qos_add_notifier(PM_QOS_CPU_DMA_LATENCY, n);
}

PM_QOS_CPU_DMA_LATENCY變化的時候會通知cpuidle

在進行cpuidle決策的時候,例如ladder governor中,

static int ladder_select_state(struct cpuidle_driver *drv,
struct cpuidle_device *dev)
{
struct ladder_device *ldev = this_cpu_ptr(&ladder_devices);
struct ladder_device_state *last_state;
int last_residency, last_idx = ldev->last_state_idx;
int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);

pm_qos_request()函數(shù)會獲取target_value,根據(jù)這個值來決定進行什么級別的idle。

對于cpuidle idle來說,一般有C1~C3幾個等級,在C3等級的退出延遲時間是57us(不同平臺會有差別),那么這里camera driver需求的50us容忍延遲就可以讓cpuidle退到C2 idle等級(即前面章節(jié)提到的執(zhí)行方需要確保自身的行為滿足這些pm qos的需求),就不會導致上面說的DMA transfer gets corrupted的問題了。

后記

內(nèi)核版本有時候差異也挺大的,一個機制,特別是小眾的可能會有更新,我們在找資料的時候,就需要注意這點,找到合適的學習資料。不過主要的思想是不變的,變的就是結(jié)構(gòu)體定義,api函數(shù)的調(diào)用流程等。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 電源管理
    +關(guān)注

    關(guān)注

    115

    文章

    6183

    瀏覽量

    144506
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40290
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7565

    瀏覽量

    88792

原文標題:電源管理入門-15 PM QoS

文章出處:【微信號:OS與AUTOSAR研究,微信公眾號:OS與AUTOSAR研究】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    電源管理入門:驅(qū)動Runtime PM管理

    Runtime PM管理也就是設(shè)備驅(qū)動里面的電源管理,即設(shè)備驅(qū)動結(jié)構(gòu)體里面的struct dev_pm_ops,只控制設(shè)備自己的
    的頭像 發(fā)表于 11-29 10:13 ?3115次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:驅(qū)動Runtime <b class='flag-5'>PM</b><b class='flag-5'>管理</b>

    電源管理入門:Power Domain管理

    SoC中通常有很多IP,按邏輯可以把幾個相關(guān)功能的IP劃為一個電源域。一個電源域內(nèi)的IP,通常按相同的方式由同一個硬件模塊PMIC供電,電壓一樣并且電源管理例如休眠喚醒一致。
    的頭像 發(fā)表于 11-29 10:16 ?3431次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:Power Domain<b class='flag-5'>管理</b>

    電源管理入門-芯片設(shè)計中的電源管理介紹

    SCP直接控制SoC的電源和時鐘,而AP通過硬件和軟件接口協(xié)同管理
    的頭像 發(fā)表于 12-06 09:16 ?3306次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>-芯片設(shè)計中的<b class='flag-5'>電源</b><b class='flag-5'>管理</b><b class='flag-5'>介紹</b>

    電源管理入門:Hypervisor中的電源管理

    很多時候聽說Hypervisor,但是對底層軟件技術(shù)不了解的人感覺挺神秘。本篇文章簡單介紹下Hypervisor的基本概念,另外介紹電源管理在Hypervisor之上多OS間怎么應用
    的頭像 發(fā)表于 12-06 09:27 ?1460次閱讀
    <b class='flag-5'>電源</b><b class='flag-5'>管理入門</b>:Hypervisor中的<b class='flag-5'>電源</b><b class='flag-5'>管理</b>

    LINUX電源管理的相關(guān)資料分享

    Linux的系統(tǒng)suspend和resumeLinux內(nèi)核 runtime_PM 框架Linux內(nèi)核電源管理綜述
    發(fā)表于 11-15 07:10

    嵌入式低功耗電源管理框架的設(shè)計資料分享

    概述目標本篇的目標是介紹低功耗電源管理框架設(shè)計的概念理解低功耗管理的重要性理解如何開發(fā)適合的低功耗管理
    發(fā)表于 12-21 07:39

    什么是PM QoS

    (requester)。PM QoS framework針對兩種對象分別提供了電源管理的基礎(chǔ)框架和接口。 那么在
    發(fā)表于 12-27 06:38

    RT-Thread PM2.0管理使用指南

    前言本篇主要對RT-Thread PM2.0(2021更新版)做個使用指南,介紹PM管理的新API的使用PM
    發(fā)表于 08-09 10:34

    RT-Thread PM框架怎么用?PM框架的作用是什么?

    ?RT-Thread PM框架 建議使用最新版本,使用最新的管理方法,【被動睡眠】,PM管理模塊化,也就是MCU是等大家都空閑了再去睡眠,而
    發(fā)表于 10-08 15:13

    一種新的Ad Hoc網(wǎng)絡(luò)QoS框架

    提出一種新的Ad Hoc網(wǎng)絡(luò)QoS保障框架。該框架能夠區(qū)分不同優(yōu)先級的業(yè)務和不同QoS要求的業(yè)務。能夠保障在網(wǎng)絡(luò)可用資源不足的情況下,高優(yōu)先級的業(yè)務通過“搶占”的方式接入網(wǎng)絡(luò)
    發(fā)表于 04-14 09:43 ?20次下載

    防火墻原理入門

    防火墻原理入門 防火墻能增強機構(gòu)內(nèi)部網(wǎng)絡(luò)的安全性。防火墻系統(tǒng)決定了哪些內(nèi)部服務可以被外界訪問;外界的哪些人可以訪問內(nèi)部的服務以及哪
    發(fā)表于 08-01 10:21 ?1023次閱讀
    防火墻原<b class='flag-5'>理入門</b>

    數(shù)字信號處理入門指南

    數(shù)字信號處理入門指南什么是DSP? 數(shù)字信號處理器(DSP)采集已被數(shù)字化的現(xiàn)實世界的聲音、音頻、視頻、溫度、壓力或位置等信號,并從數(shù)學的角度對其進
    發(fā)表于 09-15 08:55 ?1346次閱讀
    數(shù)字信號處<b class='flag-5'>理入門</b>指南

    新的AdHoc網(wǎng)絡(luò)QoS源路由框架

    框架采用模塊化思想進行設(shè)計,由可用寬帶計算、接入控制、資源預留等功能模塊組成,提出了新的AdHoc網(wǎng)絡(luò)QoS源路由框架設(shè)計
    發(fā)表于 05-26 15:44 ?32次下載
    新的AdHoc網(wǎng)絡(luò)<b class='flag-5'>QoS</b>源路由<b class='flag-5'>框架</b>

    LINUX電源管理

    Linux的系統(tǒng)suspend和resumeLinux內(nèi)核 runtime_PM 框架Linux內(nèi)核電源管理綜述
    發(fā)表于 11-07 19:36 ?8次下載
    LINUX<b class='flag-5'>電源</b><b class='flag-5'>管理</b>

    Linux電源管理--PM QoS

    (requester)。PM QoS framework針對兩種對象分別提供了電源管理的基礎(chǔ)框架和接口。 那么在
    發(fā)表于 01-05 14:37 ?1次下載
    Linux<b class='flag-5'>電源</b><b class='flag-5'>管理</b>--<b class='flag-5'>PM</b> <b class='flag-5'>QoS</b>