~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst (Architecture alpha) and /Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst (Architecture sparc)


  1 .. SPDX-License-Identifier: (GPL-2.0+ OR CC-BY      1 .. SPDX-License-Identifier: (GPL-2.0+ OR CC-BY-4.0)
  2 .. [see the bottom of this file for redistribu      2 .. [see the bottom of this file for redistribution information]
  3                                                     3 
  4 =========================================           4 =========================================
  5 How to verify bugs and bisect regressions           5 How to verify bugs and bisect regressions
  6 =========================================           6 =========================================
  7                                                     7 
  8 This document describes how to check if some L      8 This document describes how to check if some Linux kernel problem occurs in code
  9 currently supported by developers -- to then e      9 currently supported by developers -- to then explain how to locate the change
 10 causing the issue, if it is a regression (e.g.     10 causing the issue, if it is a regression (e.g. did not happen with earlier
 11 versions).                                         11 versions).
 12                                                    12 
 13 The text aims at people running kernels from m     13 The text aims at people running kernels from mainstream Linux distributions on
 14 commodity hardware who want to report a kernel     14 commodity hardware who want to report a kernel bug to the upstream Linux
 15 developers. Despite this intent, the instructi     15 developers. Despite this intent, the instructions work just as well for users
 16 who are already familiar with building their o     16 who are already familiar with building their own kernels: they help avoid
 17 mistakes occasionally made even by experienced     17 mistakes occasionally made even by experienced developers.
 18                                                    18 
 19 ..                                                 19 ..
 20    Note: if you see this note, you are reading     20    Note: if you see this note, you are reading the text's source file. You
 21    might want to switch to a rendered version:     21    might want to switch to a rendered version: it makes it a lot easier to
 22    read and navigate this document -- especial     22    read and navigate this document -- especially when you want to look something
 23    up in the reference section, then jump back     23    up in the reference section, then jump back to where you left off.
 24 ..                                                 24 ..
 25    Find the latest rendered version of this te     25    Find the latest rendered version of this text here:
 26    https://docs.kernel.org/admin-guide/verify-     26    https://docs.kernel.org/admin-guide/verify-bugs-and-bisect-regressions.html
 27                                                    27 
 28 The essence of the process (aka 'TL;DR')           28 The essence of the process (aka 'TL;DR')
 29 ========================================           29 ========================================
 30                                                    30 
 31 *[If you are new to building or bisecting Linu     31 *[If you are new to building or bisecting Linux, ignore this section and head
 32 over to the* ':ref:`step-by-step guide <introg     32 over to the* ':ref:`step-by-step guide <introguide_bissbs>`' *below. It utilizes
 33 the same commands as this section while descri     33 the same commands as this section while describing them in brief fashion. The
 34 steps are nevertheless easy to follow and toge     34 steps are nevertheless easy to follow and together with accompanying entries
 35 in a reference section mention many alternativ     35 in a reference section mention many alternatives, pitfalls, and additional
 36 aspects, all of which might be essential in yo     36 aspects, all of which might be essential in your present case.]*
 37                                                    37 
 38 **In case you want to check if a bug is presen     38 **In case you want to check if a bug is present in code currently supported by
 39 developers**, execute just the *preparations*      39 developers**, execute just the *preparations* and *segment 1*; while doing so,
 40 consider the newest Linux kernel you regularly     40 consider the newest Linux kernel you regularly use to be the 'working' kernel.
 41 In the following example that's assumed to be      41 In the following example that's assumed to be 6.0, which is why its sources
 42 will be used to prepare the .config file.          42 will be used to prepare the .config file.
 43                                                    43 
 44 **In case you face a regression**, follow the      44 **In case you face a regression**, follow the steps at least till the end of
 45 *segment 2*. Then you can submit a preliminary     45 *segment 2*. Then you can submit a preliminary report -- or continue with
 46 *segment 3*, which describes how to perform a      46 *segment 3*, which describes how to perform a bisection needed for a
 47 full-fledged regression report. In the followi     47 full-fledged regression report. In the following example 6.0.13 is assumed to be
 48 the 'working' kernel and 6.1.5 to be the first     48 the 'working' kernel and 6.1.5 to be the first 'broken', which is why 6.0
 49 will be considered the 'good' release and used     49 will be considered the 'good' release and used to prepare the .config file.
 50                                                    50 
 51 * **Preparations**: set up everything to build     51 * **Preparations**: set up everything to build your own kernels::
 52                                                    52 
 53     # * Remove any software that depends on ex     53     # * Remove any software that depends on externally maintained kernel modules
 54     #   or builds any automatically during boo     54     #   or builds any automatically during bootup.
 55     # * Ensure Secure Boot permits booting sel     55     # * Ensure Secure Boot permits booting self-compiled Linux kernels.
 56     # * If you are not already running the 'wo     56     # * If you are not already running the 'working' kernel, reboot into it.
 57     # * Install compilers and everything else      57     # * Install compilers and everything else needed for building Linux.
 58     # * Ensure to have 15 Gigabyte free space      58     # * Ensure to have 15 Gigabyte free space in your home directory.
 59     git clone -o mainline --no-checkout \          59     git clone -o mainline --no-checkout \
 60       https://git.kernel.org/pub/scm/linux/ker     60       https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ~/linux/
 61     cd ~/linux/                                    61     cd ~/linux/
 62     git remote add -t master stable \              62     git remote add -t master stable \
 63       https://git.kernel.org/pub/scm/linux/ker     63       https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
 64     git switch --detach v6.0                       64     git switch --detach v6.0
 65     # * Hint: if you used an existing clone, e     65     # * Hint: if you used an existing clone, ensure no stale .config is around.
 66     make olddefconfig                              66     make olddefconfig
 67     # * Ensure the former command picked the .     67     # * Ensure the former command picked the .config of the 'working' kernel.
 68     # * Connect external hardware (USB keys, t     68     # * Connect external hardware (USB keys, tokens, ...), start a VM, bring up
 69     #   VPNs, mount network shares, and briefl     69     #   VPNs, mount network shares, and briefly try the feature that is broken.
 70     yes '' | make localmodconfig                   70     yes '' | make localmodconfig
 71     ./scripts/config --set-str CONFIG_LOCALVER     71     ./scripts/config --set-str CONFIG_LOCALVERSION '-local'
 72     ./scripts/config -e CONFIG_LOCALVERSION_AU     72     ./scripts/config -e CONFIG_LOCALVERSION_AUTO
 73     # * Note, when short on storage space, che     73     # * Note, when short on storage space, check the guide for an alternative:
 74     ./scripts/config -d DEBUG_INFO_NONE -e KAL     74     ./scripts/config -d DEBUG_INFO_NONE -e KALLSYMS_ALL -e DEBUG_KERNEL \
 75       -e DEBUG_INFO -e DEBUG_INFO_DWARF_TOOLCH     75       -e DEBUG_INFO -e DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT -e KALLSYMS
 76     # * Hint: at this point you might want to      76     # * Hint: at this point you might want to adjust the build configuration;
 77     #   you'll have to, if you are running Deb     77     #   you'll have to, if you are running Debian.
 78     make olddefconfig                              78     make olddefconfig
 79     cp .config ~/kernel-config-working             79     cp .config ~/kernel-config-working
 80                                                    80 
 81 * **Segment 1**: build a kernel from the lates     81 * **Segment 1**: build a kernel from the latest mainline codebase.
 82                                                    82 
 83   This among others checks if the problem was      83   This among others checks if the problem was fixed already and which developers
 84   later need to be told about the problem; in      84   later need to be told about the problem; in case of a regression, this rules
 85   out a .config change as root of the problem.     85   out a .config change as root of the problem.
 86                                                    86 
 87   a) Checking out latest mainline code::           87   a) Checking out latest mainline code::
 88                                                    88 
 89        cd ~/linux/                                 89        cd ~/linux/
 90        git switch --discard-changes --detach m     90        git switch --discard-changes --detach mainline/master
 91                                                    91 
 92   b) Build, install, and boot a kernel::           92   b) Build, install, and boot a kernel::
 93                                                    93 
 94        cp ~/kernel-config-working .config          94        cp ~/kernel-config-working .config
 95        make olddefconfig                           95        make olddefconfig
 96        make -j $(nproc --all)                      96        make -j $(nproc --all)
 97        # * Make sure there is enough disk spac     97        # * Make sure there is enough disk space to hold another kernel:
 98        df -h /boot/ /lib/modules/                  98        df -h /boot/ /lib/modules/
 99        # * Note: on Arch Linux, its derivative     99        # * Note: on Arch Linux, its derivatives and a few other distributions
