Kernel/VM Advent Calendar 1日目: kmemcheck にご用心!

Kernel/VM Advent Calendarに本来考えてたネタをやろうとVMの中のカーネルをいじっていたところ、ふと気がつく。

Tuxくんが一人しかいない…? VMでは4コアあげているしなぜ?

確かに /proc/cpuinfo を見ても CPU が1つしか使われてないのだ。

その時とった dmesg -> https://gist.github.com/731682

[ 0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs

CPU4つあるよね……

[    0.140772] Brought up 1 CPUs
[    0.140784] Total of 1 processors activated (4787.87 BogoMIPS).

1つしか起動されない…

[    0.024100] CPU0: Intel QEMU Virtual CPU version 0.13.0 stepping 03
[    0.140155] kmemcheck: Limiting number of CPUs to 1.
[    0.140171] kmemcheck: Initialized

……ん? これか! "kmemcheck: Limiting number of CPUs to 1."

ということで、 kmemcheck のお話です。

もともと、 kmemcheck は Linux カーネルデバッグ用の機能。 カーネルのコードの中で初期化されずに使われるメモリがないかどうかをチェックする valgrind のようなもの。 これを有効にしていると、デスクトップ用途には使いづらくなる…らしいです。 (linux/Documentation/kmemcheck.txt)

んで、この kmemcheck の初期化が

int __init kmemcheck_init(void)
{
#ifdef CONFIG_SMP
	/*
	 * Limit SMP to use a single CPU. We rely on the fact that this code
	 * runs before SMP is set up.
	 */
	if (setup_max_cpus > 1) {
		printk(KERN_INFO
			"kmemcheck: Limiting number of CPUs to 1.\n");
		setup_max_cpus = 1;
	}
#endif

こんな風に SMP が使われていたら 1つのCPUしか使わせないという… それ CONFIG_SMP を Disable にしてくれよ… orz なコードになっていまして、こいつのせいで1つのCPUしか見えてこない、というわけでした。 (さらに言えば、デフォルトオフにしてても CPU 1つにされてしまう…まぁしかたないけど)

対策: kmemcheck を使わない しか現状なさそうです。まぁ確かに遅いしいいけど…

SMP 対応パッチも http://www.kerneltrap.org/mailarchive/linux-kernel/2008/5/23/1920164 にあるのですが、議論がいつのまにか忘れられてしまったのか中途半端な状態に…。 このスレッドだと(多分 qemu のバグで) qemu じゃ動かない、と言っていますが今はどうなんでしょうね。 やってみて Advent Calendar にしようかと思います。