This article introduces
stop-machine Linux kernel module. It's used for stopping the system for a while. It's an open-source software and its usage is written in its
stop-machine module stops the whole system for five seconds. Here
stop means not only all processes can not run, but also all kernel functions can not run.
All kernel functions include device drivers and the corresponding interrupt handlers. So all storage I/Os and network I/Os stops from the perspective of users. User interface devices like keyboards and mouses can not work too.
Please note that it's very difficult to emulate the stopping of the whole system by userspace programs.
This module can be used to confirm whether the system is tolerant to surprise freeze. It's far convenient than resetting the machine.
You can change the stopping time in milliseconds by modifying
For example, if you modify this value, by default 5000, to 60000, this module stops the whole system for one minute.
Let confirms whether this module can stop the whole system. First, please open a terminal emulator that is different from the one for loading this module. Then issue the following command to print the current time once a second at the former terminal emulator.
$ for ((;;)) ; do sleep 1 ; date -R ; done Sat, 04 May 2019 09:40:27 +0900 Sat, 04 May 2019 09:40:28 +0900 Sat, 04 May 2019 09:40:29 +0900 Sat, 04 May 2019 09:40:30 +0900 Sat, 04 May 2019 09:40:31 +0900 ...
Then load this module at the latter terminal emulator.
$ sudo insmod stop-machine.ko $ # You can see this prompt after five seconds
Before showing the prompt, your inputs are ignored and the display looks freeze. However, after that, the system works as usual.
Then back to the former terminal emulator. You can see the message was skipped five times after loading this module. It's between (1) and (2) in the following output.
... Sat, 04 May 2019 09:44:38 +0900 Sat, 04 May 2019 09:44:39 +0900 Sat, 04 May 2019 09:44:40 +0900 Sat, 04 May 2019 09:44:41 +0900 Sat, 04 May 2019 09:44:42 +0900 Sat, 04 May 2019 09:44:43 +0900 Sat, 04 May 2019 09:44:44 +0900 # ... (1) Sat, 04 May 2019 09:44:49 +0900 # ... (2) Sat, 04 May 2019 09:44:50 +0900 Sat, 04 May 2019 09:44:51 +0900 ...
At the last, unload this module as follows and close the two terminal emulators.
$ sudo rmmod stop-machine $
This module uses a kernel function called
stop_machine(). The spec of this function is as follows.
- Run the handler given by the caller, with stopping all the kernel, userspace processes, and hardware interrupts.
- The first argument is the above-mentioned handler.
- The second argument is passed to the handler when it's called.
- The third argument means which CPUs should be stopped. Set NULL here means this function stops all available CPUs.
This function is originally for running very important functions without interrupted by any other functions. CPU hotplug feature is one of the users of this function.
stop-machine module, the handler of
stop_machine() wastes CPU time for five seconds. It's easy!
If you're interested in the implementation of
stop_machine(), please refer to the Linux kernel's source code. The definition is in
include/linux/stop_machine.h and the implementation is in