100        #   the following commands will do noth    100        #   the following commands will do nothing at all or only part of the
101        #   job. See the step-by-step guide for    101        #   job. See the step-by-step guide for further details.
102        sudo make modules_install                  102        sudo make modules_install
103        command -v installkernel && sudo make i    103        command -v installkernel && sudo make install
104        # * Check how much space your self-buil    104        # * Check how much space your self-built kernel actually needs, which
105        #   enables you to make better estimate    105        #   enables you to make better estimates later:
106        du -ch /boot/*$(make -s kernelrelease)*    106        du -ch /boot/*$(make -s kernelrelease)* | tail -n 1
107        du -sh /lib/modules/$(make -s kernelrel    107        du -sh /lib/modules/$(make -s kernelrelease)/
108        # * Hint: the output of the following c    108        # * Hint: the output of the following command will help you pick the
109        #   right kernel from the boot menu:       109        #   right kernel from the boot menu:
110        make -s kernelrelease | tee -a ~/kernel    110        make -s kernelrelease | tee -a ~/kernels-built
111        reboot                                     111        reboot
112        # * Once booted, ensure you are running    112        # * Once booted, ensure you are running the kernel you just built by
113        #   checking if the output of the next     113        #   checking if the output of the next two commands matches:
114        tail -n 1 ~/kernels-built                  114        tail -n 1 ~/kernels-built
115        uname -r                                   115        uname -r
116        cat /proc/sys/kernel/tainted               116        cat /proc/sys/kernel/tainted
117                                                   117 
118   c) Check if the problem occurs with this ker    118   c) Check if the problem occurs with this kernel as well.
119                                                   119 
120 * **Segment 2**: ensure the 'good' kernel is a    120 * **Segment 2**: ensure the 'good' kernel is also a 'working' kernel.
121                                                   121 
122   This among others verifies the trimmed .conf    122   This among others verifies the trimmed .config file actually works well, as
123   bisecting with it otherwise would be a waste    123   bisecting with it otherwise would be a waste of time:
124                                                   124 
125   a) Start by checking out the sources of the     125   a) Start by checking out the sources of the 'good' version::
126                                                   126 
127        cd ~/linux/                                127        cd ~/linux/
128        git switch --discard-changes --detach v    128        git switch --discard-changes --detach v6.0
129                                                   129 
130   b) Build, install, and boot a kernel as desc    130   b) Build, install, and boot a kernel as described earlier in *segment 1,
131      section b* -- just feel free to skip the     131      section b* -- just feel free to skip the 'du' commands, as you have a rough
132      estimate already.                            132      estimate already.
133                                                   133 
134   c) Ensure the feature that regressed with th    134   c) Ensure the feature that regressed with the 'broken' kernel actually works
135      with this one.                               135      with this one.
136                                                   136 
137 * **Segment 3**: perform and validate the bise    137 * **Segment 3**: perform and validate the bisection.
138                                                   138 
139   a) Retrieve the sources for your 'bad' versi    139   a) Retrieve the sources for your 'bad' version::
140                                                   140 
141        git remote set-branches --add stable li    141        git remote set-branches --add stable linux-6.1.y
142        git fetch stable                           142        git fetch stable
143                                                   143 
144   b) Initialize the bisection::                   144   b) Initialize the bisection::
145                                                   145 
146        cd ~/linux/                                146        cd ~/linux/
147        git bisect start                           147        git bisect start
148        git bisect good v6.0                       148        git bisect good v6.0
149        git bisect bad v6.1.5                      149        git bisect bad v6.1.5
150                                                   150 
151   c) Build, install, and boot a kernel as desc    151   c) Build, install, and boot a kernel as described earlier in *segment 1,
152      section b*.                                  152      section b*.
153                                                   153 
154      In case building or booting the kernel fa    154      In case building or booting the kernel fails for unrelated reasons, run
155      ``git bisect skip``. In all other outcome    155      ``git bisect skip``. In all other outcomes, check if the regressed feature
156      works with the newly built kernel. If it     156      works with the newly built kernel. If it does, tell Git by executing
157      ``git bisect good``; if it does not, run     157      ``git bisect good``; if it does not, run ``git bisect bad`` instead.
158                                                   158 
159      All three commands will make Git check ou    159      All three commands will make Git check out another commit; then re-execute
160      this step (e.g. build, install, boot, and    160      this step (e.g. build, install, boot, and test a kernel to then tell Git
161      the outcome). Do so again and again until    161      the outcome). Do so again and again until Git shows which commit broke
162      things. If you run short of disk space du    162      things. If you run short of disk space during this process, check the
163      section 'Complementary tasks: cleanup dur    163      section 'Complementary tasks: cleanup during and after the process'
164      below.                                       164      below.
165                                                   165 
166   d) Once your finished the bisection, put a f    166   d) Once your finished the bisection, put a few things away::
167                                                   167 
168        cd ~/linux/                                168        cd ~/linux/
169        git bisect log > ~/bisect-log              169        git bisect log > ~/bisect-log
170        cp .config ~/bisection-config-culprit      170        cp .config ~/bisection-config-culprit
171        git bisect reset                           171        git bisect reset
172                                                   172 
173   e) Try to verify the bisection result::         173   e) Try to verify the bisection result::
174                                                   174 
175        git switch --discard-changes --detach m    175        git switch --discard-changes --detach mainline/master
176        git revert --no-edit cafec0cacaca0         176        git revert --no-edit cafec0cacaca0
177        cp ~/kernel-config-working .config         177        cp ~/kernel-config-working .config
178        ./scripts/config --set-str CONFIG_LOCAL    178        ./scripts/config --set-str CONFIG_LOCALVERSION '-local-cafec0cacaca0-reverted'
179                                                   179 
180     This is optional, as some commits are impo    180     This is optional, as some commits are impossible to revert. But if the
181     second command worked flawlessly, build, i    181     second command worked flawlessly, build, install, and boot one more kernel
182     kernel; just this time skip the first comm    182     kernel; just this time skip the first command copying the base .config file
183     over, as that already has been taken care     183     over, as that already has been taken care off.
184                                                   184 
185 * **Complementary tasks**: cleanup during and     185 * **Complementary tasks**: cleanup during and after the process.
186                                                   186 
187   a) To avoid running out of disk space during    187   a) To avoid running out of disk space during a bisection, you might need to
188      remove some kernels you built earlier. Yo    188      remove some kernels you built earlier. You most likely want to keep those
189      you built during segment 1 and 2 around f    189      you built during segment 1 and 2 around for a while, but you will most
190      likely no longer need kernels tested duri    190      likely no longer need kernels tested during the actual bisection
191      (Segment 3 c). You can list them in build    191      (Segment 3 c). You can list them in build order using::
192                                                   192 
193        ls -ltr /lib/modules/*-local*              193        ls -ltr /lib/modules/*-local*
194                                                   194 
195     To then for example erase a kernel that id    195     To then for example erase a kernel that identifies itself as
196     '6.0-rc1-local-gcafec0cacaca0', use this::    196     '6.0-rc1-local-gcafec0cacaca0', use this::
197                                                   197 
198        sudo rm -rf /lib/modules/6.0-rc1-local-    198        sudo rm -rf /lib/modules/6.0-rc1-local-gcafec0cacaca0
199        sudo kernel-install -v remove 6.0-rc1-l    199        sudo kernel-install -v remove 6.0-rc1-local-gcafec0cacaca0
200        # * Note, on some distributions kernel-    200        # * Note, on some distributions kernel-install is missing
201        #   or does only part of the job.          201        #   or does only part of the job.
202                                                   202 
203   b) If you performed a bisection and successf    203   b) If you performed a bisection and successfully validated the result, feel
204      free to remove all kernels built during t    204      free to remove all kernels built during the actual bisection (Segment 3 c);
205      the kernels you built earlier and later y    205      the kernels you built earlier and later you might want to keep around for
206      a week or two.                               206      a week or two.
207                                                   207 
208 * **Optional task**: test a debug patch or a p    208 * **Optional task**: test a debug patch or a proposed fix later::
209                                                   209 
210     git fetch mainline                            210     git fetch mainline
211     git switch --discard-changes --detach main    211     git switch --discard-changes --detach mainline/master
212     git apply /tmp/foobars-proposed-fix-v1.pat    212     git apply /tmp/foobars-proposed-fix-v1.patch
213     cp ~/kernel-config-working .config            213     cp ~/kernel-config-working .config
214     ./scripts/config --set-str CONFIG_LOCALVER    214     ./scripts/config --set-str CONFIG_LOCALVERSION '-local-foobars-fix-v1'
215                                                   215 
216   Build, install, and boot a kernel as describ    216   Build, install, and boot a kernel as described in *segment 1, section b* --
217   but this time omit the first command copying    217   but this time omit the first command copying the build configuration over,
218   as that has been taken care of already.         218   as that has been taken care of already.
219                                                   219 
220 .. _introguide_bissbs:                            220 .. _introguide_bissbs:
221                                                   221 
222 Step-by-step guide on how to verify bugs and b    222 Step-by-step guide on how to verify bugs and bisect regressions
223 ==============================================    223 ===============================================================
224                                                   224 
225 This guide describes how to set up your own Li    225 This guide describes how to set up your own Linux kernels for investigating bugs
226 or regressions you intend to report. How far y    226 or regressions you intend to report. How far you want to follow the instructions
227 depends on your issue:                            227 depends on your issue:
228                                                   228 
229 Execute all steps till the end of *segment 1*     229 Execute all steps till the end of *segment 1* to **verify if your kernel problem
230 is present in code supported by Linux kernel d    230 is present in code supported by Linux kernel developers**. If it is, you are all
231 set to report the bug -- unless it did not hap    231 set to report the bug -- unless it did not happen with earlier kernel versions,
232 as then your want to at least continue with *s    232 as then your want to at least continue with *segment 2* to **check if the issue
233 qualifies as regression** which receive priori    233 qualifies as regression** which receive priority treatment. Depending on the
234 outcome you then are ready to report a bug or     234 outcome you then are ready to report a bug or submit a preliminary regression
235 report; instead of the latter your could also     235 report; instead of the latter your could also head straight on and follow
236 *segment 3* to **perform a bisection** for a f    236 *segment 3* to **perform a bisection** for a full-fledged regression report
237 developers are obliged to act upon.               237 developers are obliged to act upon.
238                                                   238 
239  :ref:`Preparations: set up everything to buil    239  :ref:`Preparations: set up everything to build your own kernels <introprep_bissbs>`.
240                                                   240 
241  :ref:`Segment 1: try to reproduce the problem    241  :ref:`Segment 1: try to reproduce the problem with the latest codebase <introlatestcheck_bissbs>`.
242                                                   242 
243  :ref:`Segment 2: check if the kernels you bui    243  :ref:`Segment 2: check if the kernels you build work fine <introworkingcheck_bissbs>`.
244                                                   244 
245  :ref:`Segment 3: perform a bisection and vali    245  :ref:`Segment 3: perform a bisection and validate the result <introbisect_bissbs>`.
246                                                   246 
247  :ref:`Complementary tasks: cleanup during and    247  :ref:`Complementary tasks: cleanup during and after following this guide <introclosure_bissbs>`.
248                                                   248 
249  :ref:`Optional tasks: test reverts, patches,     249  :ref:`Optional tasks: test reverts, patches, or later versions <introoptional_bissbs>`.
250                                                   250 
251 The steps in each segment illustrate the impor    251 The steps in each segment illustrate the important aspects of the process, while
252 a comprehensive reference section holds additi    252 a comprehensive reference section holds additional details for almost all of the
253 steps. The reference section sometimes also ou    253 steps. The reference section sometimes also outlines alternative approaches,
254 pitfalls, as well as problems that might occur    254 pitfalls, as well as problems that might occur at the particular step -- and how
255 to get things rolling again.                      255 to get things rolling again.
256                                                   256 
257 For further details on how to report Linux ker    257 For further details on how to report Linux kernel issues or regressions check
258 out Documentation/admin-guide/reporting-issues    258 out Documentation/admin-guide/reporting-issues.rst, which works in conjunction
259 with this document. It among others explains w    259 with this document. It among others explains why you need to verify bugs with
260 the latest 'mainline' kernel (e.g. versions li    260 the latest 'mainline' kernel (e.g. versions like 6.0, 6.1-rc1, or 6.1-rc6),
261 even if you face a problem with a kernel from     261 even if you face a problem with a kernel from a 'stable/longterm' series
262 (say 6.0.13).                                     262 (say 6.0.13).
263                                                   263 
264 For users facing a regression that document al    264 For users facing a regression that document also explains why sending a
265 preliminary report after segment 2 might be wi    265 preliminary report after segment 2 might be wise, as the regression and its
266 culprit might be known already. For further de    266 culprit might be known already. For further details on what actually qualifies
267 as a regression check out Documentation/admin-    267 as a regression check out Documentation/admin-guide/reporting-regressions.rst.
268                                                   268 
269 If you run into any problems while following t    269 If you run into any problems while following this guide or have ideas how to
270 improve it, :ref:`please let the kernel develo    270 improve it, :ref:`please let the kernel developers know <submit_improvements>`.
271                                                   271 
272 .. _introprep_bissbs:                             272 .. _introprep_bissbs:
273                                                   273 
274 Preparations: set up everything to build your     274 Preparations: set up everything to build your own kernels
275 ----------------------------------------------    275 ---------------------------------------------------------
276                                                   276 
277 The following steps lay the groundwork for all    277 The following steps lay the groundwork for all further tasks.
278                                                   278 
279 Note: the instructions assume you are building    279 Note: the instructions assume you are building and testing on the same
280 machine; if you want to compile the kernel on     280 machine; if you want to compile the kernel on another system, check
281 :ref:`Build kernels on a different machine <bu    281 :ref:`Build kernels on a different machine <buildhost_bis>` below.
282                                                   282 
283 .. _backup_bissbs:                                283 .. _backup_bissbs:
284                                                   284 
285 * Create a fresh backup and put system repair     285 * Create a fresh backup and put system repair and restore tools at hand, just
286   to be prepared for the unlikely case of some    286   to be prepared for the unlikely case of something going sideways.
287                                                   287 
288   [:ref:`details <backup_bisref>`]                288   [:ref:`details <backup_bisref>`]
289                                                   289 
290 .. _vanilla_bissbs:                               290 .. _vanilla_bissbs:
291                                                   291 
292 * Remove all software that depends on external    292 * Remove all software that depends on externally developed kernel drivers or
293   builds them automatically. That includes but    293   builds them automatically. That includes but is not limited to DKMS, openZFS,
294   VirtualBox, and Nvidia's graphics drivers (i    294   VirtualBox, and Nvidia's graphics drivers (including the GPLed kernel module).
295                                                   295 
296   [:ref:`details <vanilla_bisref>`]               296   [:ref:`details <vanilla_bisref>`]
297                                                   297 
298 .. _secureboot_bissbs:                            298 .. _secureboot_bissbs:
299                                                   299 
300 * On platforms with 'Secure Boot' or similar s    300 * On platforms with 'Secure Boot' or similar solutions, prepare everything to
301   ensure the system will permit your self-comp    301   ensure the system will permit your self-compiled kernel to boot. The
302   quickest and easiest way to achieve this on     302   quickest and easiest way to achieve this on commodity x86 systems is to
303   disable such techniques in the BIOS setup ut    303   disable such techniques in the BIOS setup utility; alternatively, remove
304   their restrictions through a process initiat    304   their restrictions through a process initiated by
305   ``mokutil --disable-validation``.               305   ``mokutil --disable-validation``.
306                                                   306 
307   [:ref:`details <secureboot_bisref>`]            307   [:ref:`details <secureboot_bisref>`]
308                                                   308 
309 .. _rangecheck_bissbs:                            309 .. _rangecheck_bissbs:
310                                                   310 
311 * Determine the kernel versions considered 'go    311 * Determine the kernel versions considered 'good' and 'bad' throughout this
312   guide:                                          312   guide:
313                                                   313 
314   * Do you follow this guide to verify if a bu    314   * Do you follow this guide to verify if a bug is present in the code the
315     primary developers care for? Then consider    315     primary developers care for? Then consider the version of the newest kernel
316     you regularly use currently as 'good' (e.g    316     you regularly use currently as 'good' (e.g. 6.0, 6.0.13, or 6.1-rc2).
317                                                   317 
318   * Do you face a regression, e.g. something b    318   * Do you face a regression, e.g. something broke or works worse after
319     switching to a newer kernel version? In th    319     switching to a newer kernel version? In that case it depends on the version
320     range during which the problem appeared:      320     range during which the problem appeared:
321                                                   321 
322     * Something regressed when updating from a    322     * Something regressed when updating from a stable/longterm release
323       (say 6.0.13) to a newer mainline series     323       (say 6.0.13) to a newer mainline series (like 6.1-rc7 or 6.1) or a
324       stable/longterm version based on one (sa    324       stable/longterm version based on one (say 6.1.5)? Then consider the
325       mainline release your working kernel is     325       mainline release your working kernel is based on to be the 'good'
326       version (e.g. 6.0) and the first version    326       version (e.g. 6.0) and the first version to be broken as the 'bad' one
327       (e.g. 6.1-rc7, 6.1, or 6.1.5). Note, at     327       (e.g. 6.1-rc7, 6.1, or 6.1.5). Note, at this point it is merely assumed
328       that 6.0 is fine; this hypothesis will b    328       that 6.0 is fine; this hypothesis will be checked in segment 2.
329                                                   329 
330     * Something regressed when switching from     330     * Something regressed when switching from one mainline version (say 6.0) to
331       a later one (like 6.1-rc1) or a stable/l    331       a later one (like 6.1-rc1) or a stable/longterm release based on it
332       (say 6.1.5)? Then regard the last workin    332       (say 6.1.5)? Then regard the last working version (e.g. 6.0) as 'good' and
333       the first broken (e.g. 6.1-rc1 or 6.1.5)    333       the first broken (e.g. 6.1-rc1 or 6.1.5) as 'bad'.
334                                                   334 
335     * Something regressed when updating within    335     * Something regressed when updating within a stable/longterm series (say
336       from 6.0.13 to 6.0.15)? Then consider th    336       from 6.0.13 to 6.0.15)? Then consider those versions as 'good' and 'bad'
337       (e.g. 6.0.13 and 6.0.15), as you need to    337       (e.g. 6.0.13 and 6.0.15), as you need to bisect within that series.
338                                                   338 
339   *Note, do not confuse 'good' version with 'w    339   *Note, do not confuse 'good' version with 'working' kernel; the latter term
340   throughout this guide will refer to the last    340   throughout this guide will refer to the last kernel that has been working
341   fine.*                                          341   fine.*
342                                                   342 
343   [:ref:`details <rangecheck_bisref>`]            343   [:ref:`details <rangecheck_bisref>`]
344                                                   344 
345 .. _bootworking_bissbs:                           345 .. _bootworking_bissbs:
346                                                   346 
347 * Boot into the 'working' kernel and briefly u    347 * Boot into the 'working' kernel and briefly use the apparently broken feature.
348                                                   348 
349   [:ref:`details <bootworking_bisref>`]           349   [:ref:`details <bootworking_bisref>`]
350                                                   350 
351 .. _diskspace_bissbs:                             351 .. _diskspace_bissbs:
352                                                   352 
353 * Ensure to have enough free space for buildin    353 * Ensure to have enough free space for building Linux. 15 Gigabyte in your home
354   directory should typically suffice. If you h    354   directory should typically suffice. If you have less available, be sure to pay
355   attention to later steps about retrieving th    355   attention to later steps about retrieving the Linux sources and handling of
356   debug symbols: both explain approaches reduc    356   debug symbols: both explain approaches reducing the amount of space, which
357   should allow you to master these tasks with     357   should allow you to master these tasks with about 4 Gigabytes free space.
358                                                   358 
359   [:ref:`details <diskspace_bisref>`]             359   [:ref:`details <diskspace_bisref>`]
360                                                   360 
361 .. _buildrequires_bissbs:                         361 .. _buildrequires_bissbs:
362                                                   362 
363 * Install all software required to build a Lin    363 * Install all software required to build a Linux kernel. Often you will need:
364   'bc', 'binutils' ('ld' et al.), 'bison', 'fl    364   'bc', 'binutils' ('ld' et al.), 'bison', 'flex', 'gcc', 'git', 'openssl',
365   'pahole', 'perl', and the development header    365   'pahole', 'perl', and the development headers for 'libelf' and 'openssl'. The
366   reference section shows how to quickly insta    366   reference section shows how to quickly install those on various popular Linux
367   distributions.                                  367   distributions.
368                                                   368 
369   [:ref:`details <buildrequires_bisref>`]         369   [:ref:`details <buildrequires_bisref>`]
370                                                   370 
371 .. _sources_bissbs:                               371 .. _sources_bissbs:
372                                                   372 
373 * Retrieve the mainline Linux sources; then ch    373 * Retrieve the mainline Linux sources; then change into the directory holding
374   them, as all further commands in this guide     374   them, as all further commands in this guide are meant to be executed from
375   there.                                          375   there.
376                                                   376 
377   *Note, the following describe how to retriev    377   *Note, the following describe how to retrieve the sources using a full
378   mainline clone, which downloads about 2,75 G    378   mainline clone, which downloads about 2,75 GByte as of early 2024. The*
379   :ref:`reference section describes two altern    379   :ref:`reference section describes two alternatives <sources_bisref>` *:
380   one downloads less than 500 MByte, the other    380   one downloads less than 500 MByte, the other works better with unreliable
381   internet connections.*                          381   internet connections.*
382                                                   382 
383   Execute the following command to retrieve a     383   Execute the following command to retrieve a fresh mainline codebase while
384   preparing things to add branches for stable/    384   preparing things to add branches for stable/longterm series later::
385                                                   385 
386     git clone -o mainline --no-checkout \         386     git clone -o mainline --no-checkout \
387       https://git.kernel.org/pub/scm/linux/ker    387       https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ~/linux/
388     cd ~/linux/                                   388     cd ~/linux/
389     git remote add -t master stable \             389     git remote add -t master stable \
390       https://git.kernel.org/pub/scm/linux/ker    390       https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
391                                                   391 
392   [:ref:`details <sources_bisref>`]               392   [:ref:`details <sources_bisref>`]
393                                                   393 
394 .. _stablesources_bissbs:                         394 .. _stablesources_bissbs:
395                                                   395 
396 * Is one of the versions you earlier establish    396 * Is one of the versions you earlier established as 'good' or 'bad' a stable or
397   longterm release (say 6.1.5)? Then download     397   longterm release (say 6.1.5)? Then download the code for the series it belongs
398   to ('linux-6.1.y' in this example)::            398   to ('linux-6.1.y' in this example)::
399                                                   399 
400     git remote set-branches --add stable linux    400     git remote set-branches --add stable linux-6.1.y
401     git fetch stable                              401     git fetch stable
402                                                   402 
403 .. _oldconfig_bissbs:                             403 .. _oldconfig_bissbs:
404                                                   404 
405 * Start preparing a kernel build configuration    405 * Start preparing a kernel build configuration (the '.config' file).
406                                                   406 
407   Before doing so, ensure you are still runnin    407   Before doing so, ensure you are still running the 'working' kernel an earlier
408   step told you to boot; if you are unsure, ch    408   step told you to boot; if you are unsure, check the current kernelrelease
409   identifier using ``uname -r``.                  409   identifier using ``uname -r``.
410                                                   410 
411   Afterwards check out the source code for the    411   Afterwards check out the source code for the version earlier established as
412   'good'. In the following example command thi    412   'good'. In the following example command this is assumed to be 6.0; note that
413   the version number in this and all later Git    413   the version number in this and all later Git commands needs to be prefixed
414   with a 'v'::                                    414   with a 'v'::
415                                                   415 
416     git switch --discard-changes --detach v6.0    416     git switch --discard-changes --detach v6.0
417                                                   417 
418   Now create a build configuration file::         418   Now create a build configuration file::
419                                                   419 
420     make olddefconfig                             420     make olddefconfig
421                                                   421 
422   The kernel build scripts then will try to lo    422   The kernel build scripts then will try to locate the build configuration file
423   for the running kernel and then adjust it fo    423   for the running kernel and then adjust it for the needs of the kernel sources
424   you checked out. While doing so, it will pri    424   you checked out. While doing so, it will print a few lines you need to check.
425                                                   425 
426   Look out for a line starting with '# using d    426   Look out for a line starting with '# using defaults found in'. It should be
427   followed by a path to a file in '/boot/' tha    427   followed by a path to a file in '/boot/' that contains the release identifier
428   of your currently working kernel. If the lin    428   of your currently working kernel. If the line instead continues with something
429   like 'arch/x86/configs/x86_64_defconfig', th    429   like 'arch/x86/configs/x86_64_defconfig', then the build infra failed to find
430   the .config file for your running kernel --     430   the .config file for your running kernel -- in which case you have to put one
431   there manually, as explained in the referenc    431   there manually, as explained in the reference section.
432                                                   432 
433   In case you can not find such a line, look f    433   In case you can not find such a line, look for one containing '# configuration
434   written to .config'. If that's the case you     434   written to .config'. If that's the case you have a stale build configuration
435   lying around. Unless you intend to use it, d    435   lying around. Unless you intend to use it, delete it; afterwards run
436   'make olddefconfig' again and check if it no    436   'make olddefconfig' again and check if it now picked up the right config file
437   as base.                                        437   as base.
438                                                   438 
439   [:ref:`details <oldconfig_bisref>`]             439   [:ref:`details <oldconfig_bisref>`]
440                                                   440 
441 .. _localmodconfig_bissbs:                        441 .. _localmodconfig_bissbs:
442                                                   442 
443 * Disable any kernel modules apparently superf    443 * Disable any kernel modules apparently superfluous for your setup. This is
444   optional, but especially wise for bisections    444   optional, but especially wise for bisections, as it speeds up the build
445   process enormously -- at least unless the .c    445   process enormously -- at least unless the .config file picked up in the
446   previous step was already tailored to your a    446   previous step was already tailored to your and your hardware needs, in which
447   case you should skip this step.                 447   case you should skip this step.
448                                                   448 
449   To prepare the trimming, connect external ha    449   To prepare the trimming, connect external hardware you occasionally use (USB
450   keys, tokens, ...), quickly start a VM, and     450   keys, tokens, ...), quickly start a VM, and bring up VPNs. And if you rebooted
451   since you started that guide, ensure that yo    451   since you started that guide, ensure that you tried using the feature causing
452   trouble since you started the system. Only t    452   trouble since you started the system. Only then trim your .config::
453                                                   453 
454      yes '' | make localmodconfig                 454      yes '' | make localmodconfig
455                                                   455 
456   There is a catch to this, as the 'apparently    456   There is a catch to this, as the 'apparently' in initial sentence of this step
457   and the preparation instructions already hin    457   and the preparation instructions already hinted at:
458                                                   458 
459   The 'localmodconfig' target easily disables     459   The 'localmodconfig' target easily disables kernel modules for features only
460   used occasionally -- like modules for extern    460   used occasionally -- like modules for external peripherals not yet connected
461   since booting, virtualization software not y    461   since booting, virtualization software not yet utilized, VPN tunnels, and a
462   few other things. That's because some tasks     462   few other things. That's because some tasks rely on kernel modules Linux only
463   loads when you execute tasks like the aforem    463   loads when you execute tasks like the aforementioned ones for the first time.
464                                                   464 
465   This drawback of localmodconfig is nothing y    465   This drawback of localmodconfig is nothing you should lose sleep over, but
466   something to keep in mind: if something is m    466   something to keep in mind: if something is misbehaving with the kernels built
467   during this guide, this is most likely the r    467   during this guide, this is most likely the reason. You can reduce or nearly
468   eliminate the risk with tricks outlined in t    468   eliminate the risk with tricks outlined in the reference section; but when
469   building a kernel just for quick testing pur    469   building a kernel just for quick testing purposes this is usually not worth
470   spending much effort on, as long as it boots    470   spending much effort on, as long as it boots and allows to properly test the
471   feature that causes trouble.                    471   feature that causes trouble.
472                                                   472 
473   [:ref:`details <localmodconfig_bisref>`]        473   [:ref:`details <localmodconfig_bisref>`]
474                                                   474 
475 .. _tagging_bissbs:                               475 .. _tagging_bissbs:
476                                                   476 
477 * Ensure all the kernels you will build are cl    477 * Ensure all the kernels you will build are clearly identifiable using a special
478   tag and a unique version number::               478   tag and a unique version number::
479                                                   479 
480     ./scripts/config --set-str CONFIG_LOCALVER    480     ./scripts/config --set-str CONFIG_LOCALVERSION '-local'
481     ./scripts/config -e CONFIG_LOCALVERSION_AU    481     ./scripts/config -e CONFIG_LOCALVERSION_AUTO
482                                                   482 
483   [:ref:`details <tagging_bisref>`]               483   [:ref:`details <tagging_bisref>`]
484                                                   484 
485 .. _debugsymbols_bissbs:                          485 .. _debugsymbols_bissbs:
486                                                   486 
487 * Decide how to handle debug symbols.             487 * Decide how to handle debug symbols.
488                                                   488 
489   In the context of this document it is often     489   In the context of this document it is often wise to enable them, as there is a
490   decent chance you will need to decode a stac    490   decent chance you will need to decode a stack trace from a 'panic', 'Oops',
491   'warning', or 'BUG'::                           491   'warning', or 'BUG'::
492                                                   492 
493     ./scripts/config -d DEBUG_INFO_NONE -e KAL    493     ./scripts/config -d DEBUG_INFO_NONE -e KALLSYMS_ALL -e DEBUG_KERNEL \
494       -e DEBUG_INFO -e DEBUG_INFO_DWARF_TOOLCH    494       -e DEBUG_INFO -e DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT -e KALLSYMS
495                                                   495 
496   But if you are extremely short on storage sp    496   But if you are extremely short on storage space, you might want to disable
497   debug symbols instead::                         497   debug symbols instead::
498                                                   498 
499     ./scripts/config -d DEBUG_INFO -d DEBUG_IN    499     ./scripts/config -d DEBUG_INFO -d DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT \
500       -d DEBUG_INFO_DWARF4 -d DEBUG_INFO_DWARF    500       -d DEBUG_INFO_DWARF4 -d DEBUG_INFO_DWARF5 -e CONFIG_DEBUG_INFO_NONE
501                                                   501 
502   [:ref:`details <debugsymbols_bisref>`]          502   [:ref:`details <debugsymbols_bisref>`]
503                                                   503 
504 .. _configmods_bissbs:                            504 .. _configmods_bissbs:
505                                                   505 
506 * Check if you may want or need to adjust some    506 * Check if you may want or need to adjust some other kernel configuration
507   options:                                        507   options:
508                                                   508 
509   * Are you running Debian? Then you want to a    509   * Are you running Debian? Then you want to avoid known problems by performing
510     additional adjustments explained in the re    510     additional adjustments explained in the reference section.
511                                                   511 
512     [:ref:`details <configmods_distros_bisref>    512     [:ref:`details <configmods_distros_bisref>`].
513                                                   513 
514   * If you want to influence other aspects of     514   * If you want to influence other aspects of the configuration, do so now using
515     your preferred tool. Note, to use make tar    515     your preferred tool. Note, to use make targets like 'menuconfig' or
516     'nconfig', you will need to install the de    516     'nconfig', you will need to install the development files of ncurses; for
517     'xconfig' you likewise need the Qt5 or Qt6    517     'xconfig' you likewise need the Qt5 or Qt6 headers.
518                                                   518 
519     [:ref:`details <configmods_individual_bisr    519     [:ref:`details <configmods_individual_bisref>`].
520                                                   520 
521 .. _saveconfig_bissbs:                            521 .. _saveconfig_bissbs:
522                                                   522 
523 * Reprocess the .config after the latest adjus    523 * Reprocess the .config after the latest adjustments and store it in a safe
524   place::                                         524   place::
525                                                   525 
526      make olddefconfig                            526      make olddefconfig
527      cp .config ~/kernel-config-working           527      cp .config ~/kernel-config-working
528                                                   528 
529   [:ref:`details <saveconfig_bisref>`]            529   [:ref:`details <saveconfig_bisref>`]
530                                                   530 
531 .. _introlatestcheck_bissbs:                      531 .. _introlatestcheck_bissbs:
532                                                   532 
533 Segment 1: try to reproduce the problem with t    533 Segment 1: try to reproduce the problem with the latest codebase
534 ----------------------------------------------    534 ----------------------------------------------------------------
535                                                   535 
536 The following steps verify if the problem occu    536 The following steps verify if the problem occurs with the code currently
537 supported by developers. In case you face a re    537 supported by developers. In case you face a regression, it also checks that the
538 problem is not caused by some .config change,     538 problem is not caused by some .config change, as reporting the issue then would
539 be a waste of time. [:ref:`details <introlates    539 be a waste of time. [:ref:`details <introlatestcheck_bisref>`]
540                                                   540 
541 .. _checkoutmaster_bissbs:                        541 .. _checkoutmaster_bissbs:
542                                                   542 
543 * Check out the latest Linux codebase.            543 * Check out the latest Linux codebase.
544                                                   544 
545   * Are your 'good' and 'bad' versions from th    545   * Are your 'good' and 'bad' versions from the same stable or longterm series?
546     Then check the `front page of kernel.org <    546     Then check the `front page of kernel.org <https://kernel.org/>`_: if it
547     lists a release from that series without a    547     lists a release from that series without an '[EOL]' tag, checkout the series
548     latest version ('linux-6.1.y' in the follo    548     latest version ('linux-6.1.y' in the following example)::
549                                                   549 
550       cd ~/linux/                                 550       cd ~/linux/
551       git switch --discard-changes --detach st    551       git switch --discard-changes --detach stable/linux-6.1.y
552                                                   552 
553     Your series is unsupported, if is not list    553     Your series is unsupported, if is not listed or carrying a 'end of life'
554     tag. In that case you might want to check     554     tag. In that case you might want to check if a successor series (say
555     linux-6.2.y) or mainline (see next point)     555     linux-6.2.y) or mainline (see next point) fix the bug.
556                                                   556 
557   * In all other cases, run::                     557   * In all other cases, run::
558                                                   558 
559       cd ~/linux/                                 559       cd ~/linux/
560       git switch --discard-changes --detach ma    560       git switch --discard-changes --detach mainline/master
561                                                   561 
562   [:ref:`details <checkoutmaster_bisref>`]        562   [:ref:`details <checkoutmaster_bisref>`]
563                                                   563 
564 .. _build_bissbs:                                 564 .. _build_bissbs:
565                                                   565 
566 * Build the image and the modules of your firs    566 * Build the image and the modules of your first kernel using the config file you
567   prepared::                                      567   prepared::
568                                                   568 
569     cp ~/kernel-config-working .config            569     cp ~/kernel-config-working .config
570     make olddefconfig                             570     make olddefconfig
571     make -j $(nproc --all)                        571     make -j $(nproc --all)
572                                                   572 
573   If you want your kernel packaged up as deb,     573   If you want your kernel packaged up as deb, rpm, or tar file, see the
574   reference section for alternatives, which ob    574   reference section for alternatives, which obviously will require other
575   steps to install as well.                       575   steps to install as well.
576                                                   576 
577   [:ref:`details <build_bisref>`]                 577   [:ref:`details <build_bisref>`]
578                                                   578 
579 .. _install_bissbs:                               579 .. _install_bissbs:
580                                                   580 
581 * Install your newly built kernel.                581 * Install your newly built kernel.
582                                                   582 
583   Before doing so, consider checking if there     583   Before doing so, consider checking if there is still enough space for it::
584                                                   584 
585     df -h /boot/ /lib/modules/                    585     df -h /boot/ /lib/modules/
586                                                   586 
587   For now assume 150 MByte in /boot/ and 200 i    587   For now assume 150 MByte in /boot/ and 200 in /lib/modules/ will suffice; how
588   much your kernels actually require will be d    588   much your kernels actually require will be determined later during this guide.
589                                                   589 
590   Now install the kernel's modules and its ima    590   Now install the kernel's modules and its image, which will be stored in
591   parallel to the your Linux distribution's ke    591   parallel to the your Linux distribution's kernels::
592                                                   592 
593     sudo make modules_install                     593     sudo make modules_install
594     command -v installkernel && sudo make inst    594     command -v installkernel && sudo make install
595                                                   595 
596   The second command ideally will take care of    596   The second command ideally will take care of three steps required at this
597   point: copying the kernel's image to /boot/,    597   point: copying the kernel's image to /boot/, generating an initramfs, and
598   adding an entry for both to the boot loader'    598   adding an entry for both to the boot loader's configuration.
599                                                   599 
600   Sadly some distributions (among them Arch Li    600   Sadly some distributions (among them Arch Linux, its derivatives, and many
601   immutable Linux distributions) will perform     601   immutable Linux distributions) will perform none or only some of those tasks.
602   You therefore want to check if all of them w    602   You therefore want to check if all of them were taken care of and manually
603   perform those that were not. The reference s    603   perform those that were not. The reference section provides further details on
604   that; your distribution's documentation migh    604   that; your distribution's documentation might help, too.
605                                                   605 
606   Once you figured out the steps needed at thi    606   Once you figured out the steps needed at this point, consider writing them
607   down: if you will build more kernels as desc    607   down: if you will build more kernels as described in segment 2 and 3, you will
608   have to perform those again after executing     608   have to perform those again after executing ``command -v installkernel [...]``.
609                                                   609 
610   [:ref:`details <install_bisref>`]               610   [:ref:`details <install_bisref>`]
611                                                   611 
612 .. _storagespace_bissbs:                          612 .. _storagespace_bissbs:
613                                                   613 
614 * In case you plan to follow this guide furthe    614 * In case you plan to follow this guide further, check how much storage space
615   the kernel, its modules, and other related f    615   the kernel, its modules, and other related files like the initramfs consume::
616                                                   616 
617     du -ch /boot/*$(make -s kernelrelease)* |     617     du -ch /boot/*$(make -s kernelrelease)* | tail -n 1
618     du -sh /lib/modules/$(make -s kernelreleas    618     du -sh /lib/modules/$(make -s kernelrelease)/
619                                                   619 
620   Write down or remember those two values for     620   Write down or remember those two values for later: they enable you to prevent
621   running out of disk space accidentally durin    621   running out of disk space accidentally during a bisection.
622                                                   622 
623   [:ref:`details <storagespace_bisref>`]          623   [:ref:`details <storagespace_bisref>`]
624                                                   624 
625 .. _kernelrelease_bissbs:                         625 .. _kernelrelease_bissbs:
626                                                   626 
627 * Show and store the kernelrelease identifier     627 * Show and store the kernelrelease identifier of the kernel you just built::
628                                                   628 
629     make -s kernelrelease | tee -a ~/kernels-b    629     make -s kernelrelease | tee -a ~/kernels-built
630                                                   630 
631   Remember the identifier momentarily, as it w    631   Remember the identifier momentarily, as it will help you pick the right kernel
632   from the boot menu upon restarting.             632   from the boot menu upon restarting.
633                                                   633 
634 * Reboot into your newly built kernel. To ensu    634 * Reboot into your newly built kernel. To ensure your actually started the one
635   you just built, you might want to verify if     635   you just built, you might want to verify if the output of these commands
636   matches::                                       636   matches::
637                                                   637 
638     tail -n 1 ~/kernels-built                     638     tail -n 1 ~/kernels-built
639     uname -r                                      639     uname -r
640                                                   640 
641 .. _tainted_bissbs:                               641 .. _tainted_bissbs:
642                                                   642 
643 * Check if the kernel marked itself as 'tainte    643 * Check if the kernel marked itself as 'tainted'::
644                                                   644 
645     cat /proc/sys/kernel/tainted                  645     cat /proc/sys/kernel/tainted
646                                                   646 
647   If that command does not return '0', check t    647   If that command does not return '0', check the reference section, as the cause
648   for this might interfere with your testing.     648   for this might interfere with your testing.
649                                                   649 
650   [:ref:`details <tainted_bisref>`]               650   [:ref:`details <tainted_bisref>`]
651                                                   651 
652 .. _recheckbroken_bissbs:                         652 .. _recheckbroken_bissbs:
653                                                   653 
654 * Verify if your bug occurs with the newly bui    654 * Verify if your bug occurs with the newly built kernel. If it does not, check
655   out the instructions in the reference sectio    655   out the instructions in the reference section to ensure nothing went sideways
656   during your tests.                              656   during your tests.
657                                                   657 
658   [:ref:`details <recheckbroken_bisref>`]         658   [:ref:`details <recheckbroken_bisref>`]
659                                                   659 
660 .. _recheckstablebroken_bissbs:                   660 .. _recheckstablebroken_bissbs:
661                                                   661 
662 * Did you just built a stable or longterm kern    662 * Did you just built a stable or longterm kernel? And were you able to reproduce
663   the regression with it? Then you should test    663   the regression with it? Then you should test the latest mainline codebase as
664   well, because the result determines which de    664   well, because the result determines which developers the bug must be submitted
665   to.                                             665   to.
666                                                   666 
667   To prepare that test, check out current main    667   To prepare that test, check out current mainline::
668                                                   668 
669     cd ~/linux/                                   669     cd ~/linux/
670     git switch --discard-changes --detach main    670     git switch --discard-changes --detach mainline/master
671                                                   671 
672   Now use the checked out code to build and in    672   Now use the checked out code to build and install another kernel using the
673   commands the earlier steps already described    673   commands the earlier steps already described in more detail::
674                                                   674 
675     cp ~/kernel-config-working .config            675     cp ~/kernel-config-working .config
676     make olddefconfig                             676     make olddefconfig
677     make -j $(nproc --all)                        677     make -j $(nproc --all)
678     # * Check if the free space suffices holdi    678     # * Check if the free space suffices holding another kernel:
679     df -h /boot/ /lib/modules/                    679     df -h /boot/ /lib/modules/
680     sudo make modules_install                     680     sudo make modules_install
681     command -v installkernel && sudo make inst    681     command -v installkernel && sudo make install
682     make -s kernelrelease | tee -a ~/kernels-b    682     make -s kernelrelease | tee -a ~/kernels-built
683     reboot                                        683     reboot
684                                                   684 
685   Confirm you booted the kernel you intended t    685   Confirm you booted the kernel you intended to start and check its tainted
686   status::                                        686   status::
687                                                   687 
688     tail -n 1 ~/kernels-built                     688     tail -n 1 ~/kernels-built
689     uname -r                                      689     uname -r
690     cat /proc/sys/kernel/tainted                  690     cat /proc/sys/kernel/tainted
691                                                   691 
692   Now verify if this kernel is showing the pro    692   Now verify if this kernel is showing the problem. If it does, then you need
693   to report the bug to the primary developers;    693   to report the bug to the primary developers; if it does not, report it to the
694   stable team. See Documentation/admin-guide/r    694   stable team. See Documentation/admin-guide/reporting-issues.rst for details.
695                                                   695 
696   [:ref:`details <recheckstablebroken_bisref>`    696   [:ref:`details <recheckstablebroken_bisref>`]
697                                                   697 
698 Do you follow this guide to verify if a proble    698 Do you follow this guide to verify if a problem is present in the code
699 currently supported by Linux kernel developers    699 currently supported by Linux kernel developers? Then you are done at this
700 point. If you later want to remove the kernel     700 point. If you later want to remove the kernel you just built, check out
701 :ref:`Complementary tasks: cleanup during and     701 :ref:`Complementary tasks: cleanup during and after following this guide <introclosure_bissbs>`.
702                                                   702 
703 In case you face a regression, move on and exe    703 In case you face a regression, move on and execute at least the next segment
704 as well.                                          704 as well.
705                                                   705 
706 .. _introworkingcheck_bissbs:                     706 .. _introworkingcheck_bissbs:
707                                                   707 
708 Segment 2: check if the kernels you build work    708 Segment 2: check if the kernels you build work fine
709 ----------------------------------------------    709 ---------------------------------------------------
710                                                   710 
711 In case of a regression, you now want to ensur    711 In case of a regression, you now want to ensure the trimmed configuration file
712 you created earlier works as expected; a bisec    712 you created earlier works as expected; a bisection with the .config file
713 otherwise would be a waste of time. [:ref:`det    713 otherwise would be a waste of time. [:ref:`details <introworkingcheck_bisref>`]
714                                                   714 
715 .. _recheckworking_bissbs:                        715 .. _recheckworking_bissbs:
716                                                   716 
717 * Build your own variant of the 'working' kern    717 * Build your own variant of the 'working' kernel and check if the feature that
718   regressed works as expected with it.            718   regressed works as expected with it.
719                                                   719 
720   Start by checking out the sources for the ve    720   Start by checking out the sources for the version earlier established as
721   'good' (once again assumed to be 6.0 here)::    721   'good' (once again assumed to be 6.0 here)::
722                                                   722 
723     cd ~/linux/                                   723     cd ~/linux/
724     git switch --discard-changes --detach v6.0    724     git switch --discard-changes --detach v6.0
725                                                   725 
726   Now use the checked out code to configure, b    726   Now use the checked out code to configure, build, and install another kernel
727   using the commands the previous subsection e    727   using the commands the previous subsection explained in more detail::
728                                                   728 
729     cp ~/kernel-config-working .config            729     cp ~/kernel-config-working .config
730     make olddefconfig                             730     make olddefconfig
731     make -j $(nproc --all)                        731     make -j $(nproc --all)
732     # * Check if the free space suffices holdi    732     # * Check if the free space suffices holding another kernel:
733     df -h /boot/ /lib/modules/                    733     df -h /boot/ /lib/modules/
734     sudo make modules_install                     734     sudo make modules_install
735     command -v installkernel && sudo make inst    735     command -v installkernel && sudo make install
736     make -s kernelrelease | tee -a ~/kernels-b    736     make -s kernelrelease | tee -a ~/kernels-built
737     reboot                                        737     reboot
738                                                   738 
739   When the system booted, you may want to veri    739   When the system booted, you may want to verify once again that the
740   kernel you started is the one you just built    740   kernel you started is the one you just built::
741                                                   741 
742     tail -n 1 ~/kernels-built                     742     tail -n 1 ~/kernels-built
743     uname -r                                      743     uname -r
744                                                   744 
745   Now check if this kernel works as expected;     745   Now check if this kernel works as expected; if not, consult the reference
746   section for further instructions.               746   section for further instructions.
747                                                   747 
748   [:ref:`details <recheckworking_bisref>`]        748   [:ref:`details <recheckworking_bisref>`]
749                                                   749 
750 .. _introbisect_bissbs:                           750 .. _introbisect_bissbs:
751                                                   751 
752 Segment 3: perform the bisection and validate     752 Segment 3: perform the bisection and validate the result
753 ----------------------------------------------    753 --------------------------------------------------------
754                                                   754 
755 With all the preparations and precaution build    755 With all the preparations and precaution builds taken care of, you are now ready
756 to begin the bisection. This will make you bui    756 to begin the bisection. This will make you build quite a few kernels -- usually
757 about 15 in case you encountered a regression     757 about 15 in case you encountered a regression when updating to a newer series
758 (say from 6.0.13 to 6.1.5). But do not worry,     758 (say from 6.0.13 to 6.1.5). But do not worry, due to the trimmed build
759 configuration created earlier this works a lot    759 configuration created earlier this works a lot faster than many people assume:
760 overall on average it will often just take abo    760 overall on average it will often just take about 10 to 15 minutes to compile
761 each kernel on commodity x86 machines.            761 each kernel on commodity x86 machines.
762                                                   762 
763 .. _bisectstart_bissbs:                           763 .. _bisectstart_bissbs:
764                                                   764 
765 * Start the bisection and tell Git about the v    765 * Start the bisection and tell Git about the versions earlier established as
766   'good' (6.0 in the following example command    766   'good' (6.0 in the following example command) and 'bad' (6.1.5)::
767                                                   767 
768     cd ~/linux/                                   768     cd ~/linux/
769     git bisect start                              769     git bisect start
770     git bisect good v6.0                          770     git bisect good v6.0
771     git bisect bad v6.1.5                         771     git bisect bad v6.1.5
772                                                   772 
773   [:ref:`details <bisectstart_bisref>`]           773   [:ref:`details <bisectstart_bisref>`]
774                                                   774 
775 .. _bisectbuild_bissbs:                           775 .. _bisectbuild_bissbs:
776                                                   776 
777 * Now use the code Git checked out to build, i    777 * Now use the code Git checked out to build, install, and boot a kernel using
778   the commands introduced earlier::               778   the commands introduced earlier::
779                                                   779 
780     cp ~/kernel-config-working .config            780     cp ~/kernel-config-working .config
781     make olddefconfig                             781     make olddefconfig
782     make -j $(nproc --all)                        782     make -j $(nproc --all)
783     # * Check if the free space suffices holdi    783     # * Check if the free space suffices holding another kernel:
784     df -h /boot/ /lib/modules/                    784     df -h /boot/ /lib/modules/
785     sudo make modules_install                     785     sudo make modules_install
786     command -v installkernel && sudo make inst    786     command -v installkernel && sudo make install
787     make -s kernelrelease | tee -a ~/kernels-b    787     make -s kernelrelease | tee -a ~/kernels-built
788     reboot                                        788     reboot
789                                                   789 
790   If compilation fails for some reason, run ``    790   If compilation fails for some reason, run ``git bisect skip`` and restart
791   executing the stack of commands from the beg    791   executing the stack of commands from the beginning.
792                                                   792 
793   In case you skipped the 'test latest codebas    793   In case you skipped the 'test latest codebase' step in the guide, check its
794   description as for why the 'df [...]' and 'm    794   description as for why the 'df [...]' and 'make -s kernelrelease [...]'
795   commands are here.                              795   commands are here.
796                                                   796 
797   Important note: the latter command from this    797   Important note: the latter command from this point on will print release
798   identifiers that might look odd or wrong to     798   identifiers that might look odd or wrong to you -- which they are not, as it's
799   totally normal to see release identifiers li    799   totally normal to see release identifiers like '6.0-rc1-local-gcafec0cacaca0'
800   if you bisect between versions 6.1 and 6.2 f    800   if you bisect between versions 6.1 and 6.2 for example.
801                                                   801 
802   [:ref:`details <bisectbuild_bisref>`]           802   [:ref:`details <bisectbuild_bisref>`]
803                                                   803 
804 .. _bisecttest_bissbs:                            804 .. _bisecttest_bissbs:
805                                                   805 
806 * Now check if the feature that regressed work    806 * Now check if the feature that regressed works in the kernel you just built.
807                                                   807 
808   You again might want to start by making sure    808   You again might want to start by making sure the kernel you booted is the one
809   you just built::                                809   you just built::
810                                                   810 
811     cd ~/linux/                                   811     cd ~/linux/
812     tail -n 1 ~/kernels-built                     812     tail -n 1 ~/kernels-built
813     uname -r                                      813     uname -r
814                                                   814 
815   Now verify if the feature that regressed wor    815   Now verify if the feature that regressed works at this kernel bisection point.
816   If it does, run this::                          816   If it does, run this::
817                                                   817 
818     git bisect good                               818     git bisect good
819                                                   819 
820   If it does not, run this::                      820   If it does not, run this::
821                                                   821 
822     git bisect bad                                822     git bisect bad
823                                                   823 
824   Be sure about what you tell Git, as getting     824   Be sure about what you tell Git, as getting this wrong just once will send the
825   rest of the bisection totally off course.       825   rest of the bisection totally off course.
826                                                   826 
827   While the bisection is ongoing, Git will use    827   While the bisection is ongoing, Git will use the information you provided to
828   find and check out another bisection point f    828   find and check out another bisection point for you to test. While doing so, it
829   will print something like 'Bisecting: 675 re    829   will print something like 'Bisecting: 675 revisions left to test after this
830   (roughly 10 steps)' to indicate how many fur    830   (roughly 10 steps)' to indicate how many further changes it expects to be
831   tested. Now build and install another kernel    831   tested. Now build and install another kernel using the instructions from the
832   previous step; afterwards follow the instruc    832   previous step; afterwards follow the instructions in this step again.
833                                                   833 
834   Repeat this again and again until you finish    834   Repeat this again and again until you finish the bisection -- that's the case
835   when Git after tagging a change as 'good' or    835   when Git after tagging a change as 'good' or 'bad' prints something like
836   'cafecaca0c0dacafecaca0c0dacafecaca0c0da is     836   'cafecaca0c0dacafecaca0c0dacafecaca0c0da is the first bad commit'; right
837   afterwards it will show some details about t    837   afterwards it will show some details about the culprit including the patch
838   description of the change. The latter might     838   description of the change. The latter might fill your terminal screen, so you
839   might need to scroll up to see the message m    839   might need to scroll up to see the message mentioning the culprit;
840   alternatively, run ``git bisect log > ~/bise    840   alternatively, run ``git bisect log > ~/bisection-log``.
841                                                   841 
842   [:ref:`details <bisecttest_bisref>`]            842   [:ref:`details <bisecttest_bisref>`]
843                                                   843 
844 .. _bisectlog_bissbs:                             844 .. _bisectlog_bissbs:
845                                                   845 
846 * Store Git's bisection log and the current .c    846 * Store Git's bisection log and the current .config file in a safe place before
847   telling Git to reset the sources to the stat    847   telling Git to reset the sources to the state before the bisection::
848                                                   848 
849     cd ~/linux/                                   849     cd ~/linux/
850     git bisect log > ~/bisection-log              850     git bisect log > ~/bisection-log
851     cp .config ~/bisection-config-culprit         851     cp .config ~/bisection-config-culprit
852     git bisect reset                              852     git bisect reset
853                                                   853 
854   [:ref:`details <bisectlog_bisref>`]             854   [:ref:`details <bisectlog_bisref>`]
855                                                   855 
856 .. _revert_bissbs:                                856 .. _revert_bissbs:
857                                                   857 
858 * Try reverting the culprit on top of latest m    858 * Try reverting the culprit on top of latest mainline to see if this fixes your
859   regression.                                     859   regression.
860                                                   860 
861   This is optional, as it might be impossible     861   This is optional, as it might be impossible or hard to realize. The former is
862   the case, if the bisection determined a merg    862   the case, if the bisection determined a merge commit as the culprit; the
863   latter happens if other changes depend on th    863   latter happens if other changes depend on the culprit. But if the revert
864   succeeds, it is worth building another kerne    864   succeeds, it is worth building another kernel, as it validates the result of
865   a bisection, which can easily deroute; it fu    865   a bisection, which can easily deroute; it furthermore will let kernel
866   developers know, if they can resolve the reg    866   developers know, if they can resolve the regression with a quick revert.
867                                                   867 
868   Begin by checking out the latest codebase de    868   Begin by checking out the latest codebase depending on the range you bisected:
869                                                   869 
870   * Did you face a regression within a stable/    870   * Did you face a regression within a stable/longterm series (say between
871     6.0.13 and 6.0.15) that does not happen in    871     6.0.13 and 6.0.15) that does not happen in mainline? Then check out the
872     latest codebase for the affected series li    872     latest codebase for the affected series like this::
873                                                   873 
874       git fetch stable                            874       git fetch stable
875       git switch --discard-changes --detach li    875       git switch --discard-changes --detach linux-6.0.y
876                                                   876 
877   * In all other cases check out latest mainli    877   * In all other cases check out latest mainline::
878                                                   878 
879       git fetch mainline                          879       git fetch mainline
880       git switch --discard-changes --detach ma    880       git switch --discard-changes --detach mainline/master
881                                                   881 
882     If you bisected a regression within a stab    882     If you bisected a regression within a stable/longterm series that also
883     happens in mainline, there is one more thi    883     happens in mainline, there is one more thing to do: look up the mainline
884     commit-id. To do so, use a command like ``    884     commit-id. To do so, use a command like ``git show abcdcafecabcd`` to
885     view the patch description of the culprit.    885     view the patch description of the culprit. There will be a line near
886     the top which looks like 'commit cafec0cac    886     the top which looks like 'commit cafec0cacaca0 upstream.' or
887     'Upstream commit cafec0cacaca0'; use that     887     'Upstream commit cafec0cacaca0'; use that commit-id in the next command
888     and not the one the bisection blamed.         888     and not the one the bisection blamed.
889                                                   889 
890   Now try reverting the culprit by specifying     890   Now try reverting the culprit by specifying its commit id::
891                                                   891 
892     git revert --no-edit cafec0cacaca0            892     git revert --no-edit cafec0cacaca0
893                                                   893 
894   If that fails, give up trying and move on to    894   If that fails, give up trying and move on to the next step; if it works,
895   adjust the tag to facilitate the identificat    895   adjust the tag to facilitate the identification and prevent accidentally
896   overwriting another kernel::                    896   overwriting another kernel::
897                                                   897 
898     cp ~/kernel-config-working .config            898     cp ~/kernel-config-working .config
899     ./scripts/config --set-str CONFIG_LOCALVER    899     ./scripts/config --set-str CONFIG_LOCALVERSION '-local-cafec0cacaca0-reverted'
900                                                   900 
901   Build a kernel using the familiar command se    901   Build a kernel using the familiar command sequence, just without copying the
902   the base .config over::                         902   the base .config over::
903                                                   903 
904     make olddefconfig &&                          904     make olddefconfig &&
905     make -j $(nproc --all)                        905     make -j $(nproc --all)
906     # * Check if the free space suffices holdi    906     # * Check if the free space suffices holding another kernel:
907     df -h /boot/ /lib/modules/                    907     df -h /boot/ /lib/modules/
908     sudo make modules_install                     908     sudo make modules_install
909     command -v installkernel && sudo make inst    909     command -v installkernel && sudo make install
910     make -s kernelrelease | tee -a ~/kernels-b    910     make -s kernelrelease | tee -a ~/kernels-built
911     reboot                                        911     reboot
912                                                   912 
913   Now check one last time if the feature that     913   Now check one last time if the feature that made you perform a bisection works
914   with that kernel: if everything went well, i    914   with that kernel: if everything went well, it should not show the regression.
915                                                   915 
916   [:ref:`details <revert_bisref>`]                916   [:ref:`details <revert_bisref>`]
917                                                   917 
918 .. _introclosure_bissbs:                          918 .. _introclosure_bissbs:
919                                                   919 
920 Complementary tasks: cleanup during and after     920 Complementary tasks: cleanup during and after the bisection
921 ----------------------------------------------    921 -----------------------------------------------------------
922                                                   922 
923 During and after following this guide you migh    923 During and after following this guide you might want or need to remove some of
924 the kernels you installed: the boot menu other    924 the kernels you installed: the boot menu otherwise will become confusing or
925 space might run out.                              925 space might run out.
926                                                   926 
927 .. _makeroom_bissbs:                              927 .. _makeroom_bissbs:
928                                                   928 
929 * To remove one of the kernels you installed,     929 * To remove one of the kernels you installed, look up its 'kernelrelease'
930   identifier. This guide stores them in '~/ker    930   identifier. This guide stores them in '~/kernels-built', but the following
931   command will print them as well::               931   command will print them as well::
932                                                   932 
933     ls -ltr /lib/modules/*-local*                 933     ls -ltr /lib/modules/*-local*
934                                                   934 
935   You in most situations want to remove the ol    935   You in most situations want to remove the oldest kernels built during the
936   actual bisection (e.g. segment 3 of this gui    936   actual bisection (e.g. segment 3 of this guide). The two ones you created
937   beforehand (e.g. to test the latest codebase    937   beforehand (e.g. to test the latest codebase and the version considered
938   'good') might become handy to verify somethi    938   'good') might become handy to verify something later -- thus better keep them
939   around, unless you are really short on stora    939   around, unless you are really short on storage space.
940                                                   940 
941   To remove the modules of a kernel with the k    941   To remove the modules of a kernel with the kernelrelease identifier
942   '*6.0-rc1-local-gcafec0cacaca0*', start by r    942   '*6.0-rc1-local-gcafec0cacaca0*', start by removing the directory holding its
943   modules::                                       943   modules::
944                                                   944 
945     sudo rm -rf /lib/modules/6.0-rc1-local-gca    945     sudo rm -rf /lib/modules/6.0-rc1-local-gcafec0cacaca0
946                                                   946 
947   Afterwards try the following command::          947   Afterwards try the following command::
948                                                   948 
949     sudo kernel-install -v remove 6.0-rc1-loca    949     sudo kernel-install -v remove 6.0-rc1-local-gcafec0cacaca0
950                                                   950 
951   On quite a few distributions this will delet    951   On quite a few distributions this will delete all other kernel files installed
952   while also removing the kernel's entry from     952   while also removing the kernel's entry from the boot menu. But on some
953   distributions kernel-install does not exist     953   distributions kernel-install does not exist or leaves boot-loader entries or
954   kernel image and related files behind; in th    954   kernel image and related files behind; in that case remove them as described
955   in the reference section.                       955   in the reference section.
956                                                   956 
957   [:ref:`details <makeroom_bisref>`]              957   [:ref:`details <makeroom_bisref>`]
958                                                   958 
959 .. _finishingtouch_bissbs:                        959 .. _finishingtouch_bissbs:
960                                                   960 
961 * Once you have finished the bisection, do not    961 * Once you have finished the bisection, do not immediately remove anything you
962   set up, as you might need a few things again    962   set up, as you might need a few things again. What is safe to remove depends
963   on the outcome of the bisection:                963   on the outcome of the bisection:
964                                                   964 
965   * Could you initially reproduce the regressi    965   * Could you initially reproduce the regression with the latest codebase and
966     after the bisection were able to fix the p    966     after the bisection were able to fix the problem by reverting the culprit on
967     top of the latest codebase? Then you want     967     top of the latest codebase? Then you want to keep those two kernels around
968     for a while, but safely remove all others     968     for a while, but safely remove all others with a '-local' in the release
969     identifier.                                   969     identifier.
970                                                   970 
971   * Did the bisection end on a merge-commit or    971   * Did the bisection end on a merge-commit or seems questionable for other
972     reasons? Then you want to keep as many ker    972     reasons? Then you want to keep as many kernels as possible around for a few
973     days: it's pretty likely that you will be     973     days: it's pretty likely that you will be asked to recheck something.
974                                                   974 
975   * In other cases it likely is a good idea to    975   * In other cases it likely is a good idea to keep the following kernels around
976     for some time: the one built from the late    976     for some time: the one built from the latest codebase, the one created from
977     the version considered 'good', and the las    977     the version considered 'good', and the last three or four you compiled
978     during the actual bisection process.          978     during the actual bisection process.
979                                                   979 
980   [:ref:`details <finishingtouch_bisref>`]        980   [:ref:`details <finishingtouch_bisref>`]
981                                                   981 
982 .. _introoptional_bissbs:                         982 .. _introoptional_bissbs:
983                                                   983 
984 Optional: test reverts, patches, or later vers    984 Optional: test reverts, patches, or later versions
985 ----------------------------------------------    985 --------------------------------------------------
986                                                   986 
987 While or after reporting a bug, you might want    987 While or after reporting a bug, you might want or potentially will be asked to
988 test reverts, debug patches, proposed fixes, o    988 test reverts, debug patches, proposed fixes, or other versions. In that case
989 follow these instructions.                        989 follow these instructions.
990                                                   990 
991 * Update your Git clone and check out the late    991 * Update your Git clone and check out the latest code.
992                                                   992 
993   * In case you want to test mainline, fetch i    993   * In case you want to test mainline, fetch its latest changes before checking
994     its code out::                                994     its code out::
995                                                   995 
996       git fetch mainline                          996       git fetch mainline
997       git switch --discard-changes --detach ma    997       git switch --discard-changes --detach mainline/master
998                                                   998 
999   * In case you want to test a stable or longt    999   * In case you want to test a stable or longterm kernel, first add the branch
1000     holding the series you are interested in     1000     holding the series you are interested in (6.2 in the example), unless you
1001     already did so earlier::                     1001     already did so earlier::
1002                                                  1002 
1003       git remote set-branches --add stable li    1003       git remote set-branches --add stable linux-6.2.y
1004                                                  1004 
1005     Then fetch the latest changes and check o    1005     Then fetch the latest changes and check out the latest version from the
1006     series::                                     1006     series::
1007                                                  1007 
1008       git fetch stable                           1008       git fetch stable
1009       git switch --discard-changes --detach s    1009       git switch --discard-changes --detach stable/linux-6.2.y
1010                                                  1010 
1011 * Copy your kernel build configuration over::    1011 * Copy your kernel build configuration over::
1012                                                  1012 
1013     cp ~/kernel-config-working .config           1013     cp ~/kernel-config-working .config
1014                                                  1014 
1015 * Your next step depends on what you want to     1015 * Your next step depends on what you want to do:
1016                                                  1016 
1017   * In case you just want to test the latest     1017   * In case you just want to test the latest codebase, head to the next step,
1018     you are already all set.                     1018     you are already all set.
1019                                                  1019 
1020   * In case you want to test if a revert fixe    1020   * In case you want to test if a revert fixes an issue, revert one or multiple
1021     changes by specifying their commit ids::     1021     changes by specifying their commit ids::
1022                                                  1022 
1023       git revert --no-edit cafec0cacaca0         1023       git revert --no-edit cafec0cacaca0
1024                                                  1024 
1025     Now give that kernel a special tag to fac    1025     Now give that kernel a special tag to facilitates its identification and
1026     prevent accidentally overwriting another     1026     prevent accidentally overwriting another kernel::
1027                                                  1027 
1028       ./scripts/config --set-str CONFIG_LOCAL    1028       ./scripts/config --set-str CONFIG_LOCALVERSION '-local-cafec0cacaca0-reverted'
1029                                                  1029 
1030   * In case you want to test a patch, store t    1030   * In case you want to test a patch, store the patch in a file like
1031     '/tmp/foobars-proposed-fix-v1.patch' and     1031     '/tmp/foobars-proposed-fix-v1.patch' and apply it like this::
1032                                                  1032 
1033       git apply /tmp/foobars-proposed-fix-v1.    1033       git apply /tmp/foobars-proposed-fix-v1.patch
1034                                                  1034 
1035     In case of multiple patches, repeat this     1035     In case of multiple patches, repeat this step with the others.
1036                                                  1036 
1037     Now give that kernel a special tag to fac    1037     Now give that kernel a special tag to facilitates its identification and
1038     prevent accidentally overwriting another     1038     prevent accidentally overwriting another kernel::
1039                                                  1039 
1040     ./scripts/config --set-str CONFIG_LOCALVE    1040     ./scripts/config --set-str CONFIG_LOCALVERSION '-local-foobars-fix-v1'
1041                                                  1041 
1042 * Build a kernel using the familiar commands,    1042 * Build a kernel using the familiar commands, just without copying the kernel
1043   build configuration over, as that has been     1043   build configuration over, as that has been taken care of already::
1044                                                  1044 
1045     make olddefconfig &&                         1045     make olddefconfig &&
1046     make -j $(nproc --all)                       1046     make -j $(nproc --all)
1047     # * Check if the free space suffices hold    1047     # * Check if the free space suffices holding another kernel:
1048     df -h /boot/ /lib/modules/                   1048     df -h /boot/ /lib/modules/
1049     sudo make modules_install                    1049     sudo make modules_install
1050     command -v installkernel && sudo make ins    1050     command -v installkernel && sudo make install
1051     make -s kernelrelease | tee -a ~/kernels-    1051     make -s kernelrelease | tee -a ~/kernels-built
1052     reboot                                       1052     reboot
1053                                                  1053 
1054 * Now verify you booted the newly built kerne    1054 * Now verify you booted the newly built kernel and check it.
1055                                                  1055 
1056 [:ref:`details <introoptional_bisref>`]          1056 [:ref:`details <introoptional_bisref>`]
1057                                                  1057 
1058 .. _submit_improvements:                         1058 .. _submit_improvements:
1059                                                  1059 
1060 Conclusion                                       1060 Conclusion
1061 ----------                                       1061 ----------
1062                                                  1062 
1063 You have reached the end of the step-by-step     1063 You have reached the end of the step-by-step guide.
1064                                                  1064 
1065 Did you run into trouble following any of the    1065 Did you run into trouble following any of the above steps not cleared up by the
1066 reference section below? Did you spot errors?    1066 reference section below? Did you spot errors? Or do you have ideas how to
1067 improve the guide?                               1067 improve the guide?
1068                                                  1068 
1069 If any of that applies, please take a moment     1069 If any of that applies, please take a moment and let the maintainer of this
1070 document know by email (Thorsten Leemhuis <lin    1070 document know by email (Thorsten Leemhuis <linux@leemhuis.info>), ideally while
1071 CCing the Linux docs mailing list (linux-doc@    1071 CCing the Linux docs mailing list (linux-doc@vger.kernel.org). Such feedback is
1072 vital to improve this text further, which is     1072 vital to improve this text further, which is in everybody's interest, as it
1073 will enable more people to master the task de    1073 will enable more people to master the task described here -- and hopefully also
1074 improve similar guides inspired by this one.     1074 improve similar guides inspired by this one.
1075                                                  1075 
1076                                                  1076 
1077 Reference section for the step-by-step guide     1077 Reference section for the step-by-step guide
1078 ============================================     1078 ============================================
1079                                                  1079 
1080 This section holds additional information for    1080 This section holds additional information for almost all the items in the above
1081 step-by-step guide.                              1081 step-by-step guide.
1082                                                  1082 
1083 Preparations for building your own kernels       1083 Preparations for building your own kernels
1084 ------------------------------------------       1084 ------------------------------------------
1085                                                  1085 
1086   *The steps in this section lay the groundwo    1086   *The steps in this section lay the groundwork for all further tests.*
1087   [:ref:`... <introprep_bissbs>`]                1087   [:ref:`... <introprep_bissbs>`]
1088                                                  1088 
1089 The steps in all later sections of this guide    1089 The steps in all later sections of this guide depend on those described here.
1090                                                  1090 
1091 [:ref:`back to step-by-step guide <introprep_    1091 [:ref:`back to step-by-step guide <introprep_bissbs>`].
1092                                                  1092 
1093 .. _backup_bisref:                               1093 .. _backup_bisref:
1094                                                  1094 
1095 Prepare for emergencies                          1095 Prepare for emergencies
1096 ~~~~~~~~~~~~~~~~~~~~~~~                          1096 ~~~~~~~~~~~~~~~~~~~~~~~
1097                                                  1097 
1098   *Create a fresh backup and put system repai    1098   *Create a fresh backup and put system repair and restore tools at hand.*
1099   [:ref:`... <backup_bissbs>`]                   1099   [:ref:`... <backup_bissbs>`]
1100                                                  1100 
1101 Remember, you are dealing with computers, whi    1101 Remember, you are dealing with computers, which sometimes do unexpected things
1102 -- especially if you fiddle with crucial part    1102 -- especially if you fiddle with crucial parts like the kernel of an operating
1103 system. That's what you are about to do in th    1103 system. That's what you are about to do in this process. Hence, better prepare
1104 for something going sideways, even if that sh    1104 for something going sideways, even if that should not happen.
1105                                                  1105 
1106 [:ref:`back to step-by-step guide <backup_bis    1106 [:ref:`back to step-by-step guide <backup_bissbs>`]
1107                                                  1107 
1108 .. _vanilla_bisref:                              1108 .. _vanilla_bisref:
1109                                                  1109 
1110 Remove anything related to externally maintai    1110 Remove anything related to externally maintained kernel modules
1111 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    1111 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1112                                                  1112 
1113   *Remove all software that depends on extern    1113   *Remove all software that depends on externally developed kernel drivers or
1114   builds them automatically.* [:ref:`...<vani    1114   builds them automatically.* [:ref:`...<vanilla_bissbs>`]
1115                                                  1115 
1116 Externally developed kernel modules can easil    1116 Externally developed kernel modules can easily cause trouble during a bisection.
1117                                                  1117 
1118 But there is a more important reason why this    1118 But there is a more important reason why this guide contains this step: most
1119 kernel developers will not care about reports    1119 kernel developers will not care about reports about regressions occurring with
1120 kernels that utilize such modules. That's bec    1120 kernels that utilize such modules. That's because such kernels are not
1121 considered 'vanilla' anymore, as Documentatio    1121 considered 'vanilla' anymore, as Documentation/admin-guide/reporting-issues.rst
1122 explains in more detail.                         1122 explains in more detail.
1123                                                  1123 
1124 [:ref:`back to step-by-step guide <vanilla_bi    1124 [:ref:`back to step-by-step guide <vanilla_bissbs>`]
1125                                                  1125 
1126 .. _secureboot_bisref:                           1126 .. _secureboot_bisref:
1127                                                  1127 
1128 Deal with techniques like Secure Boot            1128 Deal with techniques like Secure Boot
1129 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~            1129 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1130                                                  1130 
1131   *On platforms with 'Secure Boot' or similar    1131   *On platforms with 'Secure Boot' or similar techniques, prepare everything to
1132   ensure the system will permit your self-com    1132   ensure the system will permit your self-compiled kernel to boot later.*
1133   [:ref:`... <secureboot_bissbs>`]               1133   [:ref:`... <secureboot_bissbs>`]
1134                                                  1134 
1135 Many modern systems allow only certain operat    1135 Many modern systems allow only certain operating systems to start; that's why
1136 they reject booting self-compiled kernels by     1136 they reject booting self-compiled kernels by default.
1137                                                  1137 
1138 You ideally deal with this by making your pla    1138 You ideally deal with this by making your platform trust your self-built kernels
1139 with the help of a certificate. How to do tha    1139 with the help of a certificate. How to do that is not described
1140 here, as it requires various steps that would    1140 here, as it requires various steps that would take the text too far away from
1141 its purpose; 'Documentation/admin-guide/modul    1141 its purpose; 'Documentation/admin-guide/module-signing.rst' and various web
1142 sides already explain everything needed in mo    1142 sides already explain everything needed in more detail.
1143                                                  1143 
1144 Temporarily disabling solutions like Secure B    1144 Temporarily disabling solutions like Secure Boot is another way to make your own
1145 Linux boot. On commodity x86 systems it is po    1145 Linux boot. On commodity x86 systems it is possible to do this in the BIOS Setup
1146 utility; the required steps vary a lot betwee    1146 utility; the required steps vary a lot between machines and therefore cannot be
1147 described here.                                  1147 described here.
1148                                                  1148 
1149 On mainstream x86 Linux distributions there i    1149 On mainstream x86 Linux distributions there is a third and universal option:
1150 disable all Secure Boot restrictions for your    1150 disable all Secure Boot restrictions for your Linux environment. You can
1151 initiate this process by running ``mokutil --    1151 initiate this process by running ``mokutil --disable-validation``; this will
1152 tell you to create a one-time password, which    1152 tell you to create a one-time password, which is safe to write down. Now
1153 restart; right after your BIOS performed all     1153 restart; right after your BIOS performed all self-tests the bootloader Shim will
1154 show a blue box with a message 'Press any key    1154 show a blue box with a message 'Press any key to perform MOK management'. Hit
1155 some key before the countdown exposes, which     1155 some key before the countdown exposes, which will open a menu. Choose 'Change
1156 Secure Boot state'. Shim's 'MokManager' will     1156 Secure Boot state'. Shim's 'MokManager' will now ask you to enter three
1157 randomly chosen characters from the one-time     1157 randomly chosen characters from the one-time password specified earlier. Once
1158 you provided them, confirm you really want to    1158 you provided them, confirm you really want to disable the validation.
1159 Afterwards, permit MokManager to reboot the m    1159 Afterwards, permit MokManager to reboot the machine.
1160                                                  1160 
1161 [:ref:`back to step-by-step guide <secureboot    1161 [:ref:`back to step-by-step guide <secureboot_bissbs>`]
1162                                                  1162 
1163 .. _bootworking_bisref:                          1163 .. _bootworking_bisref:
1164                                                  1164 
1165 Boot the last kernel that was working            1165 Boot the last kernel that was working
1166 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~            1166 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1167                                                  1167 
1168   *Boot into the last working kernel and brie    1168   *Boot into the last working kernel and briefly recheck if the feature that
1169   regressed really works.* [:ref:`...<bootwor    1169   regressed really works.* [:ref:`...<bootworking_bissbs>`]
1170                                                  1170 
1171 This will make later steps that cover creatin    1171 This will make later steps that cover creating and trimming the configuration do
1172 the right thing.                                 1172 the right thing.
1173                                                  1173 
1174 [:ref:`back to step-by-step guide <bootworkin    1174 [:ref:`back to step-by-step guide <bootworking_bissbs>`]
1175                                                  1175 
1176 .. _diskspace_bisref:                            1176 .. _diskspace_bisref:
1177                                                  1177 
1178 Space requirements                               1178 Space requirements
1179 ~~~~~~~~~~~~~~~~~~                               1179 ~~~~~~~~~~~~~~~~~~
1180                                                  1180 
1181   *Ensure to have enough free space for build    1181   *Ensure to have enough free space for building Linux.*
1182   [:ref:`... <diskspace_bissbs>`]                1182   [:ref:`... <diskspace_bissbs>`]
1183                                                  1183 
1184 The numbers mentioned are rough estimates wit    1184 The numbers mentioned are rough estimates with a big extra charge to be on the
1185 safe side, so often you will need less.          1185 safe side, so often you will need less.
1186                                                  1186 
1187 If you have space constraints, be sure to hay    1187 If you have space constraints, be sure to hay attention to the :ref:`step about
1188 debug symbols' <debugsymbols_bissbs>` and its    1188 debug symbols' <debugsymbols_bissbs>` and its :ref:`accompanying reference
1189 section' <debugsymbols_bisref>`, as disabling    1189 section' <debugsymbols_bisref>`, as disabling then will reduce the consumed disk
1190 space by quite a few gigabytes.                  1190 space by quite a few gigabytes.
1191                                                  1191 
1192 [:ref:`back to step-by-step guide <diskspace_    1192 [:ref:`back to step-by-step guide <diskspace_bissbs>`]
1193                                                  1193 
1194 .. _rangecheck_bisref:                           1194 .. _rangecheck_bisref:
1195                                                  1195 
1196 Bisection range                                  1196 Bisection range
1197 ~~~~~~~~~~~~~~~                                  1197 ~~~~~~~~~~~~~~~
1198                                                  1198 
1199   *Determine the kernel versions considered '    1199   *Determine the kernel versions considered 'good' and 'bad' throughout this
1200   guide.* [:ref:`...<rangecheck_bissbs>`]        1200   guide.* [:ref:`...<rangecheck_bissbs>`]
1201                                                  1201 
1202 Establishing the range of commits to be check    1202 Establishing the range of commits to be checked is mostly straightforward,
1203 except when a regression occurred when switch    1203 except when a regression occurred when switching from a release of one stable
1204 series to a release of a later series (e.g. f    1204 series to a release of a later series (e.g. from 6.0.13 to 6.1.5). In that case
1205 Git will need some hand holding, as there is     1205 Git will need some hand holding, as there is no straight line of descent.
1206                                                  1206 
1207 That's because with the release of 6.0 mainli    1207 That's because with the release of 6.0 mainline carried on to 6.1 while the
1208 stable series 6.0.y branched to the side. It'    1208 stable series 6.0.y branched to the side. It's therefore theoretically possible
1209 that the issue you face with 6.1.5 only worke    1209 that the issue you face with 6.1.5 only worked in 6.0.13, as it was fixed by a
1210 commit that went into one of the 6.0.y releas    1210 commit that went into one of the 6.0.y releases, but never hit mainline or the
1211 6.1.y series. Thankfully that normally should    1211 6.1.y series. Thankfully that normally should not happen due to the way the
1212 stable/longterm maintainers maintain the code    1212 stable/longterm maintainers maintain the code. It's thus pretty safe to assume
1213 6.0 as a 'good' kernel. That assumption will     1213 6.0 as a 'good' kernel. That assumption will be tested anyway, as that kernel
1214 will be built and tested in the segment '2' o    1214 will be built and tested in the segment '2' of this guide; Git would force you
1215 to do this as well, if you tried bisecting be    1215 to do this as well, if you tried bisecting between 6.0.13 and 6.1.15.
1216                                                  1216 
1217 [:ref:`back to step-by-step guide <rangecheck    1217 [:ref:`back to step-by-step guide <rangecheck_bissbs>`]
1218                                                  1218 
1219 .. _buildrequires_bisref:                        1219 .. _buildrequires_bisref:
1220                                                  1220 
1221 Install build requirements                       1221 Install build requirements
1222 ~~~~~~~~~~~~~~~~~~~~~~~~~~                       1222 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1223                                                  1223 
1224   *Install all software required to build a L    1224   *Install all software required to build a Linux kernel.*
1225   [:ref:`...<buildrequires_bissbs>`]             1225   [:ref:`...<buildrequires_bissbs>`]
1226                                                  1226 
1227 The kernel is pretty stand-alone, but besides    1227 The kernel is pretty stand-alone, but besides tools like the compiler you will
1228 sometimes need a few libraries to build one.     1228 sometimes need a few libraries to build one. How to install everything needed
1229 depends on your Linux distribution and the co    1229 depends on your Linux distribution and the configuration of the kernel you are
1230 about to build.                                  1230 about to build.
1231                                                  1231 
1232 Here are a few examples what you typically ne    1232 Here are a few examples what you typically need on some mainstream
1233 distributions:                                   1233 distributions:
1234                                                  1234 
1235 * Arch Linux and derivatives::                   1235 * Arch Linux and derivatives::
1236                                                  1236 
1237     sudo pacman --needed -S bc binutils bison    1237     sudo pacman --needed -S bc binutils bison flex gcc git kmod libelf openssl \
1238       pahole perl zlib ncurses qt6-base          1238       pahole perl zlib ncurses qt6-base
1239                                                  1239 
1240 * Debian, Ubuntu, and derivatives::              1240 * Debian, Ubuntu, and derivatives::
1241                                                  1241 
1242     sudo apt install bc binutils bison dwarve    1242     sudo apt install bc binutils bison dwarves flex gcc git kmod libelf-dev \
1243       libssl-dev make openssl pahole perl-bas    1243       libssl-dev make openssl pahole perl-base pkg-config zlib1g-dev \
1244       libncurses-dev qt6-base-dev g++            1244       libncurses-dev qt6-base-dev g++
1245                                                  1245 
1246 * Fedora and derivatives::                       1246 * Fedora and derivatives::
1247                                                  1247 
1248     sudo dnf install binutils \                  1248     sudo dnf install binutils \
1249       /usr/bin/{bc,bison,flex,gcc,git,openssl    1249       /usr/bin/{bc,bison,flex,gcc,git,openssl,make,perl,pahole,rpmbuild} \
1250       /usr/include/{libelf.h,openssl/pkcs7.h,    1250       /usr/include/{libelf.h,openssl/pkcs7.h,zlib.h,ncurses.h,qt6/QtGui/QAction}
1251                                                  1251 
1252 * openSUSE and derivatives::                     1252 * openSUSE and derivatives::
1253                                                  1253 
1254     sudo zypper install bc binutils bison dwa    1254     sudo zypper install bc binutils bison dwarves flex gcc git \
1255       kernel-install-tools libelf-devel make     1255       kernel-install-tools libelf-devel make modutils openssl openssl-devel \
1256       perl-base zlib-devel rpm-build ncurses-    1256       perl-base zlib-devel rpm-build ncurses-devel qt6-base-devel
1257                                                  1257 
1258 These commands install a few packages that ar    1258 These commands install a few packages that are often, but not always needed. You
1259 for example might want to skip installing the    1259 for example might want to skip installing the development headers for ncurses,
1260 which you will only need in case you later mi    1260 which you will only need in case you later might want to adjust the kernel build
1261 configuration using make the targets 'menucon    1261 configuration using make the targets 'menuconfig' or 'nconfig'; likewise omit
1262 the headers of Qt6 if you do not plan to adju    1262 the headers of Qt6 if you do not plan to adjust the .config using 'xconfig'.
1263                                                  1263 
1264 You furthermore might need additional librari    1264 You furthermore might need additional libraries and their development headers
1265 for tasks not covered in this guide -- for ex    1265 for tasks not covered in this guide -- for example when building utilities from
1266 the kernel's tools/ directory.                   1266 the kernel's tools/ directory.
1267                                                  1267 
1268 [:ref:`back to step-by-step guide <buildrequi    1268 [:ref:`back to step-by-step guide <buildrequires_bissbs>`]
1269                                                  1269 
1270 .. _sources_bisref:                              1270 .. _sources_bisref:
1271                                                  1271 
1272 Download the sources using Git                   1272 Download the sources using Git
1273 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                   1273 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1274                                                  1274 
1275   *Retrieve the Linux mainline sources.*         1275   *Retrieve the Linux mainline sources.*
1276   [:ref:`...<sources_bissbs>`]                   1276   [:ref:`...<sources_bissbs>`]
1277                                                  1277 
1278 The step-by-step guide outlines how to downlo    1278 The step-by-step guide outlines how to download the Linux sources using a full
1279 Git clone of Linus' mainline repository. Ther    1279 Git clone of Linus' mainline repository. There is nothing more to say about
1280 that -- but there are two alternatives ways t    1280 that -- but there are two alternatives ways to retrieve the sources that might
1281 work better for you:                             1281 work better for you:
1282                                                  1282 
1283 * If you have an unreliable internet connecti    1283 * If you have an unreliable internet connection, consider
1284   :ref:`using a 'Git bundle'<sources_bundle_b    1284   :ref:`using a 'Git bundle'<sources_bundle_bisref>`.
1285                                                  1285 
1286 * If downloading the complete repository woul    1286 * If downloading the complete repository would take too long or requires too
1287   much storage space, consider :ref:`using a     1287   much storage space, consider :ref:`using a 'shallow
1288   clone'<sources_shallow_bisref>`.               1288   clone'<sources_shallow_bisref>`.
1289                                                  1289 
1290 .. _sources_bundle_bisref:                       1290 .. _sources_bundle_bisref:
1291                                                  1291 
1292 Downloading Linux mainline sources using a bu    1292 Downloading Linux mainline sources using a bundle
1293 """""""""""""""""""""""""""""""""""""""""""""    1293 """""""""""""""""""""""""""""""""""""""""""""""""
1294                                                  1294 
1295 Use the following commands to retrieve the Li    1295 Use the following commands to retrieve the Linux mainline sources using a
1296 bundle::                                         1296 bundle::
1297                                                  1297 
1298     wget -c \                                    1298     wget -c \
1299       https://git.kernel.org/pub/scm/linux/ke    1299       https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle
1300     git clone --no-checkout clone.bundle ~/li    1300     git clone --no-checkout clone.bundle ~/linux/
1301     cd ~/linux/                                  1301     cd ~/linux/
1302     git remote remove origin                     1302     git remote remove origin
1303     git remote add mainline \                    1303     git remote add mainline \
1304       https://git.kernel.org/pub/scm/linux/ke    1304       https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
1305     git fetch mainline                           1305     git fetch mainline
1306     git remote add -t master stable \            1306     git remote add -t master stable \
1307       https://git.kernel.org/pub/scm/linux/ke    1307       https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
1308                                                  1308 
1309 In case the 'wget' command fails, just re-exe    1309 In case the 'wget' command fails, just re-execute it, it will pick up where
1310 it left off.                                     1310 it left off.
1311                                                  1311 
1312 [:ref:`back to step-by-step guide <sources_bi    1312 [:ref:`back to step-by-step guide <sources_bissbs>`]
1313 [:ref:`back to section intro <sources_bisref>    1313 [:ref:`back to section intro <sources_bisref>`]
1314                                                  1314 
1315 .. _sources_shallow_bisref:                      1315 .. _sources_shallow_bisref:
1316                                                  1316 
1317 Downloading Linux mainline sources using a sh    1317 Downloading Linux mainline sources using a shallow clone
1318 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    1318 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1319                                                  1319 
1320 First, execute the following command to retri    1320 First, execute the following command to retrieve the latest mainline codebase::
1321                                                  1321 
1322     git clone -o mainline --no-checkout --dep    1322     git clone -o mainline --no-checkout --depth 1 -b master \
1323       https://git.kernel.org/pub/scm/linux/ke    1323       https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git ~/linux/
1324     cd ~/linux/                                  1324     cd ~/linux/
1325     git remote add -t master stable \            1325     git remote add -t master stable \
1326       https://git.kernel.org/pub/scm/linux/ke    1326       https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
1327                                                  1327 
1328 Now deepen your clone's history to the second    1328 Now deepen your clone's history to the second predecessor of the mainline
1329 release of your 'good' version. In case the l    1329 release of your 'good' version. In case the latter are 6.0 or 6.0.13, 5.19 would
1330 be the first predecessor and 5.18 the second     1330 be the first predecessor and 5.18 the second -- hence deepen the history up to
1331 that version::                                   1331 that version::
1332                                                  1332 
1333     git fetch --shallow-exclude=v5.18 mainlin    1333     git fetch --shallow-exclude=v5.18 mainline
1334                                                  1334 
1335 Afterwards add the stable Git repository as r    1335 Afterwards add the stable Git repository as remote and all required stable
1336 branches as explained in the step-by-step gui    1336 branches as explained in the step-by-step guide.
1337                                                  1337 
1338 Note, shallow clones have a few peculiar char    1338 Note, shallow clones have a few peculiar characteristics:
1339                                                  1339 
1340 * For bisections the history needs to be deep    1340 * For bisections the history needs to be deepened a few mainline versions
1341   farther than it seems necessary, as explain    1341   farther than it seems necessary, as explained above already. That's because
1342   Git otherwise will be unable to revert or d    1342   Git otherwise will be unable to revert or describe most of the commits within
1343   a range (say 6.1..6.2), as they are interna    1343   a range (say 6.1..6.2), as they are internally based on earlier kernels
1344   releases (like 6.0-rc2 or 5.19-rc3).           1344   releases (like 6.0-rc2 or 5.19-rc3).
1345                                                  1345 
1346 * This document in most places uses ``git fet    1346 * This document in most places uses ``git fetch`` with ``--shallow-exclude=``
1347   to specify the earliest version you care ab    1347   to specify the earliest version you care about (or to be precise: its git
1348   tag). You alternatively can use the paramet    1348   tag). You alternatively can use the parameter ``--shallow-since=`` to specify
1349   an absolute (say ``'2023-07-15'``) or relat    1349   an absolute (say ``'2023-07-15'``) or relative (``'12 months'``) date to
1350   define the depth of the history you want to    1350   define the depth of the history you want to download. When using them while
1351   bisecting mainline, ensure to deepen the hi    1351   bisecting mainline, ensure to deepen the history to at least 7 months before
1352   the release of the mainline release your 'g    1352   the release of the mainline release your 'good' kernel is based on.
1353                                                  1353 
1354 * Be warned, when deepening your clone you mi    1354 * Be warned, when deepening your clone you might encounter an error like
1355   'fatal: error in object: unshallow cafecaca    1355   'fatal: error in object: unshallow cafecaca0c0dacafecaca0c0dacafecaca0c0da'.
1356   In that case run ``git repack -d`` and try     1356   In that case run ``git repack -d`` and try again.
1357                                                  1357 
1358 [:ref:`back to step-by-step guide <sources_bi    1358 [:ref:`back to step-by-step guide <sources_bissbs>`]
1359 [:ref:`back to section intro <sources_bisref>    1359 [:ref:`back to section intro <sources_bisref>`]
1360                                                  1360 
1361 .. _oldconfig_bisref:                            1361 .. _oldconfig_bisref:
1362                                                  1362 
1363 Start defining the build configuration for yo    1363 Start defining the build configuration for your kernel
1364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    1364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1365                                                  1365 
1366   *Start preparing a kernel build configurati    1366   *Start preparing a kernel build configuration (the '.config' file).*
1367   [:ref:`... <oldconfig_bissbs>`]                1367   [:ref:`... <oldconfig_bissbs>`]
1368                                                  1368 
1369 *Note, this is the first of multiple steps in    1369 *Note, this is the first of multiple steps in this guide that create or modify
1370 build artifacts. The commands used in this gu    1370 build artifacts. The commands used in this guide store them right in the source
1371 tree to keep things simple. In case you prefe    1371 tree to keep things simple. In case you prefer storing the build artifacts
1372 separately, create a directory like '~/linux-    1372 separately, create a directory like '~/linux-builddir/' and add the parameter
1373 ``O=~/linux-builddir/`` to all make calls use    1373 ``O=~/linux-builddir/`` to all make calls used throughout this guide. You will
1374 have to point other commands there as well --    1374 have to point other commands there as well -- among them the ``./scripts/config
1375 [...]`` commands, which will require ``--file    1375 [...]`` commands, which will require ``--file ~/linux-builddir/.config`` to
1376 locate the right build configuration.*           1376 locate the right build configuration.*
1377                                                  1377 
1378 Two things can easily go wrong when creating     1378 Two things can easily go wrong when creating a .config file as advised:
1379                                                  1379 
1380 * The oldconfig target will use a .config fil    1380 * The oldconfig target will use a .config file from your build directory, if
1381   one is already present there (e.g. '~/linux    1381   one is already present there (e.g. '~/linux/.config'). That's totally fine if
1382   that's what you intend (see next step), but    1382   that's what you intend (see next step), but in all other cases you want to
1383   delete it. This for example is important in    1383   delete it. This for example is important in case you followed this guide
1384   further, but due to problems come back here    1384   further, but due to problems come back here to redo the configuration from
1385   scratch.                                       1385   scratch.
1386                                                  1386 
1387 * Sometimes olddefconfig is unable to locate     1387 * Sometimes olddefconfig is unable to locate the .config file for your running
1388   kernel and will use defaults, as briefly ou    1388   kernel and will use defaults, as briefly outlined in the guide. In that case
1389   check if your distribution ships the config    1389   check if your distribution ships the configuration somewhere and manually put
1390   it in the right place (e.g. '~/linux/.confi    1390   it in the right place (e.g. '~/linux/.config') if it does. On distributions
1391   where /proc/config.gz exists this can be ac    1391   where /proc/config.gz exists this can be achieved using this command::
1392                                                  1392 
1393     zcat /proc/config.gz > .config               1393     zcat /proc/config.gz > .config
1394                                                  1394 
1395   Once you put it there, run ``make olddefcon    1395   Once you put it there, run ``make olddefconfig`` again to adjust it to the
1396   needs of the kernel about to be built.         1396   needs of the kernel about to be built.
1397                                                  1397 
1398 Note, the olddefconfig target will set any un    1398 Note, the olddefconfig target will set any undefined build options to their
1399 default value. If you prefer to set such conf    1399 default value. If you prefer to set such configuration options manually, use
1400 ``make oldconfig`` instead. Then for each und    1400 ``make oldconfig`` instead. Then for each undefined configuration option you
1401 will be asked how to proceed; in case you are    1401 will be asked how to proceed; in case you are unsure what to answer, simply hit
1402 'enter' to apply the default value. Note thou    1402 'enter' to apply the default value. Note though that for bisections you normally
1403 want to go with the defaults, as you otherwis    1403 want to go with the defaults, as you otherwise might enable a new feature that
1404 causes a problem looking like regressions (fo    1404 causes a problem looking like regressions (for example due to security
1405 restrictions).                                   1405 restrictions).
1406                                                  1406 
1407 Occasionally odd things happen when trying to    1407 Occasionally odd things happen when trying to use a config file prepared for one
1408 kernel (say 6.1) on an older mainline release    1408 kernel (say 6.1) on an older mainline release -- especially if it is much older
1409 (say 5.15). That's one of the reasons why the    1409 (say 5.15). That's one of the reasons why the previous step in the guide told
1410 you to boot the kernel where everything works    1410 you to boot the kernel where everything works. If you manually add a .config
1411 file you thus want to ensure it's from the wo    1411 file you thus want to ensure it's from the working kernel and not from a one
1412 that shows the regression.                       1412 that shows the regression.
1413                                                  1413 
1414 In case you want to build kernels for another    1414 In case you want to build kernels for another machine, locate its kernel build
1415 configuration; usually ``ls /boot/config-$(un    1415 configuration; usually ``ls /boot/config-$(uname -r)`` will print its name. Copy
1416 that file to the build machine and store it a    1416 that file to the build machine and store it as ~/linux/.config; afterwards run
1417 ``make olddefconfig`` to adjust it.              1417 ``make olddefconfig`` to adjust it.
1418                                                  1418 
1419 [:ref:`back to step-by-step guide <oldconfig_    1419 [:ref:`back to step-by-step guide <oldconfig_bissbs>`]
1420                                                  1420 
1421 .. _localmodconfig_bisref:                       1421 .. _localmodconfig_bisref:
1422                                                  1422 
1423 Trim the build configuration for your kernel     1423 Trim the build configuration for your kernel
1424 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     1424 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1425                                                  1425 
1426   *Disable any kernel modules apparently supe    1426   *Disable any kernel modules apparently superfluous for your setup.*
1427   [:ref:`... <localmodconfig_bissbs>`]           1427   [:ref:`... <localmodconfig_bissbs>`]
1428                                                  1428 
1429 As explained briefly in the step-by-step guid    1429 As explained briefly in the step-by-step guide already: with localmodconfig it
1430 can easily happen that your self-built kernel    1430 can easily happen that your self-built kernels will lack modules for tasks you
1431 did not perform at least once before utilizin    1431 did not perform at least once before utilizing this make target. That happens
1432 when a task requires kernel modules which are    1432 when a task requires kernel modules which are only autoloaded when you execute
1433 it for the first time. So when you never perf    1433 it for the first time. So when you never performed that task since starting your
1434 kernel the modules will not have been loaded     1434 kernel the modules will not have been loaded -- and from localmodonfig's point
1435 of view look superfluous, which thus disables    1435 of view look superfluous, which thus disables them to reduce the amount of code
1436 to be compiled.                                  1436 to be compiled.
1437                                                  1437 
1438 You can try to avoid this by performing typic    1438 You can try to avoid this by performing typical tasks that often will autoload
1439 additional kernel modules: start a VM, establ    1439 additional kernel modules: start a VM, establish VPN connections, loop-mount a
1440 CD/DVD ISO, mount network shares (CIFS, NFS,     1440 CD/DVD ISO, mount network shares (CIFS, NFS, ...), and connect all external
1441 devices (2FA keys, headsets, webcams, ...) as    1441 devices (2FA keys, headsets, webcams, ...) as well as storage devices with file
1442 systems you otherwise do not utilize (btrfs,     1442 systems you otherwise do not utilize (btrfs, ext4, FAT, NTFS, XFS, ...). But it
1443 is hard to think of everything that might be     1443 is hard to think of everything that might be needed -- even kernel developers
1444 often forget one thing or another at this poi    1444 often forget one thing or another at this point.
1445                                                  1445 
1446 Do not let that risk bother you, especially w    1446 Do not let that risk bother you, especially when compiling a kernel only for
1447 testing purposes: everything typically crucia    1447 testing purposes: everything typically crucial will be there. And if you forget
1448 something important you can turn on a missing    1448 something important you can turn on a missing feature manually later and quickly
1449 run the commands again to compile and install    1449 run the commands again to compile and install a kernel that has everything you
1450 need.                                            1450 need.
1451                                                  1451 
1452 But if you plan to build and use self-built k    1452 But if you plan to build and use self-built kernels regularly, you might want to
1453 reduce the risk by recording which modules yo    1453 reduce the risk by recording which modules your system loads over the course of
1454 a few weeks. You can automate this with `modp    1454 a few weeks. You can automate this with `modprobed-db
1455 <https://github.com/graysky2/modprobed-db>`_.    1455 <https://github.com/graysky2/modprobed-db>`_. Afterwards use ``LSMOD=<path>`` to
1456 point localmodconfig to the list of modules m    1456 point localmodconfig to the list of modules modprobed-db noticed being used::
1457                                                  1457 
1458   yes '' | make LSMOD='${HOME}'/.config/modpr    1458   yes '' | make LSMOD='${HOME}'/.config/modprobed.db localmodconfig
1459                                                  1459 
1460 That parameter also allows you to build trimm    1460 That parameter also allows you to build trimmed kernels for another machine in
1461 case you copied a suitable .config over to us    1461 case you copied a suitable .config over to use as base (see previous step). Just
1462 run ``lsmod > lsmod_foo-machine`` on that sys    1462 run ``lsmod > lsmod_foo-machine`` on that system and copy the generated file to
1463 your build's host home directory. Then run th    1463 your build's host home directory. Then run these commands instead of the one the
1464 step-by-step guide mentions::                    1464 step-by-step guide mentions::
1465                                                  1465 
1466   yes '' | make LSMOD=~/lsmod_foo-machine loc    1466   yes '' | make LSMOD=~/lsmod_foo-machine localmodconfig
1467                                                  1467 
1468 [:ref:`back to step-by-step guide <localmodco    1468 [:ref:`back to step-by-step guide <localmodconfig_bissbs>`]
1469                                                  1469 
1470 .. _tagging_bisref:                              1470 .. _tagging_bisref:
1471                                                  1471 
1472 Tag the kernels about to be build                1472 Tag the kernels about to be build
1473 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                1473 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1474                                                  1474 
1475   *Ensure all the kernels you will build are     1475   *Ensure all the kernels you will build are clearly identifiable using a
1476   special tag and a unique version identifier    1476   special tag and a unique version identifier.* [:ref:`... <tagging_bissbs>`]
1477                                                  1477 
1478 This allows you to differentiate your distrib    1478 This allows you to differentiate your distribution's kernels from those created
1479 during this process, as the file or directori    1479 during this process, as the file or directories for the latter will contain
1480 '-local' in the name; it also helps picking t    1480 '-local' in the name; it also helps picking the right entry in the boot menu and
1481 not lose track of you kernels, as their versi    1481 not lose track of you kernels, as their version numbers will look slightly
1482 confusing during the bisection.                  1482 confusing during the bisection.
1483                                                  1483 
1484 [:ref:`back to step-by-step guide <tagging_bi    1484 [:ref:`back to step-by-step guide <tagging_bissbs>`]
1485                                                  1485 
1486 .. _debugsymbols_bisref:                         1486 .. _debugsymbols_bisref:
1487                                                  1487 
1488 Decide to enable or disable debug symbols        1488 Decide to enable or disable debug symbols
1489 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        1489 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1490                                                  1490 
1491   *Decide how to handle debug symbols.* [:ref    1491   *Decide how to handle debug symbols.* [:ref:`... <debugsymbols_bissbs>`]
1492                                                  1492 
1493 Having debug symbols available can be importa    1493 Having debug symbols available can be important when your kernel throws a
1494 'panic', 'Oops', 'warning', or 'BUG' later wh    1494 'panic', 'Oops', 'warning', or 'BUG' later when running, as then you will be
1495 able to find the exact place where the proble    1495 able to find the exact place where the problem occurred in the code. But
1496 collecting and embedding the needed debug inf    1496 collecting and embedding the needed debug information takes time and consumes
1497 quite a bit of space: in late 2022 the build     1497 quite a bit of space: in late 2022 the build artifacts for a typical x86 kernel
1498 trimmed with localmodconfig consumed around 5    1498 trimmed with localmodconfig consumed around 5 Gigabyte of space with debug
1499 symbols, but less than 1 when they were disab    1499 symbols, but less than 1 when they were disabled. The resulting kernel image and
1500 modules are bigger as well, which increases s    1500 modules are bigger as well, which increases storage requirements for /boot/ and
1501 load times.                                      1501 load times.
1502                                                  1502 
1503 In case you want a small kernel and are unlik    1503 In case you want a small kernel and are unlikely to decode a stack trace later,
1504 you thus might want to disable debug symbols     1504 you thus might want to disable debug symbols to avoid those downsides. If it
1505 later turns out that you need them, just enab    1505 later turns out that you need them, just enable them as shown and rebuild the
1506 kernel.                                          1506 kernel.
1507                                                  1507 
1508 You on the other hand definitely want to enab    1508 You on the other hand definitely want to enable them for this process, if there
1509 is a decent chance that you need to decode a     1509 is a decent chance that you need to decode a stack trace later. The section
1510 'Decode failure messages' in Documentation/ad    1510 'Decode failure messages' in Documentation/admin-guide/reporting-issues.rst
1511 explains this process in more detail.            1511 explains this process in more detail.
1512                                                  1512 
1513 [:ref:`back to step-by-step guide <debugsymbo    1513 [:ref:`back to step-by-step guide <debugsymbols_bissbs>`]
1514                                                  1514 
1515 .. _configmods_bisref:                           1515 .. _configmods_bisref:
1516                                                  1516 
1517 Adjust build configuration                       1517 Adjust build configuration
1518 ~~~~~~~~~~~~~~~~~~~~~~~~~~                       1518 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1519                                                  1519 
1520   *Check if you may want or need to adjust so    1520   *Check if you may want or need to adjust some other kernel configuration
1521   options:*                                      1521   options:*
1522                                                  1522 
1523 Depending on your needs you at this point mig    1523 Depending on your needs you at this point might want or have to adjust some
1524 kernel configuration options.                    1524 kernel configuration options.
1525                                                  1525 
1526 .. _configmods_distros_bisref:                   1526 .. _configmods_distros_bisref:
1527                                                  1527 
1528 Distro specific adjustments                      1528 Distro specific adjustments
1529 """""""""""""""""""""""""""                      1529 """""""""""""""""""""""""""
1530                                                  1530 
1531   *Are you running* [:ref:`... <configmods_bi    1531   *Are you running* [:ref:`... <configmods_bissbs>`]
1532                                                  1532 
1533 The following sections help you to avoid buil    1533 The following sections help you to avoid build problems that are known to occur
1534 when following this guide on a few commodity     1534 when following this guide on a few commodity distributions.
1535                                                  1535 
1536 **Debian:**                                      1536 **Debian:**
1537                                                  1537 
1538 * Remove a stale reference to a certificate f    1538 * Remove a stale reference to a certificate file that would cause your build to
1539   fail::                                         1539   fail::
1540                                                  1540 
1541    ./scripts/config --set-str SYSTEM_TRUSTED_    1541    ./scripts/config --set-str SYSTEM_TRUSTED_KEYS ''
1542                                                  1542 
1543   Alternatively, download the needed certific    1543   Alternatively, download the needed certificate and make that configuration
1544   option point to it, as `the Debian handbook    1544   option point to it, as `the Debian handbook explains in more detail
1545   <https://debian-handbook.info/browse/stable    1545   <https://debian-handbook.info/browse/stable/sect.kernel-compilation.html>`_
1546   -- or generate your own, as explained in       1546   -- or generate your own, as explained in
1547   Documentation/admin-guide/module-signing.rs    1547   Documentation/admin-guide/module-signing.rst.
1548                                                  1548 
1549 [:ref:`back to step-by-step guide <configmods    1549 [:ref:`back to step-by-step guide <configmods_bissbs>`]
1550                                                  1550 
1551 .. _configmods_individual_bisref:                1551 .. _configmods_individual_bisref:
1552                                                  1552 
1553 Individual adjustments                           1553 Individual adjustments
1554 """"""""""""""""""""""                           1554 """"""""""""""""""""""
1555                                                  1555 
1556   *If you want to influence the other aspects    1556   *If you want to influence the other aspects of the configuration, do so
1557   now.* [:ref:`... <configmods_bissbs>`]         1557   now.* [:ref:`... <configmods_bissbs>`]
1558                                                  1558 
1559 At this point you can use a command like ``ma    1559 At this point you can use a command like ``make menuconfig`` or ``make nconfig``
1560 to enable or disable certain features using a    1560 to enable or disable certain features using a text-based user interface; to use
1561 a graphical configuration utility, run ``make    1561 a graphical configuration utility, run ``make xconfig`` instead. Both of them
1562 require development libraries from toolkits t    1562 require development libraries from toolkits they are rely on (ncurses
1563 respectively Qt5 or Qt6); an error message wi    1563 respectively Qt5 or Qt6); an error message will tell you if something required
1564 is missing.                                      1564 is missing.
1565                                                  1565 
1566 [:ref:`back to step-by-step guide <configmods    1566 [:ref:`back to step-by-step guide <configmods_bissbs>`]
1567                                                  1567 
1568 .. _saveconfig_bisref:                           1568 .. _saveconfig_bisref:
1569                                                  1569 
1570 Put the .config file aside                       1570 Put the .config file aside
1571 ~~~~~~~~~~~~~~~~~~~~~~~~~~                       1571 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1572                                                  1572 
1573   *Reprocess the .config after the latest cha    1573   *Reprocess the .config after the latest changes and store it in a safe place.*
1574   [:ref:`... <saveconfig_bissbs>`]               1574   [:ref:`... <saveconfig_bissbs>`]
1575                                                  1575 
1576 Put the .config you prepared aside, as you wa    1576 Put the .config you prepared aside, as you want to copy it back to the build
1577 directory every time during this guide before    1577 directory every time during this guide before you start building another
1578 kernel. That's because going back and forth b    1578 kernel. That's because going back and forth between different versions can alter
1579 .config files in odd ways; those occasionally    1579 .config files in odd ways; those occasionally cause side effects that could
1580 confuse testing or in some cases render the r    1580 confuse testing or in some cases render the result of your bisection
1581 meaningless.                                     1581 meaningless.
1582                                                  1582 
1583 [:ref:`back to step-by-step guide <saveconfig    1583 [:ref:`back to step-by-step guide <saveconfig_bissbs>`]
1584                                                  1584 
1585 .. _introlatestcheck_bisref:                     1585 .. _introlatestcheck_bisref:
1586                                                  1586 
1587 Try to reproduce the problem with the latest     1587 Try to reproduce the problem with the latest codebase
1588 ---------------------------------------------    1588 -----------------------------------------------------
1589                                                  1589 
1590   *Verify the regression is not caused by som    1590   *Verify the regression is not caused by some .config change and check if it
1591   still occurs with the latest codebase.* [:r    1591   still occurs with the latest codebase.* [:ref:`... <introlatestcheck_bissbs>`]
1592                                                  1592 
1593 For some readers it might seem unnecessary to    1593 For some readers it might seem unnecessary to check the latest codebase at this
1594 point, especially if you did that already wit    1594 point, especially if you did that already with a kernel prepared by your
1595 distributor or face a regression within a sta    1595 distributor or face a regression within a stable/longterm series. But it's
1596 highly recommended for these reasons:            1596 highly recommended for these reasons:
1597                                                  1597 
1598 * You will run into any problems caused by yo    1598 * You will run into any problems caused by your setup before you actually begin
1599   a bisection. That will make it a lot easier    1599   a bisection. That will make it a lot easier to differentiate between 'this
1600   most likely is some problem in my setup' an    1600   most likely is some problem in my setup' and 'this change needs to be skipped
1601   during the bisection, as the kernel sources    1601   during the bisection, as the kernel sources at that stage contain an unrelated
1602   problem that causes building or booting to     1602   problem that causes building or booting to fail'.
1603                                                  1603 
1604 * These steps will rule out if your problem i    1604 * These steps will rule out if your problem is caused by some change in the
1605   build configuration between the 'working' a    1605   build configuration between the 'working' and the 'broken' kernel. This for
1606   example can happen when your distributor en    1606   example can happen when your distributor enabled an additional security
1607   feature in the newer kernel which was disab    1607   feature in the newer kernel which was disabled or not yet supported by the
1608   older kernel. That security feature might g    1608   older kernel. That security feature might get into the way of something you
1609   do -- in which case your problem from the p    1609   do -- in which case your problem from the perspective of the Linux kernel
1610   upstream developers is not a regression, as    1610   upstream developers is not a regression, as
1611   Documentation/admin-guide/reporting-regress    1611   Documentation/admin-guide/reporting-regressions.rst explains in more detail.
1612   You thus would waste your time if you'd try    1612   You thus would waste your time if you'd try to bisect this.
1613                                                  1613 
1614 * If the cause for your regression was alread    1614 * If the cause for your regression was already fixed in the latest mainline
1615   codebase, you'd perform the bisection for n    1615   codebase, you'd perform the bisection for nothing. This holds true for a
1616   regression you encountered with a stable/lo    1616   regression you encountered with a stable/longterm release as well, as they are
1617   often caused by problems in mainline change    1617   often caused by problems in mainline changes that were backported -- in which
1618   case the problem will have to be fixed in m    1618   case the problem will have to be fixed in mainline first. Maybe it already was
1619   fixed there and the fix is already in the p    1619   fixed there and the fix is already in the process of being backported.
1620                                                  1620 
1621 * For regressions within a stable/longterm se    1621 * For regressions within a stable/longterm series it's furthermore crucial to
1622   know if the issue is specific to that serie    1622   know if the issue is specific to that series or also happens in the mainline
1623   kernel, as the report needs to be sent to d    1623   kernel, as the report needs to be sent to different people:
1624                                                  1624 
1625   * Regressions specific to a stable/longterm    1625   * Regressions specific to a stable/longterm series are the stable team's
1626     responsibility; mainline Linux developers    1626     responsibility; mainline Linux developers might or might not care.
1627                                                  1627 
1628   * Regressions also happening in mainline ar    1628   * Regressions also happening in mainline are something the regular Linux
1629     developers and maintainers have to handle    1629     developers and maintainers have to handle; the stable team does not care
1630     and does not need to be involved in the r    1630     and does not need to be involved in the report, they just should be told
1631     to backport the fix once it's ready.         1631     to backport the fix once it's ready.
1632                                                  1632 
1633   Your report might be ignored if you send it    1633   Your report might be ignored if you send it to the wrong party -- and even
1634   when you get a reply there is a decent chan    1634   when you get a reply there is a decent chance that developers tell you to
1635   evaluate which of the two cases it is befor    1635   evaluate which of the two cases it is before they take a closer look.
1636                                                  1636 
1637 [:ref:`back to step-by-step guide <introlates    1637 [:ref:`back to step-by-step guide <introlatestcheck_bissbs>`]
1638                                                  1638 
1639 .. _checkoutmaster_bisref:                       1639 .. _checkoutmaster_bisref:
1640                                                  1640 
1641 Check out the latest Linux codebase              1641 Check out the latest Linux codebase
1642 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~              1642 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1643                                                  1643 
1644   *Check out the latest Linux codebase.*         1644   *Check out the latest Linux codebase.*
1645   [:ref:`... <checkoutmaster_bissbs>`]           1645   [:ref:`... <checkoutmaster_bissbs>`]
1646                                                  1646 
1647 In case you later want to recheck if an ever     1647 In case you later want to recheck if an ever newer codebase might fix the
1648 problem, remember to run that ``git fetch --s    1648 problem, remember to run that ``git fetch --shallow-exclude [...]`` command
1649 again mentioned earlier to update your local     1649 again mentioned earlier to update your local Git repository.
1650                                                  1650 
1651 [:ref:`back to step-by-step guide <checkoutma    1651 [:ref:`back to step-by-step guide <checkoutmaster_bissbs>`]
1652                                                  1652 
1653 .. _build_bisref:                                1653 .. _build_bisref:
1654                                                  1654 
1655 Build your kernel                                1655 Build your kernel
1656 ~~~~~~~~~~~~~~~~~                                1656 ~~~~~~~~~~~~~~~~~
1657                                                  1657 
1658   *Build the image and the modules of your fi    1658   *Build the image and the modules of your first kernel using the config file
1659   you prepared.* [:ref:`... <build_bissbs>`]     1659   you prepared.* [:ref:`... <build_bissbs>`]
1660                                                  1660 
1661 A lot can go wrong at this stage, but the ins    1661 A lot can go wrong at this stage, but the instructions below will help you help
1662 yourself. Another subsection explains how to     1662 yourself. Another subsection explains how to directly package your kernel up as
1663 deb, rpm or tar file.                            1663 deb, rpm or tar file.
1664                                                  1664 
1665 Dealing with build errors                        1665 Dealing with build errors
1666 """""""""""""""""""""""""                        1666 """""""""""""""""""""""""
1667                                                  1667 
1668 When a build error occurs, it might be caused    1668 When a build error occurs, it might be caused by some aspect of your machine's
1669 setup that often can be fixed quickly; other     1669 setup that often can be fixed quickly; other times though the problem lies in
1670 the code and can only be fixed by a developer    1670 the code and can only be fixed by a developer. A close examination of the
1671 failure messages coupled with some research o    1671 failure messages coupled with some research on the internet will often tell you
1672 which of the two it is. To perform such inves    1672 which of the two it is. To perform such investigation, restart the build
1673 process like this::                              1673 process like this::
1674                                                  1674 
1675   make V=1                                       1675   make V=1
1676                                                  1676 
1677 The ``V=1`` activates verbose output, which m    1677 The ``V=1`` activates verbose output, which might be needed to see the actual
1678 error. To make it easier to spot, this comman    1678 error. To make it easier to spot, this command also omits the ``-j $(nproc
1679 --all)`` used earlier to utilize every CPU co    1679 --all)`` used earlier to utilize every CPU core in the system for the job -- but
1680 this parallelism also results in some clutter    1680 this parallelism also results in some clutter when failures occur.
1681                                                  1681 
1682 After a few seconds the build process should     1682 After a few seconds the build process should run into the error again. Now try
1683 to find the most crucial line describing the     1683 to find the most crucial line describing the problem. Then search the internet
1684 for the most important and non-generic sectio    1684 for the most important and non-generic section of that line (say 4 to 8 words);
1685 avoid or remove anything that looks remotely     1685 avoid or remove anything that looks remotely system-specific, like your username
1686 or local path names like ``/home/username/lin    1686 or local path names like ``/home/username/linux/``. First try your regular
1687 internet search engine with that string, afte    1687 internet search engine with that string, afterwards search Linux kernel mailing
1688 lists via `lore.kernel.org/all/ <https://lore    1688 lists via `lore.kernel.org/all/ <https://lore.kernel.org/all/>`_.
1689                                                  1689 
1690 This most of the time will find something tha    1690 This most of the time will find something that will explain what is wrong; quite
1691 often one of the hits will provide a solution    1691 often one of the hits will provide a solution for your problem, too. If you
1692 do not find anything that matches your proble    1692 do not find anything that matches your problem, try again from a different angle
1693 by modifying your search terms or using anoth    1693 by modifying your search terms or using another line from the error messages.
1694                                                  1694 
1695 In the end, most issues you run into have lik    1695 In the end, most issues you run into have likely been encountered and
1696 reported by others already. That includes iss    1696 reported by others already. That includes issues where the cause is not your
1697 system, but lies in the code. If you run into    1697 system, but lies in the code. If you run into one of those, you might thus find
1698 a solution (e.g. a patch) or workaround for y    1698 a solution (e.g. a patch) or workaround for your issue, too.
1699                                                  1699 
1700 Package your kernel up                           1700 Package your kernel up
1701 """"""""""""""""""""""                           1701 """"""""""""""""""""""
1702                                                  1702 
1703 The step-by-step guide uses the default make     1703 The step-by-step guide uses the default make targets (e.g. 'bzImage' and
1704 'modules' on x86) to build the image and the     1704 'modules' on x86) to build the image and the modules of your kernel, which later
1705 steps of the guide then install. You instead     1705 steps of the guide then install. You instead can also directly build everything
1706 and directly package it up by using one of th    1706 and directly package it up by using one of the following targets:
1707                                                  1707 
1708 * ``make -j $(nproc --all) bindeb-pkg`` to ge    1708 * ``make -j $(nproc --all) bindeb-pkg`` to generate a deb package
1709                                                  1709 
1710 * ``make -j $(nproc --all) binrpm-pkg`` to ge    1710 * ``make -j $(nproc --all) binrpm-pkg`` to generate a rpm package
1711                                                  1711 
1712 * ``make -j $(nproc --all) tarbz2-pkg`` to ge    1712 * ``make -j $(nproc --all) tarbz2-pkg`` to generate a bz2 compressed tarball
1713                                                  1713 
1714 This is just a selection of available make ta    1714 This is just a selection of available make targets for this purpose, see
1715 ``make help`` for others. You can also use th    1715 ``make help`` for others. You can also use these targets after running
1716 ``make -j $(nproc --all)``, as they will pick    1716 ``make -j $(nproc --all)``, as they will pick up everything already built.
1717                                                  1717 
1718 If you employ the targets to generate deb or     1718 If you employ the targets to generate deb or rpm packages, ignore the
1719 step-by-step guide's instructions on installi    1719 step-by-step guide's instructions on installing and removing your kernel;
1720 instead install and remove the packages using    1720 instead install and remove the packages using the package utility for the format
1721 (e.g. dpkg and rpm) or a package management u    1721 (e.g. dpkg and rpm) or a package management utility build on top of them (apt,
1722 aptitude, dnf/yum, zypper, ...). Be aware tha    1722 aptitude, dnf/yum, zypper, ...). Be aware that the packages generated using
1723 these two make targets are designed to work o    1723 these two make targets are designed to work on various distributions utilizing
1724 those formats, they thus will sometimes behav    1724 those formats, they thus will sometimes behave differently than your
1725 distribution's kernel packages.                  1725 distribution's kernel packages.
1726                                                  1726 
1727 [:ref:`back to step-by-step guide <build_biss    1727 [:ref:`back to step-by-step guide <build_bissbs>`]
1728                                                  1728 
1729 .. _install_bisref:                              1729 .. _install_bisref:
1730                                                  1730 
1731 Put the kernel in place                          1731 Put the kernel in place
1732 ~~~~~~~~~~~~~~~~~~~~~~~                          1732 ~~~~~~~~~~~~~~~~~~~~~~~
1733                                                  1733 
1734   *Install the kernel you just built.* [:ref:    1734   *Install the kernel you just built.* [:ref:`... <install_bissbs>`]
1735                                                  1735 
1736 What you need to do after executing the comma    1736 What you need to do after executing the command in the step-by-step guide
1737 depends on the existence and the implementati    1737 depends on the existence and the implementation of ``/sbin/installkernel``
1738 executable on your distribution.                 1738 executable on your distribution.
1739                                                  1739 
1740 If installkernel is found, the kernel's build    1740 If installkernel is found, the kernel's build system will delegate the actual
1741 installation of your kernel image to this exe    1741 installation of your kernel image to this executable, which then performs some
1742 or all of these tasks:                           1742 or all of these tasks:
1743                                                  1743 
1744 * On almost all Linux distributions installke    1744 * On almost all Linux distributions installkernel will store your kernel's
1745   image in /boot/, usually as '/boot/vmlinuz-    1745   image in /boot/, usually as '/boot/vmlinuz-<kernelrelease_id>'; often it will
1746   put a 'System.map-<kernelrelease_id>' along    1746   put a 'System.map-<kernelrelease_id>' alongside it.
1747                                                  1747 
1748 * On most distributions installkernel will th    1748 * On most distributions installkernel will then generate an 'initramfs'
1749   (sometimes also called 'initrd'), which usu    1749   (sometimes also called 'initrd'), which usually are stored as
1750   '/boot/initramfs-<kernelrelease_id>.img' or    1750   '/boot/initramfs-<kernelrelease_id>.img' or
1751   '/boot/initrd-<kernelrelease_id>'. Commodit    1751   '/boot/initrd-<kernelrelease_id>'. Commodity distributions rely on this file
1752   for booting, hence ensure to execute the ma    1752   for booting, hence ensure to execute the make target 'modules_install' first,
1753   as your distribution's initramfs generator     1753   as your distribution's initramfs generator otherwise will be unable to find
1754   the modules that go into the image.            1754   the modules that go into the image.
1755                                                  1755 
1756 * On some distributions installkernel will th    1756 * On some distributions installkernel will then add an entry for your kernel
1757   to your bootloader's configuration.            1757   to your bootloader's configuration.
1758                                                  1758 
1759 You have to take care of some or all of the t    1759 You have to take care of some or all of the tasks yourself, if your
1760 distribution lacks a installkernel script or     1760 distribution lacks a installkernel script or does only handle part of them.
1761 Consult the distribution's documentation for     1761 Consult the distribution's documentation for details. If in doubt, install the
1762 kernel manually::                                1762 kernel manually::
1763                                                  1763 
1764    sudo install -m 0600 $(make -s image_name)    1764    sudo install -m 0600 $(make -s image_name) /boot/vmlinuz-$(make -s kernelrelease)
1765    sudo install -m 0600 System.map /boot/Syst    1765    sudo install -m 0600 System.map /boot/System.map-$(make -s kernelrelease)
1766                                                  1766 
1767 Now generate your initramfs using the tools y    1767 Now generate your initramfs using the tools your distribution provides for this
1768 process. Afterwards add your kernel to your b    1768 process. Afterwards add your kernel to your bootloader configuration and reboot.
1769                                                  1769 
1770 [:ref:`back to step-by-step guide <install_bi    1770 [:ref:`back to step-by-step guide <install_bissbs>`]
1771                                                  1771 
1772 .. _storagespace_bisref:                         1772 .. _storagespace_bisref:
1773                                                  1773 
1774 Storage requirements per kernel                  1774 Storage requirements per kernel
1775 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                  1775 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1776                                                  1776 
1777   *Check how much storage space the kernel, i    1777   *Check how much storage space the kernel, its modules, and other related files
1778   like the initramfs consume.* [:ref:`... <st    1778   like the initramfs consume.* [:ref:`... <storagespace_bissbs>`]
1779                                                  1779 
1780 The kernels built during a bisection consume     1780 The kernels built during a bisection consume quite a bit of space in /boot/ and
1781 /lib/modules/, especially if you enabled debu    1781 /lib/modules/, especially if you enabled debug symbols. That makes it easy to
1782 fill up volumes during a bisection -- and due    1782 fill up volumes during a bisection -- and due to that even kernels which used to
1783 work earlier might fail to boot. To prevent t    1783 work earlier might fail to boot. To prevent that you will need to know how much
1784 space each installed kernel typically require    1784 space each installed kernel typically requires.
1785                                                  1785 
1786 Note, most of the time the pattern '/boot/*$(    1786 Note, most of the time the pattern '/boot/*$(make -s kernelrelease)*' used in
1787 the guide will match all files needed to boot    1787 the guide will match all files needed to boot your kernel -- but neither the
1788 path nor the naming scheme are mandatory. On     1788 path nor the naming scheme are mandatory. On some distributions you thus will
1789 need to look in different places.                1789 need to look in different places.
1790                                                  1790 
1791 [:ref:`back to step-by-step guide <storagespa    1791 [:ref:`back to step-by-step guide <storagespace_bissbs>`]
1792                                                  1792 
1793 .. _tainted_bisref:                              1793 .. _tainted_bisref:
1794                                                  1794 
1795 Check if your newly built kernel considers it    1795 Check if your newly built kernel considers itself 'tainted'
1796 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    1796 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1797                                                  1797 
1798   *Check if the kernel marked itself as 'tain    1798   *Check if the kernel marked itself as 'tainted'.*
1799   [:ref:`... <tainted_bissbs>`]                  1799   [:ref:`... <tainted_bissbs>`]
1800                                                  1800 
1801 Linux marks itself as tainted when something     1801 Linux marks itself as tainted when something happens that potentially leads to
1802 follow-up errors that look totally unrelated.    1802 follow-up errors that look totally unrelated. That is why developers might
1803 ignore or react scantly to reports from taint    1803 ignore or react scantly to reports from tainted kernels -- unless of course the
1804 kernel set the flag right when the reported b    1804 kernel set the flag right when the reported bug occurred.
1805                                                  1805 
1806 That's why you want check why a kernel is tai    1806 That's why you want check why a kernel is tainted as explained in
1807 Documentation/admin-guide/tainted-kernels.rst    1807 Documentation/admin-guide/tainted-kernels.rst; doing so is also in your own
1808 interest, as your testing might be flawed oth    1808 interest, as your testing might be flawed otherwise.
1809                                                  1809 
1810 [:ref:`back to step-by-step guide <tainted_bi    1810 [:ref:`back to step-by-step guide <tainted_bissbs>`]
1811                                                  1811 
1812 .. _recheckbroken_bisref:                        1812 .. _recheckbroken_bisref:
1813                                                  1813 
1814 Check the kernel built from a recent mainline    1814 Check the kernel built from a recent mainline codebase
1815 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    1815 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1816                                                  1816 
1817   *Verify if your bug occurs with the newly b    1817   *Verify if your bug occurs with the newly built kernel.*
1818   [:ref:`... <recheckbroken_bissbs>`]            1818   [:ref:`... <recheckbroken_bissbs>`]
1819                                                  1819 
1820 There are a couple of reasons why your bug or    1820 There are a couple of reasons why your bug or regression might not show up with
1821 the kernel you built from the latest codebase    1821 the kernel you built from the latest codebase. These are the most frequent:
1822                                                  1822 
1823 * The bug was fixed meanwhile.                   1823 * The bug was fixed meanwhile.
1824                                                  1824 
1825 * What you suspected to be a regression was c    1825 * What you suspected to be a regression was caused by a change in the build
1826   configuration the provider of your kernel c    1826   configuration the provider of your kernel carried out.
1827                                                  1827 
1828 * Your problem might be a race condition that    1828 * Your problem might be a race condition that does not show up with your kernel;
1829   the trimmed build configuration, a differen    1829   the trimmed build configuration, a different setting for debug symbols, the
1830   compiler used, and various other things can    1830   compiler used, and various other things can cause this.
1831                                                  1831 
1832 * In case you encountered the regression with    1832 * In case you encountered the regression with a stable/longterm kernel it might
1833   be a problem that is specific to that serie    1833   be a problem that is specific to that series; the next step in this guide will
1834   check this.                                    1834   check this.
1835                                                  1835 
1836 [:ref:`back to step-by-step guide <recheckbro    1836 [:ref:`back to step-by-step guide <recheckbroken_bissbs>`]
1837                                                  1837 
1838 .. _recheckstablebroken_bisref:                  1838 .. _recheckstablebroken_bisref:
1839                                                  1839 
1840 Check the kernel built from the latest stable    1840 Check the kernel built from the latest stable/longterm codebase
1841 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    1841 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1842                                                  1842 
1843   *Are you facing a regression within a stabl    1843   *Are you facing a regression within a stable/longterm release, but failed to
1844   reproduce it with the kernel you just built    1844   reproduce it with the kernel you just built using the latest mainline sources?
1845   Then check if the latest codebase for the p    1845   Then check if the latest codebase for the particular series might already fix
1846   the problem.* [:ref:`... <recheckstablebrok    1846   the problem.* [:ref:`... <recheckstablebroken_bissbs>`]
1847                                                  1847 
1848 If this kernel does not show the regression e    1848 If this kernel does not show the regression either, there most likely is no need
1849 for a bisection.                                 1849 for a bisection.
1850                                                  1850 
1851 [:ref:`back to step-by-step guide <rechecksta    1851 [:ref:`back to step-by-step guide <recheckstablebroken_bissbs>`]
1852                                                  1852 
1853 .. _introworkingcheck_bisref:                    1853 .. _introworkingcheck_bisref:
1854                                                  1854 
1855 Ensure the 'good' version is really working w    1855 Ensure the 'good' version is really working well
1856 ---------------------------------------------    1856 ------------------------------------------------
1857                                                  1857 
1858   *Check if the kernels you build work fine.*    1858   *Check if the kernels you build work fine.*
1859   [:ref:`... <introworkingcheck_bissbs>`]        1859   [:ref:`... <introworkingcheck_bissbs>`]
1860                                                  1860 
1861 This section will reestablish a known working    1861 This section will reestablish a known working base. Skipping it might be
1862 appealing, but is usually a bad idea, as it d    1862 appealing, but is usually a bad idea, as it does something important:
1863                                                  1863 
1864 It will ensure the .config file you prepared     1864 It will ensure the .config file you prepared earlier actually works as expected.
1865 That is in your own interest, as trimming the    1865 That is in your own interest, as trimming the configuration is not foolproof --
1866 and you might be building and testing ten or     1866 and you might be building and testing ten or more kernels for nothing before
1867 starting to suspect something might be wrong     1867 starting to suspect something might be wrong with the build configuration.
1868                                                  1868 
1869 That alone is reason enough to spend the time    1869 That alone is reason enough to spend the time on this, but not the only reason.
1870                                                  1870 
1871 Many readers of this guide normally run kerne    1871 Many readers of this guide normally run kernels that are patched, use add-on
1872 modules, or both. Those kernels thus are not     1872 modules, or both. Those kernels thus are not considered 'vanilla' -- therefore
1873 it's possible that the thing that regressed m    1873 it's possible that the thing that regressed might never have worked in vanilla
1874 builds of the 'good' version in the first pla    1874 builds of the 'good' version in the first place.
1875                                                  1875 
1876 There is a third reason for those that notice    1876 There is a third reason for those that noticed a regression between
1877 stable/longterm kernels of different series (    1877 stable/longterm kernels of different series (e.g. 6.0.13..6.1.5): it will
1878 ensure the kernel version you assumed to be '    1878 ensure the kernel version you assumed to be 'good' earlier in the process (e.g.
1879 6.0) actually is working.                        1879 6.0) actually is working.
1880                                                  1880 
1881 [:ref:`back to step-by-step guide <introworki    1881 [:ref:`back to step-by-step guide <introworkingcheck_bissbs>`]
1882                                                  1882 
1883 .. _recheckworking_bisref:                       1883 .. _recheckworking_bisref:
1884                                                  1884 
1885 Build your own version of the 'good' kernel      1885 Build your own version of the 'good' kernel
1886 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      1886 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1887                                                  1887 
1888   *Build your own variant of the working kern    1888   *Build your own variant of the working kernel and check if the feature that
1889   regressed works as expected with it.* [:ref    1889   regressed works as expected with it.* [:ref:`... <recheckworking_bissbs>`]
1890                                                  1890 
1891 In case the feature that broke with newer ker    1891 In case the feature that broke with newer kernels does not work with your first
1892 self-built kernel, find and resolve the cause    1892 self-built kernel, find and resolve the cause before moving on. There are a
1893 multitude of reasons why this might happen. S    1893 multitude of reasons why this might happen. Some ideas where to look:
1894                                                  1894 
1895 * Check the taint status and the output of ``    1895 * Check the taint status and the output of ``dmesg``, maybe something unrelated
1896   went wrong.                                    1896   went wrong.
1897                                                  1897 
1898 * Maybe localmodconfig did something odd and     1898 * Maybe localmodconfig did something odd and disabled the module required to
1899   test the feature? Then you might want to re    1899   test the feature? Then you might want to recreate a .config file based on the
1900   one from the last working kernel and skip t    1900   one from the last working kernel and skip trimming it down; manually disabling
1901   some features in the .config might work as     1901   some features in the .config might work as well to reduce the build time.
1902                                                  1902 
1903 * Maybe it's not a kernel regression and some    1903 * Maybe it's not a kernel regression and something that is caused by some fluke,
1904   a broken initramfs (also known as initrd),     1904   a broken initramfs (also known as initrd), new firmware files, or an updated
1905   userland software?                             1905   userland software?
1906                                                  1906 
1907 * Maybe it was a feature added to your distri    1907 * Maybe it was a feature added to your distributor's kernel which vanilla Linux
1908   at that point never supported?                 1908   at that point never supported?
1909                                                  1909 
1910 Note, if you found and fixed problems with th    1910 Note, if you found and fixed problems with the .config file, you want to use it
1911 to build another kernel from the latest codeb    1911 to build another kernel from the latest codebase, as your earlier tests with
1912 mainline and the latest version from an affec    1912 mainline and the latest version from an affected stable/longterm series were
1913 most likely flawed.                              1913 most likely flawed.
1914                                                  1914 
1915 [:ref:`back to step-by-step guide <recheckwor    1915 [:ref:`back to step-by-step guide <recheckworking_bissbs>`]
1916                                                  1916 
1917 Perform a bisection and validate the result      1917 Perform a bisection and validate the result
1918 -------------------------------------------      1918 -------------------------------------------
1919                                                  1919 
1920   *With all the preparations and precaution b    1920   *With all the preparations and precaution builds taken care of, you are now
1921   ready to begin the bisection.* [:ref:`... <    1921   ready to begin the bisection.* [:ref:`... <introbisect_bissbs>`]
1922                                                  1922 
1923 The steps in this segment perform and validat    1923 The steps in this segment perform and validate the bisection.
1924                                                  1924 
1925 [:ref:`back to step-by-step guide <introbisec    1925 [:ref:`back to step-by-step guide <introbisect_bissbs>`].
1926                                                  1926 
1927 .. _bisectstart_bisref:                          1927 .. _bisectstart_bisref:
1928                                                  1928 
1929 Start the bisection                              1929 Start the bisection
1930 ~~~~~~~~~~~~~~~~~~~                              1930 ~~~~~~~~~~~~~~~~~~~
1931                                                  1931 
1932   *Start the bisection and tell Git about the    1932   *Start the bisection and tell Git about the versions earlier established as
1933   'good' and 'bad'.* [:ref:`... <bisectstart_    1933   'good' and 'bad'.* [:ref:`... <bisectstart_bissbs>`]
1934                                                  1934 
1935 This will start the bisection process; the la    1935 This will start the bisection process; the last of the commands will make Git
1936 check out a commit round about half-way betwe    1936 check out a commit round about half-way between the 'good' and the 'bad' changes
1937 for you to test.                                 1937 for you to test.
1938                                                  1938 
1939 [:ref:`back to step-by-step guide <bisectstar    1939 [:ref:`back to step-by-step guide <bisectstart_bissbs>`]
1940                                                  1940 
1941 .. _bisectbuild_bisref:                          1941 .. _bisectbuild_bisref:
1942                                                  1942 
1943 Build a kernel from the bisection point          1943 Build a kernel from the bisection point
1944 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~          1944 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1945                                                  1945 
1946   *Build, install, and boot a kernel from the    1946   *Build, install, and boot a kernel from the code Git checked out using the
1947   same commands you used earlier.* [:ref:`...    1947   same commands you used earlier.* [:ref:`... <bisectbuild_bissbs>`]
1948                                                  1948 
1949 There are two things worth of note here:         1949 There are two things worth of note here:
1950                                                  1950 
1951 * Occasionally building the kernel will fail     1951 * Occasionally building the kernel will fail or it might not boot due some
1952   problem in the code at the bisection point.    1952   problem in the code at the bisection point. In that case run this command::
1953                                                  1953 
1954     git bisect skip                              1954     git bisect skip
1955                                                  1955 
1956   Git will then check out another commit near    1956   Git will then check out another commit nearby which with a bit of luck should
1957   work better. Afterwards restart executing t    1957   work better. Afterwards restart executing this step.
1958                                                  1958 
1959 * Those slightly odd looking version identifi    1959 * Those slightly odd looking version identifiers can happen during bisections,
1960   because the Linux kernel subsystems prepare    1960   because the Linux kernel subsystems prepare their changes for a new mainline
1961   release (say 6.2) before its predecessor (e    1961   release (say 6.2) before its predecessor (e.g. 6.1) is finished. They thus
1962   base them on a somewhat earlier point like     1962   base them on a somewhat earlier point like 6.1-rc1 or even 6.0 -- and then
1963   get merged for 6.2 without rebasing nor squ    1963   get merged for 6.2 without rebasing nor squashing them once 6.1 is out. This
1964   leads to those slightly odd looking version    1964   leads to those slightly odd looking version identifiers coming up during
1965   bisections.                                    1965   bisections.
1966                                                  1966 
1967 [:ref:`back to step-by-step guide <bisectbuil    1967 [:ref:`back to step-by-step guide <bisectbuild_bissbs>`]
1968                                                  1968 
1969 .. _bisecttest_bisref:                           1969 .. _bisecttest_bisref:
1970                                                  1970 
1971 Bisection checkpoint                             1971 Bisection checkpoint
1972 ~~~~~~~~~~~~~~~~~~~~                             1972 ~~~~~~~~~~~~~~~~~~~~
1973                                                  1973 
1974   *Check if the feature that regressed works     1974   *Check if the feature that regressed works in the kernel you just built.*
1975   [:ref:`... <bisecttest_bissbs>`]               1975   [:ref:`... <bisecttest_bissbs>`]
1976                                                  1976 
1977 Ensure what you tell Git is accurate: getting    1977 Ensure what you tell Git is accurate: getting it wrong just one time will bring
1978 the rest of the bisection totally off course,    1978 the rest of the bisection totally off course, hence all testing after that point
1979 will be for nothing.                             1979 will be for nothing.
1980                                                  1980 
1981 [:ref:`back to step-by-step guide <bisecttest    1981 [:ref:`back to step-by-step guide <bisecttest_bissbs>`]
1982                                                  1982 
1983 .. _bisectlog_bisref:                            1983 .. _bisectlog_bisref:
1984                                                  1984 
1985 Put the bisection log away                       1985 Put the bisection log away
1986 ~~~~~~~~~~~~~~~~~~~~~~~~~~                       1986 ~~~~~~~~~~~~~~~~~~~~~~~~~~
1987                                                  1987 
1988   *Store Git's bisection log and the current     1988   *Store Git's bisection log and the current .config file in a safe place.*
1989   [:ref:`... <bisectlog_bissbs>`]                1989   [:ref:`... <bisectlog_bissbs>`]
1990                                                  1990 
1991 As indicated above: declaring just one kernel    1991 As indicated above: declaring just one kernel wrongly as 'good' or 'bad' will
1992 render the end result of a bisection useless.    1992 render the end result of a bisection useless. In that case you'd normally have
1993 to restart the bisection from scratch. The lo    1993 to restart the bisection from scratch. The log can prevent that, as it might
1994 allow someone to point out where a bisection     1994 allow someone to point out where a bisection likely went sideways -- and then
1995 instead of testing ten or more kernels you mi    1995 instead of testing ten or more kernels you might only have to build a few to
1996 resolve things.                                  1996 resolve things.
1997                                                  1997 
1998 The .config file is put aside, as there is a     1998 The .config file is put aside, as there is a decent chance that developers might
1999 ask for it after you report the regression.      1999 ask for it after you report the regression.
2000                                                  2000 
2001 [:ref:`back to step-by-step guide <bisectlog_    2001 [:ref:`back to step-by-step guide <bisectlog_bissbs>`]
2002                                                  2002 
2003 .. _revert_bisref:                               2003 .. _revert_bisref:
2004                                                  2004 
2005 Try reverting the culprit                        2005 Try reverting the culprit
2006 ~~~~~~~~~~~~~~~~~~~~~~~~~                        2006 ~~~~~~~~~~~~~~~~~~~~~~~~~
2007                                                  2007 
2008   *Try reverting the culprit on top of the la    2008   *Try reverting the culprit on top of the latest codebase to see if this fixes
2009   your regression.* [:ref:`... <revert_bissbs    2009   your regression.* [:ref:`... <revert_bissbs>`]
2010                                                  2010 
2011 This is an optional step, but whenever possib    2011 This is an optional step, but whenever possible one you should try: there is a
2012 decent chance that developers will ask you to    2012 decent chance that developers will ask you to perform this step when you bring
2013 the bisection result up. So give it a try, yo    2013 the bisection result up. So give it a try, you are in the flow already, building
2014 one more kernel shouldn't be a big deal at th    2014 one more kernel shouldn't be a big deal at this point.
2015                                                  2015 
2016 The step-by-step guide covers everything rele    2016 The step-by-step guide covers everything relevant already except one slightly
2017 rare thing: did you bisected a regression tha    2017 rare thing: did you bisected a regression that also happened with mainline using
2018 a stable/longterm series, but Git failed to r    2018 a stable/longterm series, but Git failed to revert the commit in mainline? Then
2019 try to revert the culprit in the affected sta    2019 try to revert the culprit in the affected stable/longterm series -- and if that
2020 succeeds, test that kernel version instead.      2020 succeeds, test that kernel version instead.
2021                                                  2021 
2022 [:ref:`back to step-by-step guide <revert_bis    2022 [:ref:`back to step-by-step guide <revert_bissbs>`]
2023                                                  2023 
2024 Cleanup steps during and after following this    2024 Cleanup steps during and after following this guide
2025 ---------------------------------------------    2025 ---------------------------------------------------
2026                                                  2026 
2027   *During and after following this guide you     2027   *During and after following this guide you might want or need to remove some
2028   of the kernels you installed.* [:ref:`... <    2028   of the kernels you installed.* [:ref:`... <introclosure_bissbs>`]
2029                                                  2029 
2030 The steps in this section describe clean-up p    2030 The steps in this section describe clean-up procedures.
2031                                                  2031 
2032 [:ref:`back to step-by-step guide <introclosu    2032 [:ref:`back to step-by-step guide <introclosure_bissbs>`].
2033                                                  2033 
2034 .. _makeroom_bisref:                             2034 .. _makeroom_bisref:
2035                                                  2035 
2036 Cleaning up during the bisection                 2036 Cleaning up during the bisection
2037 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                 2037 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2038                                                  2038 
2039   *To remove one of the kernels you installed    2039   *To remove one of the kernels you installed, look up its 'kernelrelease'
2040   identifier.* [:ref:`... <makeroom_bissbs>`]    2040   identifier.* [:ref:`... <makeroom_bissbs>`]
2041                                                  2041 
2042 The kernels you install during this process a    2042 The kernels you install during this process are easy to remove later, as its
2043 parts are only stored in two places and clear    2043 parts are only stored in two places and clearly identifiable. You thus do not
2044 need to worry to mess up your machine when yo    2044 need to worry to mess up your machine when you install a kernel manually (and
2045 thus bypass your distribution's packaging sys    2045 thus bypass your distribution's packaging system): all parts of your kernels are
2046 relatively easy to remove later.                 2046 relatively easy to remove later.
2047                                                  2047 
2048 One of the two places is a directory in /lib/    2048 One of the two places is a directory in /lib/modules/, which holds the modules
2049 for each installed kernel. This directory is     2049 for each installed kernel. This directory is named after the kernel's release
2050 identifier; hence, to remove all modules for     2050 identifier; hence, to remove all modules for one of the kernels you built,
2051 simply remove its modules directory in /lib/m    2051 simply remove its modules directory in /lib/modules/.
2052                                                  2052 
2053 The other place is /boot/, where typically tw    2053 The other place is /boot/, where typically two up to five files will be placed
2054 during installation of a kernel. All of them     2054 during installation of a kernel. All of them usually contain the release name in
2055 their file name, but how many files and their    2055 their file name, but how many files and their exact names depend somewhat on
2056 your distribution's installkernel executable     2056 your distribution's installkernel executable and its initramfs generator. On
2057 some distributions the ``kernel-install remov    2057 some distributions the ``kernel-install remove...`` command mentioned in the
2058 step-by-step guide will delete all of these f    2058 step-by-step guide will delete all of these files for you while also removing
2059 the menu entry for the kernel from your bootl    2059 the menu entry for the kernel from your bootloader configuration. On others you
2060 have to take care of these two tasks yourself    2060 have to take care of these two tasks yourself. The following command should
2061 interactively remove the three main files of     2061 interactively remove the three main files of a kernel with the release name
2062 '6.0-rc1-local-gcafec0cacaca0'::                 2062 '6.0-rc1-local-gcafec0cacaca0'::
2063                                                  2063 
2064   rm -i /boot/{System.map,vmlinuz,initr}-6.0-    2064   rm -i /boot/{System.map,vmlinuz,initr}-6.0-rc1-local-gcafec0cacaca0
2065                                                  2065 
2066 Afterwards check for other files in /boot/ th    2066 Afterwards check for other files in /boot/ that have
2067 '6.0-rc1-local-gcafec0cacaca0' in their name     2067 '6.0-rc1-local-gcafec0cacaca0' in their name and consider deleting them as well.
2068 Now remove the boot entry for the kernel from    2068 Now remove the boot entry for the kernel from your bootloader's configuration;
2069 the steps to do that vary quite a bit between    2069 the steps to do that vary quite a bit between Linux distributions.
2070                                                  2070 
2071 Note, be careful with wildcards like '*' when    2071 Note, be careful with wildcards like '*' when deleting files or directories
2072 for kernels manually: you might accidentally     2072 for kernels manually: you might accidentally remove files of a 6.0.13 kernel
2073 when all you want is to remove 6.0 or 6.0.1.     2073 when all you want is to remove 6.0 or 6.0.1.
2074                                                  2074 
2075 [:ref:`back to step-by-step guide <makeroom_b    2075 [:ref:`back to step-by-step guide <makeroom_bissbs>`]
2076                                                  2076 
2077 Cleaning up after the bisection                  2077 Cleaning up after the bisection
2078 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                  2078 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2079                                                  2079 
2080 .. _finishingtouch_bisref:                       2080 .. _finishingtouch_bisref:
2081                                                  2081 
2082   *Once you have finished the bisection, do n    2082   *Once you have finished the bisection, do not immediately remove anything
2083   you set up, as you might need a few things     2083   you set up, as you might need a few things again.*
2084   [:ref:`... <finishingtouch_bissbs>`]           2084   [:ref:`... <finishingtouch_bissbs>`]
2085                                                  2085 
2086 When you are really short of storage space re    2086 When you are really short of storage space removing the kernels as described in
2087 the step-by-step guide might not free as much    2087 the step-by-step guide might not free as much space as you would like. In that
2088 case consider running ``rm -rf ~/linux/*`` as    2088 case consider running ``rm -rf ~/linux/*`` as well now. This will remove the
2089 build artifacts and the Linux sources, but wi    2089 build artifacts and the Linux sources, but will leave the Git repository
2090 (~/linux/.git/) behind -- a simple ``git rese    2090 (~/linux/.git/) behind -- a simple ``git reset --hard`` thus will bring the
2091 sources back.                                    2091 sources back.
2092                                                  2092 
2093 Removing the repository as well would likely     2093 Removing the repository as well would likely be unwise at this point: there
2094 is a decent chance developers will ask you to    2094 is a decent chance developers will ask you to build another kernel to
2095 perform additional tests -- like testing a de    2095 perform additional tests -- like testing a debug patch or a proposed fix.
2096 Details on how to perform those can be found     2096 Details on how to perform those can be found in the section :ref:`Optional
2097 tasks: test reverts, patches, or later versio    2097 tasks: test reverts, patches, or later versions <introoptional_bissbs>`.
2098                                                  2098 
2099 Additional tests are also the reason why you     2099 Additional tests are also the reason why you want to keep the
2100 ~/kernel-config-working file around for a few    2100 ~/kernel-config-working file around for a few weeks.
2101                                                  2101 
2102 [:ref:`back to step-by-step guide <finishingt    2102 [:ref:`back to step-by-step guide <finishingtouch_bissbs>`]
2103                                                  2103 
2104 .. _introoptional_bisref:                        2104 .. _introoptional_bisref:
2105                                                  2105 
2106 Test reverts, patches, or later versions         2106 Test reverts, patches, or later versions
2107 ----------------------------------------         2107 ----------------------------------------
2108                                                  2108 
2109   *While or after reporting a bug, you might     2109   *While or after reporting a bug, you might want or potentially will be asked
2110   to test reverts, patches, proposed fixes, o    2110   to test reverts, patches, proposed fixes, or other versions.*
2111   [:ref:`... <introoptional_bissbs>`]            2111   [:ref:`... <introoptional_bissbs>`]
2112                                                  2112 
2113 All the commands used in this section should     2113 All the commands used in this section should be pretty straight forward, so
2114 there is not much to add except one thing: wh    2114 there is not much to add except one thing: when setting a kernel tag as
2115 instructed, ensure it is not much longer than    2115 instructed, ensure it is not much longer than the one used in the example, as
2116 problems will arise if the kernelrelease iden    2116 problems will arise if the kernelrelease identifier exceeds 63 characters.
2117                                                  2117 
2118 [:ref:`back to step-by-step guide <introoptio    2118 [:ref:`back to step-by-step guide <introoptional_bissbs>`].
2119                                                  2119 
2120                                                  2120 
2121 Additional information                           2121 Additional information
2122 ======================                           2122 ======================
2123                                                  2123 
2124 .. _buildhost_bis:                               2124 .. _buildhost_bis:
2125                                                  2125 
2126 Build kernels on a different machine             2126 Build kernels on a different machine
2127 ------------------------------------             2127 ------------------------------------
2128                                                  2128 
2129 To compile kernels on another system, slightl    2129 To compile kernels on another system, slightly alter the step-by-step guide's
2130 instructions:                                    2130 instructions:
2131                                                  2131 
2132 * Start following the guide on the machine wh    2132 * Start following the guide on the machine where you want to install and test
2133   the kernels later.                             2133   the kernels later.
2134                                                  2134 
2135 * After executing ':ref:`Boot into the workin    2135 * After executing ':ref:`Boot into the working kernel and briefly use the
2136   apparently broken feature <bootworking_biss    2136   apparently broken feature <bootworking_bissbs>`', save the list of loaded
2137   modules to a file using ``lsmod > ~/test-ma    2137   modules to a file using ``lsmod > ~/test-machine-lsmod``. Then locate the
2138   build configuration for the running kernel     2138   build configuration for the running kernel (see ':ref:`Start defining the
2139   build configuration for your kernel <oldcon    2139   build configuration for your kernel <oldconfig_bisref>`' for hints on where
2140   to find it) and store it as '~/test-machine    2140   to find it) and store it as '~/test-machine-config-working'. Transfer both
2141   files to the home directory of your build h    2141   files to the home directory of your build host.
2142                                                  2142 
2143 * Continue the guide on the build host (e.g.     2143 * Continue the guide on the build host (e.g. with ':ref:`Ensure to have enough
2144   free space for building [...] <diskspace_bi    2144   free space for building [...] <diskspace_bissbs>`').
2145                                                  2145 
2146 * When you reach ':ref:`Start preparing a ker    2146 * When you reach ':ref:`Start preparing a kernel build configuration[...]
2147   <oldconfig_bissbs>`': before running ``make    2147   <oldconfig_bissbs>`': before running ``make olddefconfig`` for the first time,
2148   execute the following command to base your     2148   execute the following command to base your configuration on the one from the
2149   test machine's 'working' kernel::              2149   test machine's 'working' kernel::
2150                                                  2150 
2151     cp ~/test-machine-config-working ~/linux/    2151     cp ~/test-machine-config-working ~/linux/.config
2152                                                  2152 
2153 * During the next step to ':ref:`disable any     2153 * During the next step to ':ref:`disable any apparently superfluous kernel
2154   modules <localmodconfig_bissbs>`' use the f    2154   modules <localmodconfig_bissbs>`' use the following command instead::
2155                                                  2155 
2156     yes '' | make localmodconfig LSMOD=~/lsmo    2156     yes '' | make localmodconfig LSMOD=~/lsmod_foo-machine localmodconfig
2157                                                  2157 
2158 * Continue the guide, but ignore the instruct    2158 * Continue the guide, but ignore the instructions outlining how to compile,
2159   install, and reboot into a kernel every tim    2159   install, and reboot into a kernel every time they come up. Instead build
2160   like this::                                    2160   like this::
2161                                                  2161 
2162     cp ~/kernel-config-working .config           2162     cp ~/kernel-config-working .config
2163     make olddefconfig &&                         2163     make olddefconfig &&
2164     make -j $(nproc --all) targz-pkg             2164     make -j $(nproc --all) targz-pkg
2165                                                  2165 
2166   This will generate a gzipped tar file whose    2166   This will generate a gzipped tar file whose name is printed in the last
2167   line shown; for example, a kernel with the     2167   line shown; for example, a kernel with the kernelrelease identifier
2168   '6.0.0-rc1-local-g928a87efa423' built for x    2168   '6.0.0-rc1-local-g928a87efa423' built for x86 machines usually will
2169   be stored as '~/linux/linux-6.0.0-rc1-local    2169   be stored as '~/linux/linux-6.0.0-rc1-local-g928a87efa423-x86.tar.gz'.
2170                                                  2170 
2171   Copy that file to your test machine's home     2171   Copy that file to your test machine's home directory.
2172                                                  2172 
2173 * Switch to the test machine to check if you     2173 * Switch to the test machine to check if you have enough space to hold another
2174   kernel. Then extract the file you transferr    2174   kernel. Then extract the file you transferred::
2175                                                  2175 
2176     sudo tar -xvzf ~/linux-6.0.0-rc1-local-g9    2176     sudo tar -xvzf ~/linux-6.0.0-rc1-local-g928a87efa423-x86.tar.gz -C /
2177                                                  2177 
2178   Afterwards :ref:`generate the initramfs and    2178   Afterwards :ref:`generate the initramfs and add the kernel to your boot
2179   loader's configuration <install_bisref>`; o    2179   loader's configuration <install_bisref>`; on some distributions the following
2180   command will take care of both these tasks:    2180   command will take care of both these tasks::
2181                                                  2181 
2182     sudo /sbin/installkernel 6.0.0-rc1-local-    2182     sudo /sbin/installkernel 6.0.0-rc1-local-g928a87efa423 /boot/vmlinuz-6.0.0-rc1-local-g928a87efa423
2183                                                  2183 
2184   Now reboot and ensure you started the inten    2184   Now reboot and ensure you started the intended kernel.
2185                                                  2185 
2186 This approach even works when building for an    2186 This approach even works when building for another architecture: just install
2187 cross-compilers and add the appropriate param    2187 cross-compilers and add the appropriate parameters to every invocation of make
2188 (e.g. ``make ARCH=arm64 CROSS_COMPILE=aarch64    2188 (e.g. ``make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- [...]``).
2189                                                  2189 
2190 Additional reading material                      2190 Additional reading material
2191 ---------------------------                      2191 ---------------------------
2192                                                  2192 
2193 * The `man page for 'git bisect' <https://git    2193 * The `man page for 'git bisect' <https://git-scm.com/docs/git-bisect>`_ and
2194   `fighting regressions with 'git bisect' <ht    2194   `fighting regressions with 'git bisect' <https://git-scm.com/docs/git-bisect-lk2009.html>`_
2195   in the Git documentation.                      2195   in the Git documentation.
2196 * `Working with git bisect <https://nathancha    2196 * `Working with git bisect <https://nathanchance.dev/posts/working-with-git-bisect/>`_
2197   from kernel developer Nathan Chancellor.       2197   from kernel developer Nathan Chancellor.
2198 * `Using Git bisect to figure out when broken    2198 * `Using Git bisect to figure out when brokenness was introduced <http://webchick.net/node/99>`_.
2199 * `Fully automated bisecting with 'git bisect    2199 * `Fully automated bisecting with 'git bisect run' <https://lwn.net/Articles/317154>`_.
2200                                                  2200 
2201 ..                                               2201 ..
2202    end-of-content                                2202    end-of-content
2203 ..                                               2203 ..
2204    This document is maintained by Thorsten Le<    2204    This document is maintained by Thorsten Leemhuis <linux@leemhuis.info>. If
2205    you spot a typo or small mistake, feel fre    2205    you spot a typo or small mistake, feel free to let him know directly and
2206    he'll fix it. You are free to do the same     2206    he'll fix it. You are free to do the same in a mostly informal way if you
2207    want to contribute changes to the text --     2207    want to contribute changes to the text -- but for copyright reasons please CC
2208    linux-doc@vger.kernel.org and 'sign-off' y    2208    linux-doc@vger.kernel.org and 'sign-off' your contribution as
2209    Documentation/process/submitting-patches.r    2209    Documentation/process/submitting-patches.rst explains in the section 'Sign
2210    your work - the Developer's Certificate of    2210    your work - the Developer's Certificate of Origin'.
2211 ..                                               2211 ..
2212    This text is available under GPL-2.0+ or C    2212    This text is available under GPL-2.0+ or CC-BY-4.0, as stated at the top
2213    of the file. If you want to distribute thi    2213    of the file. If you want to distribute this text under CC-BY-4.0 only,
2214    please use 'The Linux kernel development c    2214    please use 'The Linux kernel development community' for author attribution
2215    and link this as source:                      2215    and link this as source:
2216    https://git.kernel.org/pub/scm/linux/kerne    2216    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst
2217                                                  2217 
2218 ..                                               2218 ..
2219    Note: Only the content of this RST file as    2219    Note: Only the content of this RST file as found in the Linux kernel sources
2220    is available under CC-BY-4.0, as versions     2220    is available under CC-BY-4.0, as versions of this text that were processed
2221    (for example by the kernel's build system)    2221    (for example by the kernel's build system) might contain content taken from
2222    files which use a more restrictive license    2222    files which use a more restrictive license.
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php