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