Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

docs: Add debugging guide for the media subsystem

Provide a guide for developers on how to debug code with a focus on the
media subsystem. This document aims to provide a rough overview over the
possibilities and a rational to help choosing the right tool for the
given circumstances.

Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/20241028-media_docs_improve_v3-v3-2-edf5c5b3746f@collabora.com

authored by

Sebastian Fricke and committed by
Jonathan Corbet
83a474c1 a037699d

+198
+5
Documentation/admin-guide/media/index.rst
··· 20 20 - for driver development information and Kernel APIs used by 21 21 media devices; 22 22 23 + Documentation/process/debugging/media_specific_debugging_guide.rst 24 + 25 + - for advice about essential tools and techniques to debug drivers on this 26 + subsystem 27 + 23 28 .. toctree:: 24 29 :caption: Table of Contents 25 30 :maxdepth: 2
+13
Documentation/process/debugging/index.rst
··· 4 4 Debugging advice for Linux Kernel developers 5 5 ============================================ 6 6 7 + general guides 8 + -------------- 9 + 7 10 .. toctree:: 8 11 :maxdepth: 1 9 12 10 13 driver_development_debugging_guide 11 14 userspace_debugging_guide 15 + 16 + .. only:: subproject and html 17 + 18 + subsystem specific guides 19 + ------------------------- 20 + 21 + .. toctree:: 22 + :maxdepth: 1 23 + 24 + media_specific_debugging_guide 12 25 13 26 .. only:: subproject and html 14 27
+180
Documentation/process/debugging/media_specific_debugging_guide.rst
··· 1 + .. SPDX-License-Identifier: GPL-2.0 2 + 3 + ============================================ 4 + Debugging and tracing in the media subsystem 5 + ============================================ 6 + 7 + This document serves as a starting point and lookup for debugging device 8 + drivers in the media subsystem and to debug these drivers from userspace. 9 + 10 + .. contents:: 11 + :depth: 3 12 + 13 + General debugging advice 14 + ------------------------ 15 + 16 + For general advice see the :doc:`general advice document 17 + </process/debugging/index>`. 18 + 19 + The following sections show you some of the available tools. 20 + 21 + dev_debug module parameter 22 + -------------------------- 23 + 24 + Every video device provides a ``dev_debug`` parameter, which allows to get 25 + further insights into the IOCTLs in the background.:: 26 + 27 + # cat /sys/class/video4linux/video3/name 28 + rkvdec 29 + # echo 0xff > /sys/class/video4linux/video3/dev_debug 30 + # dmesg -wH 31 + [...] videodev: v4l2_open: video3: open (0) 32 + [ +0.000036] video3: VIDIOC_QUERYCAP: driver=rkvdec, card=rkvdec, 33 + bus=platform:rkvdec, version=0x00060900, capabilities=0x84204000, 34 + device_caps=0x04204000 35 + 36 + For the full documentation see :ref:`driver-api/media/v4l2-dev:video device 37 + debugging` 38 + 39 + dev_dbg() / v4l2_dbg() 40 + ---------------------- 41 + 42 + Two debug print statements, which are specific for devices and for the v4l2 43 + subsystem, avoid adding these to your final submission unless they have 44 + long-term value for investigations. 45 + 46 + For a general overview please see the 47 + :ref:`process/debugging/driver_development_debugging_guide:printk() & friends` 48 + guide. 49 + 50 + - Difference between both? 51 + 52 + - v4l2_dbg() utilizes v4l2_printk() under the hood, which further uses 53 + printk() directly, thus it cannot be targeted by dynamic debug 54 + - dev_dbg() can be targeted by dynamic debug 55 + - v4l2_dbg() has a more specific prefix format for the media subsystem, while 56 + dev_dbg only highlights the driver name and the location of the log 57 + 58 + Dynamic debug 59 + ------------- 60 + 61 + A method to trim down the debug output to your needs. 62 + 63 + For general advice see the 64 + :ref:`process/debugging/userspace_debugging_guide:dynamic debug` guide. 65 + 66 + Here is one example, that enables all available pr_debug()'s within the file:: 67 + 68 + $ alias ddcmd='echo $* > /proc/dynamic_debug/control' 69 + $ ddcmd '-p; file v4l2-h264.c +p' 70 + $ grep =p /proc/dynamic_debug/control 71 + drivers/media/v4l2-core/v4l2-h264.c:372 [v4l2_h264]print_ref_list_b =p 72 + "ref_pic_list_b%u (cur_poc %u%c) %s" 73 + drivers/media/v4l2-core/v4l2-h264.c:333 [v4l2_h264]print_ref_list_p =p 74 + "ref_pic_list_p (cur_poc %u%c) %s\n" 75 + 76 + Ftrace 77 + ------ 78 + 79 + An internal kernel tracer that can trace static predefined events, function 80 + calls, etc. Very useful for debugging problems without changing the kernel and 81 + understanding the behavior of subsystems. 82 + 83 + For general advice see the 84 + :ref:`process/debugging/userspace_debugging_guide:ftrace` guide. 85 + 86 + DebugFS 87 + ------- 88 + 89 + This tool allows you to dump or modify internal values of your driver to files 90 + in a custom filesystem. 91 + 92 + For general advice see the 93 + :ref:`process/debugging/driver_development_debugging_guide:debugfs` guide. 94 + 95 + Perf & alternatives 96 + ------------------- 97 + 98 + Tools to measure the various stats on a running system to diagnose issues. 99 + 100 + For general advice see the 101 + :ref:`process/debugging/userspace_debugging_guide:perf & alternatives` guide. 102 + 103 + Example for media devices: 104 + 105 + Gather statistics data for a decoding job: (This example is on a RK3399 SoC 106 + with the rkvdec codec driver using the `fluster test suite 107 + <https://github.com/fluendo/fluster>`__):: 108 + 109 + perf stat -d python3 fluster.py run -d GStreamer-H.264-V4L2SL-Gst1.0 -ts 110 + JVT-AVC_V1 -tv AUD_MW_E -j1 111 + ... 112 + Performance counter stats for 'python3 fluster.py run -d 113 + GStreamer-H.264-V4L2SL-Gst1.0 -ts JVT-AVC_V1 -tv AUD_MW_E -j1 -v': 114 + 115 + 7794.23 msec task-clock:u # 0.697 CPUs utilized 116 + 0 context-switches:u # 0.000 /sec 117 + 0 cpu-migrations:u # 0.000 /sec 118 + 11901 page-faults:u # 1.527 K/sec 119 + 882671556 cycles:u # 0.113 GHz (95.79%) 120 + 711708695 instructions:u # 0.81 insn per cycle (95.79%) 121 + 10581935 branches:u # 1.358 M/sec (15.13%) 122 + 6871144 branch-misses:u # 64.93% of all branches (95.79%) 123 + 281716547 L1-dcache-loads:u # 36.144 M/sec (95.79%) 124 + 9019581 L1-dcache-load-misses:u # 3.20% of all L1-dcache accesses (95.79%) 125 + <not supported> LLC-loads:u 126 + <not supported> LLC-load-misses:u 127 + 128 + 11.180830431 seconds time elapsed 129 + 130 + 1.502318000 seconds user 131 + 6.377221000 seconds sys 132 + 133 + The availability of events and metrics depends on the system you are running. 134 + 135 + Error checking & panic analysis 136 + ------------------------------- 137 + 138 + Various Kernel configuration options to enhance error detection of the Linux 139 + Kernel with the cost of lowering performance. 140 + 141 + For general advice see the 142 + :ref:`process/debugging/driver_development_debugging_guide:kasan, ubsan, 143 + lockdep and other error checkers` guide. 144 + 145 + Driver verification with v4l2-compliance 146 + ---------------------------------------- 147 + 148 + To verify, that a driver adheres to the v4l2 API, the tool v4l2-compliance is 149 + used, which is part of the `v4l_utils 150 + <https://git.linuxtv.org/v4l-utils.git>`__, a suite of userspace tools to work 151 + with the media subsystem. 152 + 153 + To see the detailed media topology (and check it) use:: 154 + 155 + v4l2-compliance -M /dev/mediaX --verbose 156 + 157 + You can also run a full compliance check for all devices referenced in the 158 + media topology with:: 159 + 160 + v4l2-compliance -m /dev/mediaX 161 + 162 + Debugging problems with receiving video 163 + --------------------------------------- 164 + 165 + Implementing vidioc_log_status in the driver: this can log the current status 166 + to the kernel log. It's called by v4l2-ctl --log-status. Very useful for 167 + debugging problems with receiving video (TV/S-Video/HDMI/etc) since the video 168 + signal is external (so unpredictable). Less useful with camera sensor inputs 169 + since you have control over what the camera sensor does. 170 + 171 + Usually you can just assign the default:: 172 + 173 + .vidioc_log_status = v4l2_ctrl_log_status, 174 + 175 + But you can also create your own callback, to create a custom status log. 176 + 177 + You can find an example in the cobalt driver 178 + (`drivers/media/pci/cobalt/cobalt-v4l2.c <https://elixir.bootlin.com/linux/v6.11.6/source/drivers/media/pci/cobalt/cobalt-v4l2.c#L567>`__). 179 + 180 + **Copyright** ©2024 : Collabora