1. 背景

我在linux-fsl里面有一个commit, 想提交到社区.

327 32db966721ed tip linux-4.9-preparation 2019-11-21 Bai Yingjie PPC32 smp boot: also write addr_h to spin table for a 64bit boot entry

下面记录一下如何提交补丁到upstream社区

2. 使用git

我们内部使用hg, 但提交kernel的补丁要用git. 所以需要先在kernel的git上生成patch.

先要安装git-email, 用来发送patch

apt install git-email

在生成patch之前, 我要先查一下kernel的commit格式. 比如, 针对我要提交patch的文件, 看一下别人都怎么提交的:

git ls arch/powerpc/platforms/85xx/smp.c

看了一下, 大部分commiter都用powerpc/mpc85xx来开头, 表示子系统. 提交者主要来自freescale.com, 也有gmail.com, windriver.com等待.

OK. 可以准备patch了

2.1. 准备kernel的git库

需要有个最新的kernel的git库

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

或者已经有的库更新到最新: git pull

2.2. patch从hg到git

hg export可以生成hg的patch, 但我没找到直接可以给git用的patch. 所以我们用半手工的方式生成patch

#先生成纯内容的patch
hg diff --git -c 327 | nc 11985
#在kernel的git库, 这里我用虚拟机clone的
nc 172.24.213.190 11985 > 85xx.patch
#patch打到kernel
git apply 85xx.patch

2.3. 写git commit

#写commit
git add arch/powerpc/platforms/85xx/smp.c
#用-s生成Signed-off-by:字段. 内核commit惯例
git commit -s

commit之后, 这个patch是这样的:

f3f83cac875a 2019-11-25 Bai Yingjie powerpc/mpc85xx: also write addr_h to spin table for 64bit boot entry
219d54332a09 2019-11-24 Linus Torvalds Linux 5.4
b8387f6f3495 2019-11-24 Linus Torvalds Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
3e5aeec0e267 2019-10-19 Maxime Bizon cramfs: fix usage on non-MTD device

2.4. 生成用于提交upstream的patch

kernel的patch都是通过邮件发送的. 所以我要先生成patch. 用

git format-patch HEAD~<number of commits to convert to patches>

生成一系列patch

这里我只有一个改动, 用:

Linux Mint 19.1 Tessa $ git format-patch HEAD~ -o outgoing
outgoing/0001-powerpc-mpc85xx-also-write-addr_h-to-spin-table-for-.patch

生成的patch在outgoing文件夹下面. 一次邮件发送多个patch的时候, 用outgoing保存多个patch更方便.

看看这个文件: 它就是个文本格式的邮件.

这些patch用git am <patchfile>就被社区维护者打到kernel代码里.

注:

  • patch的后续版本可以用 git format-patch -v2 HEAD~来format, 邮件标题会自动加V2
  • 多个patch的例子
    Linux Mint 19.1 Tessa $ git format-patch HEAD~3 -o outgoing
    outgoing/0001-powerpc-mpc85xx-also-write-addr_h-to-spin-table-for-.patch
    outgoing/0002-powerpc32-booke-consistently-return-phys_addr_t-in-_.patch
    outgoing/0003-powerpc-io-use-phys_addr_t-in-virt_to_phys-phys_to_v.patch
    

按照惯例, 邮件标题会加上[PATCH], 比如
Subject: [PATCH] powerpc/mpc85xx: also write addr_h to spin table for 64bit

发送邮箱就是我gitconfig的邮箱:

Linux Mint 19.1 Tessa $ cat ~/.gitconfig
[user]
        name = Bai Yingjie
        email = byj.tea@gmail.com
[sendemail]
        smtpencryption = tls
        smtpserver = smtp.gmail.com
        smtpuser = byj.tea@gmail.com
        smtpserverport = 587
[core]
        editor = vim
[diff]
        tool = vimdiff
[merge]
        tool = meld
[alias]
        ls = log '--pretty=format:"%h %ad%x09%an%x09%s"' --date=short
        lg = log --decorate --stat --graph
[push]
        default = matching
[http]
        proxy = http://135.245.48.34:8000

2.5. 检查patch格式

在邮件发送patch之前, 用./scripts/checkpatch.pl检查一下patch的格式是否符合kernel的惯例.

如果有问题, 用git commit --amend <files updated>来做相应修改.

这里我的patch格式没问题:

