@@ -7,8 +7,6 @@ MODULE_AUTHOR("ming.li");
77//MODULE_VERSION(version_string);
88//MODULE_DEVICE_TABLE(table_info);
99//MODULE_ALIAS(alternate_name);
10- MODULE_LICENSE ("Dual BSD/GPL" );
11-
1210//#include <linux/moduleparam.h>
1311//module_param(variable, type, perm);
1412//module_param_array(name, type, nump, perm)
@@ -123,18 +121,21 @@ static struct file_operations proc_fops = {
123121
124122};
125123
126-
127124static void proc_init (void )
128125{
129126 sema_init (& sem ,0 );
130-
127+
128+ #if 0
131129 test = create_proc_entry (proc_entry_name , proc_mod , NULL );
132130
133131 if (test )
134132 {
135133 test -> proc_fops = & proc_fops ;
136134 test -> data = NULL ;
137135 }
136+ #else
137+ test = proc_create (proc_entry_name , proc_mod , NULL , & proc_fops );
138+ #endif
138139
139140 proc_buf = kmalloc (PROC_BUF_SIZE ,GFP_KERNEL );
140141
@@ -172,10 +173,13 @@ static struct task_struct *test_task_1,*test_task_2;
172173static struct semaphore sem_thread ;
173174
174175#define THREAD_WORK_INIT_VALUE 10
175- enum {
176- thread_id_0 = 0 ,
177- thread_id_1
178- };
176+ typedef enum {
177+ thread_id_0 = 0 ,
178+ thread_id_1
179+ } thread_id_t ;
180+
181+ struct mutex lock_a ,lock_b ;
182+
179183static void thread_cmd (void )
180184{
181185 printk (KERN_DEBUG "[%s] [%s] ..." ,MODULE_TAG ,__FUNCTION__ );
@@ -184,9 +188,67 @@ static void thread_cmd(void)
184188
185189static void do_work (void * data )
186190{
191+ thread_id_t thread_id = (long )data ;
192+
187193 printk (KERN_DEBUG "[%s] [%s] [%ld]" ,MODULE_TAG ,__FUNCTION__ ,(long )data );
194+ switch (thread_id )
195+ {
196+ case thread_id_0 :
197+
198+ printk (KERN_DEBUG "[%ld] getting lock a" ,(long )data );
199+
200+ mutex_lock (& lock_a );
201+
202+ printk (KERN_DEBUG "[%ld] got lock a" ,(long )data );
203+
204+ printk (KERN_DEBUG "[%ld] getting lock b" ,(long )data );
205+
206+ mutex_lock (& lock_b );
207+
208+ printk (KERN_DEBUG "[%ld] got lock b" ,(long )data );
209+
210+ msleep (100 );
211+
212+ printk (KERN_DEBUG "[%ld] unlock b" ,(long )data );
213+
214+ mutex_unlock (& lock_b );
215+
216+ printk (KERN_DEBUG "[%ld] unlock a" ,(long )data );
217+
218+ mutex_unlock (& lock_a );
188219
189- msleep (100 );
220+ break ;
221+ case thread_id_1 :
222+
223+ printk (KERN_DEBUG "[%ld] getting lock b" ,(long )data );
224+
225+ mutex_lock (& lock_b );
226+
227+ printk (KERN_DEBUG "[%ld] got lock b" ,(long )data );
228+
229+ printk (KERN_DEBUG "[%ld] getting lock a" ,(long )data );
230+
231+ mutex_lock (& lock_a );
232+
233+ printk (KERN_DEBUG "[%ld] got lock a" ,(long )data );
234+
235+ msleep (100 );
236+
237+
238+ printk (KERN_DEBUG "[%ld] unlock a" ,(long )data );
239+
240+ mutex_unlock (& lock_a );
241+
242+ printk (KERN_DEBUG "[%ld] unlock b" ,(long )data );
243+
244+ mutex_unlock (& lock_b );
245+
246+ break ;
247+ default :
248+ printk (KERN_ERR "err thread id" );
249+ break ;
250+
251+ }
190252}
191253
192254static int test_thread (void * data )
@@ -220,6 +282,10 @@ static int thread_init(void)
220282 printk (KERN_DEBUG "[%s] [%s] ..." ,MODULE_TAG ,__FUNCTION__ );
221283
222284 sema_init (& sem_thread , THREAD_WORK_INIT_VALUE );
285+
286+ mutex_init (& lock_a );
287+ mutex_init (& lock_b );
288+
223289 test_task_1 = kthread_create (test_thread , (void * )thread_id_0 , "test_task_2" );
224290
225291 if (IS_ERR (test_task_1 ))
@@ -244,6 +310,7 @@ static int thread_init(void)
244310
245311 wake_up_process (test_task_2 );
246312
313+
247314 return 0 ;
248315}
249316static void thread_exit (void )
@@ -274,6 +341,7 @@ static __exit void test_exit(void)
274341//EXPORT_SYMBOL (symbol);
275342//EXPORT_SYMBOL_GPL (symbol);
276343//
344+ MODULE_LICENSE ("Dual BSD/GPL" );
277345
278346module_init (test_init );
279347module_exit (test_exit );
0 commit comments