Mutex

#

Version

Freebsd

14.1.0

  • In this program, you are going to learn

  • How to use mutex in kernel module ?

 1#include<sys/param.h>
 2#include<sys/kernel.h>
 3#include<sys/module.h>
 4#include<sys/systm.h>
 5#include<sys/mutex.h>
 6
 7static struct mtx lock; 
 8
 9static int count = 0;
10
11static void increment_counter(void) 
12{
13	mtx_lock(&lock);
14	printf("Count = %d\n",count);
15	count++;
16	mtx_unlock(&lock);
17}
18
19static int event_handler(struct module *module, int event, void *arg)
20{
21        int e = 0;
22
23        switch(event)
24        {
25        case MOD_LOAD:
26                printf("Module loaded\n");
27		mtx_init(&lock, "my_mutex", NULL, MTX_DEF | MTX_NOWITNESS);
28
29		increment_counter();
30		increment_counter();
31		break;
32	case MOD_UNLOAD:
33                printf("Module unloaded\n");
34		mtx_destroy(&lock);
35                break;
36
37        default:
38                e = EOPNOTSUPP;
39                break;
40        }
41return(e);
42}
43
44static moduledata_t mutex_data = { 
45	"mutex_module",
46        event_handler,
47        NULL
48};
49
50DECLARE_MODULE(mutex_module, mutex_data, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);
51
52
1SRCS=mutex.c
2KMOD=mutex_module
3
4.include <bsd.kmod.mk>
 1$ pwd
 2basic_device_drivers/mutex
 3
 4
 5$ ls
 6mutex.c  Makefile
 7
 8
 9$ make
10
11
12$ ls
13.depend.mutex.o export_syms     machine         mutex.o         opt_global.h
14Makefile        i386            mutex.c         mutex_module.ko x86
  • Load the module using kldload

1$ kldload -v ./mutex_module.ko
2Loaded ./mutex_module.ko, id=8
  • Run kldstat command to check the loaded modules

 1$ kldstat
 2Id Refs Address                Size Name
 3 1   29 0xffffffff80200000  1f6c698 kernel
 4 2    1 0xffffffff8216d000   772c70 zfs.ko
 5 3    1 0xffffffff828e1000     7850 cryptodev.ko
 6 4    1 0xffffffff83218000     3220 intpm.ko
 7 5    1 0xffffffff8321c000     2178 smbus.ko
 8 6    1 0xffffffff8321f000     3360 uhid.ko
 9 7    1 0xffffffff83223000     3360 wmt.ko
10 8    1 0xffffffff83227000     20d4 mutex_module.ko
  • Run dmesg command to check the kernel logs

1$ dmesg
2Module loaded
3Count = 0
4Count = 1
  • Unload the module using kldunload

1$ kldunload -v ./mutex_module.ko
2Unloading mutex_module.ko, id=8
  • Run kldstat command to check the loaded modules

1$ kldstat
2Id Refs Address                Size Name
3 1   27 0xffffffff80200000  1f6c698 kernel
4 2    1 0xffffffff8216d000   772c70 zfs.ko
5 3    1 0xffffffff828e1000     7850 cryptodev.ko
6 4    1 0xffffffff83218000     3220 intpm.ko
7 5    1 0xffffffff8321c000     2178 smbus.ko
8 6    1 0xffffffff8321f000     3360 uhid.ko
9 7    1 0xffffffff83223000     3360 wmt.ko
  • Run dmesg command to check the kernel logs

1$ dmesg
2Module loaded
3Count = 0
4Count = 1
5Module unloaded