Pull in adaptive fixes/improvements and p-p-d integration
This commit is contained in:
parent
82e1a8aee8
commit
4c12904be4
646
338.patch
Normal file
646
338.patch
Normal file
@ -0,0 +1,646 @@
|
|||||||
|
From 877065bb5d2ba1ee10369ba1febc06ee3a4c07b3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Wed, 19 Jan 2022 14:18:14 +0100
|
||||||
|
Subject: [PATCH 1/7] adaptive: Unref UPower client in destructor
|
||||||
|
|
||||||
|
---
|
||||||
|
src/thd_engine_adaptive.cpp | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index ed04cc7c..256eb4aa 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -89,6 +89,7 @@ class _gddv_exception: public std::exception {
|
||||||
|
} gddv_exception;
|
||||||
|
|
||||||
|
cthd_engine_adaptive::~cthd_engine_adaptive() {
|
||||||
|
+ g_clear_object (&upower_client);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cthd_engine_adaptive::get_type(char *object, int *offset) {
|
||||||
|
|
||||||
|
From 94711ae29223415a75240ed943c5caf418416b12 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Sun, 6 Feb 2022 18:39:28 +0100
|
||||||
|
Subject: [PATCH 2/7] adaptive: Improve cleanup of dynamic data sources
|
||||||
|
|
||||||
|
Clean them all up from the finalizer. Also add a helper function, and do
|
||||||
|
the same in case the adaptive engine falls back to a static
|
||||||
|
configuration.
|
||||||
|
---
|
||||||
|
src/thd_engine_adaptive.cpp | 17 ++++++++++++-----
|
||||||
|
src/thd_engine_adaptive.h | 1 +
|
||||||
|
2 files changed, 13 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index 256eb4aa..24600c97 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -88,8 +88,18 @@ class _gddv_exception: public std::exception {
|
||||||
|
}
|
||||||
|
} gddv_exception;
|
||||||
|
|
||||||
|
+void cthd_engine_adaptive::destroy_dynamic_sources() {
|
||||||
|
+ g_clear_object(&upower_client);
|
||||||
|
+
|
||||||
|
+ if (tablet_dev) {
|
||||||
|
+ close(libevdev_get_fd(tablet_dev));
|
||||||
|
+ libevdev_free(tablet_dev);
|
||||||
|
+ tablet_dev = NULL;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
cthd_engine_adaptive::~cthd_engine_adaptive() {
|
||||||
|
- g_clear_object (&upower_client);
|
||||||
|
+ destroy_dynamic_sources();
|
||||||
|
}
|
||||||
|
|
||||||
|
int cthd_engine_adaptive::get_type(char *object, int *offset) {
|
||||||
|
@@ -1660,10 +1670,7 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
thd_log_info("Also unable to evaluate any conditions\n");
|
||||||
|
thd_log_info("Falling back to use configuration with the highest power\n");
|
||||||
|
|
||||||
|
- if (tablet_dev)
|
||||||
|
- libevdev_free(tablet_dev);
|
||||||
|
-
|
||||||
|
- // Looks like there is no free call for up_client_new()
|
||||||
|
+ destroy_dynamic_sources();
|
||||||
|
|
||||||
|
int i = find_agressive_target();
|
||||||
|
thd_log_info("target:%d\n", i);
|
||||||
|
diff --git a/src/thd_engine_adaptive.h b/src/thd_engine_adaptive.h
|
||||||
|
index 043c0d6d..330516c5 100644
|
||||||
|
--- a/src/thd_engine_adaptive.h
|
||||||
|
+++ b/src/thd_engine_adaptive.h
|
||||||
|
@@ -161,6 +161,7 @@ class cthd_engine_adaptive: public cthd_engine_default {
|
||||||
|
int passive_def_only;
|
||||||
|
int passive_def_processed;
|
||||||
|
|
||||||
|
+ void destroy_dynamic_sources();
|
||||||
|
int get_type(char *object, int *offset);
|
||||||
|
uint64_t get_uint64(char *object, int *offset);
|
||||||
|
char* get_string(char *object, int *offset);
|
||||||
|
|
||||||
|
From 5103fe63f7f02754e6667b0a70686577f81e4b9b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Wed, 19 Jan 2022 14:18:53 +0100
|
||||||
|
Subject: [PATCH 3/7] adaptive: Implement Power Slider following
|
||||||
|
power-profiles-deamon
|
||||||
|
|
||||||
|
This maps the three power-profiles-daemon states to appropriate values
|
||||||
|
of the power slider DPTF control.
|
||||||
|
|
||||||
|
Note that thermald already has the "preference" setting which can be set
|
||||||
|
to either "PERFORMANCE" or "ENERGY_CONSERVE". As such, an alternative
|
||||||
|
could be to expand the list of valid preferences and then let p-p-d set
|
||||||
|
the value via dbus.
|
||||||
|
---
|
||||||
|
src/thd_engine_adaptive.cpp | 56 ++++++++++++++++++++++++++++++++++---
|
||||||
|
src/thd_engine_adaptive.h | 6 +++-
|
||||||
|
2 files changed, 57 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index 24600c97..4d0fd6b2 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -1042,10 +1042,7 @@ int cthd_engine_adaptive::evaluate_platform_type_condition(
|
||||||
|
int cthd_engine_adaptive::evaluate_power_slider_condition(
|
||||||
|
struct condition condition) {
|
||||||
|
|
||||||
|
- // We don't have a power slider currently, just set it to 75 which
|
||||||
|
- // equals "Better Performance" (using 100 would be more aggressive).
|
||||||
|
-
|
||||||
|
- return compare_condition(condition, 75);
|
||||||
|
+ return compare_condition(condition, power_slider);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cthd_engine_adaptive::evaluate_ac_condition(struct condition condition) {
|
||||||
|
@@ -1569,7 +1566,36 @@ void cthd_engine_adaptive::setup_input_devices() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void cthd_engine_adaptive::update_power_slider()
|
||||||
|
+{
|
||||||
|
+ g_autoptr(GVariant) active_profile_v = NULL;
|
||||||
|
+
|
||||||
|
+ active_profile_v = g_dbus_proxy_get_cached_property (power_profiles_daemon, "ActiveProfile");
|
||||||
|
+ if (active_profile_v && g_variant_is_of_type (active_profile_v, G_VARIANT_TYPE_STRING)) {
|
||||||
|
+ const char *active_profile = g_variant_get_string (active_profile_v, NULL);
|
||||||
|
+
|
||||||
|
+ if (strcmp (active_profile, "power-saver") == 0)
|
||||||
|
+ power_slider = 25; /* battery saver */
|
||||||
|
+ else if (strcmp (active_profile, "balanced") == 0)
|
||||||
|
+ power_slider = 75; /* better performance */
|
||||||
|
+ else if (strcmp (active_profile, "performance") == 0)
|
||||||
|
+ power_slider = 100; /* best performance */
|
||||||
|
+ else
|
||||||
|
+ power_slider = 75;
|
||||||
|
+ } else {
|
||||||
|
+ power_slider = 75;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ thd_log_info("Power slider is now set to %d\n", power_slider);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void power_profiles_changed_cb(cthd_engine_adaptive *engine)
|
||||||
|
+{
|
||||||
|
+ engine->update_power_slider();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
+ g_autoptr(GDBusConnection) bus = NULL;
|
||||||
|
char *buf;
|
||||||
|
csys_fs sysfs("");
|
||||||
|
size_t size;
|
||||||
|
@@ -1686,6 +1712,28 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
|
||||||
|
set_control_mode(EXCLUSIVE);
|
||||||
|
|
||||||
|
+ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL);
|
||||||
|
+ if (bus) {
|
||||||
|
+ power_profiles_daemon = g_dbus_proxy_new_sync (bus,
|
||||||
|
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
|
||||||
|
+ NULL,
|
||||||
|
+ "net.hadess.PowerProfiles",
|
||||||
|
+ "/net/hadess/PowerProfiles",
|
||||||
|
+ "net.hadess.PowerProfiles",
|
||||||
|
+ NULL,
|
||||||
|
+ NULL);
|
||||||
|
+
|
||||||
|
+ if (power_profiles_daemon) {
|
||||||
|
+ g_signal_connect_swapped (power_profiles_daemon,
|
||||||
|
+ "g-properties-changed",
|
||||||
|
+ (GCallback) power_profiles_changed_cb,
|
||||||
|
+ this);
|
||||||
|
+ power_profiles_changed_cb(this);
|
||||||
|
+ } else {
|
||||||
|
+ thd_log_info("Could not setup DBus watch for power-profiles-daemon");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
evaluate_conditions();
|
||||||
|
thd_log_info("adaptive engine reached end");
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.h b/src/thd_engine_adaptive.h
|
||||||
|
index 330516c5..bfd6c868 100644
|
||||||
|
--- a/src/thd_engine_adaptive.h
|
||||||
|
+++ b/src/thd_engine_adaptive.h
|
||||||
|
@@ -153,6 +153,7 @@ class cthd_engine_adaptive: public cthd_engine_default {
|
||||||
|
std::vector<struct psvt> psvts;
|
||||||
|
std::string int3400_path;
|
||||||
|
UpClient *upower_client;
|
||||||
|
+ GDBusProxy *power_profiles_daemon;
|
||||||
|
struct libevdev *tablet_dev;
|
||||||
|
int current_condition_set;
|
||||||
|
int policy_active;
|
||||||
|
@@ -161,6 +162,8 @@ class cthd_engine_adaptive: public cthd_engine_default {
|
||||||
|
int passive_def_only;
|
||||||
|
int passive_def_processed;
|
||||||
|
|
||||||
|
+ int power_slider;
|
||||||
|
+
|
||||||
|
void destroy_dynamic_sources();
|
||||||
|
int get_type(char *object, int *offset);
|
||||||
|
uint64_t get_uint64(char *object, int *offset);
|
||||||
|
@@ -210,13 +213,14 @@ class cthd_engine_adaptive: public cthd_engine_default {
|
||||||
|
cthd_engine_default("63BE270F-1C11-48FD-A6F7-3AF253FF3E2D"), upower_client(
|
||||||
|
NULL), tablet_dev(NULL), current_condition_set(0xffff), policy_active(
|
||||||
|
0), fallback_id(-1), int3400_base_path(""), passive_def_only(
|
||||||
|
- 0), passive_def_processed(0) {
|
||||||
|
+ 0), passive_def_processed(0), power_slider(75) {
|
||||||
|
}
|
||||||
|
|
||||||
|
~cthd_engine_adaptive();
|
||||||
|
ppcc_t* get_ppcc_param(std::string name);
|
||||||
|
int thd_engine_start(bool ignore_cpuid_check, bool adaptive);
|
||||||
|
void update_engine_state();
|
||||||
|
+ void update_power_slider();
|
||||||
|
};
|
||||||
|
|
||||||
|
int thd_engine_create_adaptive_engine(bool ignore_cpuid_check);
|
||||||
|
|
||||||
|
From 86eddff7845ccd4f87b084a0e572d050b33053e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Sun, 6 Feb 2022 18:25:10 +0100
|
||||||
|
Subject: [PATCH 4/7] engine: Split start into init/start to load sensors
|
||||||
|
earlier
|
||||||
|
|
||||||
|
The adaptive engine needs to have the sensors loaded early on in order
|
||||||
|
to verify conditions. To make sure this works well, split the start
|
||||||
|
function into two parts, the first being init and the second being
|
||||||
|
start.
|
||||||
|
|
||||||
|
For adaptive, the start function still does some verification, as the
|
||||||
|
upower availability is important for the lid state (it should switch to
|
||||||
|
reading the lid state directly though).
|
||||||
|
---
|
||||||
|
src/thd_engine.cpp | 52 +++++++++++++++++++++----------------
|
||||||
|
src/thd_engine.h | 3 ++-
|
||||||
|
src/thd_engine_adaptive.cpp | 41 ++++++++++++++++++++++-------
|
||||||
|
src/thd_engine_adaptive.h | 3 ++-
|
||||||
|
src/thd_engine_default.cpp | 10 ++++++-
|
||||||
|
5 files changed, 73 insertions(+), 36 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine.cpp b/src/thd_engine.cpp
|
||||||
|
index 67308a26..b5289975 100644
|
||||||
|
--- a/src/thd_engine.cpp
|
||||||
|
+++ b/src/thd_engine.cpp
|
||||||
|
@@ -174,9 +174,8 @@ bool cthd_engine::set_preference(const int pref) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int cthd_engine::thd_engine_start(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
+int cthd_engine::thd_engine_init(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
int ret;
|
||||||
|
- int wake_fds[2];
|
||||||
|
|
||||||
|
adaptive_mode = adaptive;
|
||||||
|
|
||||||
|
@@ -196,6 +195,34 @@ int cthd_engine::thd_engine_start(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ ret = read_thermal_sensors();
|
||||||
|
+ if (ret != THD_SUCCESS) {
|
||||||
|
+ thd_log_error("Thermal sysfs Error in reading sensors\n");
|
||||||
|
+ // This is a fatal error and daemon will exit
|
||||||
|
+ return THD_FATAL_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = read_cooling_devices();
|
||||||
|
+ if (ret != THD_SUCCESS) {
|
||||||
|
+ thd_log_error("Thermal sysfs Error in reading cooling devs\n");
|
||||||
|
+ // This is a fatal error and daemon will exit
|
||||||
|
+ return THD_FATAL_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = read_thermal_zones();
|
||||||
|
+ if (ret != THD_SUCCESS) {
|
||||||
|
+ thd_log_error("No thermal sensors found\n");
|
||||||
|
+ // This is a fatal error and daemon will exit
|
||||||
|
+ return THD_FATAL_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return THD_SUCCESS;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int cthd_engine::thd_engine_start() {
|
||||||
|
+ int ret;
|
||||||
|
+ int wake_fds[2];
|
||||||
|
+
|
||||||
|
check_for_rt_kernel();
|
||||||
|
|
||||||
|
// Pipe is used for communication between two processes
|
||||||
|
@@ -228,27 +255,6 @@ int cthd_engine::thd_engine_start(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
poll_timeout_msec = poll_interval_sec * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = read_thermal_sensors();
|
||||||
|
- if (ret != THD_SUCCESS) {
|
||||||
|
- thd_log_error("Thermal sysfs Error in reading sensors\n");
|
||||||
|
- // This is a fatal error and daemon will exit
|
||||||
|
- return THD_FATAL_ERROR;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ret = read_cooling_devices();
|
||||||
|
- if (ret != THD_SUCCESS) {
|
||||||
|
- thd_log_error("Thermal sysfs Error in reading cooling devs\n");
|
||||||
|
- // This is a fatal error and daemon will exit
|
||||||
|
- return THD_FATAL_ERROR;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- ret = read_thermal_zones();
|
||||||
|
- if (ret != THD_SUCCESS) {
|
||||||
|
- thd_log_error("No thermal sensors found\n");
|
||||||
|
- // This is a fatal error and daemon will exit
|
||||||
|
- return THD_FATAL_ERROR;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (parser.platform_matched()) {
|
||||||
|
parser.set_default_preference();
|
||||||
|
int poll_secs = parser.get_polling_interval();
|
||||||
|
diff --git a/src/thd_engine.h b/src/thd_engine.h
|
||||||
|
index 4200450b..697ff40a 100644
|
||||||
|
--- a/src/thd_engine.h
|
||||||
|
+++ b/src/thd_engine.h
|
||||||
|
@@ -148,7 +148,8 @@ class cthd_engine {
|
||||||
|
return control_mode;
|
||||||
|
}
|
||||||
|
void thd_engine_thread();
|
||||||
|
- virtual int thd_engine_start(bool ignore_cpuid_check, bool adaptive = false);
|
||||||
|
+ virtual int thd_engine_init(bool ignore_cpuid_check, bool adaptive = false);
|
||||||
|
+ virtual int thd_engine_start();
|
||||||
|
int thd_engine_stop();
|
||||||
|
int check_cpu_id();
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index 4d0fd6b2..232dcd47 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -1594,11 +1594,14 @@ static void power_profiles_changed_cb(cthd_engine_adaptive *engine)
|
||||||
|
engine->update_power_slider();
|
||||||
|
}
|
||||||
|
|
||||||
|
-int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
- g_autoptr(GDBusConnection) bus = NULL;
|
||||||
|
- char *buf;
|
||||||
|
+int cthd_engine_adaptive::thd_engine_init(bool ignore_cpuid_check, bool adaptive) {
|
||||||
|
csys_fs sysfs("");
|
||||||
|
+ char *buf;
|
||||||
|
size_t size;
|
||||||
|
+ int res;
|
||||||
|
+
|
||||||
|
+ parser_disabled = true;
|
||||||
|
+ force_mmio_rapl = true;
|
||||||
|
|
||||||
|
if (!ignore_cpuid_check) {
|
||||||
|
check_cpu_id();
|
||||||
|
@@ -1613,9 +1616,6 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
return THD_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
- parser_disabled = true;
|
||||||
|
- force_mmio_rapl = true;
|
||||||
|
-
|
||||||
|
if (sysfs.exists("/sys/bus/platform/devices/INT3400:00")) {
|
||||||
|
int3400_base_path = "/sys/bus/platform/devices/INT3400:00/";
|
||||||
|
} else if (sysfs.exists("/sys/bus/platform/devices/INTC1040:00")) {
|
||||||
|
@@ -1626,6 +1626,12 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
return THD_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Read the sensors/zones */
|
||||||
|
+ res = cthd_engine::thd_engine_init(ignore_cpuid_check, adaptive);
|
||||||
|
+ if (res != THD_SUCCESS)
|
||||||
|
+ return res;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
if (sysfs.read(int3400_base_path + "firmware_node/path",
|
||||||
|
int3400_path) < 0) {
|
||||||
|
thd_log_debug("Unable to locate INT3400 firmware path\n");
|
||||||
|
@@ -1664,6 +1670,8 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
dump_psvt();
|
||||||
|
dump_apat();
|
||||||
|
dump_apct();
|
||||||
|
+
|
||||||
|
+ delete [] buf;
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
thd_log_warn("%s\n", e.what());
|
||||||
|
delete [] buf;
|
||||||
|
@@ -1679,9 +1687,18 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
thd_log_info("IETM.D0 found\n");
|
||||||
|
passive_def_only = 1;
|
||||||
|
}
|
||||||
|
- return cthd_engine::thd_engine_start(ignore_cpuid_check);
|
||||||
|
+ return THD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ return THD_SUCCESS;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int cthd_engine_adaptive::thd_engine_start() {
|
||||||
|
+ g_autoptr(GDBusConnection) bus = NULL;
|
||||||
|
+
|
||||||
|
+ if (passive_def_only)
|
||||||
|
+ return cthd_engine::thd_engine_start();
|
||||||
|
+
|
||||||
|
setup_input_devices();
|
||||||
|
|
||||||
|
upower_client = up_client_new();
|
||||||
|
@@ -1704,7 +1721,6 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
thd_log_info("fallback id:%d\n", i);
|
||||||
|
fallback_id = i;
|
||||||
|
} else {
|
||||||
|
- delete[] buf;
|
||||||
|
return THD_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1737,7 +1753,7 @@ int cthd_engine_adaptive::thd_engine_start(bool ignore_cpuid_check, bool adaptiv
|
||||||
|
evaluate_conditions();
|
||||||
|
thd_log_info("adaptive engine reached end");
|
||||||
|
|
||||||
|
- return cthd_engine::thd_engine_start(ignore_cpuid_check, adaptive);
|
||||||
|
+ return cthd_engine::thd_engine_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
int thd_engine_create_adaptive_engine(bool ignore_cpuid_check) {
|
||||||
|
@@ -1746,7 +1762,12 @@ int thd_engine_create_adaptive_engine(bool ignore_cpuid_check) {
|
||||||
|
thd_engine->set_poll_interval(thd_poll_interval);
|
||||||
|
|
||||||
|
// Initialize thermald objects
|
||||||
|
- if (thd_engine->thd_engine_start(ignore_cpuid_check, true) != THD_SUCCESS) {
|
||||||
|
+ if (thd_engine->thd_engine_init(ignore_cpuid_check, true) != THD_SUCCESS) {
|
||||||
|
+ thd_log_info("THD engine init failed\n");
|
||||||
|
+ return THD_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (thd_engine->thd_engine_start() != THD_SUCCESS) {
|
||||||
|
thd_log_info("THD engine start failed\n");
|
||||||
|
return THD_ERROR;
|
||||||
|
}
|
||||||
|
diff --git a/src/thd_engine_adaptive.h b/src/thd_engine_adaptive.h
|
||||||
|
index bfd6c868..d044698d 100644
|
||||||
|
--- a/src/thd_engine_adaptive.h
|
||||||
|
+++ b/src/thd_engine_adaptive.h
|
||||||
|
@@ -218,7 +218,8 @@ class cthd_engine_adaptive: public cthd_engine_default {
|
||||||
|
|
||||||
|
~cthd_engine_adaptive();
|
||||||
|
ppcc_t* get_ppcc_param(std::string name);
|
||||||
|
- int thd_engine_start(bool ignore_cpuid_check, bool adaptive);
|
||||||
|
+ int thd_engine_init(bool ignore_cpuid_check, bool adaptive);
|
||||||
|
+ int thd_engine_start();
|
||||||
|
void update_engine_state();
|
||||||
|
void update_power_slider();
|
||||||
|
};
|
||||||
|
diff --git a/src/thd_engine_default.cpp b/src/thd_engine_default.cpp
|
||||||
|
index 2db78505..18635c50 100644
|
||||||
|
--- a/src/thd_engine_default.cpp
|
||||||
|
+++ b/src/thd_engine_default.cpp
|
||||||
|
@@ -838,7 +838,15 @@ int thd_engine_create_default_engine(bool ignore_cpuid_check,
|
||||||
|
if (conf_file)
|
||||||
|
thd_engine->set_config_file(conf_file);
|
||||||
|
|
||||||
|
- res = thd_engine->thd_engine_start(ignore_cpuid_check);
|
||||||
|
+ res = thd_engine->thd_engine_init(ignore_cpuid_check);
|
||||||
|
+ if (res != THD_SUCCESS) {
|
||||||
|
+ if (res == THD_FATAL_ERROR)
|
||||||
|
+ thd_log_error("THD engine init failed\n");
|
||||||
|
+ else
|
||||||
|
+ thd_log_msg("THD engine init failed\n");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ res = thd_engine->thd_engine_start();
|
||||||
|
if (res != THD_SUCCESS) {
|
||||||
|
if (res == THD_FATAL_ERROR)
|
||||||
|
thd_log_error("THD engine start failed\n");
|
||||||
|
|
||||||
|
From ecdbdb5039dd7f016918f8d734a11670ea062bf7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Sun, 6 Feb 2022 19:24:57 +0100
|
||||||
|
Subject: [PATCH 5/7] adaptive: Open event FD non-blocking and with CLOEXEC
|
||||||
|
|
||||||
|
This makes more sense, and it is what libevdev expects by default.
|
||||||
|
---
|
||||||
|
src/thd_engine_adaptive.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index 232dcd47..c546b61e 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -1550,7 +1550,7 @@ void cthd_engine_adaptive::setup_input_devices() {
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
|
snprintf(fname, sizeof(fname), "/dev/input/%s", namelist[i]->d_name);
|
||||||
|
- fd = open(fname, O_RDONLY);
|
||||||
|
+ fd = open(fname, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
|
||||||
|
if (fd < 0)
|
||||||
|
continue;
|
||||||
|
ret = libevdev_new_from_fd(fd, &tablet_dev);
|
||||||
|
|
||||||
|
From 9d01731a28f97a6581e6bbe3dc675e140d5336ea Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Sun, 6 Feb 2022 19:25:44 +0100
|
||||||
|
Subject: [PATCH 6/7] adaptive: Process evdev events for tablet mode
|
||||||
|
|
||||||
|
Otherwise the switch will never change, as libevdev will just return the
|
||||||
|
latest cached value.
|
||||||
|
---
|
||||||
|
src/thd_engine_adaptive.cpp | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index c546b61e..da6a2e60 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -1031,6 +1031,11 @@ int cthd_engine_adaptive::evaluate_platform_type_condition(
|
||||||
|
int value = 1;
|
||||||
|
|
||||||
|
if (tablet_dev) {
|
||||||
|
+ struct input_event ev;
|
||||||
|
+
|
||||||
|
+ while (libevdev_has_event_pending(tablet_dev))
|
||||||
|
+ libevdev_next_event(tablet_dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
|
||||||
|
+
|
||||||
|
int tablet = libevdev_get_event_value(tablet_dev, EV_SW,
|
||||||
|
SW_TABLET_MODE);
|
||||||
|
if (tablet)
|
||||||
|
|
||||||
|
From 93c7d2783b28a4b5ec5ca5071881547b5ee65da3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Berg <bberg@redhat.com>
|
||||||
|
Date: Sun, 6 Feb 2022 19:26:38 +0100
|
||||||
|
Subject: [PATCH 7/7] adaptive: Read the lid state directly from the kernel
|
||||||
|
|
||||||
|
The UPower interface for the lid state is deprecated. As such, we should
|
||||||
|
be reading it directly from the input device. Making the switch is
|
||||||
|
straight forward, so just do it.
|
||||||
|
---
|
||||||
|
src/thd_engine_adaptive.cpp | 43 ++++++++++++++++++++++++++-----------
|
||||||
|
src/thd_engine_adaptive.h | 1 +
|
||||||
|
2 files changed, 32 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.cpp b/src/thd_engine_adaptive.cpp
|
||||||
|
index da6a2e60..3e8b3674 100644
|
||||||
|
--- a/src/thd_engine_adaptive.cpp
|
||||||
|
+++ b/src/thd_engine_adaptive.cpp
|
||||||
|
@@ -94,8 +94,18 @@ void cthd_engine_adaptive::destroy_dynamic_sources() {
|
||||||
|
if (tablet_dev) {
|
||||||
|
close(libevdev_get_fd(tablet_dev));
|
||||||
|
libevdev_free(tablet_dev);
|
||||||
|
+
|
||||||
|
+ if (lid_dev == tablet_dev)
|
||||||
|
+ lid_dev = NULL;
|
||||||
|
tablet_dev = NULL;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (lid_dev) {
|
||||||
|
+ close(libevdev_get_fd(lid_dev));
|
||||||
|
+ libevdev_free(lid_dev);
|
||||||
|
+
|
||||||
|
+ lid_dev = NULL;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
cthd_engine_adaptive::~cthd_engine_adaptive() {
|
||||||
|
@@ -848,7 +858,7 @@ int cthd_engine_adaptive::verify_condition(struct condition condition) {
|
||||||
|
|| condition.condition == (adaptive_condition) 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
- if (condition.condition == Lid_state && upower_client != NULL)
|
||||||
|
+ if (condition.condition == Lid_state && lid_dev != NULL)
|
||||||
|
return 0;
|
||||||
|
if (condition.condition == Power_source && upower_client != NULL)
|
||||||
|
return 0;
|
||||||
|
@@ -1010,11 +1020,16 @@ int cthd_engine_adaptive::evaluate_temperature_condition(
|
||||||
|
|
||||||
|
int cthd_engine_adaptive::evaluate_lid_condition(struct condition condition) {
|
||||||
|
int value = 0;
|
||||||
|
- bool lid_closed = up_client_get_lid_is_closed(upower_client);
|
||||||
|
|
||||||
|
- if (!lid_closed)
|
||||||
|
- value = 1;
|
||||||
|
+ if (lid_dev) {
|
||||||
|
+ struct input_event ev;
|
||||||
|
|
||||||
|
+ while (libevdev_has_event_pending(lid_dev))
|
||||||
|
+ libevdev_next_event(lid_dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
|
||||||
|
+
|
||||||
|
+ int lid_closed = libevdev_get_event_value(lid_dev, EV_SW, SW_LID);
|
||||||
|
+ value = !lid_closed;
|
||||||
|
+ }
|
||||||
|
return compare_condition(condition, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1547,10 +1562,9 @@ void cthd_engine_adaptive::setup_input_devices() {
|
||||||
|
struct dirent **namelist;
|
||||||
|
int i, ndev, ret;
|
||||||
|
|
||||||
|
- tablet_dev = NULL;
|
||||||
|
-
|
||||||
|
ndev = scandir("/dev/input", &namelist, is_event_device, versionsort);
|
||||||
|
for (i = 0; i < ndev; i++) {
|
||||||
|
+ struct libevdev *dev = NULL;
|
||||||
|
char fname[267];
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
|
@@ -1558,16 +1572,21 @@ void cthd_engine_adaptive::setup_input_devices() {
|
||||||
|
fd = open(fname, O_RDONLY | O_NONBLOCK | O_CLOEXEC);
|
||||||
|
if (fd < 0)
|
||||||
|
continue;
|
||||||
|
- ret = libevdev_new_from_fd(fd, &tablet_dev);
|
||||||
|
+ ret = libevdev_new_from_fd(fd, &dev);
|
||||||
|
if (ret) {
|
||||||
|
close(fd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- if (libevdev_has_event_code(tablet_dev, EV_SW, SW_TABLET_MODE))
|
||||||
|
- return;
|
||||||
|
- libevdev_free(tablet_dev);
|
||||||
|
- tablet_dev = NULL;
|
||||||
|
- close(fd);
|
||||||
|
+
|
||||||
|
+ if (!tablet_dev && libevdev_has_event_code(dev, EV_SW, SW_TABLET_MODE))
|
||||||
|
+ tablet_dev = dev;
|
||||||
|
+ if (!lid_dev && libevdev_has_event_code(dev, EV_SW, SW_LID))
|
||||||
|
+ lid_dev = dev;
|
||||||
|
+
|
||||||
|
+ if (lid_dev != dev && tablet_dev != dev) {
|
||||||
|
+ libevdev_free(dev);
|
||||||
|
+ close(fd);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/thd_engine_adaptive.h b/src/thd_engine_adaptive.h
|
||||||
|
index d044698d..fb55aa4e 100644
|
||||||
|
--- a/src/thd_engine_adaptive.h
|
||||||
|
+++ b/src/thd_engine_adaptive.h
|
||||||
|
@@ -155,6 +155,7 @@ class cthd_engine_adaptive: public cthd_engine_default {
|
||||||
|
UpClient *upower_client;
|
||||||
|
GDBusProxy *power_profiles_daemon;
|
||||||
|
struct libevdev *tablet_dev;
|
||||||
|
+ struct libevdev *lid_dev;
|
||||||
|
int current_condition_set;
|
||||||
|
int policy_active;
|
||||||
|
int fallback_id;
|
@ -37,6 +37,8 @@ Requires(pre): shadow-utils
|
|||||||
|
|
||||||
%{?systemd_requires}
|
%{?systemd_requires}
|
||||||
|
|
||||||
|
# Pull in adaptive fixes/improvements and p-p-d integration
|
||||||
|
Patch0001: https://github.com/intel/thermal_daemon/pull/338.patch
|
||||||
|
|
||||||
%description
|
%description
|
||||||
%{name} monitors and controls platform temperature.
|
%{name} monitors and controls platform temperature.
|
||||||
|
Loading…
Reference in New Issue
Block a user