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

TOMOYO Linux Cross Reference
Linux/Documentation/process/backporting.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/process/backporting.rst (Version linux-6.12-rc7) and /Documentation/process/backporting.rst (Version linux-6.6.60)


  1 .. SPDX-License-Identifier: GPL-2.0               
  2                                                   
  3 ===================================               
  4 Backporting and conflict resolution               
  5 ===================================               
  6                                                   
  7 :Author: Vegard Nossum <vegard.nossum@oracle.co    
  8                                                   
  9 .. contents::                                     
 10     :local:                                       
 11     :depth: 3                                     
 12     :backlinks: none                              
 13                                                   
 14 Introduction                                      
 15 ============                                      
 16                                                   
 17 Some developers may never really have to deal     
 18 merging branches, or resolving conflicts in th    
 19 when a merge conflict does pop up, it can be d    
 20 resolving conflicts is a skill like any other,    
 21 techniques you can use to make the process smo    
 22 confidence in the result.                         
 23                                                   
 24 This document aims to be a comprehensive, step    
 25 backporting and conflict resolution.              
 26                                                   
 27 Applying the patch to a tree                      
 28 ============================                      
 29                                                   
 30 Sometimes the patch you are backporting alread    
 31 in which case you just cherry-pick it directly    
 32 ``git cherry-pick``. However, if the patch com    
 33 often does for the Linux kernel, you will need    
 34 using ``git am``.                                 
 35                                                   
 36 If you've ever used ``git am``, you probably a    
 37 quite picky about the patch applying perfectly    
 38 fact, you've probably had nightmares about ``.    
 39 edit the patch to make it apply.                  
 40                                                   
 41 It is strongly recommended to instead find an     
 42 where the patch applies cleanly and *then* che    
 43 destination tree, as this will make git output    
 44 you resolve conflicts with the help of git and    
 45 resolution tools you might prefer to use. For     
 46 apply a patch that just arrived on LKML to an     
 47 can apply it to the most recent mainline kerne    
 48 to your older stable branch.                      
 49                                                   
 50 It's generally better to use the exact same ba    
 51 was generated from, but it doesn't really matt    
 52 applies cleanly and isn't too far from the ori    
 53 problem with applying the patch to the "wrong"    
 54 in more unrelated changes in the context of th    
 55 it to the older branch.                           
 56                                                   
 57 A good reason to prefer ``git cherry-pick`` ov    
 58 knows the precise history of an existing commi    
 59 code has moved around and changed the line num    
 60 it less likely to apply the patch to the wrong    
 61 in silent mistakes or messy conflicts).           
 62                                                   
 63 If you are using `b4`_. and you are applying t    
 64 email, you can use ``b4 am`` with the options     
 65 and ``-3``/``--prep-3way`` to do some of this     
 66 `b4 presentation`_ for more information). Howe    
 67 article will assume that you are doing a plain    
 68                                                   
 69 .. _b4: https://people.kernel.org/monsieuricon    
 70 .. _b4 presentation: https://youtu.be/mF10hgVI    
 71                                                   
 72 Once you have the patch in git, you can go ahe    
 73 your source tree. Don't forget to cherry-pick     
 74 written record of where the patch came from!      
 75                                                   
 76 Note that if you are submitting a patch for st    
 77 slightly different; the first line after the s    
 78 either::                                          
 79                                                   
 80     commit <upstream commit> upstream             
 81                                                   
 82 or::                                              
 83                                                   
 84     [ Upstream commit <upstream commit> ]         
 85                                                   
 86 Resolving conflicts                               
 87 ===================                               
 88                                                   
 89 Uh-oh; the cherry-pick failed with a vaguely t    
 90                                                   
 91     CONFLICT (content): Merge conflict            
 92                                                   
 93 What to do now?                                   
 94                                                   
 95 In general, conflicts appear when the context     
 96 lines being changed and/or the lines surroundi    
 97 match what's in the tree you are trying to app    
 98                                                   
 99 For backports, what likely happened was that t    
