simple kernel FIFO implementation

凄く面白い。これしきで面白がってては駄目なんでしょうが。
ええと面白がってみてるのは

  • include/linux/kfifo.h
  • kernel/kfifo.c

基本的には i/f が kfifo.h に定義してあるカンジ。これを見るに自分の考慮の至らなさがありありと分かって違う意味でヘコむ。

  • spinlock の事をすっかりスルー
  • copy_{from, to}_user なソレも微妙 (kfifo.[ch] ではここはスルー)

特に spinlock 云々はソース見る直前に思い至っていただけにイタ杉。

spin_lock 云々

以前色々見てた記憶はありますが忘却の彼方。

spin_lock_irqsave だの spin_unlock_irqsave だのというナニは別途きちんと追い掛けつつきちっとログを残した方が良さげ。以下は自分メモ (バージョンが微妙??

このあたり、別途エントリ投入します。

kfifo.h

こちらは実際の使用にあたっての i/f 定義。キモなデータ構造が以下。

struct kfifo {
        unsigned char *buffer;  /* the buffer holding the data */
        unsigned int size;      /* the size of the allocated buffer */
        unsigned int in;        /* data is added at offset (in % size) */
        unsigned int out;       /* data is extracted from off. (out % size) */
        spinlock_t *lock;       /* protects concurrent modifications */
};

in とか out な属性のコメントがナニ。
# (in % size) とか (out % size) とか
最初、kfifo.c だけしか見てなくってどきどきでした (何

kfifo.c

低水準な i/f が定義されている。とりあえずメモのみ。
最初は size が任意だと思ってて例えば __kfifo_get な手続きの以下のソレが意味不明だった。

        l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));

むむむ、と唸りつつソースをぱらぱらめくってたら以下なコメントを発見。

 * @size: the size of the internal buffer, this have to be a power of 2.

これはこれは。
power of 2 だったら 1 引いた値とある値の & を取ったら、って今考えるに mask だし。なんと言えば良いのか分かりませんが格好良い。
あと、put だの get だので buffer に入りきらないのはステてるあたりも男。

mb とか rmb とか

smp_rmb() とか smb_mb() などという手続きを呼び出してますが、これも別途確認してエントリ投入します。

最後に

すげー、と思ったにもかかわらず、微妙なエントリしか残せぬ。(とほほ

ってか

モジュールで kfifo なソレを試験するナニは書けないのでしょうか。ぱたぱたしてて読むだけだと微妙なソレしか入れれんな。
もう少し引っ張るかも。あるいは課題に feedback かも。