diff --git a/tuned/plugins/plugin_disk.py b/tuned/plugins/plugin_disk.py index 4e7e57b..5f064f2 100644 --- a/tuned/plugins/plugin_disk.py +++ b/tuned/plugins/plugin_disk.py @@ -3,6 +3,7 @@ import tuned.plugins import tuned.logs import tuned.monitors import tuned.utils.commands +import tuned.utils.storage import struct log = tuned.logs.get() @@ -50,6 +51,7 @@ class DiskPlugin(tuned.plugins.Plugin): return { "elevator" : "", "disk_alpm" : "", + "disk_apm" : "", } def _update_idle(self, dev): @@ -98,6 +100,7 @@ class DiskPlugin(tuned.plugins.Plugin): if self.devidle[dev]["LEVEL"] > 0: os.system("hdparm -S0 -B255 /dev/"+dev+" > /dev/null 2>&1") self._revert_elevator(dev) + self._revert_disk_apm(dev) self._revert_disk_alpm() @@ -106,6 +109,7 @@ class DiskPlugin(tuned.plugins.Plugin): for dev, devload in load.iteritems(): if not self._elevator_set: self._apply_elevator(dev) + self._apply_disk_apm(dev) self._init_stats(dev) self._update_stats(dev, devload) @@ -140,12 +144,12 @@ class DiskPlugin(tuned.plugins.Plugin): # Commands: def _apply_elevator(self, dev): - sys_file = os.path.join("/sys/block/", dev, "queue/scheduler") - tuned.utils.commands.revert_file("disk", "elevator_" + dev, sys_file) + self._revert_elevator(dev) if len(self._options["elevator"]) == 0: return False + sys_file = os.path.join("/sys/block/", dev, "queue/scheduler") tuned.utils.commands.set_file("disk", "elevator_" + dev, sys_file, self._options["elevator"]) return True @@ -154,9 +158,7 @@ class DiskPlugin(tuned.plugins.Plugin): tuned.utils.commands.revert_file("disk", "elevator_" + dev, sys_file) def _apply_disk_alpm(self): - for host in os.listdir("/sys/class/scsi_host/"): - sys_file = os.path.join("/sys/class/scsi_host/", host, "link_power_management_policy") - tuned.utils.commands.revert_file("disk", "disk_alpm", sys_file) + self._revert_disk_alpm() if len(self._options["disk_alpm"]) == 0: return False @@ -187,3 +189,20 @@ class DiskPlugin(tuned.plugins.Plugin): for host in os.listdir("/sys/class/scsi_host/"): sys_file = os.path.join("/sys/class/scsi_host/", host, "link_power_management_policy") tuned.utils.commands.revert_file("disk", "disk_alpm", sys_file) + + def _apply_disk_apm(self, dev): + self._revert_disk_apm(dev) + + if len(self._options["disk_apm"]) == 0: + return False + + #TODO: get current value using hdparm -B. My disk does not support it... + tuned.utils.commands.execute(["hdparm", "-B", self._options["disk_apm"], "/dev/" + dev]) + return True + + def _revert_disk_apm(self, dev): + storage = tuned.utils.storage.Storage.get_instance() + if storage.data["disk"].has_key("disk_apm_" + dev): + tuned.utils.commands.execute(["hdparm", "-B", storage.data["disk"]["disk_apm_" + dev], "/dev/" + dev]) + del storage.data["disk"]["disk_apm_" + dev] + diff --git a/tuned/utils/commands.py b/tuned/utils/commands.py index 28f0bb8..29f3a49 100644 --- a/tuned/utils/commands.py +++ b/tuned/utils/commands.py @@ -21,6 +21,7 @@ import tuned.logs import tuned.monitors import tuned.utils.storage import struct +from subprocess import * log = tuned.logs.get() @@ -71,3 +72,15 @@ def set_file(key, subkey, f, data): _write_to_file(f, data) +def execute(args): + out = "" + try: + proc = Popen(args, stdout=PIPE, stderr=PIPE) + out, err = proc.communicate() + + if proc.returncode: + log.error("Executing %s error: %s" % (args[0], err[:-1])) + except (OSError,IOError) as e: + log.error("Executing %s error: %s" % (args[0], e)) + return out +