Timer creation makes powertop stuck with high CPU usage for a noticeable
amount of time, due to /proc/timer_stats file parsing.
Move member is_deferred() to static timer_is_deferred(const char*)
function,
which gets called during timer() construction.
is_deferred() function returns member bool deferred variable instead,
preventing CPU consuming file lookup.
Signed-off-by: Sergey Senozhatsky <[email protected]>
---
process/timer.cpp | 45 +++++++++++++++++++++++++--------------------
process/timer.h | 1 +
2 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/process/timer.cpp b/process/timer.cpp
index bb7f459..8917490 100644
--- a/process/timer.cpp
+++ b/process/timer.cpp
@@ -35,11 +35,35 @@
using namespace std;
+static bool timer_is_deferred(const char *handler)
+{
+ FILE *file;
+ bool ret = false;
+ char line[4096];
+
+ file = fopen("/proc/timer_stats", "r");
+ if (!file) {
+ return ret;
+ }
+
+ while (!feof(file)) {
+ if (fgets(line, 4096, file) == NULL)
+ break;
+ if (strstr(line, handler)) {
+ ret = (strstr(line, "D,") != NULL);
+ if (ret == true)
+ break;
+ }
+ }
+ fclose(file);
+ return ret;
+}
timer::timer(unsigned long address) : power_consumer()
{
strncpy(handler, kernel_function(address), 31);
raw_count = 0;
+ deferred = timer_is_deferred(handler);
}
@@ -127,24 +151,5 @@ void clear_timers(void)
bool timer::is_deferred(void)
{
- FILE *file;
- bool ret = false;
- char line[4096];
-
- file = fopen("/proc/timer_stats", "r");
- if (!file) {
- return ret;
- }
-
- while (!feof(file)) {
- if (fgets(line, 4096, file) == NULL)
- break;
- if (strstr(line, handler)) {
- ret = (strstr(line, "D,") != NULL);
- if (ret == true)
- break;
- }
- }
- fclose(file);
- return ret;
+ return deferred;
}
diff --git a/process/timer.h b/process/timer.h
index 880fa26..7718c3b 100644
--- a/process/timer.h
+++ b/process/timer.h
@@ -34,6 +34,7 @@ class timer : public power_consumer {
public:
char handler[32];
int raw_count;
+ bool deferred;
timer(unsigned long timer_func);
_______________________________________________
Power mailing list
[email protected]
https://bughost.org/mailman/listinfo/power