Há anos, o conceito de Proxy Execution vem sendo discutido no kernel Linux como uma solução para implementar a priority inheritance (herança de prioridade). Essa abordagem utiliza informações tanto do contexto de escalonamento quanto do contexto de execução de uma tarefa. Embora os patches principais de Proxy Execution ainda não tenham sido incorporados, patches preparatórios estão a caminho para serem fundidos na janela de fusões do Linux 6.13.
O Proxy Execution foi descrito em patches anteriores como uma abordagem que distingue entre o contexto do escalonador de uma tarefa (informações essenciais para tomar decisões sobre quando a tarefa será escalonada, como prioridade e classe de escalonamento) e o seu contexto de execução (informações necessárias para a execução da tarefa, como afinidade de CPU). Com o Proxy Execution ativado, uma tarefa que está bloqueada em um mutex continua na fila de execução, mas o seu status de “bloqueada” e o mutex no qual está bloqueada são registrados. Se essa tarefa for escalonada enquanto ainda estiver bloqueada, o proprietário do mutex pode executar a tarefa em seu lugar, herdando o contexto do escalonador, mas não o de execução.
Essa abordagem permite uma flexibilidade no gerenciamento de tarefas bloqueadas, mas também apresenta situações mais complexas, como um proprietário de mutex também estar bloqueado em outro mutex, estar dormindo ou migrando entre CPUs.
Alterações na versão 12 dos patches preparatórios:
A versão 12 dos patches preparatórios, desenvolvida por John Stultz do Google, traz algumas mudanças importantes:
- Alteração de terminologia: A sugestão de Peter Zijlstra para substituir o termo “selecionado” por “doador” (donor) para descrever a tarefa escolhida para ser escalonada foi implementada.
- Correções em patches específicos: K Prateek Nayak e Peter Zijlstra apontaram problemas no patch “Remove wakeups from under mutex::wait_lock”, que foram corrigidos nesta versão.
Além dessas mudanças, os patches foram rebaseados no branch tip/sched/core
para evitar conflitos com mudanças recentes no kernel, como o rework do delayed dequeuing e do dl_server, que foram incluídos no Linux 6.12-rc1.
Histórico e colaboração:
O desenvolvimento do Proxy Execution tem uma longa história. Originalmente descrito em um artigo de Watkins, Straub e Niehaus, o conceito foi posteriormente explorado por Peter Zijlstra com patches iniciais. A partir daí, o trabalho foi estendido por Juri Lelli, Valentin Schneider e Connor O’Brien, com contribuições de Steven Rostedt. John Stultz reconhece a importância dessas contribuições, ressaltando que o mérito é de todos os envolvidos, enquanto eventuais falhas são suas.
Patches preparatórios:
Nesta versão dos patches preparatórios, foram incluídas sete alterações principais:
- sched: Add move_queued_task_locked helper: Um novo helper para mover tarefas enfileiradas de maneira eficiente.
- sched: Consolidate pick_*_task to task_is_pushable helper: Consolidação de funções para determinar a “empurrabilidade” de tarefas.
- sched: Split out __schedule() deactivate task logic into a helper: Divisão da lógica de desativação de tarefas em um novo helper.
- sched: Split scheduler and execution contexts: Separação dos contextos de escalonamento e execução, alinhada diretamente com os objetivos do Proxy Execution.
- locking/mutex: Make mutex::wait_lock irq safe: Ajustes para tornar a manipulação de mutexes mais segura em relação a interrupções.
Esses patches preparatórios são um passo crucial para a futura implementação completa do Proxy Execution no kernel Linux, prometendo otimizações significativas no gerenciamento de prioridades e desempenho de tarefas. A integração dos patches está prevista para a próxima janela de fusões do Linux 6.13, a menos que surjam problemas de última hora ou objeções de Linus Torvalds.
Para mais informações sobre o desenvolvimento do Proxy Execution, confira a apresentação de John Stultz na Linux Plumbers Conference 2023.