100 backporting from contains patches not in the b    
101 to. However, the reverse is also possible. In     
102 conflict that needs to be resolved.               
103                                                   
104 If your attempted cherry-pick fails with a con    
105 edits the files to include so-called conflict     
106 the conflict is and how the two branches have     
107 conflict typically means editing the end resul    
108 takes into account these other commits.           
109                                                   
110 Resolving the conflict can be done either by h    
111 editor or using a dedicated conflict resolutio    
112                                                   
113 Many people prefer to use their regular text e    
114 conflict directly, as it may be easier to unde    
115 and to control the final result. There are def    
116 each method, and sometimes there's value in us    
117                                                   
118 We will not cover using dedicated merge tools     
119 pointers to various tools that you could use:     
120                                                   
121 -  `Emacs Ediff mode <https://www.emacswiki.or    
122 -  `vimdiff/gvimdiff <https://linux.die.net/ma    
123 -  `KDiff3 <http://kdiff3.sourceforge.net/>`__    
124 -  `TortoiseMerge <https://tortoisesvn.net/Tor    
125 -  `Meld <https://meldmerge.org/help/>`__         
126 -  `P4Merge <https://www.perforce.com/products    
127 -  `Beyond Compare <https://www.scootersoftwar    
128 -  `IntelliJ <https://www.jetbrains.com/help/i    
129 -  `VSCode <https://code.visualstudio.com/docs    
130                                                   
131 To configure git to work with these, see ``git    
132 the official `git-mergetool documentation`_.      
133                                                   
134 .. _git-mergetool documentation: https://git-s    
135                                                   
136 Prerequisite patches                              
137 --------------------                              
138                                                   
139 Most conflicts happen because the branch you a    
140 missing some patches compared to the branch yo    
141 In the more general case (such as merging two     
142 development could have happened on either bran    
143 simply diverged -- perhaps your older branch h    
144 applied to it that themselves needed conflict     
145 divergence.                                       
146                                                   
147 It's important to always identify the commit o    
148 conflict, as otherwise you cannot be confident    
149 your resolution. As an added bonus, especially    
150 area you're not that familiar with, the change    
151 often give you the context to understand the c    
152 or pitfalls with your conflict resolution.        
153                                                   
154 git log                                           
155 ~~~~~~~                                           
156                                                   
157 A good first step is to look at ``git log`` fo    
158 conflict -- this is usually sufficient when th    
159 patches to the file, but may get confusing if     
160 frequently patched. You should run ``git log``    
161 between your currently checked-out branch (``H    
162 the patch you are picking (``<commit>``), i.e.    
163                                                   
164     git log HEAD..<commit>^ -- <path>             
165                                                   
166 Even better, if you want to restrict this outp    
167 (because that's where the conflict appears), y    
168 syntax::                                          
169                                                   
170     git log -L:'\<function\>':<path> HEAD..<co    
171                                                   
172 .. note::                                         
173      The ``\<`` and ``\>`` around the function    
174      matches are anchored on a word boundary.     
175      part is actually a regex and git only fol    
176      if you use ``-L:thread_stack:kernel/fork.    
177      results for the function ``try_release_th    
178      though there are many other functions in     
179      string ``thread_stack`` in their names.      
180                                                   
181 Another useful option for ``git log`` is ``-G`    
182 filter on certain strings appearing in the dif    
183 listing::                                         
184                                                   
185     git log -G'regex' HEAD..<commit>^ -- <path    
186                                                   
187 This can also be a handy way to quickly find w    
188 function call or a variable) was changed, adde    
189 string is a regular expression, which means yo    
190 for more specific things like assignments to a    
191                                                   
192     git log -G'\->index\>.*='                     
193                                                   
194 git blame                                         
195 ~~~~~~~~~                                         
196                                                   
197 Another way to find prerequisite commits (albe    
198 one for a given conflict) is to run ``git blam    
199 need to run it against the parent commit of th    
200 cherry-picking and the file where the conflict    
201                                                   
202     git blame <commit>^ -- <path>                 
203                                                   
204 This command also accepts the ``-L`` argument     
205 output to a single function), but in this case    
206 at the end of the command as usual::              
207                                                   
208     git blame -L:'\<function\>' <commit>^ -- <    
209                                                   
210 Navigate to the place where the conflict occur    
211 the blame output is the commit ID of the patch    
212 of code.                                          
213                                                   
214 It might be a good idea to ``git show`` these     
215 look like they might be the source of the conf    
216 be more than one of these commits, either beca    
217 changed different lines of the same conflict a    
218 subsequent patches changed the same line (or l    
219 the latter case, you may have to run ``git bla    
220 older version of the file to look at in order     
221 the history of the file.                          
222                                                   
223 Prerequisite vs. incidental patches               
224 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~               
225                                                   
226 Having found the patch that caused the conflic    
227 whether it is a prerequisite for the patch you    
228 whether it is just incidental and can be skipp    
229 would be one that touches the same code as the    
230 backporting, but does not change the semantics    
231 material way. For example, a whitespace cleanu    
232 incidental -- likewise, a patch that simply re    
233 variable would be incidental as well. On the o    
234 being changed does not even exist in your curr    
235 not be incidental at all and you need to caref    
236 patch adding the function should be cherry-pic    
237                                                   
238 If you find that there is a necessary prerequi    
239 to stop and cherry-pick that instead. If you'v    
240 conflicts in a different file and don't want t    
241 create a temporary copy of that file.             
242                                                   
243 To abort the current cherry-pick, go ahead and    
244 ``git cherry-pick --abort``, then restart the     
245 with the commit ID of the prerequisite patch i    
246                                                   
247 Understanding conflict markers                    
248 ------------------------------                    
249                                                   
250 Combined diffs                                    
251 ~~~~~~~~~~~~~~                                    
252                                                   
253 Let's say you've decided against picking (or r    
254 patches and you just want to resolve the confl    
255 inserted conflict markers into your file. Out     
256 something like::                                  
257                                                   
258     <<<<<<< HEAD                                  
259     this is what's in your current tree before    
260     =======                                       
261     this is what the patch wants it to be afte    
262     >>>>>>> <commit>... title                     
263                                                   
264 This is what you would see if you opened the f    
265 However, if you were to run ``git diff`` witho    
266 output would look something like this::           
267                                                   
268     $ git diff                                    
269     [...]                                         
270     ++<<<<<<<< HEAD                               
271      +this is what's in your current tree befo    
272     ++========                                    
273     + this is what the patch wants it to be af    
274     ++>>>>>>>> <commit>... title                  
275                                                   
276 When you are resolving a conflict, the behavio    
277 from its normal behavior. Notice the two colum    
278 instead of the usual one; this is a so-called     
279 showing the 3-way diff (or diff-of-diffs) betw    
280                                                   
281 #. the current branch (before cherry-picking)     
282    directory, and                                 
283 #. the current branch (before cherry-picking)     
284    after the original patch has been applied.     
285                                                   
286 .. _combined diff: https://git-scm.com/docs/di    
287                                                   
288                                                   
289 Better diffs                                      
290 ~~~~~~~~~~~~                                      
291                                                   
292 3-way combined diffs include all the other cha    
293 file between your current branch and the branc    
294 from. While this is useful for spotting other     
295 take into account, this also makes the output     
296 intimidating and difficult to read. You may in    
297 ``git diff HEAD`` (or ``git diff --ours``) whi    
298 between the current branch before cherry-picki    
299 directory. It looks like this::                   
300                                                   
301     $ git diff HEAD                               
302     [...]                                         
303     +<<<<<<<< HEAD                                
304      this is what's in your current tree befor    
305     +========                                     
306     +this is what the patch wants it to be aft    
307     +>>>>>>>> <commit>... title                   
308                                                   
309 As you can see, this reads just like any other    
310 which lines are in the current branch and whic    
311 because they are part of the merge conflict or    
312 cherry-picked.                                    
313                                                   
314 Merge styles and diff3                            
315 ~~~~~~~~~~~~~~~~~~~~~~                            
316                                                   
317 The default conflict marker style shown above     
318 style. There is also another style available,     
319 style, which looks like this::                    
320                                                   
321     <<<<<<< HEAD                                  
322     this is what is in your current tree befor    
323     ||||||| parent of <commit> (title)            
324     this is what the patch expected to find th    
325     =======                                       
326     this is what the patch wants it to be afte    
327     >>>>>>> <commit> (title)                      
328                                                   
329 As you can see, this has 3 parts instead of 2,    
330 expected to find there but didn't. It is *high    
331 this conflict style as it makes it much cleare    
332 changed; i.e., it allows you to compare the be    
333 of the file for the commit you are cherry-pick    
334 make better decisions about how to resolve the    
335                                                   
336 To change conflict marker styles, you can use     
337                                                   
338     git config merge.conflictStyle diff3          
339                                                   
340 There is a third option, ``zdiff3``, introduce    
341 which has the same 3 sections as ``diff3``, bu    
342 been trimmed off, making the conflict area sma    
343                                                   
344 .. _Git 2.35: https://github.blog/2022-01-24-h    
345                                                   
346 Iterating on conflict resolutions                 
347 ---------------------------------                 
348                                                   
349 The first step in any conflict resolution proc    
350 patch you are backporting. For the Linux kerne    
351 important, since an incorrect change can lead     
352 crashing -- or worse, an undetected security v    
353                                                   
354 Understanding the patch can be easy or difficu    
355 itself, the changelog, and your familiarity wi    
356 However, a good question for every change (or     
357 might be: "Why is this hunk in the patch?" The    
358 questions will inform your conflict resolution    
359                                                   
360 Resolution process                                
361 ~~~~~~~~~~~~~~~~~~                                
362                                                   
363 Sometimes the easiest thing to do is to just r    
364 part of the conflict, leaving the file essenti    
365 the changes by hand. Perhaps the patch is chan    
366 argument from ``0`` to ``1`` while a conflicti    
367 entirely new (and insignificant) parameter to     
368 list; in that case, it's easy enough to change    
369 to ``1`` by hand and leave the rest of the arg    
370 technique of manually applying changes is most    
371 pulled in a lot of unrelated context that you     
372 about.                                            
373                                                   
374 For particularly nasty conflicts with many con    
375 ``git add`` or ``git add -i`` to selectively s    
376 get them out of the way; this also lets you us    
377 always see what remains to be resolved or ``gi    
378 what your patch looks like so far.                
379                                                   
380 Dealing with file renames                         
381 ~~~~~~~~~~~~~~~~~~~~~~~~~                         
382                                                   
383 One of the most annoying things that can happe    
384 patch is discovering that one of the files bei    
385 renamed, as that typically means git won't eve    
386 but will just throw up its hands and say (para    
387 You do the work..."                               
388                                                   
389 There are generally a few ways to deal with th    
390 renamed file is small, like a one-line change,    
391 just go ahead and apply the change by hand and    
392 other hand, if the change is big or complicate    
393 want to do it by hand.                            
394                                                   
395 As a first pass, you can try something like th    
396 rename detection threshold to 30% (by default,    
397 that two files need to have at least 50% in co    
398 an add-delete pair to be a potential rename)::    
399                                                   
400   git cherry-pick -strategy=recursive -Xrename    
401                                                   
402 Sometimes the right thing to do will be to als    
403 did the rename, but that's definitely not the     
404 what you can do is to temporarily rename the f    
405 backporting to (using ``git mv`` and committin    
406 attempt to cherry-pick the patch, rename the f    
407 committing again), and finally squash the resu    
408 (see the `rebase tutorial`_) so it appears as     
409 are done.                                         
410                                                   
411 .. _rebase tutorial: https://medium.com/@slamf    
412                                                   
413 Gotchas                                           
414 -------                                           
415                                                   
416 Function arguments                                
417 ~~~~~~~~~~~~~~~~~~                                
418                                                   
419 Pay attention to changing function arguments!     
420 details and think that two lines are the same     
421 in some small detail like which variable was p    
422 (especially if the two variables are both a si    
423 the same, like i and j).                          
424                                                   
425 Error handling                                    
426 ~~~~~~~~~~~~~~                                    
427                                                   
428 If you cherry-pick a patch that includes a ``g    
429 for error handling), it is absolutely imperati    
430 the target label is still correct in the branc    
431 The same goes for added ``return``, ``break``,    
432 statements.                                       
433                                                   
434 Error handling is typically located at the bot    
435 may not be part of the conflict even though co    
436 other patches.                                    
437                                                   
438 A good way to ensure that you review the error    
439 ``git diff -W`` and ``git show -W`` (AKA ``--f    
440 inspecting your changes.  For C code, this wil    
441 function that's being changed in a patch. One     
442 go wrong during backports is that something el    
443 on either of the branches that you're backport    
444 including the whole function in the diff you g    
445 more easily spot problems that might otherwise    
446                                                   
447 Refactored code                                   
448 ~~~~~~~~~~~~~~~                                   
449                                                   
450 Something that happens quite often is that cod    
451 "factoring out" a common code sequence or patt    
452 function. When backporting patches to an area     
453 has taken place, you effectively need to do th    
454 backporting: a patch to a single location may     
455 multiple locations in the backported version.     
456 scenario is that a function was renamed -- but    
457 case.)                                            
458                                                   
459 To avoid incomplete backports, it's worth tryi    
460 patch fixes a bug that appears in more than on    
461 this would be to use ``git grep``. (This is ac    
462 in general, not just for backports.) If you do    
463 of fix would apply to other places, it's also     
464 places exist upstream -- if they don't, it's l    
465 to be adjusted. ``git log`` is your friend to     
466 to these areas as ``git blame`` won't show you    
467 removed.                                          
468                                                   
469 If you do find other instances of the same pat    
470 and you're not sure whether it's also a bug, i    
471 patch author. It's not uncommon to find new bu    
472                                                   
473 Verifying the result                              
474 ====================                              
475                                                   
476 colordiff                                         
477 ---------                                         
478                                                   
479 Having committed a conflict-free new patch, yo    
480 patch to the original patch. It is highly reco    
481 tool such as `colordiff`_ that can show two fi    
482 them according to the changes between them::      
483                                                   
484     colordiff -yw -W 200 <(git diff -W <upstre    
485                                                   
486 .. _colordiff: https://www.colordiff.org/         
487                                                   
488 Here, ``-y`` means to do a side-by-side compar    
489 whitespace, and ``-W 200`` sets the width of t    
490 will use 130 by default, which is often a bit     
491                                                   
492 The ``rev^-`` syntax is a handy shorthand for     
493 giving you just the diff for that single commi    
494 the official `git rev-parse documentation`_.      
495                                                   
496 .. _git rev-parse documentation: https://git-s    
497                                                   
498 Again, note the inclusion of ``-W`` for ``git     
499 you will see the full function for any functio    
500                                                   
501 One incredibly important thing that colordiff     
502 that are different. For example, if an error-h    
503 changed labels between the original and backpo    
504 show these side-by-side but highlighted in a d    
505 is easy to see that the two ``goto`` statement    
506 labels. Likewise, lines that were not modified    
507 differ in the context will also be highlighted    
508 a manual inspection.                              
509                                                   
510 Of course, this is just a visual inspection; t    
511 and running the patched kernel (or program).      
512                                                   
513 Build testing                                     
514 -------------                                     
515                                                   
516 We won't cover runtime testing here, but it ca    
517 just the files touched by the patch as a quick    
518 Linux kernel you can build single files like t    
519 ``.config`` and build environment set up corre    
520                                                   
521     make path/to/file.o                           
522                                                   
523 Note that this won't discover linker errors, s    
524 full build after verifying that the single fil    
525 the single file first you can avoid having to     
526 case* there are compiler errors in any of the     
527                                                   
528 Runtime testing                                   
529 ---------------                                   
530                                                   
531 Even a successful build or boot test is not ne    
532 out a missing dependency somewhere. Even thoug    
533 there could be code changes where two independ    
534 file result in no conflicts, no compile-time e    
535 only in exceptional cases.                        
536                                                   
537 One concrete example of this was a pair of pat    
538 entry code where the first patch saved/restore    
539 patch made use of the same register somewhere     
540 sequence. Since there was no overlap between t    
541 cherry-pick the second patch, have no conflict    
542 everything was fine, when in fact the code was    
543 unsaved register.                                 
544                                                   
545 Although the vast majority of errors will be c    
546 or by superficially exercising the code, the o    
547 a backport is to review the final patch with t    
548 as you would (or should) give to any other pat    
549 regression tests or other types of automatic t    
550 the confidence in the correctness of a backpor    
551                                                   
552 Submitting backports to stable                    
553 ==============================                    
554                                                   
555 As the stable maintainers try to cherry-pick m    
556 stable kernels, they may send out emails askin    
557 encountering conflicts, see e.g.                  
558 <https://lore.kernel.org/stable/2023101528-jawe    
559 These emails typically include the exact steps    
560 the patch to the correct tree and submit the p    
561                                                   
562 One thing to make sure is that your changelog     
563 format::                                          
564                                                   
565   <original patch title>                          
566                                                   
567   [ Upstream commit <mainline rev> ]              
568                                                   
569   <rest of the original changelog>                
570   [ <summary of the conflicts and their resolu    
571   Signed-off-by: <your name and email>            
572                                                   
573 The "Upstream commit" line is sometimes slight    
574 the stable version. Older version used this fo    
575                                                   
576   commit <mainline rev> upstream.                 
577                                                   
578 It is most common to indicate the kernel versi    
579 in the email subject line (using e.g.             
580 ``git send-email --subject-prefix='PATCH 6.1.y    
581 it in the Signed-off-by:-area or below the ``-    
582                                                   
583 The stable maintainers expect separate submiss    
584 stable version, and each submission should als    
585                                                   
586 A few final words of advice                       
587 ===========================                       
588                                                   
589 1) Approach the backporting process with humil    
590 2) Understand the patch you are backporting; t    
591    the changelog and the code.                    
592 3) Be honest about your confidence in the resu    
593    patch.                                         
594 4) Ask relevant maintainers for explicit acks.    
595                                                   
596 Examples                                          
597 ========                                          
598                                                   
599 The above shows roughly the idealized process     
600 For a more concrete example, see this video tu    
601 are backported from mainline to stable:           
602 `Backporting Linux Kernel Patches`_.              
603                                                   
604 .. _Backporting Linux Kernel Patches: https://    
                                                      

~ [ 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