2015年1月25日日曜日

smartassH3をいじってみる

AndroPlusの作者がXperia Z2・Z3むけにカーネルを作成しています。
GitHubを使用しているため、ソースコードを拝見することが出来、色々と比較してみました。

  1. AnDyXX氏が作成したsmartassH3のソースコード(今回こちらをいじっている)は、C3C0が作成したZTE skateのsmartassH3のオリジナルソースコードとほぼ変わらなかった。
  2. 次に、2chのGXスレッドで154氏が書いたソースコード(smartassV2)にはboostの設定が追加されており、システムからboost_pulseを受信するとCPU周波数を上昇させる挙動がなんとなく見えました。また、workqueueの割り当てがalloc_workqueue()に変更されていましたのでこれをマージした。
  3. AndroPlusカーネルではcpufreq_governor_smartass_h3にて全てのCPUコアに対して設定を行っているようなのでここをマージした。
  4. idle_notifier_register・idle_notifier_unregisterの記述は、AnDyXX氏のソースコードではあった(ストックカーネルのinteractiveにはある)のでそれはそのまま残した。

なお、Tunable parametersを以下の通り変更しました。原文のコメントと共に自分なりの翻訳も付けてみた(間違っているかもしれないのはご了承下さい)。

/*
* The "ideal" frequency to use when awake. The governor will ramp up faster
* towards the ideal frequency and slower after it has passed it. Similarly,
* lowering the frequency towards the ideal frequency is faster than below it.
*
* 個人的な翻訳(以下、他のパラメータも記載)
* スリープ解除時に利用する「理想的な」周波数設定。CPUガバナは理想的な周波数へ
* 素早く上昇し、それを超えた場合(オーバーシュート時)はゆっくり下降させる。
* 同様に理想的な周波数まで下げる際はそれを超えた場合より素早く下降させる。
*/
#define DEFAULT_AWAKE_IDEAL_FREQ (702*1000)
AnDyXXのソースコードの値は378000、Xperia Zは最大周波数1.5GHzのため、この半分で周波数テーブルと同じ値にした

/*
* The "ideal" frequency to use when suspended.
* When set to 0, the governor will not track the suspended state (meaning
* that practically when sleep_ideal_freq==0 the awake_ideal_freq is used
* also when suspended).
*
* サスペンド時に使用する「理想的な」周波数
* 0にセットした際、CPUガバナはサスペンド状態を監視しない(実際には
* sleep_ideal_freq==0 の際はサスペンド時にもawake_ideal_freqを使用すると
* いう意味である)。
*/
#define DEFAULT_SLEEP_IDEAL_FREQ (384*1000)
AnDyXXのソースコードの値は378000、サスペンド時は周波数テーブルの最低周波数384000とした

/*
* Freqeuncy delta when ramping up above the ideal freqeuncy.
* Zero disables and causes to always jump straight to max frequency.
* When below the ideal freqeuncy we always ramp up to the ideal freq.
*
* 理想周波数まで上昇させる際の周波数変動値
* 0の場合は一気に最高周波数まで上昇させる。
* 理想周波数より低い場合、理想周波数まで上昇させる。
*/
#define DEFAULT_RAMP_UP_STEP (216*1000)
AnDyXX氏のソースコードでは80000、この値はC3C0氏のコードでは最大周波数/10位(ZTE steakの最大周波数は800MHz)のため、当初は(108*1000)にしてみた。しかしこの値では384Mhz〜486MHz間をうろうろし、周波数が上がらない(ようだった)ので2倍に変更(AndroPlusカーネルの作者様に質問し教えていただいた)。
/*
* Freqeuncy delta when ramping down below the ideal freqeuncy.
* Zero disables and will calculate ramp down according to load heuristic.
* When above the ideal freqeuncy we always ramp down to the ideal freq.
*
* 理想周波数まで下降させる際の周波数変動値
* 0の場合はCPU負荷状態を確認し一気に所要周波数を下降させる。
* 理想周波数より高い場合、理想周波数まで下降させる。
*/
#define DEFAULT_RAMP_DOWN_STEP (216*1000)
DEFAULT_RAMP_UP_STEPと同様。

/*
* CPU freq will be increased if measured load > max_cpu_load;
*
* CPU負荷がmax_cpu_loadを越えた際、CPU周波数を上昇させる。
*/
#define DEFAULT_MAX_CPU_LOAD 85
参照したソースコードでは変更した形跡はないためそのまま

/*
* CPU freq will be decreased if measured load < min_cpu_load;
*
* CPU負荷がmin_cpu_loadを下回った際、CPU周波数を下降させる。
*/
#define DEFAULT_MIN_CPU_LOAD 70
参照したソースコードでは変更した形跡はないためそのまま

/*
* The minimum amount of time to spend at a frequency before we can ramp up.
* Notice we ignore this when we are below the ideal frequency.
*
* CPU周波数を上昇させるまでに必要な最少経過時間
* 理想周波数より低い場合はこの値は無視する。
*/
#define DEFAULT_UP_RATE_US 48000
参照したソースコードでは変更した形跡はないためそのまま

/*
* The minimum amount of time to spend at a frequency before we can ramp down.
* Notice we ignore this when we are above the ideal frequency.
*
* CPU周波数を下降させるまでに必要な最少経過時間
* 理想周波数を超えている場合はこの値は無視する。
*/
#define DEFAULT_DOWN_RATE_US 49000
参照したソースコードでは変更した形跡はないためそのまま

/*
* The frequency to set when waking up from sleep.
* When sleep_ideal_freq=0 this will have no effect.
*
* スリープ解除時に設定される周波数
* sleep_ideal_freqを0に設定した際、この値は無視される。
*/
#define DEFAULT_SLEEP_WAKEUP_FREQ 99999999
参照したソースコードでは変更した形跡はないためそのまま

/*
* Sampling rate, I highly recommend to leave it at 2。
*
* サンプリングレート、2のままにしておくことを強く推奨する。
*/
#define DEFAULT_SAMPLE_RATE_JIFFIES 2
参照したソースコードでは変更した形跡はないためそのまま
最終的には、もう少しはチューニングしてみようかと思います。

0 件のコメント:

コメントを投稿