読者です 読者をやめる 読者になる 読者になる

lkmlで気になったパッチとか

linux

Bloggerがちょっと使いづらかったので、やっぱりはてなで書く。

lkmlで気になったスレッド
mutex_lock()の使い方を間違ってんじゃないのと言うパッチだけど、確かにぱっと見だとmutex_lock()の使い方を間違ってんジャンと思う。

kernel/audit.c
int audit_send_list(void *_dest)
{
	struct audit_netlink_list *dest = _dest;
	int pid = dest->pid;
	struct sk_buff *skb;

	/* wait for parent to finish and send an ACK */
	mutex_lock(&audit_cmd_mutex);
	mutex_unlock(&audit_cmd_mutex);

	while ((skb = __skb_dequeue(&dest->q)) != NULL)
		netlink_unicast(audit_sock, skb, pid, 0);

	kfree(dest);

	return 0;
}

でも、これで良いとの返信が。。
mutex_lockはkernel/mutex.cではこんな風に実装。

void inline __sched mutex_lock(struct mutex *lock)
{
	might_sleep();
	/*
	 * The locking fastpath is the 1->0 transition from
	* 'unlocked' into 'locked' state.
	*/
	__mutex_fastpath_lock(&lock->count, __mutex_lock_slowpath);
	mutex_set_owner(lock);
}


might_sleep()はlinuix/kernel.hで定義していて、CONFIG_DEBUG_SPINLOCK_SLEEPが定義されていなければ、こんな感じの実装。

# define might_sleep() do { might_resched(); } while (0)

さらにmight_resched()は同じくkernel.hでこんな実装に。

# define might_resched() _cond_resched()

_cond_resched()はkernel/sched.cにいて、必要に応じて__cond_resched()を呼んで、
その中でschedule()を呼んでる。

ここで、元のaudit_send_list()をみるとコメントがついているので、

	/* wait for parent to finish and send an ACK */
	mutex_lock(&audit_cmd_mutex);

このコメントからすると、ACKを送りきるまでmutex_lock()を使って処理が終わるのを待っている感じ。
つーか、ぱっと見じゃバグと思うっすよ(´Д`;)/ヽァ・・・

debian絡みだと、Barryさんからバグ報告を受けてたけど、すっかり見逃してたらメールでpingしてくれたので先週はそれの対応。

libglib2.0-devへの対応は基本的には下のパッチで済むんだけど、configureとかを作り直すのにautoreconfを使うとdiffが巨大に(ノД`)・゜・。
あんまりでかいパッチを入れるのもアレなので。debian/rule内でautoreconfを呼ぶようにした。

diff -urNad autounit~/configure.in autounit/configure.in
--- autounit~/configure.in 2009-04-15 07:11:17.000000000 +0900
+++ autounit/configure.in 2009-04-15 07:35:27.000000000 +0900
@@ -12,7 +12,7 @@
 AC_PROG_LIBTOOL
 
 # Checks for libraries.
-AM_PATH_GLIB()
+AM_PATH_GLIB_2_0()
 
 # Checks for header files.
 AC_HEADER_STDC

まあ、単にパッケージングするだけならこれだけで良いんだけど、lintinでWaringが出まくったのでそれを修正する方が大変。。
特に、debian/rule内でautoreconfすると当然アップストリームが配布していると差分が出てしまうのでそれを無視するように、source.lintian-overridesファイルを作って以下の行を追加して、強制的にWarningを無視した。反省はしてない。。
autounit source: patch-system-but-direct-changes-in-diff