Linux Mint 19.1 Tessa $ ./scripts/checkpatch.pl outgoing/*
total: 0 errors, 0 warnings, 14 lines checked

outgoing/0001-powerpc-mpc85xx-also-write-addr_h-to-spin-table-for-.patch has no obvious style problems and is ready for submission.

2.6. 测试发送

git send-email --to byj8389@qq.com outgoing/*

2.7. 找到maintainer

kernel提供了找到相关maintainer的脚本:scripts/get_maintainer.pl

Linux Mint 19.1 Tessa $ ./scripts/get_maintainer.pl outgoing/0001-powerpc-mpc85xx-also-write-addr_h-to-spin-table-for-.patch
Scott Wood <oss@buserror.net> (maintainer:LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX)
Kumar Gala <galak@kernel.crashing.org> (maintainer:LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX)
Benjamin Herrenschmidt <benh@kernel.crashing.org> (supporter:LINUX FOR POWERPC (32-BIT AND 64-BIT))
Paul Mackerras <paulus@samba.org> (supporter:LINUX FOR POWERPC (32-BIT AND 64-BIT))
Michael Ellerman <mpe@ellerman.id.au> (supporter:LINUX FOR POWERPC (32-BIT AND 64-BIT))
linuxppc-dev@lists.ozlabs.org (open list:LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX)
linux-kernel@vger.kernel.org (open list)

这个脚本也可以对文件使用:

./scripts/get_maintainer.pl -f arch/powerpc/platforms/85xx/smp.c

效果是一样的.

可以看到, Scott Wood <oss@buserror.net>Kumar Gala <galak@kernel.crashing.org>是maintainer, 是email要to的人. 其他人cc

2.8. 正式发送

git send-email outgoing/* --cc-cmd './scripts/get_maintainer.pl --norolestats --git outgoing/*' --to 'Scott Wood <oss@buserror.net>' --to 'Kumar Gala <galak@kernel.crashing.org>'

2.9. 其实没这么简单

如果这么简单就好了. 实际上, 我不能通过gmail的smtp发送patch. 在公司, 587端口被防火墙了. 在家, google更是连不上.

但gmail邮箱是我主力提交代码的邮箱, 我还不想换.

所以, 需要曲线救国的方案. 如下:

先注册一个126的邮箱, 而且一定要在其设置里把smtp服务打开. 打开这个服务, 需要再设置个"授权码", 用于第三方登录的时候, 代替邮箱密码.

然后用如下命令提交patch, 就是说让126邮箱来发这个patch, 但内容还是我之前生成的, 在patch里用的是gmail邮箱.

先试一试:

git send-email 0001-powerpc-mpc85xx-also-write-addr_h-to-sp.patch --smtp-debug=1 --to yingjie.bai@nokia-sbell.com --smtp-encryption=ssl --smtp-server=smtp.126.com --smtp-server-port=994 --smtp-user=yingjie_bai@126.com --from=yingjie_bai@126.com

正式提交版本:

git send-email 0001-powerpc-mpc85xx-also-write-addr_h-to-sp.patch --smtp-debug=1 --to 'Scott Wood <oss@buserror.net>' --to 'Kumar Gala <galak@kernel.crashing.org>' --cc 'Benjamin Herrenschmidt <benh@kernel.crashing.org>' --cc 'Paul Mackerras <paulus@samba.org>' --cc 'Michael Ellerman <mpe@ellerman.id.au>' --cc 'linuxppc-dev@lists.ozlabs.org' --cc 'linux-kernel@vger.kernel.org' --smtp-encryption=ssl --smtp-server=smtp.126.com --smtp-server-port=994 --smtp-user=yingjie_bai@126.com --from=yingjie_bai@126.com
git send-email outgoing/* --cc-cmd './scripts/get_maintainer.pl --norolestats --git outgoing/*' --to 'Scott Wood <oss@buserror.net>' --to 'Kumar Gala <galak@kernel.crashing.org>' --smtp-encryption=ssl --smtp-server=smtp.126.com --smtp-server-port=994 --smtp-user=yingjie_bai@126.com --from=yingjie_bai@126.com

2.10. 到patchwork上查提交

2.11. 补充, 用手机开热点可以发送

2.11.1. 先要设置gmail, 打开less secure app access

2.11.2. 再用git send-email发送

多试几次, 有的时候卡住, 有的时候可以输入密码. 第一次会有下面的提示, 按照提示的URL地址打开浏览器, google提示新设备access, 要发手机验证码验证

Password for 'smtp://byj.tea@gmail.com@smtp.gmail.com:587':
5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbt
5.7.14 TO77buewAb-9v-7bMFJtKvsLnToTRilFUvqtOzNwXu81Miu3opYz1tKgLMN7mgmKe5Xxy
5.7.14 XiEDQp94UFEPtbqRT_dtLs3QCXtPAs_x4fdayPuecWPQpRFap155Z4nD3HAUtYGn>
5.7.14 Please log in via your web browser and then try again.
5.7.14 Learn more at
5.7.14 https://support.google.com/mail/answer/78754 b65sm47429126pgc.18 - gsmtp

验证好了再次发送. 大部分时间还是不行 偶尔可以

2.11.3. 以上不行要打开临时访问, 据说只有10分钟.

https://accounts.google.com/DisplayUnlockCaptcha

3. 参考

results matching ""

    No results matching ""