earlysuspend、autosleep以及wakeup_count三種休眠機制的分析和比較

一、Opportunistic sleep引言

1. 背景

(1) android 面臨的問題

          Opportunistic sleep: 當沒有任務時,需要尋找時機,進入suspended

(2) 3類同步問題

          a. 內核:driver處理event的過程中,系統不能suspend

          b. 用戶:用戶進程處理的過程中系統不能suspend

          c. 內核與用戶交互: 

              休眠過程中,觸發event, 需abort suspend流程;

              event 事件需用戶態處理完畢後,才能suspend;



2. earlysuspend



3. autosleep



4. wakeup_count



5. 三種休眠機制的比較


(1)有關earlysuspend的討論

          a. 更改了suspend 流程,引入了earlysuspend 接口;

          b. 社區對該patch,有誤解,認爲其要替代runtime;

          c. wakelock 實現過於複雜,名稱易造成誤解;

          d. mini-summit: 有nokia 開發者,缺乏android 開發者,引入了非技術性的討論;

          e. 應該使用pm_runtime, cpuidle; susupend 不應該存在;

          f. 喚醒源的處理過程,貫穿整個系統,影響較大;

(2)有關autosleep的討論

          a. android 市場份額越來越大,很多driver src code 脫離了mainline;

          b. Linus 認爲需要合併android 的特性:suspend block;

          c. Rafael J. Wysocki 認爲時機已經成熟,提出了新的解決方案;

          d. 社區對該opportunisic suspend patch, 有誤解,引入了非技術性的討論:重新設計後,命名爲autosleep;

          e. 考慮到android 的兼容性,接口上保留了wakelock; 實現上,進行了改進;


(3)有關wakeup_count的討論

          a. 在userspace 基於wakeup_count 實現的 opportunistic sleep 機制;(與autosleep 類似);

          b. 內核空間,無wake_lock 概念;

          c. 無suspend block 概念;

          d. suspend 觸發的時機,全部交由用戶空間負責;



6. 引入autosleep   |  wakeup count的理由

(1)earlysuspend 被內核拋棄,需自己打補丁;

(2)使用earlysuspend, 對內核改動較大,更改了suspend 流程, 無法合併入mainline;

(3)對設備驅動影響較大,需額外實現earlysuspend 接口,不利於upstream;

(4)earlysuspend 已存在的問題:例如只支持開關屏時執行earlysuspend, 不利於動態功耗的優化;

(5)pm_runtime 已經在display, usb 等設備使用;

(6)upstream 的需求;


二、opportunistic sleep 框架



三、wakeup source 框架

1. 功能

    a. 抽象wakeup source和wakeup event的概念;

    b. 向各個device driver提供wakeup source的註冊、使能等接口;

    c. 向各個device driver提供wakeup event的上報、停止等接口;

    d. 向上層的PM core(包括wakeup count、auto sleep、suspend、hibernate等模塊)提供wakeup event的查詢接

        口,以判斷是否可以suspend、是否需要終止正在進行的suspend;


2. 數據結構


(1)registered wakeup events(cnt)和saved_count;

(2)wakeup events in progress(inpr);



3. 相關接口






四、wakeup count框架

1. 目標

    有喚醒事件需處理時:
若系統在運行過程中,不能進入suspend;
若已進入suspend 流程,需及時退出;


2. 接口

    a. bool pm_get_wakeup_count(unsigned int *count, bool block);

    b. bool pm_save_wakeup_count(unsigned int count);


3. 流程



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章