commit:     fcf0219eb2804a4fc994c4732e6416b4f9b8b6e7
Author:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 15 20:34:10 2021 +0000
Commit:     Ionen Wolkens <ionen <AT> gentoo <DOT> org>
CommitDate: Mon Nov 15 21:54:02 2021 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=fcf0219e

x11-drivers/nvidia-drivers: workaround 0/495 dbus powerd spam

Not ideal and may possibly have other impacts, but it seem
better than leaving this issue alone as it can be doing ~10000
requests per second depending on what's being ran.

Alternative known workaround to at least prevent logging issues
(dbus black hole) would require user interaction and doesn't
seem worth it here.

Signed-off-by: Ionen Wolkens <ionen <AT> gentoo.org>

 .../nvidia-drivers/nvidia-drivers-495.44-r1.ebuild | 507 +++++++++++++++++++++
 1 file changed, 507 insertions(+)

diff --git a/x11-drivers/nvidia-drivers/nvidia-drivers-495.44-r1.ebuild 
b/x11-drivers/nvidia-drivers/nvidia-drivers-495.44-r1.ebuild
new file mode 100644
index 000000000000..17ddd558fc79
--- /dev/null
+++ b/x11-drivers/nvidia-drivers/nvidia-drivers-495.44-r1.ebuild
@@ -0,0 +1,507 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+MODULES_OPTIONAL_USE="driver"
+inherit desktop eapi8-dosym linux-mod multilib-build \
+       readme.gentoo-r1 systemd toolchain-funcs unpacker
+
+NV_KERNEL_MAX="5.15"
+NV_URI="https://download.nvidia.com/XFree86/";
+
+DESCRIPTION="NVIDIA Accelerated Graphics Driver"
+HOMEPAGE="https://www.nvidia.com/download/index.aspx";
+SRC_URI="
+       amd64? ( ${NV_URI}Linux-x86_64/${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+       arm64? ( ${NV_URI}Linux-aarch64/${PV}/NVIDIA-Linux-aarch64-${PV}.run )
+       ${NV_URI}nvidia-installer/nvidia-installer-${PV}.tar.bz2
+       ${NV_URI}nvidia-modprobe/nvidia-modprobe-${PV}.tar.bz2
+       ${NV_URI}nvidia-persistenced/nvidia-persistenced-${PV}.tar.bz2
+       ${NV_URI}nvidia-settings/nvidia-settings-${PV}.tar.bz2
+       ${NV_URI}nvidia-xconfig/nvidia-xconfig-${PV}.tar.bz2"
+# nvidia-installer is unused but here for GPL-2's "distribute sources"
+S="${WORKDIR}"
+
+LICENSE="NVIDIA-r2 BSD GPL-2 MIT ZLIB"
+SLOT="0/${PV%%.*}"
+KEYWORDS="-* ~amd64"
+IUSE="+X +driver static-libs +tools wayland"
+RESTRICT="bindist"
+
+COMMON_DEPEND="
+       acct-group/video
+       acct-user/nvpd
+       net-libs/libtirpc:=
+       tools? (
+               dev-libs/atk
+               dev-libs/glib:2
+               dev-libs/jansson
+               media-libs/harfbuzz:=
+               x11-libs/cairo
+               x11-libs/gdk-pixbuf:2
+               x11-libs/gtk+:3
+               x11-libs/libX11
+               x11-libs/libXext
+               x11-libs/libXxf86vm
+               x11-libs/pango
+       )"
+RDEPEND="
+       ${COMMON_DEPEND}
+       X? (
+               media-libs/libglvnd[X,${MULTILIB_USEDEP}]
+               x11-libs/libX11[${MULTILIB_USEDEP}]
+               x11-libs/libXext[${MULTILIB_USEDEP}]
+       )
+       wayland? (
+               >=gui-libs/egl-wayland-1.1.7-r1
+               media-libs/libglvnd
+               >=media-libs/mesa-21.2[gbm(+)]
+               x11-libs/libdrm
+       )"
+DEPEND="
+       ${COMMON_DEPEND}
+       static-libs? (
+               x11-libs/libX11
+               x11-libs/libXext
+       )
+       tools? (
+               media-libs/libglvnd
+               sys-apps/dbus
+               x11-base/xorg-proto
+               x11-libs/libXrandr
+               x11-libs/libXv
+               x11-libs/libvdpau
+       )"
+BDEPEND="
+       app-misc/pax-utils
+       sys-devel/m4
+       virtual/pkgconfig"
+
+QA_PREBUILT="lib/firmware/* opt/bin/* usr/lib*"
+
+PATCHES=(
+       "${FILESDIR}"/nvidia-modprobe-390.141-uvm-perms.patch
+)
+
+pkg_setup() {
+       use driver || return
+
+       local CONFIG_CHECK="
+               PROC_FS
+               ~DRM_KMS_HELPER
+               ~SYSVIPC
+               ~!DRM_SIMPLEDRM
+               ~!LOCKDEP
+               ~!SLUB_DEBUG_ON
+               !DEBUG_MUTEXES"
+       local ERROR_DRM_KMS_HELPER="CONFIG_DRM_KMS_HELPER: is not set but 
needed for Xorg auto-detection
+       of drivers (no custom config), and for wayland / nvidia-drm.modeset=1.
+       Cannot be directly selected in the kernel's menuconfig, so enable
+       options such as CONFIG_DRM_FBDEV_EMULATION instead."
+
+       use amd64 && kernel_is -ge 5 8 && CONFIG_CHECK+=" X86_PAT" #817764
+
+       MODULE_NAMES="
+               nvidia(video:kernel)
+               nvidia-drm(video:kernel)
+               nvidia-modeset(video:kernel)
+               nvidia-peermem(video:kernel)
+               nvidia-uvm(video:kernel)"
+
+       linux-mod_pkg_setup
+
+       [[ ${MERGE_TYPE} == binary ]] && return
+
+       BUILD_PARAMS='NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC="${KV_DIR}" 
SYSOUT="${KV_OUT_DIR}"'
+       BUILD_TARGETS="modules" # defaults' clean sometimes deletes modules
+
+       if linux_chkconfig_present CC_IS_CLANG; then
+               ewarn "Warning: building ${PN} with a clang-built kernel is 
experimental."
+
+               BUILD_PARAMS+=' CC=${CHOST}-clang'
+               if linux_chkconfig_present LD_IS_LLD; then
+                       BUILD_PARAMS+=' LD=ld.lld'
+                       if linux_chkconfig_present LTO_CLANG_THIN; then
+                               # kernel enables cache by default leading to 
sandbox violations
+                               BUILD_PARAMS+=' ldflags-y=--thinlto-cache-dir= 
LDFLAGS_MODULE=--thinlto-cache-dir='
+                       fi
+               fi
+       fi
+
+       if kernel_is -gt ${NV_KERNEL_MAX/./ }; then
+               ewarn "Kernel ${KV_MAJOR}.${KV_MINOR} is either known to break 
this version of nvidia-drivers"
+               ewarn "or was not tested with it. It is recommended to use one 
of:"
+               ewarn "  <=sys-kernel/gentoo-kernel-${NV_KERNEL_MAX}"
+               ewarn "  <=sys-kernel/gentoo-sources-${NV_KERNEL_MAX}"
+               ewarn "You are free to try or use /etc/portage/patches, but 
support will"
+               ewarn "not be given and issues wait until NVIDIA releases a 
fixed version."
+               ewarn
+               ewarn "Do _not_ file a bug report if run into issues."
+               ewarn
+       fi
+}
+
+src_prepare() {
+       # make user patches usable across versions
+       rm nvidia-modprobe && mv nvidia-modprobe{-${PV},} || die
+       rm nvidia-persistenced && mv nvidia-persistenced{-${PV},} || die
+       rm nvidia-settings && mv nvidia-settings{-${PV},} || die
+       rm nvidia-xconfig && mv nvidia-xconfig{-${PV},} || die
+
+       default
+
+       # prevent detection of incomplete kernel DRM support (bug #603818)
+       sed 's/defined(CONFIG_DRM)/defined(CONFIG_DRM_KMS_HELPER)/' \
+               -i kernel/conftest.sh || die
+
+       sed -e '/Exec=\|Icon=/s/_.*/nvidia-settings/' \
+               -e '/Categories=/s/_.*/System;Settings;/' \
+               -i nvidia-settings/doc/nvidia-settings.desktop || die
+
+       # remove gtk2 support (bug #592730)
+       sed '/^GTK2LIB = /d;/INSTALL.*GTK2LIB/,+1d' \
+               -i nvidia-settings/src/Makefile || die
+
+       sed 's/__USER__/nvpd/' \
+               
nvidia-persistenced/init/systemd/nvidia-persistenced.service.template \
+               > nvidia-persistenced.service || die
+
+       # enable nvidia-drm.modeset=1 by default with USE=wayland
+       cp "${FILESDIR}"/nvidia-470.conf "${T}"/nvidia.conf || die
+       use !wayland || sed -i '/^#.*modeset=1$/s/^#//' "${T}"/nvidia.conf || 
die
+
+       gzip -d nvidia-{cuda-mps-control,smi}.1.gz || die
+
+       # temporary workaround for dbus powerd spam in 495 series
+       # (jz -> jmp after nvidia.powerd.server, need RESTRICT=bindist)
+       # 
https://forums.developer.nvidia.com/t/bug-nvidia-v495-29-05-driver-spamming-dbus-enabled-applications-with-invalid-messages/192892/14
+       if use amd64; then
+               sed 
's/\x0f\x84\[\x01\x00\x00\x4c\x8d/\xe9\x5c\x01\x00\x00\x00\x4c\x8d/' \
+                       -i libnvidia-glcore.so.495.44 || die
+               sed 
's/\x0f\x84\x65\x01\x00\x00\x83\xec\x08\x89/\xe9\x66\x01\x00\x00\x00\x83\xec\x08\x89/'
 \
+                       -i 32/libnvidia-glcore.so.495.44 || die
+       fi
+}
+
+src_compile() {
+       nvidia-drivers_make() {
+               emake -C nvidia-${1} ${2} \
+                       PREFIX="${EPREFIX}/usr" \
+                       HOST_CC="$(tc-getBUILD_CC)" \
+                       HOST_LD="$(tc-getBUILD_LD)" \
+                       NV_USE_BUNDLED_LIBJANSSON=0 \
+                       NV_VERBOSE=1 DO_STRIP= OUTPUTDIR=out
+       }
+
+       tc-export AR CC LD OBJCOPY
+
+       # may no longer be relevant but kept as a safety
+       export DISTCC_DISABLE=1 CCACHE_DISABLE=1
+
+       use driver && linux-mod_src_compile
+
+       nvidia-drivers_make modprobe
+       nvidia-drivers_make persistenced
+       use X && nvidia-drivers_make xconfig
+
+       if use tools; then
+               nvidia-drivers_make settings
+       elif use static-libs; then
+               nvidia-drivers_make settings/src out/libXNVCtrl.a
+       fi
+}
+
+src_install() {
+       nvidia-drivers_make_install() {
+               emake -C nvidia-${1} install \
+                       DESTDIR="${D}" \
+                       PREFIX="${EPREFIX}/usr" \
+                       LIBDIR="${ED}/usr/$(get_libdir)" \
+                       NV_USE_BUNDLED_LIBJANSSON=0 \
+                       NV_VERBOSE=1 DO_STRIP= MANPAGE_GZIP= OUTPUTDIR=out
+       }
+
+       nvidia-drivers_libs_install() {
+               local libs=(
+                       EGL_nvidia
+                       GLESv1_CM_nvidia
+                       GLESv2_nvidia
+                       cuda
+                       nvcuvid
+                       nvidia-allocator
+                       nvidia-eglcore
+                       nvidia-encode
+                       nvidia-glcore
+                       nvidia-glsi
+                       nvidia-glvkspirv
+                       nvidia-ml
+                       nvidia-opencl
+                       nvidia-opticalflow
+                       nvidia-ptxjitcompiler
+                       nvidia-tls
+                       $(usex X '
+                               GLX_nvidia
+                               nvidia-fbc
+                               vdpau_nvidia
+                       ' '')
+                       $(usex amd64 nvidia-compiler '')
+               )
+
+               local libdir=.
+               if [[ ${ABI} == x86 ]]; then
+                       libdir+=/32
+               else
+                       libs+=(
+                               libnvidia-nvvm.so.4.0.0
+                               nvidia-cfg
+                               nvidia-ngx
+                               nvidia-rtcore
+                               nvoptix
+                               $(usex wayland '
+                                       libnvidia-egl-gbm.so.1.1.0
+                                       nvidia-vulkan-producer
+                               ' '')
+                       )
+               fi
+
+               local lib soname
+               for lib in "${libs[@]}"; do
+                       [[ ${lib:0:3} != lib ]] && lib=lib${lib}.so.${PV}
+
+                       # auto-detect soname and create appropriate symlinks
+                       soname=$(scanelf -qF'%S#F' ${lib}) || die "Scanning 
${lib} failed"
+                       if [[ ${soname} && ${soname} != ${lib} ]]; then
+                               ln -s ${lib} ${libdir}/${soname} || die
+                       fi
+                       ln -s ${lib} ${libdir}/${lib%.so*}.so || die
+
+                       dolib.so ${libdir}/${lib%.so*}*
+               done
+       }
+
+       if use driver; then
+               linux-mod_src_install
+
+               insinto /etc/modprobe.d
+               doins "${T}"/nvidia.conf
+
+               insinto /lib/firmware/nvidia/${PV}
+               doins firmware/gsp.bin
+
+               # used for gpu verification with binpkgs (not kept)
+               insinto /usr/share/nvidia
+               doins supported-gpus/supported-gpus.json
+       fi
+
+       if use X; then
+               exeinto /usr/$(get_libdir)/xorg/modules/drivers
+               doexe nvidia_drv.so
+
+               exeinto /usr/$(get_libdir)/xorg/modules/extensions
+               newexe libglxserver_nvidia.so{.${PV},}
+
+               insinto /usr/share/X11/xorg.conf.d
+               newins {,50-}nvidia-drm-outputclass.conf
+
+               # vulkan icd uses libGLX_nvidia.so and so requires X
+               insinto /usr/share/vulkan/icd.d
+               doins nvidia_icd.json
+               insinto /usr/share/vulkan/implicit_layer.d
+               doins nvidia_layers.json
+       fi
+
+       if use wayland; then
+               insinto /usr/share/egl/egl_external_platform.d
+               doins 15_nvidia_gbm.json
+
+               dosym8 -r 
/usr/$(get_libdir)/{libnvidia-allocator.so.1,gbm/nvidia-drm_gbm.so}
+       fi
+
+       insinto /usr/share/glvnd/egl_vendor.d
+       doins 10_nvidia.json
+
+       insinto /etc/OpenCL/vendors
+       doins nvidia.icd
+
+       insinto /etc/nvidia
+       newins nvidia-application-profiles{-${PV},}-rc
+
+       # install built helpers
+       nvidia-drivers_make_install modprobe
+       # allow video group to load mods and create devs (bug #505092)
+       fowners :video /usr/bin/nvidia-modprobe
+       fperms 4710 /usr/bin/nvidia-modprobe
+
+       nvidia-drivers_make_install persistenced
+       newconfd "${FILESDIR}"/nvidia-persistenced.confd nvidia-persistenced
+       newinitd "${FILESDIR}"/nvidia-persistenced.initd nvidia-persistenced
+       systemd_dounit nvidia-persistenced.service
+
+       use X && nvidia-drivers_make_install xconfig
+
+       if use tools; then
+               nvidia-drivers_make_install settings
+               doicon nvidia-settings/doc/nvidia-settings.png
+               domenu nvidia-settings/doc/nvidia-settings.desktop
+
+               insinto /usr/share/nvidia
+               newins nvidia-application-profiles{-${PV},}-key-documentation
+
+               exeinto /etc/X11/xinit/xinitrc.d
+               newexe "${FILESDIR}"/95-nvidia-settings-r1 95-nvidia-settings
+       fi
+
+       if use static-libs; then
+               dolib.a nvidia-settings/src/out/libXNVCtrl.a
+
+               insinto /usr/include/NVCtrl
+               doins nvidia-settings/src/libXNVCtrl/NVCtrl{Lib,}.h
+       fi
+
+       # install prebuilt-only helpers
+       exeinto /opt/bin
+
+       doexe nvidia-cuda-mps-control
+       doman nvidia-cuda-mps-control.1
+       doexe nvidia-cuda-mps-server
+
+       doexe nvidia-debugdump
+       dobin nvidia-bug-report.sh
+
+       doexe nvidia-ngx-updater
+
+       doexe nvidia-smi
+       doman nvidia-smi.1
+
+       # install prebuilt-only libraries
+       multilib_foreach_abi nvidia-drivers_libs_install
+
+       # install dlls for optional use with proton/wine
+       insinto /usr/$(get_libdir)/nvidia/wine
+       use amd64 && doins {_,}nvngx.dll
+
+       # install systemd sleep services
+       exeinto /lib/systemd/system-sleep
+       doexe systemd/system-sleep/nvidia
+       dobin systemd/nvidia-sleep.sh
+       systemd_dounit systemd/system/nvidia-{hibernate,resume,suspend}.service
+
+       # create README.gentoo
+       local DISABLE_AUTOFORMATTING=yes
+       local DOC_CONTENTS=\
+"Trusted users should be in the 'video' group to use NVIDIA devices.
+You can add yourself by using: gpasswd -a my-user video
+
+See '${EPREFIX}/etc/modprobe.d/nvidia.conf' for modules options.
+
+For general information on using nvidia-drivers, please see:
+https://wiki.gentoo.org/wiki/NVIDIA/nvidia-drivers";
+       readme.gentoo_create_doc
+
+       local DOCS=(
+               README.txt NVIDIA_Changelog supported-gpus/supported-gpus.json
+               nvidia-settings/doc/{FRAMELOCK,NV-CONTROL-API}.txt
+       )
+       local HTML_DOCS=( html/. )
+       einstalldocs
+}
+
+pkg_preinst() {
+       use driver || return
+       linux-mod_pkg_preinst
+
+       # set video group id based on live system (bug #491414)
+       local g=$(getent group video | cut -d: -f3)
+       [[ ${g} ]] || die "Failed to determine video group id"
+       sed -i "s/@VIDEOGID@/${g}/" "${ED}"/etc/modprobe.d/nvidia.conf || die
+
+       # try to find driver mismatches using temporary supported-gpus.json
+       for g in $(grep -l 0x10de /sys/bus/pci/devices/*/vendor 2>/dev/null); do
+               g=$(grep -io 
"\"devid\":\"$(<${g%vendor}device)\"[^}]*branch\":\"[0-9]*" \
+                       "${ED}"/usr/share/nvidia/supported-gpus.json 
2>/dev/null)
+               if [[ ${g} ]]; then
+                       g=$((${g##*\"}+1))
+                       if ver_test -ge ${g}; then
+                               NV_LEGACY_MASK=">=${CATEGORY}/${PN}-${g}"
+                               break
+                       fi
+               fi
+       done
+       rm "${ED}"/usr/share/nvidia/supported-gpus.json || die
+
+       has_version "x11-drivers/nvidia-drivers[wayland]" && NV_HAD_WAYLAND=1
+}
+
+pkg_postinst() {
+       use driver && linux-mod_pkg_postinst
+
+       readme.gentoo_print_elog
+
+       if [[ -r /proc/driver/nvidia/version &&
+               $(grep -o '  [0-9.]*  ' /proc/driver/nvidia/version) != "  
${PV}  " ]]; then
+               ewarn "Currently loaded NVIDIA modules do not match the newly 
installed"
+               ewarn "libraries and will lead to GPU-using application issues."
+               use driver && ewarn "The easiest way to fix this is usually to 
reboot."
+       fi
+
+       if [[ $(</proc/cmdline) == *slub_debug=[!-]* ]]; then
+               ewarn "Detected that the current kernel command line is using 
'slub_debug=',"
+               ewarn "this may lead to system instability/freezes with this 
version of"
+               ewarn "${PN}. Bug: https://bugs.gentoo.org/796329";
+       fi
+
+       if [[ ${NV_LEGACY_MASK} ]]; then
+               ewarn
+               ewarn "***WARNING***"
+               ewarn
+               ewarn "You are installing a version of nvidia-drivers known not 
to work"
+               ewarn "with a GPU of the current system. If unwanted, add the 
mask:"
+               if [[ -d ${EROOT}/etc/portage/package.mask ]]; then
+                       ewarn "  echo '${NV_LEGACY_MASK}' > 
${EROOT}/etc/portage/package.mask/${PN}"
+               else
+                       ewarn "  echo '${NV_LEGACY_MASK}' >> 
${EROOT}/etc/portage/package.mask"
+               fi
+               ewarn "...then downgrade to a legacy branch if possible. For 
details, see:"
+               ewarn "https://www.nvidia.com/object/IO_32667.html";
+       fi
+
+       if use wayland && use driver && [[ ! ${NV_HAD_WAYLAND} ]]; then
+               elog
+               elog "With USE=wayland, this version of ${PN} sets 
nvidia-drm.modeset=1"
+               elog "in '${EROOT}/etc/modprobe.d/nvidia.conf'. This feature is 
considered"
+               elog "experimental but is required for EGLStream (used for 
wayland acceleration"
+               elog "in compositors that support it)."
+               elog
+               elog "If you experience issues, please comment out the option 
from nvidia.conf."
+               elog "Of note, may possibly cause issues with SLI and Reverse 
PRIME."
+       fi
+
+       if use wayland && [[ ${REPLACING_VERSIONS} ]] &&
+               ver_test ${REPLACING_VERSIONS} -lt 495.29.05; then
+               elog
+               elog "While this version of ${PN} adds GBM support (allowing a 
wider"
+               elog "range of wayland compositors, such as sway), be warned it 
is very"
+               elog "experimental. While not essential, some features also 
need"
+               elog ">=egl-wayland-1.1.8 which is known to cause EGLStream 
regressions."
+               elog
+               elog "If lacking a cursor with wlroots, try 
WLR_NO_HARDWARE_CURSORS=1"
+               elog "Also of interest: __GLX_VENDOR_LIBRARY_NAME=nvidia, 
GBM_BACKEND=nvidia-drm"
+       fi
+
+       # Try to show this message only to users that may really need it
+       # given the workaround is discouraged and usage isn't widespread.
+       if use X && [[ ${REPLACING_VERSIONS} ]] &&
+               ver_test ${REPLACING_VERSIONS} -lt 460.73.01 &&
+               grep -qr Coolbits 
"${EROOT}"/etc/X11/{xorg.conf,xorg.conf.d/*.conf} 2>/dev/null; then
+               elog
+               elog "Coolbits support with ${PN} has been restricted to 
require Xorg"
+               elog "with root privilege by NVIDIA (being in video group is 
not sufficient)."
+               elog "e.g. attempting to change fan speed with nvidia-settings 
would fail."
+               elog
+               elog "Depending on your display manager (e.g. sddm starts X as 
root, gdm doesn't)"
+               elog "or if using startx, it may be necessary to emerge 
x11-base/xorg-server with"
+               elog 'USE="suid -elogind -systemd" if wish to keep using this 
feature.'
+               elog "Bug: https://bugs.gentoo.org/784248";
+       fi
+}

Reply via email to