ANDROID: sched: Track wake_q length
Some partners have value-adds based on aosp/540066, which cannot be carried in ACK in its entirety as it no longer makes sense as-is (the select_idle_capacity() rework upstream solved the issue differently). It seems that those partners do not actually need the wake-wide tweaks, they only need to access the wake_q length for wake-up balance. To support this, add minimal tracking to the wake_q infrastructure in the core kernel, but do that by adding a pointer to the wake_q_head to task_struct directly to not litter all sched classes with an additional sibling_count_hint argument to the select_task_rq callbacks. Modules needing to access the wake_q length can do so by dereferencing p->wake_q_head in the wake-up path when it is non-NULL. Bug: 173981591 Signed-off-by: Quentin Perret <qperret@google.com> Change-Id: I9a98167face92e70aba847d9f04d0c216065478c
This commit is contained in:
committed by
Todd Kjos
parent
4d1ac6a160
commit
1a29b384b0
@@ -538,6 +538,7 @@ static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task)
|
||||
*/
|
||||
*head->lastp = node;
|
||||
head->lastp = &node->next;
|
||||
head->count++;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -594,12 +595,14 @@ void wake_up_q(struct wake_q_head *head)
|
||||
/* Task can safely be re-inserted now: */
|
||||
node = node->next;
|
||||
task->wake_q.next = NULL;
|
||||
task->wake_q_head = head;
|
||||
|
||||
/*
|
||||
* wake_up_process() executes a full barrier, which pairs with
|
||||
* the queueing in wake_q_add() so as not to miss wakeups.
|
||||
*/
|
||||
wake_up_process(task);
|
||||
task->wake_q_head = NULL;
|
||||
put_task_struct(task);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user