Skip to content

Commit db95ed0

Browse files
committed
tools: labs: Add kernel profiling templates
Signed-off-by: Sergiu Weisz <sergiu121@gmail.com>
1 parent 4368092 commit db95ed0

File tree

14 files changed

+1805
-0
lines changed

14 files changed

+1805
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ccflags-y = -Wno-unused-function -Wno-unused-label -Wno-unused-variable
2+
3+
obj-m := io.o
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <linux/kernel.h>
2+
#include <linux/init.h>
3+
#include <linux/module.h>
4+
#include <linux/fs.h>
5+
#include <linux/sched.h>
6+
#include <linux/slab.h>
7+
#include <linux/uaccess.h>
8+
#include <linux/sched/task.h>
9+
10+
#define MY_MAJOR 42
11+
#define MY_MINOR 0
12+
#define MODULE_NAME "deferred"
13+
14+
#define TIMER_TYPE_NONE -1
15+
#define TIMER_TYPE_SET 0
16+
#define TIMER_TYPE_ALLOC 1
17+
#define TIMER_TYPE_MON 2
18+
19+
MODULE_DESCRIPTION("Generate disruptive interrupts");
20+
MODULE_AUTHOR("SO2");
21+
MODULE_LICENSE("GPL");
22+
23+
struct timer_list timer;
24+
25+
static void timer_handler(struct timer_list *tl)
26+
{
27+
unsigned long deadline = jiffies + HZ;
28+
29+
while (jiffies < deadline) {
30+
(void)0;
31+
}
32+
mod_timer(&timer, jiffies + HZ);
33+
}
34+
35+
static int deferred_init(void)
36+
{
37+
int err;
38+
39+
pr_info("[deferred_init] Init module\n");
40+
41+
timer_setup(&timer, timer_handler, 0);
42+
mod_timer(&timer, jiffies + 5 * HZ);
43+
44+
return 0;
45+
}
46+
47+
static void deferred_exit(void)
48+
{
49+
struct mon_proc *p, *n;
50+
51+
pr_info("[deferred_exit] Exit module\n" );
52+
53+
del_timer_sync(&timer);
54+
}
55+
56+
module_init(deferred_init);
57+
module_exit(deferred_exit);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CFLAGS = -Wall -m32 -pthread -g
2+
LDFLAGS = -static -m32 -pthread
3+
4+
scheduling: scheduling.o
5+
6+
.PHONY: clean
7+
8+
clean:
9+
-rm -f *~ *.o scheduling
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <stdio.h>
2+
#include <unistd.h>
3+
#include <sys/types.h>
4+
#include <sys/time.h>
5+
#include <pthread.h>
6+
#include <stdlib.h>
7+
8+
void helper(int i) {
9+
printf("%d\n", i);
10+
}
11+
12+
void * thread_start(void *arg) {
13+
14+
helper((int) arg);
15+
pthread_exit(NULL);
16+
}
17+
18+
int main(int argc, char *argv[]) {
19+
20+
int pid = 0;
21+
pthread_t tid[300];
22+
struct timeval begin, end;
23+
24+
if (argc < 1) {
25+
printf("./scheduling <mode>\n");
26+
return -1;
27+
}
28+
29+
gettimeofday(&begin, NULL);
30+
31+
for (int i = 0; i < 300; i++) {
32+
if (atoi(argv[1]) == 0) {
33+
pid = pthread_create(&tid[i], NULL, &thread_start, (void *) i);
34+
if (pid != 0) {
35+
break;
36+
}
37+
} else {
38+
pid = fork();
39+
if (pid == 0) {
40+
helper(i);
41+
break;
42+
}
43+
}
44+
}
45+
46+
gettimeofday(&end, NULL);
47+
48+
return 0;
49+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CFLAGS=-Wall -m32
2+
LDFLAGS=-static -m32
3+
4+
memory: memory.o
5+
6+
.PHONY: clean
7+
8+
clean:
9+
-rm -f *~ *.o memory
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <string.h>
4+
#include <unistd.h>
5+
#include <sys/types.h>
6+
#include <sys/time.h>
7+
#include <sys/stat.h>
8+
#include <fcntl.h>
9+
#include <sys/mman.h>
10+
11+
int main(int argc, char *argv[]) {
12+
13+
int src_fd, dst_fd, mode;
14+
struct stat st;
15+
unsigned long to_write, size, blk_size;
16+
char *src_p, *dst_p, *buf;
17+
18+
if (argc < 3) {
19+
printf("./memory <mode> <blk_size> <src> <dst>\n");
20+
return -1;
21+
}
22+
23+
mode = atoi(argv[1]);
24+
blk_size = atoi(argv[2]);
25+
26+
printf("mode %d blk_size %ld src %s dst %s\n",
27+
mode, blk_size, argv[3], argv[4]);
28+
29+
src_fd = open(argv[3], O_RDONLY);
30+
if (src_fd < 0)
31+
return src_fd;
32+
33+
stat(argv[3], &st);
34+
size = to_write = st.st_size;
35+
36+
if (mode == 0) {
37+
src_p = mmap(NULL, size, PROT_READ, MAP_SHARED, src_fd, 0);
38+
if (src_p < 0)
39+
return -1;
40+
}
41+
42+
dst_fd = open(argv[4], O_CREAT | O_RDWR | O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
43+
if (dst_fd < 0)
44+
return -1;
45+
46+
ftruncate(dst_fd, size);
47+
48+
if (mode == 0) {
49+
dst_p = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, dst_fd, 0);
50+
if (dst_p < 0)
51+
return -1;
52+
}
53+
54+
buf = malloc(blk_size);
55+
56+
while (to_write > blk_size) {
57+
if (mode == 0) {
58+
memcpy(dst_p, src_p, blk_size);
59+
} else {
60+
pread(src_fd, buf, blk_size, size - to_write);
61+
pwrite(dst_fd, buf, blk_size, size - to_write);
62+
}
63+
64+
to_write -= blk_size;
65+
dst_p += blk_size;
66+
src_p += blk_size;
67+
}
68+
69+
if (mode == 0) {
70+
memcpy(dst_p, src_p, to_write);
71+
msync(dst_p - size, size, MS_SYNC);
72+
} else {
73+
pread(src_fd, buf, to_write, to_write);
74+
pwrite(dst_fd, buf, blk_size, to_write);
75+
}
76+
77+
78+
close(src_fd);
79+
close(dst_fd);
80+
81+
return 0;
82+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
EXTRA_CFLAGS = -Wall -g -Wno-unused
2+
3+
obj-m = bio.o
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/fs.h>
4+
#include <linux/wait.h>
5+
#include <linux/sched.h>
6+
#include <linux/genhd.h>
7+
#include <linux/blkdev.h>
8+
#include <linux/kthread.h>
9+
#include <linux/delay.h>
10+
11+
MODULE_AUTHOR("SO2");
12+
MODULE_DESCRIPTION("Relay disk");
13+
MODULE_LICENSE("GPL");
14+
15+
#define KERN_LOG_LEVEL KERN_ALERT
16+
17+
#define PHYSICAL_DISK_NAME "/dev/vdb"
18+
#define KERNEL_SECTOR_SIZE 512
19+
20+
#define MAX_BIO 30000
21+
#define MAX_THREAD 20
22+
#define MAX_RUNS 40
23+
24+
25+
/* pointer to physical device structure */
26+
static struct block_device *phys_bdev;
27+
28+
struct bio *bio[MAX_BIO];
29+
struct page *page[MAX_BIO];
30+
31+
static void alloc_io(struct block_device *bdev)
32+
{
33+
int i;
34+
35+
for (i = 0; i < MAX_BIO; i++) {
36+
bio[i] = bio_alloc(GFP_NOIO, 1);
37+
bio[i]->bi_disk = bdev->bd_disk;
38+
bio[i]->bi_opf = REQ_OP_READ;
39+
40+
bio[i]->bi_iter.bi_sector = i;
41+
page[i] = alloc_page(GFP_NOIO);
42+
bio_add_page(bio[i], page[i], KERNEL_SECTOR_SIZE, 0);
43+
}
44+
}
45+
46+
static struct block_device *open_disk(char *name)
47+
{
48+
struct block_device *bdev;
49+
50+
bdev = blkdev_get_by_path(name, FMODE_READ | FMODE_WRITE | FMODE_EXCL, THIS_MODULE);
51+
if (IS_ERR(bdev)) {
52+
printk(KERN_ERR "blkdev_get_by_path\n");
53+
return NULL;
54+
}
55+
56+
return bdev;
57+
}
58+
59+
int my_thread_f(void *data)
60+
{
61+
int part, sec, i, run;
62+
63+
part = (int) data;
64+
sec = MAX_BIO / MAX_THREAD;
65+
66+
for (run = 0; run < MAX_RUNS; run++) {
67+
for (i = sec * part; i < (part + 1) * sec; i++)
68+
submit_bio_wait(bio[i]);
69+
msleep(30 * 1000);
70+
}
71+
72+
do_exit(0);
73+
}
74+
75+
static int __init relay_init(void)
76+
{
77+
int i = 0;
78+
79+
phys_bdev = open_disk(PHYSICAL_DISK_NAME);
80+
if (phys_bdev == NULL) {
81+
printk(KERN_ERR "[relay_init] No such device\n");
82+
return -EINVAL;
83+
}
84+
85+
alloc_io(phys_bdev);
86+
87+
for (i = 0; i < MAX_THREAD; i++)
88+
kthread_run(my_thread_f, i, "%skwriterd%d", "my", (void *)i);
89+
90+
return 0;
91+
}
92+
93+
static void close_disk(struct block_device *bdev)
94+
{
95+
blkdev_put(bdev, FMODE_READ | FMODE_WRITE | FMODE_EXCL);
96+
}
97+
98+
static void __exit relay_exit(void)
99+
{
100+
int i;
101+
102+
for (i = 0; i < MAX_BIO; i++) {
103+
bio_put(bio[i]);
104+
__free_page(page[i]);
105+
}
106+
close_disk(phys_bdev);
107+
}
108+
109+
module_init(relay_init);
110+
module_exit(relay_exit);

0 commit comments

Comments
 (0)