"Después del juego es antes del juego"
Sepp Herberger

lunes, 23 de marzo de 2015

Listar el valor real de los parámetros de un módulo cargado por el kernel.

Normalmente, los drivers de Linux tienen diversos parámetros con los que podemos jugar al cargarlos en memoria, logrando así que funcionen mejor o, simplemente, funcionen correctamente. Cuando trabajamos con hardware diverso siempre que tenemos problemas de estabilidad o rendimiento tenemos que andar husmeando y afinando dichos parámetros. La forma de saber que parámetros tiene un driver es:

root@A99-PRO:~# modinfo radeon
filename: /lib/modules/3.16-0.bpo.2-amd64/kernel/drivers/gpu/drm/radeon/radeon.ko
license: GPL and additional rights
description: ATI Radeon
author: Gareth Hughes, Keith Whitwell, others.
firmware: radeon/R520_cp.bin
.......
firmware: radeon/BONAIRE_vce.bin
alias: pci:v00001002d000099A4sv*sd*bc*sc*i*
........
alias: pci:v00001002d00001304sv*sd*bc*sc*i*
depends: drm,drm_kms_helper,ttm,i2c-core,i2c-algo-bit
intree: Y
vermagic: 3.16-0.bpo.2-amd64 SMP mod_unload modversions
parm: no_wb:Disable AGP writeback for scratch registers (int)
parm: modeset:Disable/Enable modesetting (int)
parm: dynclks:Disable/Enable dynamic clocks (int)
parm: r4xx_atom:Enable ATOMBIOS modesetting for R4xx (int)
parm: vramlimit:Restrict VRAM for testing, in megabytes (int)
parm: agpmode:AGP Mode (-1 == PCI) (int)
parm: gartsize:Size of PCIE/IGP gart to setup in megabytes (32, 64, etc., -1 = auto) (int)
parm: benchmark:Run benchmark (int)
parm: test:Run tests (int)
parm: connector_table:Force connector table (int)
parm: tv:TV enable (0 = disable) (int)
parm: audio:Audio enable (-1 = auto, 0 = disable, 1 = enable) (int)
parm: disp_priority:Display Priority (0 = auto, 1 = normal, 2 = high) (int)
parm: hw_i2c:hw i2c engine enable (0 = disable) (int)
parm: pcie_gen2:PCIE Gen2 mode (-1 = auto, 0 = disable, 1 = enable) (int)
parm: msi:MSI support (1 = enable, 0 = disable, -1 = auto) (int)
parm: lockup_timeout:GPU lockup timeout in ms (defaul 10000 = 10 seconds, 0 = disable) (int)
parm: fastfb:Direct FB access for IGP chips (0 = disable, 1 = enable) (int)
parm: dpm:DPM support (1 = enable, 0 = disable, -1 = auto) (int)
parm: aspm:ASPM support (1 = enable, 0 = disable, -1 = auto) (int)
parm: runpm:PX runtime pm (1 = force enable, 0 = disable, -1 = PX only default) (int)
parm: hard_reset:PCI config reset (1 = force enable, 0 = disable (default)) (int)
parm: vm_size:VM address space size in gigabytes (default 4GB) (int)
parm: vm_block_size:VM page table size in bits (default 9) (int)
parm: deep_color:Deep Color support (1 = enable, 0 = disable (default)) (int)

La forma en que se da valor a esos parámetros es en /etc/modprobe.d. Por ejemplo si queremos dar un valor al parámetro mode del driver radeon haríamos (el nombre del fichero radeon-kms.conf es arbitrario):

root@A99-PRO:~# cat /etc/modprobe.d/radeon-kms.conf 
options radeon modeset=1
root@A99-PRO:~#

Otra opción es añadirlo en /boot/grub.cfg, en la línea que carga el núcleo:

....
linux /boot/vmlinuz-3.10.12-100.fc18.x86_64 root=UUID=e39b2bba-0709-4e67-89b6-c8ebcf89592f ro radeon.modeset=0
....

Hay varios sitios más desde donde dar esos valores,pero estos son los mas usuales.

Mi problema era que quería saber, con el sistema ya arrancado, que valor tenían realmente los parámetros. Lo encontré en http://stackexchange.com, pero por desgracia perdí la referencia al mensaje concreto. El script es este:

root@A99-PRO:~# cat parametros-modulo.sh 
#!/bin/bash

cat /proc/modules | grep $1 | cut -f 1 -d " " | while read module; do \
echo "Module: $module"; \
if [ -d "/sys/module/$module/parameters" ]; then \
ls /sys/module/$module/parameters/ | while read parameter; do \
echo -n " $parameter="; \
cat /sys/module/$module/parameters/$parameter; \
done; \
fi; \
echo; \
done

Ahora, si queremos saber el valor que tienen todos los parámetros de, por ejemplo, el módulo radeon y sus módulos dependientes haríamos:

root@A99-PRO:~# ./parametros-modulo.sh radeon
Module: radeon
agpmode=0
aspm=-1
audio=-1
benchmark=0
connector_table=0
deep_color=0
disp_priority=0
dpm=-1
dynclks=-1
fastfb=0
gartsize=512
hard_reset=0
hw_i2c=0
lockup_timeout=10000
modeset=1
msi=-1
no_wb=0
pcie_gen2=-1
r4xx_atom=0
runpm=-1
test=0
tv=1
vm_block_size=9
vm_size=4
vramlimit=0

Module: ttm

Module: drm_kms_helper
edid_firmware= poll=Y

Module: drm
debug=0
edid_fixup=6
rnodes=0
timestamp_monotonic=1
timestamp_precision_usec=20
universal_planes=0
vblankoffdelay=5000

Module: i2c_algo_bit
bit_test=0

Module: i2c_core

Y eso esto todo, amigos.

No hay comentarios:

Publicar un comentario