Blame view

lib/livepatch/test_klp_callbacks_busy.c 1.47 KB
a2818ee4d   Joe Lawrence   selftests/livepat...
1
2
3
4
5
6
7
  // SPDX-License-Identifier: GPL-2.0
  // Copyright (C) 2018 Joe Lawrence <joe.lawrence@redhat.com>
  
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  
  #include <linux/module.h>
  #include <linux/kernel.h>
547840bd5   Joe Lawrence   selftests/livepat...
8
  #include <linux/sched.h>
a2818ee4d   Joe Lawrence   selftests/livepat...
9
10
  #include <linux/workqueue.h>
  #include <linux/delay.h>
547840bd5   Joe Lawrence   selftests/livepat...
11
12
13
14
  /* load/run-time control from sysfs writer  */
  static bool block_transition;
  module_param(block_transition, bool, 0644);
  MODULE_PARM_DESC(block_transition, "block_transition (default=false)");
a2818ee4d   Joe Lawrence   selftests/livepat...
15
16
  
  static void busymod_work_func(struct work_struct *work);
547840bd5   Joe Lawrence   selftests/livepat...
17
  static DECLARE_WORK(work, busymod_work_func);
a2818ee4d   Joe Lawrence   selftests/livepat...
18
19
20
  
  static void busymod_work_func(struct work_struct *work)
  {
547840bd5   Joe Lawrence   selftests/livepat...
21
22
23
24
25
26
27
28
29
30
  	pr_info("%s enter
  ", __func__);
  
  	while (READ_ONCE(block_transition)) {
  		/*
  		 * Busy-wait until the sysfs writer has acknowledged a
  		 * blocked transition and clears the flag.
  		 */
  		msleep(20);
  	}
a2818ee4d   Joe Lawrence   selftests/livepat...
31
32
33
34
35
36
37
38
  	pr_info("%s exit
  ", __func__);
  }
  
  static int test_klp_callbacks_busy_init(void)
  {
  	pr_info("%s
  ", __func__);
547840bd5   Joe Lawrence   selftests/livepat...
39
40
41
42
43
44
45
46
47
  	schedule_work(&work);
  
  	if (!block_transition) {
  		/*
  		 * Serialize output: print all messages from the work
  		 * function before returning from init().
  		 */
  		flush_work(&work);
  	}
a2818ee4d   Joe Lawrence   selftests/livepat...
48
49
50
51
52
  	return 0;
  }
  
  static void test_klp_callbacks_busy_exit(void)
  {
547840bd5   Joe Lawrence   selftests/livepat...
53
54
  	WRITE_ONCE(block_transition, false);
  	flush_work(&work);
a2818ee4d   Joe Lawrence   selftests/livepat...
55
56
57
58
59
60
61
62
63
  	pr_info("%s
  ", __func__);
  }
  
  module_init(test_klp_callbacks_busy_init);
  module_exit(test_klp_callbacks_busy_exit);
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR("Joe Lawrence <joe.lawrence@redhat.com>");
  MODULE_DESCRIPTION("Livepatch test: busy target module");