diff --git a/tuned/plugins/plugin_disk.py b/tuned/plugins/plugin_disk.py index 1438e35..d6feb06 100644 --- a/tuned/plugins/plugin_disk.py +++ b/tuned/plugins/plugin_disk.py @@ -100,19 +100,20 @@ class DiskPlugin(hotplug.Plugin): 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 @@ class DiskPlugin(hotplug.Plugin): 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 @@ class DiskPlugin(hotplug.Plugin): 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 @@ class DiskPlugin(hotplug.Plugin): # 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 @@ class DiskPlugin(hotplug.Plugin): @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 @@ class DiskPlugin(hotplug.Plugin): @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 @@ class DiskPlugin(hotplug.Plugin): @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 @@ class DiskPlugin(hotplug.Plugin): @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