mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 01:05:29 +00:00
f5aff6fa64
Explicitly mention how to bisect -next, as nothing in the kernel tree currently explains that bisects between -next versions won't work well and it's better to bisect between mainline and -next. Co-developed-by: Mark Brown <broonie@kernel.org> Signed-off-by: Mark Brown <broonie@kernel.org> Reviewed-by: Mark Brown <broonie@kernel.org> Signed-off-by: Thorsten Leemhuis <linux@leemhuis.info> Signed-off-by: Jonathan Corbet <corbet@lwn.net> Link: https://lore.kernel.org/r/ec19d5fc503ff7db3d4c4ff9e97fff24cc78f72a.1730808651.git.linux@leemhuis.info
166 lines
7.5 KiB
ReStructuredText
166 lines
7.5 KiB
ReStructuredText
.. SPDX-License-Identifier: (GPL-2.0+ OR CC-BY-4.0)
|
|
.. [see the bottom of this file for redistribution information]
|
|
|
|
======================
|
|
Bisecting a regression
|
|
======================
|
|
|
|
This document describes how to use a ``git bisect`` to find the source code
|
|
change that broke something -- for example when some functionality stopped
|
|
working after upgrading from Linux 6.0 to 6.1.
|
|
|
|
The text focuses on the gist of the process. If you are new to bisecting the
|
|
kernel, better follow Documentation/admin-guide/verify-bugs-and-bisect-regressions.rst
|
|
instead: it depicts everything from start to finish while covering multiple
|
|
aspects even kernel developers occasionally forget. This includes detecting
|
|
situations early where a bisection would be a waste of time, as nobody would
|
|
care about the result -- for example, because the problem happens after the
|
|
kernel marked itself as 'tainted', occurs in an abandoned version, was already
|
|
fixed, or is caused by a .config change you or your Linux distributor performed.
|
|
|
|
Finding the change causing a kernel issue using a bisection
|
|
===========================================================
|
|
|
|
*Note: the following process assumes you prepared everything for a bisection.
|
|
This includes having a Git clone with the appropriate sources, installing the
|
|
software required to build and install kernels, as well as a .config file stored
|
|
in a safe place (the following example assumes '~/prepared_kernel_.config') to
|
|
use as pristine base at each bisection step; ideally, you have also worked out
|
|
a fully reliable and straight-forward way to reproduce the regression, too.*
|
|
|
|
* Preparation: start the bisection and tell Git about the points in the history
|
|
you consider to be working and broken, which Git calls 'good' and 'bad'::
|
|
|
|
git bisect start
|
|
git bisect good v6.0
|
|
git bisect bad v6.1
|
|
|
|
Instead of Git tags like 'v6.0' and 'v6.1' you can specify commit-ids, too.
|
|
|
|
1. Copy your prepared .config into the build directory and adjust it to the
|
|
needs of the codebase Git checked out for testing::
|
|
|
|
cp ~/prepared_kernel_.config .config
|
|
make olddefconfig
|
|
|
|
2. Now build, install, and boot a kernel. This might fail for unrelated reasons,
|
|
for example, when a compile error happens at the current stage of the
|
|
bisection a later change resolves. In such cases run ``git bisect skip`` and
|
|
go back to step 1.
|
|
|
|
3. Check if the functionality that regressed works in the kernel you just built.
|
|
|
|
If it works, execute::
|
|
|
|
git bisect good
|
|
|
|
If it is broken, run::
|
|
|
|
git bisect bad
|
|
|
|
Note, getting this wrong just once will send the rest of the bisection
|
|
totally off course. To prevent having to start anew later you thus want to
|
|
ensure what you tell Git is correct; it is thus often wise to spend a few
|
|
minutes more on testing in case your reproducer is unreliable.
|
|
|
|
After issuing one of these two commands, Git will usually check out another
|
|
bisection point and print something like 'Bisecting: 675 revisions left to
|
|
test after this (roughly 10 steps)'. In that case go back to step 1.
|
|
|
|
If Git instead prints something like 'cafecaca0c0dacafecaca0c0dacafecaca0c0da
|
|
is the first bad commit', then you have finished the bisection. In that case
|
|
move to the next point below. Note, right after displaying that line Git will
|
|
show some details about the culprit including its patch description; this can
|
|
easily fill your terminal, so you might need to scroll up to see the message
|
|
mentioning the culprit's commit-id.
|
|
|
|
In case you missed Git's output, you can always run ``git bisect log`` to
|
|
print the status: it will show how many steps remain or mention the result of
|
|
the bisection.
|
|
|
|
* Recommended complementary task: put the bisection log and the current .config
|
|
file aside for the bug report; furthermore tell Git to reset the sources to
|
|
the state before the bisection::
|
|
|
|
git bisect log > ~/bisection-log
|
|
cp .config ~/bisection-config-culprit
|
|
git bisect reset
|
|
|
|
* Recommended optional task: try reverting the culprit on top of the latest
|
|
codebase and check if that fixes your bug; if that is the case, it validates
|
|
the bisection and enables developers to resolve the regression through a
|
|
revert.
|
|
|
|
To try this, update your clone and check out latest mainline. Then tell Git
|
|
to revert the change by specifying its commit-id::
|
|
|
|
git revert --no-edit cafec0cacaca0
|
|
|
|
Git might reject this, for example when the bisection landed on a merge
|
|
commit. In that case, abandon the attempt. Do the same, if Git fails to revert
|
|
the culprit on its own because later changes depend on it -- at least unless
|
|
you bisected a stable or longterm kernel series, in which case you want to
|
|
check out its latest codebase and try a revert there.
|
|
|
|
If a revert succeeds, build and test another kernel to check if reverting
|
|
resolved your regression.
|
|
|
|
With that the process is complete. Now report the regression as described by
|
|
Documentation/admin-guide/reporting-issues.rst.
|
|
|
|
Bisecting linux-next
|
|
--------------------
|
|
|
|
If you face a problem only happening in linux-next, bisect between the
|
|
linux-next branches 'stable' and 'master'. The following commands will start
|
|
the process for a linux-next tree you added as a remote called 'next'::
|
|
|
|
git bisect start
|
|
git bisect good next/stable
|
|
git bisect bad next/master
|
|
|
|
The 'stable' branch refers to the state of linux-mainline that the current
|
|
linux-next release (found in the 'master' branch) is based on -- the former
|
|
thus should be free of any problems that show up in -next, but not in Linus'
|
|
tree.
|
|
|
|
This will bisect across a wide range of changes, some of which you might have
|
|
used in earlier linux-next releases without problems. Sadly there is no simple
|
|
way to avoid checking them: bisecting from one linux-next release to a later
|
|
one (say between 'next-20241020' and 'next-20241021') is impossible, as they
|
|
share no common history.
|
|
|
|
Additional reading material
|
|
---------------------------
|
|
|
|
* The `man page for 'git bisect' <https://git-scm.com/docs/git-bisect>`_ and
|
|
`fighting regressions with 'git bisect' <https://git-scm.com/docs/git-bisect-lk2009.html>`_
|
|
in the Git documentation.
|
|
* `Working with git bisect <https://nathanchance.dev/posts/working-with-git-bisect/>`_
|
|
from kernel developer Nathan Chancellor.
|
|
* `Using Git bisect to figure out when brokenness was introduced <http://webchick.net/node/99>`_.
|
|
* `Fully automated bisecting with 'git bisect run' <https://lwn.net/Articles/317154>`_.
|
|
|
|
..
|
|
end-of-content
|
|
..
|
|
This document is maintained by Thorsten Leemhuis <linux@leemhuis.info>. If
|
|
you spot a typo or small mistake, feel free to let him know directly and
|
|
he'll fix it. You are free to do the same in a mostly informal way if you
|
|
want to contribute changes to the text -- but for copyright reasons please CC
|
|
linux-doc@vger.kernel.org and 'sign-off' your contribution as
|
|
Documentation/process/submitting-patches.rst explains in the section 'Sign
|
|
your work - the Developer's Certificate of Origin'.
|
|
..
|
|
This text is available under GPL-2.0+ or CC-BY-4.0, as stated at the top
|
|
of the file. If you want to distribute this text under CC-BY-4.0 only,
|
|
please use 'The Linux kernel development community' for author attribution
|
|
and link this as source:
|
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/plain/Documentation/admin-guide/bug-bisect.rst
|
|
|
|
..
|
|
Note: Only the content of this RST file as found in the Linux kernel sources
|
|
is available under CC-BY-4.0, as versions of this text that were processed
|
|
(for example by the kernel's build system) might contain content taken from
|
|
files which use a more restrictive license.
|