Mandriva Linux 2009.0のcpufreqdが起動できない件と該当部分を無効化する対処方法
Mandriva Linux 2009.0でcpufreqdをインストールしたのだが、デーモンが動かなかった。使用したバージョンは2.3系だったが、2.2系を入れてもダメだった。
(2009/5/6)2009.1のcpufreqd(バージョン2.3.4-1mdv2009.1)ではこの記事の不具合は起こっていない。
どのあたりで落ちているのかまでは分かったものの...
「動的にCPUクロックや電圧を変更するcpufreqの概要とcpufreqdデーモンについて」に書いているテスト時の要領で手動で動かしても落ちてしまうためgdbを使用したところProgram received signal SIGSEGV, Segmentation fault. 0x00007f1d4700f660 in dlist_start () from /lib64/libsysfs.so.2
という出力が得られた。
手動でソースからビルドして「dlist_start」のありかを調べてみたところ
$ tar jxf [cpufreqd-2.3.3.tar.bz2の場所] $ cd cpufreqd-2.3.3/ [cpufreqd-2.3.3]$ ./configure [cpufreqd-2.3.3]$ make [cpufreqd-2.3.3]$ LC_MESSAGES=C grep -r "dlist_start" . Binary file ./src/.libs/cpufreqd_acpi.so matches Binary file ./src/.libs/cpufreqd_acpi_la-cpufreqd_acpi.o matches
不思議なことに、cpufreqd自体のソース内の一致はなかった。
一方で「dlist」ではソースに以下の一致があったが
[cpufreqd-2.3.3]$ grep dlist $(find . -name \*.c) ./src/cpufreqd_acpi.c: struct dlist *devs = NULL; ./src/cpufreqd_acpi.c: dlist_for_each_data(devs, clsdev, struct sysfs_class_device) {
「dlist_for_each_data」はマクロで、その中でdlist_start()が使用されていた。
[引用]ファイル名: /usr/include/sysfs/dlist.h より
#define dlist_for_each_data(list,data_iterator,datatype) \ for(dlist_start(list), (data_iterator)=(datatype *) dlist_next(list); \ (list)->marker!=(list)->head;(data_iterator)=(datatype *) dlist_next(list))
libsysfs側の問題でないのであれば、修正するべきソースはsrc/cpufreqd_acpi.cということになるのだが、どこをどうすればよいのかは分からなかった。
ACPI関係のプラグインを切って対処は可能
上記部分の処理を行うプラグインを使用しなければよいと思い、試しにconfigureスクリプトに対して--disable-acpiを付けてビルドしたところ、うまく動作した。以下はソースRPM(cpufreqd-2.3.3-1mdv2009.0.src.rpm)をダウンロード・展開後にspecファイルへ行う修正。
--- cpufreqd-2.3.3-1mdv2009.0.orig/SPECS/cpufreqd.spec +++ cpufreqd-2.3.3-1mdv2009.0/SPECS/cpufreqd.spec @@ -57,7 +57,7 @@ automake -a %build -%configure2_5x +%configure2_5x --disable-acpi %make %install
また、この修正を行ったソースRPMとx86_64向けRPMを別館から入手できるようにした。
(2008/11/7)リリース番号を2に上げたものに差し替え
(2008/12/12)i586版パッケージを追加した。
(2014/10/4)別館の配布ページは削除済み。
使用したバージョン:
- cpufreqd / lib64cpufreqd 2.3.3-1mdv2009.0
- lib64sysfs2 / lib64sysfs-devel 2.1.0-9mnb2