国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linux PM QoS framework(3)_per-device PM QoS

2019-11-09 17:37:40
字體:
來源:轉載
供稿:網友

本文轉自: http://www.wowotech.net/pm_subsystem/per_device_pm_qos.html

linux PM QoS framework(3)_per-device PM QoS

作者:wowo 發布于:2015-2-26 22:44 分類:電源管理子系統

1. 前言

per-device PM QoS是針對指定設備的QoS framework,背后的思考如下:

1)resume_latency

在Runtime PM的框架下,當device的引用計數減為0的時候,RPM會suspend該device。不過,device進入suspend狀態以及從suspend狀態resume是需要消耗時間的(相關信息保存在pm domain中),而系統其它實體(如用戶空間程序)可能對該設備的響應時間有要求,這就是一種形式的QoS request,稱作resume_latency。

per-device PM QoS framework會提供相應的接口,收集指定設備的resume_latency request,并提供給Runtime PM,它在suspend設備時,會考慮這種需求,并決定是否suspend設備。

2)latency_tolerance

一些復雜的設備,在運行狀態(active)時,為了節省功耗,也有可能自行進入某些省電狀態,相應的,設備的響應速度可能降低。如果該設備足夠智能,可能會提供一個回調函數(.set_latency_tolerance,位于dev_pm_info結構中),以便設置最大的延遲容忍時間。這稱作latency_tolerance。

對per-device PM QoS來說,需要提供一種機制,收集所有的、針對某個設備的latency_tolerance需求,并匯整出可以滿足所有需求的latency_tolerance,通過設備的回調函數告知設備。

3)no power off/remote wakeup

在Runtime PM的框架下,設備suspend之后,還可以進一步通過pm domain關閉該設備的供電,以節省功耗。但關閉供電時,除了要考慮對設備resume_latency的需求之外,還要考慮該設備是否允許關閉供電,以及該設備是否需要作為一個喚醒源(remote wakeup)。

這是另一種形式的QoS request,稱作per-device PM QoS flag,表示系統其它實體對該設備的一些特定行為的需求。當前的flag有兩種:

PM_QOS_FLAG_NO_POWER_OFF,表示不允許設備斷電 PM_QOS_FLAG_REMOTE_WAKEUP,表示設備應具備喚醒功能

這兩個flag可以通過或操作,同時生效。

因此,per-device PM QoS framework的功能,就是抽象上面兩類需求,包括:向requestor提供QoS request的add、update、remove等API,包括內核空間API和用戶空間API;匯整、整理這些request;向電源管理有關的service(主要是pm domain framework)提供匯整后的request信息,以便這些service可以做出正確的決定。

下面將會結合source code(位于drivers/base/power/qos.c中),介紹上面的實現邏輯。

2. API匯整

2.1 struct dev_pm_qos數據結構

每個設備的per-device pm qos信息,都保存在設備的qos指針中,即:

   1: struct device {
   2:         ...
   3:         struct dev_pm_info      power;
   4:         ...
   5: }
   6:  
   7: struct dev_pm_info {
   8:         ...
   9:         struct dev_pm_qos       *qos;
  10:         ...
  11: }

該指針的數據類型struct dev_pm_qos是per-device pm qos的核心數據結構,定義如下:

   1: struct dev_pm_qos {
   2:         struct pm_qos_constraints resume_latency;
   3:         struct pm_qos_constraints latency_tolerance;
   4:         struct pm_qos_flags flags;
   5:         struct dev_pm_qos_request *resume_latency_req;
   6:         struct dev_pm_qos_request *latency_tolerance_req;
   7:         struct dev_pm_qos_request *flags_req;
   8: };

resume_latency,為第一種QoS request,表示其它實體對該設備從suspend狀態返回的延遲的要求。struct pm_qos_constraints為pm qos要求的具體抽象,可參考“Linux PM QoS framework(2)_PM QoS class”中的描述;

latency_tolerance,為第二種QoS request,和resume_latency類似;

flags,為第三種QoS request,主要包括一個鏈表頭,用于保存具體的flag要求,以及匯整后的、當前所有有效的flags;

resume_latency_req、latency_tolerance_req、flags_req,三個不同類型的request指針,用于保存用戶空間對設備pm QoS的request請求。struct dev_pm_qos_request結構類似上一篇文章所描述的struct pm_qos_request結構,用于抽象一個具體的request。

   1: struct dev_pm_qos_request {
   2:         enum dev_pm_qos_req_type type;
   3:         union {
   4:                 struct plist_node pnode;
   5:                 struct pm_qos_flags_request flr;
   6:         } data;
   7:         struct device *dev;
   8: };

type,request的類型,當前共三類,包括在前言部分所描述的三種request(DEV_PM_QOS_RESUME_LATENCY、DEV_PM_QOS_LATENCY_TOLERANCE、DEV_PM_QOS_FLAGS);

data,不同類型的request,有不同的數據,因此這里是一個聯合體。當為DEV_PM_QOS_RESUME_LATENCY、DEV_PM_QOS_LATENCY_TOLERANCE時,為一個plist_node,類似PM QoS class。為DEV_PM_QOS_FLAGS時,為struct pm_qos_flags_request類型的變量;

dev,保存了設備指針。

2.2 向kernel其它driver提供的,用于提出per-device PM QoS需求的API

int dev_pm_qos_add_request(struct device *dev, struct dev_pm_qos_request *req,                            enum dev_pm_qos_req_type type, s32 value); int dev_pm_qos_update_request(struct dev_pm_qos_request *req, s32 new_value); int dev_pm_qos_remove_request(struct dev_pm_qos_request *req);

類似PM QoS class中的pm_qos_*接口,不過操作對象為設備,因而需要提供相應的設備指針。

2.3 向kernel PM有關的service(例如PM domain)提供的,用于獲取、跟蹤指定PM QoS需求的API

enum pm_qos_flags_status dev_pm_qos_flags(struct device *dev, s32 mask); s32 dev_pm_qos_read_value(struct device *dev); int dev_pm_qos_add_notifier(struct device *dev,                             struct notifier_block *notifier); int dev_pm_qos_remove_notifier(struct device *dev,                                struct notifier_block *notifier); int dev_pm_qos_add_global_notifier(struct notifier_block *notifier); int dev_pm_qos_remove_global_notifier(struct notifier_block *notifier); 

由于DEV_PM_QOS_FLAGS特殊性,kernel提供了單獨的API,以獲取相應的flags。對于其它兩個類型的QoS,和PM QoS class中的pm_qos_*接口類似。

2.4  向用戶空間PRocess提供的,用于提出per-device PM QoS需求的API

通過sysfs文件,kernel允許用戶空間程序對某個設備提出QoS需求,這些sysfs文件位于各個設備的sysf目錄下,默認情況下,PM QoS framework不會創建這些文件,除非具體設備驅動調用dev_pm_qos_expose_*系列接口,主動創建。具體可參考代碼,這里不再詳細說明。

3. 實現思路和內部邏輯

和PM QoS class類似,不再描述。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 集安市| 鄂伦春自治旗| 固镇县| 樟树市| 济南市| 太保市| 襄樊市| 勃利县| 乌拉特中旗| 化隆| 滁州市| 荆门市| 南安市| 汤阴县| 许昌市| 苗栗县| 栾城县| 西乡县| 长宁区| 阿克苏市| 江达县| 同心县| 章丘市| 犍为县| 清水县| 罗城| 兰坪| 皮山县| 札达县| 且末县| 和平区| 岢岚县| 莎车县| 蒙山县| 潜山县| 儋州市| 星座| 宁武县| 崇阳县| 沾化县| 宜宾县|