やるきなし

2018/01/10 00:52 / nvidia-kernel-dkms 384.98-3~bpo9+1 on Linux 4.14.9 以降

https://devtalk.nvidia.com/default/topic/1028134/error-upgrading-to-4-14-10-kernel-in-xubuntu-17-10-in-dkms-384-90/?offset=2などで報告されていて,各所で nvidia のドライバの version を上げることが解決策として示されているが,nvidia-kernel-dkms 384.98-3~bpo9+1 が Linux 4.14.9 以降で以下のようなエラーでコンパイルできない.

/var/lib/dkms/nvidia-current/384.98/build/nvidia-uvm/uvm8_va_block.c: In function ‘block_cpu_fault_locked’:
./arch/x86/include/asm/processor.h:826:39: error: implicit declaration of function ‘task_stack_page’ [-Werror=implicit-function-declaration]
  unsigned long __ptr = (unsigned long)task_stack_page(task); \
                                       ^
./arch/x86/include/asm/processor.h:909:26: note: in expansion of macro ‘task_pt_regs’
 #define KSTK_EIP(task)  (task_pt_regs(task)->ip)
                          ^~~~~~~~~~~~
/var/lib/dkms/nvidia-current/384.98/build/nvidia-uvm/uvm8_va_block.c:8771:41: note: in expansion of macro ‘KSTK_EIP’
                                         KSTK_EIP(current));
                                         ^~~~~~~~

上記問題に対応した version が stable backports でまだ利用できないので,とりあえず対処する.方法は,https://patchwork.kernel.org/patch/10137715/のとおり#include <linux/sched/task_stack.h>すること.

Kernel側の原因はx86/entry/64: Remove thread_struct::sp0.x86_64 と x86_32 で task_pt_regs が共通化され,いままで 64bit だと task_stack_page が不要だったが,使われるようになって,そのため#include <linux/sched/task_stack.h>が必要になったということらしい.

Debian GNU/Linux experimental では 387.34 が利用可能で,少しコードをみてみたが,以下がnvidia-uvm/uvm_linux.hに追加されていた(conftest.shlinux/sched/task_stack.h がチェックされ NV_LINUX_SCHED_TASK_STACK_H_PRESENT がセットされる).

#if defined(NV_LINUX_SCHED_TASK_STACK_H_PRESENT)
#include <linux/sched/task_stack.h>
#endif

追記 (2018/1/13)

stable-bpo 384.111-1~bpo9+1 で本件解決した模様.

Related articles