diff --git a/tuned/plugins/plugin_cpu.py b/tuned/plugins/plugin_cpu.py index f2a54bc..287aa45 100644 --- a/tuned/plugins/plugin_cpu.py +++ b/tuned/plugins/plugin_cpu.py @@ -16,8 +16,16 @@ class CPULatencyPlugin(tuned.plugins.Plugin): super(self.__class__, self).__init__(None, options) self._latency = None + self._load_monitor = None self._cpu_latency_fd = os.open("/dev/cpu_dma_latency", os.O_WRONLY) - self._load_monitor = tuned.monitors.get_repository().create("load", devices) + + def _delayed_init(self): + if self._options["force_latency"] is None: + self._load_monitor = tuned.monitors.get_repository().create("load", self._devices) + self.update_tuning = self._update_tuning_dynamic + else: + self._set_latency(self._options["force_latency"]) + self.update_tuning = self._update_tuning_forced @classmethod def _get_default_options(cls): @@ -25,14 +33,25 @@ class CPULatencyPlugin(tuned.plugins.Plugin): "load_threshold" : 0.2, "latency_low" : 100, "latency_high" : 1000, + "force_latency" : None, } def cleanup(self): - tuned.monitors.get_repository().delete(self._load_monitor) + if self._load_monitor is not None: + tuned.monitors.get_repository().delete(self._load_monitor) os.close(self._cpu_latency_fd) def update_tuning(self): + old_update_tuning = self.update_tuning + self._delayed_init() + assert self.update_tuning != old_update_tuning + self.update_tuning() + + def _update_tuning_forced(self): + pass + + def _update_tuning_dynamic(self): load = self._load_monitor.get_load()["system"] if load < self._options["load_threshold"]: self._set_latency(self._options["latency_high"])