kfifo 試す (9)

ええと、直前エントリなソレを試験する、というナニはデバイスドライバにせずに module_init なソレで試験なコードと printk で、という解を思いつく。
で、こんなカンジからスタート

#include <linux/module.h>   // required by all modules
#include <linux/kernel.h>   // required by printk()
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <asm/uaccess.h>    // required by copy_{to_user, from_user}
#include <linux/errno.h>
#include <linux/kfifo.h>    // fifo

MODULE_LICENSE("GPL");

#define BUFSIZ 256

static struct kfifo *fifo_ptr;
static spinlock_t fifo_lock;

static void kfifo_test(void)
{
	return;
}

static int yamanetoshi_init(void) {
	int ret;

	printk("initialize the fifo device\n");

	spin_lock_init(&fifo_lock);
	fifo_ptr = kfifo_alloc(BUFSIZ, GFP_KERNEL, &fifo_lock);

	if(IS_ERR(fifo_ptr))
		return -ENOMEM;

	kfifo_test();

	return 0;
}

static void yamanetoshi_exit(void) {
	printk("cleanup the fifo device\n");

	kfifo_free(fifo_ptr);

	return;
}

module_init(yamanetoshi_init);
module_exit(yamanetoshi_exit);

kfifo_test な関数に動作確認なコードを書いていく方向ッス。

とりあえず

な試験を書いてみました。関係するトコのみ。

static void kfifo_test(void)
{
	printk("buffer is not NULL : %p\n", fifo_ptr->buffer);
	printk("size is not zero : %d\n", fifo_ptr->size);
	printk("in is zero : %d\n", fifo_ptr->in);
	printk("out is zero : %d\n", fifo_ptr->out);
	
	return;
}

static int yamanetoshi_init(void) {

	printk("initialize the fifo device\n");

	spin_lock_init(&fifo_lock);
	fifo_ptr = kfifo_alloc(BUFSIZ, GFP_KERNEL, &fifo_lock);

	if(IS_ERR(fifo_ptr))
		return -ENOMEM;

	kfifo_test();

	return 0;
}

どう書くか、は悩ましい。出力が以下です。

initialize the fifo device
buffer is not NULL : cf79b180
size is not zero : 256
in is zero : 0
out is zero : 0
cleanup the fifo device

これ、リダイレクトとかできないのが微妙ですな。って messages に出てるのか。

現状な試験

って溢れた場合のナニがどーゆー挙動か、が見れれば良いのかな。先端と末端に跨ってる時の in とか out とかの値も見てみたい。