DevSecOpsARTIGO

Como usar o nvidia-331 e linux-3.13

Nada como começar 2014 com um artigo sobre nvidia. Não que 2014 tenha começado agora, mas não tive muito assunto pra escrever até o momento.

Nada como começar 2014 com um artigo sobre nvidia. Não que 2014 tenha começado agora, mas não tive muito assunto pra escrever até o momento (na verdade tive, mas a inércia de 2013 foi mais forte).

Estou trabalhando num ambiente que usa pesadamente Linux containers, os lxc, que é uma forma de virtualização.  Pra minha triste surpresa, muitas funcionalidades não ficam ativas no lxc com o kernel-pf.  Então resolvi voltar pro bom e velho kernel Linux padrão, baixado diretamente de https://www.kernel.org.

Compilação feita, com parâmetros pra funcionamento dos Linux containers (é preciso ativar cgroups em toda sua funcionalidade) e, antes do boot, aparece um upgrade dos drivers da nvidia. Já que ia fazer um reboot, resolvi fazer tudo de uma vez.

O boot do kernel linux-3.13.0-helio.3 (3ª versão, as outras duas ou eu esqueci algo, ou falhou em algum parâmetro que deixei fora) foi tranquilo, mas o Xorg… Esse subiu com noveau, bem inferior ao drive da nvidia.  Ao tentar carregar o módulo da nvidia manualmente, pra descobrir qual o problema, surgiu a seguinte mensagem:

[ 89.005614] nvidia: Unknown symbol acpi_os_wait_events_complete (err 0)
[ 386.837191] nvidia: Unknown symbol acpi_os_wait_events_complete (err 0)

Procurando pela Internet, descobri que justamente o pacote novo da nvidia, nvidia-331 (ou nvidia-331_331.38-0ubuntu0.0.1~xedgers~precise2_amd64.deb), tem esse erro com kernels 3.13, pois a função EXPORT_SYMBOL(acpi_os_wait_events_complete) foi removida do mesmo.

A correção não é muito complexa.  Basta aplicar a seguinte correção dentro de “/usr/src/nvidia-331-331.38”, que foi criado durante a instalação do pacote:

--- nvidia-331-331.38/nv-acpi.c.orig    2014-01-21 11:44:59.485055493 +0100
+++ nvidia-331-331.38/nv-acpi.c 2014-01-21 11:44:22.664056579 +0100
@@ -301,13 +301,13 @@
             "NVRM: nv_acpi_remove: failed to disable display switch events (%d)!\n", status);
     }
 
-    if (pNvAcpiObject->notify_handler_installed)
+    /* if (pNvAcpiObject->notify_handler_installed)
     {
         NV_ACPI_OS_WAIT_EVENTS_COMPLETE();
 
         // remove event notifier
         status = acpi_remove_notify_handler(device->handle, ACPI_DEVICE_NOTIFY, nv_acpi_event);
-    }
+    }*/
 
     if (pNvAcpiObject->notify_handler_installed &&
         ACPI_FAILURE(status))

É um comentário em toda a parte de código que usa a função problemática.  Uma vez que a chamada de kernel não existe mais, não deve causar grandes impactos.  Então basta atualizar o dkms, que no meu caso fiz com o kernel de nomelinux-3.13.0.helio-3.

dkms remove -m nvidia-331 -v 331.38 -k 3.13.0.helio-3
dkms build -m nvidia-331 -v 331.38 -k 3.13.0.helio-3
dkms install -m nvidia-331 -v 331.38 -k 3.13.0.helio-3

Com isso, o módulo novo, com o patch acima, é construído. Então basta rebootar pra ter o kernel novo rodando e correr pro abraço.

trabalha em telecomunicações na Ericsson. Formado em engenharia elétrica pela UFSC e com MBA em gestão estratégica de TI pela FGV, trilha o mundo do software livre desde 1997, passando por Linux em geral, Debian e FreeBSD. Atualmente, se interessa mais pelo lado de startups do software livre e menos por código, mas sempre dá uma escapadinha para programar em Python.

Ver perfil