gpointer user_data)
{
int i, ret = -ENOTSUP;
+ int max_duration_ms = -1;
gboolean ret_out = TRUE;
if (!g_pmqos) {
bool support = g_pmqos->list[i].support;
if (!strcmp(supported_name, name) && support) {
- int max_duration_ms = g_pmqos->list[i].max_duration_ms;
-
- if (duration > max_duration_ms)
- duration = max_duration_ms;
+ max_duration_ms = g_pmqos->list[i].max_duration_ms;
ret = 0;
break;
}
goto out_dbus;
}
- if (duration)
+ /* Reqeust pmqos scenario with the maximum duration */
+ if (max_duration_ms > 0 && duration > 0) {
+ duration = (duration < max_duration_ms)
+ ? duration : max_duration_ms;
ret = pmqos_request(name, duration);
- else
+
+ /*
+ * Request pmqos mode without the maximum duration.
+ * Instead, enter the minus value (-1). When entering the minus value,
+ * doesn't create the timeout timer for pmqos mode. Until receiving
+ * the cancel request, keep the pmqos mode like UltraPowerSaving.
+ */
+ } else if (max_duration_ms == 0 && duration > 0) {
+ ret = pmqos_request(name, INT_MAX);
+
+ /* Cancel both scenario and mode for pmqos */
+ } else {
ret = pmqos_cancel(name);
+ }
out_dbus:
g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ret));
for (elem = pmqos_head; elem != NULL; elem = elem->next) {
cpu = elem->data;
cpu->timeout -= delta;
+
+ /*
+ * If timeout is INT_MAX, indicatte 'mode'.
+ * Don't need to update the timeout and cancel pmqos for mode
+ * until receiving the cancel request.
+ */
+ if (cpu->timeout == INT_MAX)
+ continue;
+
if (cpu->timeout < 0)
cpu->timeout = 0;
if (cpu->timeout > 0)
for (elem = pmqos_head; elem != NULL; elem = elem->next) {
cpu = elem->data;
+ /*
+ * If timeout is INT_MAX, indicate 'mode'.
+ * Don't need to add the timre for 'mode'.
+ */
+ if (cpu->timeout == INT_MAX)
+ continue;
if (cpu->timeout <= 0)
continue;
memcpy(&unlock_timer_owner, cpu, sizeof(struct pmqos_cpu));