[powertop] Print commands which reproduce the tunings into html log (html-print-commands patch)

Jaroslav Škarvada jskarvad at fedoraproject.org
Mon Mar 26 12:24:43 UTC 2012


commit a10dfdd9cb732426c0ae68a576f907263dfbc676
Author: Jaroslav Škarvada <jskarvad at redhat.com>
Date:   Mon Mar 26 14:24:38 2012 +0200

    Print commands which reproduce the tunings into html log (html-print-commands patch)

 powertop-1.98-html-print-commands.patch |  385 +++++++++++++++++++++++++++++++
 powertop.spec                           |   14 +-
 2 files changed, 398 insertions(+), 1 deletions(-)
---
diff --git a/powertop-1.98-html-print-commands.patch b/powertop-1.98-html-print-commands.patch
new file mode 100644
index 0000000..b4e746b
--- /dev/null
+++ b/powertop-1.98-html-print-commands.patch
@@ -0,0 +1,385 @@
+diff --git a/tuning/bluetooth.cpp b/tuning/bluetooth.cpp
+index 3957316..cc98642 100644
+--- a/tuning/bluetooth.cpp
++++ b/tuning/bluetooth.cpp
+@@ -46,6 +46,8 @@
+ bt_tunable::bt_tunable(void) : tunable("", 1.0, "Good", "Bad", "Unknown")
+ {
+ 	sprintf(desc, _("Bluetooth device interface status"));
++	strcpy(toggle_bad, "/usr/sbin/hciconfig hci0 up &> /dev/null &");
++	strcpy(toggle_good, "/usr/sbin/hciconfig hci0 down &> /dev/null");
+ }
+ 
+ 
+@@ -180,6 +182,16 @@ void bt_tunable::toggle(void)
+ 	system("/usr/sbin/hciconfig hci0 down &> /dev/null");
+ }
+ 
++const char *bt_tunable::toggle_script(void)
++{
++	int good;
++	good = good_bad();
++
++	if (good == TUNE_GOOD) {
++		return toggle_bad;
++	}
++	return toggle_good;
++}
+ 
+ 
+ void add_bt_tunable(void)
+diff --git a/tuning/bluetooth.h b/tuning/bluetooth.h
+index 27e15f1..ecb667d 100644
+--- a/tuning/bluetooth.h
++++ b/tuning/bluetooth.h
+@@ -39,6 +39,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_bt_tunable(void);
+diff --git a/tuning/cpufreq.cpp b/tuning/cpufreq.cpp
+index bf2b8ae..3d0dbea 100644
+--- a/tuning/cpufreq.cpp
++++ b/tuning/cpufreq.cpp
+@@ -35,6 +35,7 @@
+ #include <unistd.h> 
+ #include <dirent.h>
+ #include <errno.h>
++#include <sys/stat.h>
+ 
+ #include "../lib.h"
+ #include "cpufreq.h"
+@@ -153,6 +154,54 @@ void cpufreq_tunable::toggle(void)
+ 	closedir(dir);
+ }
+ 
++const char *cpufreq_tunable::toggle_script(void) {
++	DIR *dir;
++	struct dirent *dirent;
++	FILE *file;
++	char filename[PATH_MAX];
++	char tmp[4096];
++	struct stat statbuf;
++	int good;
++	good = good_bad();
++
++	strcpy(toggle_good, "/sbin/modprobe cpufreq_ondemand > /dev/null 2>&1\n");
++
++	if (good == TUNE_GOOD) {
++		dir = opendir("/sys/devices/system/cpu");
++		if (!dir)
++			return NULL;
++
++		while ((dirent = readdir(dir))) {
++			if (dirent->d_name[0]=='.')
++				continue;
++			sprintf(filename, "/sys/devices/system/cpu/%s/cpufreq/scaling_governor", dirent->d_name);
++			if (stat(filename, &statbuf) == -1)
++				continue;
++			sprintf(tmp, "echo '%s' > '%s';\n", original, filename);
++			strcat(toggle_good, tmp);
++		}
++
++		closedir(dir);
++		return toggle_good;
++	}
++
++	dir = opendir("/sys/devices/system/cpu");
++	if (!dir)
++		return NULL;
++
++	while ((dirent = readdir(dir))) {
++		if (dirent->d_name[0]=='.')
++			continue;
++		sprintf(filename, "/sys/devices/system/cpu/%s/cpufreq/scaling_governor", dirent->d_name);
++		if (stat(filename, &statbuf) == -1)
++			continue;
++		sprintf(tmp, "echo 'ondemand' > '%s';\n", filename);
++		strcat(toggle_good, tmp);
++	}
++
++	closedir(dir);
++	return toggle_good;
++}
+ 
+ 
+ void add_cpufreq_tunable(void)
+diff --git a/tuning/cpufreq.h b/tuning/cpufreq.h
+index 55af71f..983f813 100644
+--- a/tuning/cpufreq.h
++++ b/tuning/cpufreq.h
+@@ -40,6 +40,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_cpufreq_tunable(void);
+diff --git a/tuning/ethernet.cpp b/tuning/ethernet.cpp
+index 4666ac1..7687e38 100644
+--- a/tuning/ethernet.cpp
++++ b/tuning/ethernet.cpp
+@@ -54,6 +54,8 @@ ethernet_tunable::ethernet_tunable(const char *iface) : tunable("", 0.3, _("Good
+ 	memset(interf, 0, sizeof(interf));
+ 	strncpy(interf, iface, sizeof(interf));
+ 	sprintf(desc, _("Wake-on-lan status for device %s"), iface);
++	sprintf(toggle_good, "ethtool -s %s wol d;", iface);
++	
+ }
+ 
+ 
+@@ -128,6 +130,18 @@ void ethernet_tunable::toggle(void)
+ 	close(sock);
+ }
+ 
++const char *ethernet_tunable::toggle_script(void)
++{
++	int good;
++	good = good_bad();
++
++	if (good != TUNE_GOOD) {
++		return toggle_good;
++	}
++
++	return NULL;
++}
++
+ 
+ void ethtunable_callback(const char *d_name)
+ {
+diff --git a/tuning/ethernet.h b/tuning/ethernet.h
+index eeb6ebb..85810fb 100644
+--- a/tuning/ethernet.h
++++ b/tuning/ethernet.h
+@@ -40,6 +40,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_ethernet_tunable(void);
+diff --git a/tuning/runtime.cpp b/tuning/runtime.cpp
+index 03cfa0b..3c6dae8 100644
+--- a/tuning/runtime.cpp
++++ b/tuning/runtime.cpp
+@@ -77,6 +77,8 @@ runtime_tunable::runtime_tunable(const char *path, const char *bus, const char *
+ 
+ 		
+ 	}
++	sprintf(toggle_good, "echo 'auto' > '%s';", runtime_path);
++	sprintf(toggle_bad, "echo 'on' > '%s';", runtime_path);
+ }
+ 
+ int runtime_tunable::good_bad(void)
+@@ -105,6 +107,18 @@ void runtime_tunable::toggle(void)
+ 	write_sysfs(runtime_path, "auto");
+ }
+ 
++const char *runtime_tunable::toggle_script(void)
++{
++	int good;
++	good = good_bad();
++
++	if (good == TUNE_GOOD) {
++		return toggle_bad;
++	}
++
++	return toggle_good;
++}
++
+ 
+ void add_runtime_tunables(const char *bus)
+ {
+diff --git a/tuning/runtime.h b/tuning/runtime.h
+index c874241..a3c3e20 100644
+--- a/tuning/runtime.h
++++ b/tuning/runtime.h
+@@ -39,6 +39,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_runtime_tunables(const char *bus);
+diff --git a/tuning/sysfs.cpp b/tuning/sysfs.cpp
+index e1742a3..ffb2df0 100644
+--- a/tuning/sysfs.cpp
++++ b/tuning/sysfs.cpp
+@@ -39,6 +39,8 @@ sysfs_tunable::sysfs_tunable(const char *str, const char *_sysfs_path, const cha
+ 	strcpy(sysfs_path, _sysfs_path);
+ 	strcpy(target_value, _target_content);
+ 	bad_value[0] = 0;
++	sprintf(toggle_good, "echo '%s' > '%s';", target_value, sysfs_path);
++	sprintf(toggle_bad, "echo '%s' > '%s';", bad_value, sysfs_path);
+ }
+ 
+ int sysfs_tunable::good_bad(void)
+@@ -77,6 +79,19 @@ void sysfs_tunable::toggle(void)
+ 	write_sysfs(sysfs_path, target_value);
+ }
+ 
++const char *sysfs_tunable::toggle_script(void) {
++	int good;
++	good = good_bad();
++
++	if (good == TUNE_GOOD) {
++		if (strlen(bad_value) > 0)
++			return toggle_bad;
++		return NULL;
++	}
++
++	return toggle_good;
++}
++
+ 
+ void add_sysfs_tunable(const char *str, const char *_sysfs_path, const char *_target_content)
+ {
+diff --git a/tuning/sysfs.h b/tuning/sysfs.h
+index 9fee4c0..ac7938c 100644
+--- a/tuning/sysfs.h
++++ b/tuning/sysfs.h
+@@ -42,6 +42,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_sysfs_tunable(const char *str, const char *_sysfs_path, const char *_target_content);
+diff --git a/tuning/tunable.h b/tuning/tunable.h
+index a4e994d..dacbd79 100644
+--- a/tuning/tunable.h
++++ b/tuning/tunable.h
+@@ -42,6 +42,9 @@ class tunable {
+ 	char good_string[128];
+ 	char bad_string[128];
+ 	char neutral_string[128];
++protected:
++	char toggle_good[4096];
++	char toggle_bad[4096];
+ public:
+ 	char desc[4096];
+ 	double score;
+@@ -67,6 +70,8 @@ public:
+ 	virtual const char *description(void) { return desc; };
+ 
+ 	virtual void toggle(void) { };
++
++	virtual const char *toggle_script(void) { return NULL; }
+ };
+ 
+ extern vector<class tunable *> all_tunables;
+diff --git a/tuning/tuning.cpp b/tuning/tuning.cpp
+index c63f1e8..dd5b1dc 100644
+--- a/tuning/tuning.cpp
++++ b/tuning/tuning.cpp
+@@ -218,7 +218,7 @@ void html_show_tunables(void)
+ 		}
+ 
+ 		line++;
+-		fprintf(htmlout, "<tr class=\"%s\"><td>%s</td></tr>\n", tune_class_bad(line), all_tunables[i]->description());
++		fprintf(htmlout, "<tr class=\"%s\"><td>%s</td><td>%s</td></tr>\n", tune_class_bad(line), all_tunables[i]->description(), all_tunables[i]->toggle_script());
+ 	}
+ 
+ 	if (line > 0) 
+diff --git a/tuning/usb.cpp b/tuning/usb.cpp
+index 16e25d4..6bcfb07 100644
+--- a/tuning/usb.cpp
++++ b/tuning/usb.cpp
+@@ -74,6 +74,9 @@ usb_tunable::usb_tunable(const char *path, const char *name) : tunable("", 0.9,
+ 		sprintf(desc, _("Autosuspend for USB device %s [%s]"), product, name);
+ 	else if (strlen(vendor))
+ 		sprintf(desc, _("Autosuspend for USB device %s [%s]"), vendor, name);
++
++	sprintf(toggle_good, "echo 'auto' > '%s';", usb_path);
++	sprintf(toggle_bad, "echo 'on' > '%s';", usb_path);
+ }
+ 
+ int usb_tunable::good_bad(void)
+@@ -102,6 +105,17 @@ void usb_tunable::toggle(void)
+ 	write_sysfs(usb_path, "auto");
+ }
+ 
++const char *usb_tunable::toggle_script(void)
++{
++	int good;
++	good = good_bad();
++
++	if (good == TUNE_GOOD) {
++		return toggle_bad;
++	}
++
++	return toggle_good;
++}
+ 
+ void add_usb_tunables(void)
+ {
+diff --git a/tuning/usb.h b/tuning/usb.h
+index a6f9557..a257904 100644
+--- a/tuning/usb.h
++++ b/tuning/usb.h
+@@ -40,6 +40,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_usb_tunables(void);
+diff --git a/tuning/wifi.cpp b/tuning/wifi.cpp
+index 9d64a9f..8b67fc5 100644
+--- a/tuning/wifi.cpp
++++ b/tuning/wifi.cpp
+@@ -46,6 +46,9 @@ wifi_tunable::wifi_tunable(const char *_iface) : tunable("", 1.5, _("Good"), _("
+ {
+ 	strcpy(iface, _iface);
+ 	sprintf(desc, _("Wireless Power Saving for interface %s"), iface);
++	
++	sprintf(toggle_good, "iw dev %s set power_save off", iface);
++	sprintf(toggle_bad, "iw dev %s set power_save on", iface);
+ }
+ 
+ int wifi_tunable::good_bad(void)
+@@ -69,6 +72,17 @@ void wifi_tunable::toggle(void)
+ 	set_wifi_power_saving(iface, 1);
+ }
+ 
++const char *wifi_tunable::toggle_script(void)
++{
++	int good;
++	good = good_bad();
++
++	if (good == TUNE_GOOD) {
++		return toggle_bad;
++	}
++
++	return toggle_good;
++}
+ 
+ void add_wifi_tunables(void)
+ {
+diff --git a/tuning/wifi.h b/tuning/wifi.h
+index 347470e..50ca68c 100644
+--- a/tuning/wifi.h
++++ b/tuning/wifi.h
+@@ -40,6 +40,8 @@ public:
+ 
+ 	virtual void toggle(void);
+ 
++	virtual const char *toggle_script(void);
++
+ };
+ 
+ extern void add_wifi_tunables(void);
diff --git a/powertop.spec b/powertop.spec
index 1a0c16d..cbfdffd 100644
--- a/powertop.spec
+++ b/powertop.spec
@@ -1,6 +1,6 @@
 Name:          powertop
 Version:       1.98
-Release:       6%{?dist}
+Release:       7%{?dist}
 Summary:       Power consumption monitor
 
 Group:         Applications/System
@@ -8,12 +8,20 @@ License:       GPLv2
 URL:           http://www.lesswatts.org/
 #Source0:       http://www.lesswatts.org/projects/%{name}/download/%{name}-%{version}.tar.gz
 Source0:       http://www.kernel.org/pub/linux/status/powertop/%{name}-%{version}.tar.bz2
+# Sent upstream
 Patch0:        powertop-1.98-always-create-params.patch
+# Accepted upstream
 Patch1:        powertop-1.98-unknown-readings-fix.patch
+# Accepted upstream
 Patch2:        powertop-1.98-compile-fix.patch
+# Backported from upstream HEAD
 Patch3:        powertop-1.98-add-power-supply-class-support.patch
+# Sent upstream
 Patch4:        powertop-1.98-power-supply-add-power-now-support.patch
+# Sent upstream
 Patch5:        powertop-1.98-power-supply-units-fix.patch
+# Accepted upstream
+Patch6:        powertop-1.98-html-print-commands.patch
 BuildRoot:     %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: gettext, ncurses-devel, pciutils-devel, zlib-devel, libnl-devel
 
@@ -29,6 +37,7 @@ computer use more power than necessary while it is idle.
 %patch3 -p1 -b .add-power-supply-class-support.patch
 %patch4 -p1 -b .power-supply-add-power-now-support
 %patch5 -p1 -b .power-supply-units-fix
+%patch6 -p1 -b .html-print-commands
 
 %build
 make %{?_smp_mflags} CFLAGS="$RPM_OPT_FLAGS"
@@ -61,6 +70,9 @@ rm -rf %{buildroot}
 #%{_mandir}/man8/powertop.8*
 
 %changelog
+* Mon Mar 26 2012 Jaroslav Škarvada <jskarvad at redhat.com> - 1.98-7
+- Print commands which reproduce the tunings into html log (html-print-commands patch)
+
 * Wed Mar  7 2012 Jaroslav Škarvada <jskarvad at redhat.com> - 1.98-6
 - Fixed power_supply units
   Resolves: rhbz#800814


More information about the scm-commits mailing list