2011年2月22日火曜日

[HOWTO] Adding BFQ I/O scheduler to Nexus S stock kernel.

Linuxの標準のI/OスケジューラはCFQで、Nexusのkernelもこれをデフォルトとしている、ほかにも利用可能なスケジューラとして、noop | deadline などがあるが、
Nexus Sのstock kernelは2.6.35なので、これに対応するpatchをダウンロードしておく
http://algo.ing.unimo.it/people/paolo/disk_sched/
mbox形式のpatchなので、git amで当てる。configもやり直すので、distcleanしておくといい。
cd samsung
make distclean ARCH=arm
git am ../bfq_patch/0001-bfq_iosched-block-prepare_IO_context_code-2.6.35-v1-r1.patch
git am ../bfq_patch/0002-bfq_iosched-block-add_cgroups_kconfig_and_build_bits-2.6.35-v1-r1.patch
git am ../bfq_patch/0003-bfq_iosched-block-introduce_BFQ-2.6.35-v1-r1.patch

configをやり直す

make herring_defconfig ARCH=arm
make menuconfig ARCH=arm
(TUN/TAPを有効にしたりしておく)

デフォルトのIO schedulerをBFQにするために

Enable the block layer => IO Schedulers => BFQ I/O Scheduler に*
出現するオプションも*いれておく。

その後

Default I/O scheduler で BFQを選択してExitしていく。
よければbuild

make -j2 ARCH=arm CROSS_COMPILE=/home/somewhere/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
mkbootimg ....
..
いつものように、fastbootモードにしてお試し起動してチェックしてみること。

adb reboot bootloader
fastboot boot myboot.img

デフォルトが変更されていたらOK。

dmesg | grep scheduler
<6>[    0.377504] io scheduler noop registered
<6>[    0.377640] io scheduler deadline registered
<6>[    0.377762] io scheduler cfq registered
<6>[    0.377960] io scheduler bfq registered (default)

動的にI/Oスケジューラを変更するには、おそらく下記の作業で行けるはず(未検証)
cd /sys/devices/platform/s3c-sdhci.0/mmc_host/mmc0/mmc0:0001/block/mmcblk0/queue
echo cfq > scheduler
cat scheduler
noop deadline [cfq] bfq 

追記:
git amでpatchを適用するとcommitも反映されるので、kernelのバージョンマジックが変わるようです。
モジュールなどは全部コンパイルし直して入れ直しましょう。

0 コメント:

コメントを投稿