From afd26f62774daf81a9f95d256d415547300f7757 Mon Sep 17 00:00:00 2001 From: Jan Vcelak Date: Tue, 29 Jan 2013 13:26:25 +0100 Subject: [PATCH] tuned: restart ktune 10 seconds after last SIGUSR2 was received When multiple devices are added into the system, udev restarted ktune daemon for each new device. This can cause races within ktune. This mechanism allows triggering just one ktune restart when multiple devices are inserted. --- tuned | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tuned b/tuned index 0fa9278..c6f07cb 100755 --- a/tuned +++ b/tuned @@ -21,12 +21,13 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -import sys, os.path, getopt, atexit, signal +import sys, os.path, getopt, atexit, signal, subprocess INIT_TIMEOUT = 3 TUNEDDIR = "/usr/share/tuned" if not TUNEDDIR in sys.path: sys.path.append(TUNEDDIR) +KTUNE_DEFERRED_RESTART_TIME = 10 import logging, tuned_logging log = logging.getLogger("tuned") @@ -87,6 +88,16 @@ def daemonize_handle_signal(signum, frame): else: pass +def ktune_deferred_restart(signum, frame): + log.debug("received signal %d, ktune restart requested" % signum) + signal.alarm(KTUNE_DEFERRED_RESTART_TIME) + +def ktune_do_restart(signum, frame): + log.info("performing ktune conditional restart") + restart = subprocess.Popen(["service", "ktune", "condrestart"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (stdout, stderr) = restart.communicate() + log.debug("exit status %d" % restart.returncode) + if __name__ == "__main__": try: opts, args = getopt.getopt(sys.argv[1:], "dc:D", ["daemon", "config=", "debug"]) @@ -135,5 +146,9 @@ if __name__ == "__main__": atexit.register(tuned.cleanup) signal.signal(signal.SIGTERM, handler) + # handle ktune restart (triggered from udev rule) + signal.signal(signal.SIGALRM, ktune_do_restart) + signal.signal(signal.SIGUSR2, ktune_deferred_restart) + tuned.run() tuned.cleanup()