- test2.c (/usr/src/linux-2.6.23/joseph)
|- struct
|| _mydrv_wq
|| _mydrv_work
|
|- variable
|| mydrv_wq
|| mydrv_work
|| hello_init
|| hello_exit
|
|- function
|| my_task // Test task
|| mydrv_submit_task //Testing kernel thread used to submmit two task to worker thread and then exit
|| mydrv_worker // The worker thread
|| submit_work // Submitting Work to be executed
|| mydrv_init // init mydrv_wq and mydrv_work
|| hello_init
|| hello_exit
------------------------------------------------------------------------------------------------------------------------------------------
Introduction:
In this experiment, I will show you how to use list and wait queue.
we create two kernel thread. One is mydrv_worker which is our worker thread used to handle the submitted tasks
in mydrv_wq.mydrv_worklist. When there is no task to handle, it will add itself to wait queue. It will be wake
up by submit_work when new tasks are added to work list. The other is mydrv_submit_task used to submit two tasks
and then exit. When we execute ' kill -s 9 thread_id_of_mydrv_worker' mydrv_worker will exit.
source code:
steps:
1. compile
# make -C /path/to/your/kernel/tree -M `pwd' modules
2. #echo "" > /var/log/messages
3. insmod test2.ko
4. cat /var/log/messages
May 13 02:27:11 joseph kernel: [160219.386631] Hello, I am a test module
May 13 02:27:11 joseph kernel: [160219.386843] mydrv_worker go to sleep
May 13 02:27:11 joseph kernel: [160219.386932] Create mydrv_submit_task <---------<<<<<<<<
May 13 02:27:11 joseph kernel: [160219.387016] submit_work get lock
May 13 02:27:11 joseph kernel: [160219.387042] submit_work release lock
May 13 02:27:11 joseph kernel: [160219.387061] my_task is called the 1 time(s)
May 13 02:27:11 joseph kernel: [160219.387081] mydrv_worker go to sleep
May 13 02:27:11 joseph kernel: [160219.387099] submit_work get lock
May 13 02:27:11 joseph kernel: [160219.387117] submit_work release lock
May 13 02:27:11 joseph kernel: [160219.387136] my_task is called the 2 time(s)
May 13 02:27:11 joseph kernel: [160219.387154] mydrv_worker go to sleep
May 13 02:27:11 joseph kernel: [160219.387171] mydrv_submit_task exit
5. # ps -ef
you can find 'mydrv_worker'. assume its thread ID is 21996.
# kill -s 9 21996 // kill the thread
6. # cat /var/log/messages
May 13 19:36:49 joseph kernel: [221908.003286] mydrv_worker exit
May 13 19:37:04 joseph kernel: [221922.735699] Bye, my dear!
May 13 19:37:04 joseph kernel: [221922.735701] Cruel world