Depois de atualizar o kernel 5.15 para o 5.16, o Fedora passou a utilizar o driver nouveau. Veja nessa dica como utilizar o driver proprietário novamente.

Atualização: bug resolvido na versão 510.47.03 do driver.

A relação dos drivers NVIDIA com o Linux, sempre foi caótica. Volta e meia, quando há alguma atualização de kernel, o driver proprietário quebra e na próxima reinicialização, aparece o bendito nouveau, trabalhando a todo vapor!

Não vou entrar na questão do conflito que há entre o nouveau e a nvidia, pois este assunto é antigo e muito mal esclarecido, ainda.

No momento, vou focar na resolução do problema que envolve a versão 5.16 do kernel linux com o Fedora 35, e a versão 495.46 do driver nvidia, que é a que estou utilizando nesse exato momento.

Se você utiliza uma versão mais antiga do driver, pode ser que essa dica resolva o seu problema também, embora eu só tenha testado com a versão mencionada.

Corrigindo o driver nvidia

Para voltar a ter o driver funcionando na versão 5.16, precisaremos editar o código fonte do módulo nvidia para remover algumas linhas de código.

Nessa dica, estou utilizando o kernel 5.16.5. Se estiver usando uma versão mais recente do kernel, atente-se em trocar o 5.16.5 pela versão utilizada.

Antes de prosseguir, logue-se como root no terminal, pois será necessário executar todos os comandos abaixo como superusuário.

Crie uma pasta temporária:

1
# mkdir /tmp/nvidia-patch

Copie o módulo nvidia compactado para a pasta recém criada:

1
# cp /usr/share/nvidia-kmod-495.46/nvidia-kmod-495.46-x86_64.tar.xz /tmp/nvidia-patch

Entre na pasta temporária:

1
# cd /tmp/nvidia-patch

Descompacte o módulo nvidia:

1
# tar -xvf nvidia-kmod-495.46-x86_64.tar.xz

Agora vem a parte divertida: precisamos remover a constante MIGRATE_PFN_LOCKED do arquivo kernel/nvidia-uvm/uvm_migrate_pageable.c.

Essa constante foi removida da versão 5.16 do kernel, e é o real motivo pelo qual o akmod falha ao compilar o módulo nvidia para essa versão.

Para remover, podemos utilizar o comando sed:

1
# sed -i 's/| MIGRATE_PFN_LOCKED//g' kernel/nvidia-uvm/uvm_migrate_pageable.c

Após essa alteração, podemos compactar novamente o módulo:

1
# tar cfJ nvidia-kmod-495.46-x86_64.tar.xz kernel/

Mova o arquivo recém compactado para a pasta do akmod:

1
# mv nvidia-kmod-495.46-x86_64.tar.xz /usr/share/nvidia-kmod-495.46/

Agora, podemos recompilar os módulos nvidia para o kernel 5.16:

1
# akmods --force --kernel 5.16.5-200.fc35.x86_64

Depois que compilar, certifique-se que os arquivos .ko do módulo foram criados para o kernel 5.16:

1
# ls /lib/modules/5.16.5-200.fc35.x86_64/extra/nvidia/*.ko

O resultado deve ser o mesmo que:

1
2
3
4
5
6
7
8
9
/lib/modules/5.16.5-200.fc35.x86_64/extra/nvidia/nvidia-drm.ko

/lib/modules/5.16.5-200.fc35.x86_64/extra/nvidia/nvidia.ko

/lib/modules/5.16.5-200.fc35.x86_64/extra/nvidia/nvidia-modeset.ko

/lib/modules/5.16.5-200.fc35.x86_64/extra/nvidia/nvidia-peermem.ko

/lib/modules/5.16.5-200.fc35.x86_64/extra/nvidia/nvidia-uvm.ko

Após isso, basta reinicializar o sistema que o driver nvidia será carregado normalmente.

Créditos: reddit.com