mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 23:14:31 +08:00
b45d8f3871
Having "how to submit patches" in MAINTAINTERS seems out of place. We have a whole section of documentation about it, duplication is harmful and a lot of the text looks really out of date. Sections 1, 2 and 4 look really, really old and not applicable to the modern process. Section 3 is obvious but also we have build bots now. Section 5 is a bit outdated (diff -u?!). But I like the part about factoring out shared code, so add that to process docs. Section 6 is unnecessary? Section 7 is covered by more appropriate docs. Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Randy Dunlap <rdunlap@infradead.org> Reviewed-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Kees Cook <keescook@chromium.org> Signed-off-by: Jonathan Corbet <corbet@lwn.net> Message-ID: <20230630171550.128296-1-kuba@kernel.org>
220 lines
12 KiB
ReStructuredText
220 lines
12 KiB
ReStructuredText
.. _development_followthrough:
|
|
|
|
Followthrough
|
|
=============
|
|
|
|
At this point, you have followed the guidelines given so far and, with the
|
|
addition of your own engineering skills, have posted a perfect series of
|
|
patches. One of the biggest mistakes that even experienced kernel
|
|
developers can make is to conclude that their work is now done. In truth,
|
|
posting patches indicates a transition into the next stage of the process,
|
|
with, possibly, quite a bit of work yet to be done.
|
|
|
|
It is a rare patch which is so good at its first posting that there is no
|
|
room for improvement. The kernel development process recognizes this fact,
|
|
and, as a result, is heavily oriented toward the improvement of posted
|
|
code. You, as the author of that code, will be expected to work with the
|
|
kernel community to ensure that your code is up to the kernel's quality
|
|
standards. A failure to participate in this process is quite likely to
|
|
prevent the inclusion of your patches into the mainline.
|
|
|
|
|
|
Working with reviewers
|
|
----------------------
|
|
|
|
A patch of any significance will result in a number of comments from other
|
|
developers as they review the code. Working with reviewers can be, for
|
|
many developers, the most intimidating part of the kernel development
|
|
process. Life can be made much easier, though, if you keep a few things in
|
|
mind:
|
|
|
|
- If you have explained your patch well, reviewers will understand its
|
|
value and why you went to the trouble of writing it. But that value
|
|
will not keep them from asking a fundamental question: what will it be
|
|
like to maintain a kernel with this code in it five or ten years later?
|
|
Many of the changes you may be asked to make - from coding style tweaks
|
|
to substantial rewrites - come from the understanding that Linux will
|
|
still be around and under development a decade from now.
|
|
|
|
- Code review is hard work, and it is a relatively thankless occupation;
|
|
people remember who wrote kernel code, but there is little lasting fame
|
|
for those who reviewed it. So reviewers can get grumpy, especially when
|
|
they see the same mistakes being made over and over again. If you get a
|
|
review which seems angry, insulting, or outright offensive, resist the
|
|
impulse to respond in kind. Code review is about the code, not about
|
|
the people, and code reviewers are not attacking you personally.
|
|
|
|
- Similarly, code reviewers are not trying to promote their employers'
|
|
agendas at the expense of your own. Kernel developers often expect to
|
|
be working on the kernel years from now, but they understand that their
|
|
employer could change. They truly are, almost without exception,
|
|
working toward the creation of the best kernel they can; they are not
|
|
trying to create discomfort for their employers' competitors.
|
|
|
|
- Be prepared for seemingly silly requests for coding style changes
|
|
and requests to factor out some of your code to shared parts of
|
|
the kernel. One job the maintainers do is to keep things looking
|
|
the same. Sometimes this means that the clever hack in your driver
|
|
to get around a problem actually needs to become a generalized
|
|
kernel feature ready for next time.
|
|
|
|
What all of this comes down to is that, when reviewers send you comments,
|
|
you need to pay attention to the technical observations that they are
|
|
making. Do not let their form of expression or your own pride keep that
|
|
from happening. When you get review comments on a patch, take the time to
|
|
understand what the reviewer is trying to say. If possible, fix the things
|
|
that the reviewer is asking you to fix. And respond back to the reviewer:
|
|
thank them, and describe how you will answer their questions.
|
|
|
|
Note that you do not have to agree with every change suggested by
|
|
reviewers. If you believe that the reviewer has misunderstood your code,
|
|
explain what is really going on. If you have a technical objection to a
|
|
suggested change, describe it and justify your solution to the problem. If
|
|
your explanations make sense, the reviewer will accept them. Should your
|
|
explanation not prove persuasive, though, especially if others start to
|
|
agree with the reviewer, take some time to think things over again. It can
|
|
be easy to become blinded by your own solution to a problem to the point
|
|
that you don't realize that something is fundamentally wrong or, perhaps,
|
|
you're not even solving the right problem.
|
|
|
|
Andrew Morton has suggested that every review comment which does not result
|
|
in a code change should result in an additional code comment instead; that
|
|
can help future reviewers avoid the questions which came up the first time
|
|
around.
|
|
|
|
One fatal mistake is to ignore review comments in the hope that they will
|
|
go away. They will not go away. If you repost code without having
|
|
responded to the comments you got the time before, you're likely to find
|
|
that your patches go nowhere.
|
|
|
|
Speaking of reposting code: please bear in mind that reviewers are not
|
|
going to remember all the details of the code you posted the last time
|
|
around. So it is always a good idea to remind reviewers of previously
|
|
raised issues and how you dealt with them; the patch changelog is a good
|
|
place for this kind of information. Reviewers should not have to search
|
|
through list archives to familiarize themselves with what was said last
|
|
time; if you help them get a running start, they will be in a better mood
|
|
when they revisit your code.
|
|
|
|
What if you've tried to do everything right and things still aren't going
|
|
anywhere? Most technical disagreements can be resolved through discussion,
|
|
but there are times when somebody simply has to make a decision. If you
|
|
honestly believe that this decision is going against you wrongly, you can
|
|
always try appealing to a higher power. As of this writing, that higher
|
|
power tends to be Andrew Morton. Andrew has a great deal of respect in the
|
|
kernel development community; he can often unjam a situation which seems to
|
|
be hopelessly blocked. Appealing to Andrew should not be done lightly,
|
|
though, and not before all other alternatives have been explored. And bear
|
|
in mind, of course, that he may not agree with you either.
|
|
|
|
|
|
What happens next
|
|
-----------------
|
|
|
|
If a patch is considered to be a good thing to add to the kernel, and once
|
|
most of the review issues have been resolved, the next step is usually
|
|
entry into a subsystem maintainer's tree. How that works varies from one
|
|
subsystem to the next; each maintainer has his or her own way of doing
|
|
things. In particular, there may be more than one tree - one, perhaps,
|
|
dedicated to patches planned for the next merge window, and another for
|
|
longer-term work.
|
|
|
|
For patches applying to areas for which there is no obvious subsystem tree
|
|
(memory management patches, for example), the default tree often ends up
|
|
being -mm. Patches which affect multiple subsystems can also end up going
|
|
through the -mm tree.
|
|
|
|
Inclusion into a subsystem tree can bring a higher level of visibility to a
|
|
patch. Now other developers working with that tree will get the patch by
|
|
default. Subsystem trees typically feed linux-next as well, making their
|
|
contents visible to the development community as a whole. At this point,
|
|
there's a good chance that you will get more comments from a new set of
|
|
reviewers; these comments need to be answered as in the previous round.
|
|
|
|
What may also happen at this point, depending on the nature of your patch,
|
|
is that conflicts with work being done by others turn up. In the worst
|
|
case, heavy patch conflicts can result in some work being put on the back
|
|
burner so that the remaining patches can be worked into shape and merged.
|
|
Other times, conflict resolution will involve working with the other
|
|
developers and, possibly, moving some patches between trees to ensure that
|
|
everything applies cleanly. This work can be a pain, but count your
|
|
blessings: before the advent of the linux-next tree, these conflicts often
|
|
only turned up during the merge window and had to be addressed in a hurry.
|
|
Now they can be resolved at leisure, before the merge window opens.
|
|
|
|
Some day, if all goes well, you'll log on and see that your patch has been
|
|
merged into the mainline kernel. Congratulations! Once the celebration is
|
|
complete (and you have added yourself to the MAINTAINERS file), though, it
|
|
is worth remembering an important little fact: the job still is not done.
|
|
Merging into the mainline brings its own challenges.
|
|
|
|
To begin with, the visibility of your patch has increased yet again. There
|
|
may be a new round of comments from developers who had not been aware of
|
|
the patch before. It may be tempting to ignore them, since there is no
|
|
longer any question of your code being merged. Resist that temptation,
|
|
though; you still need to be responsive to developers who have questions or
|
|
suggestions.
|
|
|
|
More importantly, though: inclusion into the mainline puts your code into
|
|
the hands of a much larger group of testers. Even if you have contributed
|
|
a driver for hardware which is not yet available, you will be surprised by
|
|
how many people will build your code into their kernels. And, of course,
|
|
where there are testers, there will be bug reports.
|
|
|
|
The worst sort of bug reports are regressions. If your patch causes a
|
|
regression, you'll find an uncomfortable number of eyes upon you;
|
|
regressions need to be fixed as soon as possible. If you are unwilling or
|
|
unable to fix the regression (and nobody else does it for you), your patch
|
|
will almost certainly be removed during the stabilization period. Beyond
|
|
negating all of the work you have done to get your patch into the mainline,
|
|
having a patch pulled as the result of a failure to fix a regression could
|
|
well make it harder for you to get work merged in the future.
|
|
|
|
After any regressions have been dealt with, there may be other, ordinary
|
|
bugs to deal with. The stabilization period is your best opportunity to
|
|
fix these bugs and ensure that your code's debut in a mainline kernel
|
|
release is as solid as possible. So, please, answer bug reports, and fix
|
|
the problems if at all possible. That's what the stabilization period is
|
|
for; you can start creating cool new patches once any problems with the old
|
|
ones have been taken care of.
|
|
|
|
And don't forget that there are other milestones which may also create bug
|
|
reports: the next mainline stable release, when prominent distributors pick
|
|
up a version of the kernel containing your patch, etc. Continuing to
|
|
respond to these reports is a matter of basic pride in your work. If that
|
|
is insufficient motivation, though, it's also worth considering that the
|
|
development community remembers developers who lose interest in their code
|
|
after it's merged. The next time you post a patch, they will be evaluating
|
|
it with the assumption that you will not be around to maintain it
|
|
afterward.
|
|
|
|
|
|
Other things that can happen
|
|
-----------------------------
|
|
|
|
One day, you may open your mail client and see that somebody has mailed you
|
|
a patch to your code. That is one of the advantages of having your code
|
|
out there in the open, after all. If you agree with the patch, you can
|
|
either forward it on to the subsystem maintainer (be sure to include a
|
|
proper From: line so that the attribution is correct, and add a signoff of
|
|
your own), or send an Acked-by: response back and let the original poster
|
|
send it upward.
|
|
|
|
If you disagree with the patch, send a polite response explaining why. If
|
|
possible, tell the author what changes need to be made to make the patch
|
|
acceptable to you. There is a certain resistance to merging patches which
|
|
are opposed by the author and maintainer of the code, but it only goes so
|
|
far. If you are seen as needlessly blocking good work, those patches will
|
|
eventually flow around you and get into the mainline anyway. In the Linux
|
|
kernel, nobody has absolute veto power over any code. Except maybe Linus.
|
|
|
|
On very rare occasion, you may see something completely different: another
|
|
developer posts a different solution to your problem. At that point,
|
|
chances are that one of the two patches will not be merged, and "mine was
|
|
here first" is not considered to be a compelling technical argument. If
|
|
somebody else's patch displaces yours and gets into the mainline, there is
|
|
really only one way to respond: be pleased that your problem got solved and
|
|
get on with your work. Having one's work shoved aside in this manner can
|
|
be hurtful and discouraging, but the community will remember your reaction
|
|
long after they have forgotten whose patch actually got merged.
|