hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
09/29/2013 ふむ [長年日記]
tDiary 3993日目
■ [Linux] ksyslog
in-kernel な syslog サーバとかあってもよくね? と思ってついカッとなって書いてしまった.といっても「UDP パケットを受け取ってファイルに書き出す」というだけのものだけれど.
「できるかな」で書いた勉強用のブツだけれど,暇を見て色々拡張してみようかな.
ちなみに CentOS6 上で作ったのでたぶん 3 系では動かないはず.
追記
ここまでのところではまったところをメモしておく.
- 最初は横着して udp パケット受信ハンドラで直接ファイルに書いてやろうと思っていたのだけれど,どうも softirq context では vfs に正常にアクセスできないくさい.あるはずのファイルが path_lookup で見つからない,filp_open がとにかく失敗する,という状態.しょうがないので受信ハンドラではデータをキューイングするだけにして,書き出しは process context で動く workqueue に任せることに.
- workqueue のハンドラでデータを書き出す際,キューからデータを取り出して削除する処理が必要になる.これは softirq context からもアクセスするリソースへの破壊的操作なので,*_bh な lock を行うことになる.しかし vfs はスケジューラをキックすることがあるらしく (flush や notify だと思う),*_bh な lock を保持したまま (割込を禁止したまま) vfs にアクセスすると,"BUG: scheduling while atomic" というメッセージを吐きまくる.しょうがないので,キューからデータを取得したら lock は解放して,書き込みはその後で行うことに.書き込み失敗時のリカバリまで atomic に処理したかったんだけどなあ.
何というかまあ,横着しようとすんなってことですね.
追記 2
3 系でも動くようにしておいた.
少なくとも 3.8.13 と 10/02 時点の net-next master では動作.
追記 3
これ書いた数日後には気付いてたんだけど,今更メモのように書いておく.
Driving Me Nuts - Things You Never Should Do in the Kernel によると kernel space から直接ファイルを読み書きしてはいけないそうです :-P