From 053638215863564b7d8bd3e67cffc3f670bd3c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavol=20=C5=BD=C3=A1=C4=8Dik?= Date: Wed, 29 May 2024 13:33:02 +0200 Subject: [PATCH] Disk plugin: make hdparm device checks lazy The disk plugin checks each device for hdparm support during initialization. When using many disk devices, this can lead to unwanted delays in profile application. This change makes the hdparm check lazy by postponing it to the moment when hdparm is actually needed, i.e., during dynamic tuning or when setting spindown/apm. Each device is checked at most once - the plugin now stores the sets of hdparm-supported devices and hdparm-unsupported devices). Resolves: RHEL-6891 --- tuned/plugins/plugin_disk.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/tuned/plugins/plugin_disk.py b/tuned/plugins/plugin_disk.py index 1438e354..d6feb06c 100644 --- a/tuned/plugins/plugin_disk.py +++ b/tuned/plugins/plugin_disk.py @@ -100,19 +100,20 @@ def _init_devices(self): self._devices_supported = True self._use_hdparm = True self._free_devices = set() - self._hdparm_apm_devices = set() + self._hdparm_apm_device_support = dict() for device in self._hardware_inventory.get_devices("block"): if self._device_is_supported(device): self._free_devices.add(device.sys_name) - if self._use_hdparm and self._is_hdparm_apm_supported(device.sys_name): - self._hdparm_apm_devices.add(device.sys_name) - self._assigned_devices = set() def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("block", x) for x in devices] def _is_hdparm_apm_supported(self, device): + if not self._use_hdparm: + return False + if device in self._hdparm_apm_device_support: + return self._hdparm_apm_device_support[device] (rc, out, err_msg) = self._cmd.execute(["hdparm", "-C", "/dev/%s" % device], \ no_errors = [errno.ENOENT], return_err=True) if rc == -errno.ENOENT: @@ -122,10 +123,13 @@ def _is_hdparm_apm_supported(self, device): elif rc: log.info("Device '%s' not supported by hdparm" % device) log.debug("(rc: %s, msg: '%s')" % (rc, err_msg)) + self._hdparm_apm_device_support[device] = False return False elif "unknown" in out: log.info("Driver for device '%s' does not support apm command" % device) + self._hdparm_apm_device_support[device] = False return False + self._hdparm_apm_device_support[device] = True return True @classmethod @@ -232,7 +236,7 @@ def _drive_spinning(self, device): return not "standby" in out and not "sleeping" in out def _instance_update_dynamic(self, instance, device): - if not device in self._hdparm_apm_devices: + if not self._is_hdparm_apm_supported(device): return load = instance._load_monitor.get_device_load(device) if load is None: @@ -315,7 +319,7 @@ def _instance_apply_dynamic(self, instance, device): # At the moment we support dynamic tuning just for devices compatible with hdparm apm commands # If in future will be added new functionality not connected to this command, # it is needed to change it here - if device not in self._hdparm_apm_devices: + if not self._is_hdparm_apm_supported(device): log.info("There is no dynamic tuning available for device '%s' at time" % device) else: super(DiskPlugin, self)._instance_apply_dynamic(instance, device) @@ -350,7 +354,7 @@ def _get_elevator(self, device, ignore_missing=False): @command_set("apm", per_device=True) def _set_apm(self, value, device, sim, remove): - if device not in self._hdparm_apm_devices: + if not self._is_hdparm_apm_supported(device): if not sim: log.info("apm option is not supported for device '%s'" % device) return None @@ -366,7 +370,7 @@ def _set_apm(self, value, device, sim, remove): @command_get("apm") def _get_apm(self, device, ignore_missing=False): - if device not in self._hdparm_apm_devices: + if not self._is_hdparm_apm_supported(device): if not ignore_missing: log.info("apm option is not supported for device '%s'" % device) return None @@ -390,7 +394,7 @@ def _get_apm(self, device, ignore_missing=False): @command_set("spindown", per_device=True) def _set_spindown(self, value, device, sim, remove): - if device not in self._hdparm_apm_devices: + if not self._is_hdparm_apm_supported(device): if not sim: log.info("spindown option is not supported for device '%s'" % device) return None @@ -406,7 +410,7 @@ def _set_spindown(self, value, device, sim, remove): @command_get("spindown") def _get_spindown(self, device, ignore_missing=False): - if device not in self._hdparm_apm_devices: + if not self._is_hdparm_apm_supported(device): if not ignore_missing: log.info("spindown option is not supported for device '%s'" % device) return None