Adicionar infraestrutura para Vblank e page flip no vkms com hrtimer

16 Jul 2018

Desde o início de maio de 2018, tenho me aprofundado no subsistema do DRM. No começo, nada fazia sentido para mim e tive que me esforçar muito para entender como as coisas funcionam. Felizmente, não estava sozinho e tive grande apoio de Gustavo Padovan, Daniel Vetter, Haneen Mohammed e de toda a comunidade. Como resultado, finalmente entreguei um novo recurso para o VKMS: a infraestrutura para eventos de Vblank e de Page Flip.

O VKMS possui eventos Vblank regulares simulados por meio de hrtimers (consulte drm-misc-next), recurso esse necessário para que o VKMS imite o hardware real [1]. A abordagem de desenvolvimento foi inteiramente orientada pelos testes fornecidos pela IGT, mais especificamente o kms_flip. Modifiquei o IGT para fazer com que a ferramenta leia o nome de um módulo via linha de comando e forçar o uso dele, em vez de usar apenas os módulos definidos no código (patch enviado para o IGT [2]). Com essa modificação no IGT, meu processo de desenvolvimento para adicionar uma infraestrutura Vblank ao VKMS teve três etapas principais, conforme descrito na figura abaixo:

My work cycle in VKMS
Figure 1. My work cycle in VKMS

Primeiramente, concentrei-me apenas no subteste “basic-plain-flip” do IGT e, após cada execução do teste, verifiquei as mensagens de falha. Em segundo lugar, tentei escrever o código necessário para que o teste passasse; é essencial destacar que essa fase, por vezes, levou dias devido ao processo de entender o problema e implementar a correção. Finalmente, após superar a falha de cada teste, me esforcei ainda mais para aprimorar a implementação. Como pode ser visto no conjunto de patches enviado para adicionar o suporte a Vblank [3], o primeiro conjunto de patches não estava diretamente relacionado ao Vblank em si, mas era uma infraestrutura necessária para que o kms_flip funcionasse.

sudo ./tests/kms_flip  --run-subtest basic-plain-flip --force-module vkms
Figure 2. sudo ./tests/kms_flip –run-subtest basic-plain-flip –force-module vkms

Após um longo período de trabalho para fazer o VKMS passar no teste basic-plain-flip, eu finalmente obtive sucesso, tudo isso graças a todo o suporte que recebi da comunidade DRM. Em seguida, comecei a trabalhar no subteste wf_vblank-ts-check, e aqui passei muito tempo depurando problemas. Meu problema aqui era devido ao comportamento estocástico do teste, às vezes passava e outras vezes falhava, e eu presumi que o problema estava relacionado ao acúmulo de erros durante a etapa de virada de página. Como resultado, me concentrei um bom tempo para tornar o tempo na virada o mais preciso possível, e acabei com um patch que calcula o momento exato para o próximo período [4]. No entanto, depois que enviei o patch, Chris Wilson destacou que eu estava reinventando a roda, já que o hrtimer já fazia os cálculos necessários [5]; Ele estava 100% certo. Após seu comentário, examinei linha por linha o hrtimer_forward e concluí que havia implementado o mesmo algoritmo. Perdi alguns dias recriando algo que, no final, não é útil; no entanto, foi realmente valioso para mim, pois aprendi como o hrtimer funciona e também expandi minha compreensão sobre o Vblank. Finalmente, Daniel Vetter apontou precisamente uma série de problemas no patch [6] que não apenas melhoraram os testes, mas também fizeram com que a maioria dos testes no kms_flip passassem.

Concluindo, adicionar a infraestrutura para o Vblank e eventos de virada de página no vkms foi um recurso interessante para o VKMS, mas também foi uma tarefa importante para me ensinar como as coisas funcionam no DRM. Ainda estou focado nesta parte do VKMS, mas agora estou começando a pensar em como posso adicionar hardware virtual que não suporta interrupção do Vblank. Por fim, quero escrever um post detalhado sobre como implementei o suporte a Vblank no VKMS e outro sobre temporizadores (usuários e espaço do kernel); acredito que esse tipo de post pode ser útil para alguém que está começando no subsistema DRM.

Agradeço a toda a comunidade DRM que é sempre gentil e fornece grande ajuda para um novato como eu :)

Referências

[1] “DRM misc-next”. URL: https://cgit.freedesktop.org/drm/drm-misc/

[2] “Opção de forçar no IGT”. URL: https://www.spinics.net/lists/intel-gfx/msg170670.html

[3] “Adicionando infraestrutura para eventos de Vblank e Page Flip no VKMS”. URL: https://www.spinics.net/lists/dri-devel/msg182903.html

[4] “Cálculo do período”. URL: https://www.spinics.net/lists/dri-devel/msg182037.html

[5] “Comentário do Chris Wilson sobre hrtimer”. URL: https://www.spinics.net/lists/dri-devel/msg182037.html

[6] “Comentário do Daniel Vetter na V2”. URL: https://www.spinics.net/lists/dri-devel/msg182037.html


Articles from blogs I follow around the net

Status update, November 2025

Hi! This month a lot of new features have added to the Goguma mobile IRC client. Hubert Hirtz has implemented drafts so that unsent text gets saved and network disconnections don’t disrupt users typing a message. He also enabled replying to one’s own messages…

via emersion November 16, 2025

Kworkflow at Kernel Recipes 2025

This was the first year I attended Kernel Recipes and I have nothing but say how much I enjoyed it and how grateful I’m for the opportunity to talk more about kworkflow to very experienced kernel developers. What I mostly like about Kernel Recipes is its inti…

via Wen.onweb November 3, 2025

October/November Conference News

The last part of October brings us a whole pile of events, with many of them featuring talks by Igalians. After the month ends, we’re looking forward to a couple of events in November. Here’s where we’ll be presenting talks: RISC-V Summit North America, O…

via Igalia October 22, 2025

Generated by openring