Skip to content

Commit c5e4bd7

Browse files
committed
Add hlist usage example
Change-Id: Ibe51396e3a0cb24189cfa760c783a97258c521db
1 parent 9e2a8b4 commit c5e4bd7

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

debug/hlist/Makefile

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Makefile
2+
# Comment/uncomment the following line to disable/enable debugging
3+
# DEBUG = y
4+
5+
# Usage
6+
# make CROSS_COMPILE=<cross_compiler_prefix> KERNEL_DIR=<your_kernel_dir> KERNEL_BUID_OUTPUT=<kernel_buid_output>
7+
#
8+
# make CROSS_COMPILE=/home/zeroway/rk3399/tool/gcc-linaro-4.9.4-2017.01-i686_aarch64-linux-gnu/bin/aarch64-linux-gnu- KERNEL_DIR=/home/zeroway/rk3399/src/firefly/kernel KERNEL_BUID_OUTPUT=/home/zeroway/rk3399/src/firefly/out/target/product/rk3399_firefly_box/obj/KERNEL
9+
10+
# Add your debugging flag (or not) to CFLAGS
11+
ifeq ($(DEBUG),y)
12+
DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
13+
else
14+
DEBFLAGS = -O2
15+
endif
16+
17+
obj-m := demo.o
18+
19+
KERNEL_DIR ?= /lib/modules/`uname -r`/build
20+
KERNEL_BUID_OUTPUT ?=$(KERNEL_DIR)
21+
CC = $(CROSS_COMPILE)gcc
22+
LD = $(CROSS_COMPILE)ld
23+
PWD := $(shell pwd)
24+
ARCH := x86_64
25+
26+
modules:
27+
$(MAKE) -C $(KERNEL_DIR) ARCH=$(ARCH) M=$(PWD) O=$(KERNEL_DIR) modules
28+
29+
clean:
30+
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers
31+
32+
depend .depend dep:
33+
$(CC) $(CFLAGS) -M *.c > .depend
34+
35+
ifeq (.depend,$(wildcard .depend))
36+
include .depend
37+
endif

debug/hlist/demo.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include <linux/init.h>
2+
#include <linux/module.h>
3+
#include <linux/slab.h>
4+
#include <linux/string.h>
5+
6+
/* refercence with kernel module zd1201 */
7+
/* https://zhuanlan.zhihu.com/p/82375193 */
8+
struct AAAAA {
9+
/* hash table implement in list address */
10+
struct hlist_head nodelist;
11+
};
12+
13+
struct AAAAA_node {
14+
struct hlist_node fnode;
15+
char name[20];
16+
};
17+
18+
struct AAAAA *module5a;
19+
static int hlist_test_init(void)
20+
{
21+
struct AAAAA_node *node1;
22+
struct AAAAA_node *node2;
23+
struct AAAAA_node *pos;
24+
25+
/* another hlist_node to use as temporary storage */
26+
struct hlist_node *tmp_node;
27+
28+
module5a = kmalloc(sizeof(struct AAAAA), GFP_ATOMIC);
29+
if (!module5a)
30+
return -1;
31+
32+
node1 = kmalloc(sizeof(*node1), GFP_ATOMIC);
33+
if (!node1)
34+
return -1;
35+
strcpy(node1->name, "Node1");
36+
37+
node2 = kmalloc(sizeof(*node2), GFP_ATOMIC);
38+
if (!node2)
39+
return -1;
40+
strcpy(node2->name, "Node2");
41+
42+
/* init hash table */
43+
INIT_HLIST_HEAD(&module5a->nodelist);
44+
45+
/* add node to hash table */
46+
hlist_add_head(&node1->fnode, &module5a->nodelist);
47+
hlist_add_head(&node2->fnode, &module5a->nodelist);
48+
49+
hlist_for_each_entry_safe(pos, tmp_node, &module5a->nodelist, fnode) {
50+
printk(KERN_ALERT"Iter node : %s\n", pos->name);
51+
}
52+
53+
return 0;
54+
}
55+
56+
static void hlist_test_exit(void)
57+
{
58+
struct AAAAA_node *pos;
59+
struct hlist_node *tmp_node;
60+
61+
hlist_for_each_entry_safe(pos, tmp_node, &module5a->nodelist, fnode) {
62+
printk(KERN_ALERT"Delete node : %s\n", pos->name);
63+
hlist_del_init(&pos->fnode);
64+
kfree(pos);
65+
}
66+
kfree(module5a);
67+
}
68+
69+
MODULE_LICENSE("Dual BSD/GPL");
70+
module_init(hlist_test_init);
71+
module_exit(hlist_test_exit);

0 commit comments

Comments
 (0)