Linux内核社区投稿

2年前指导公司内部人员如何提交Linux内核Patch时整理的wiki资料。在这里共享,主要介绍Patch作成时,以及社区对应时的注意点。

1.  patch制作

1.1 bug修正

bug修正时请注意以下几点:

  • 是否没有多余的注释。
  • 注释是否符合kernel doc format。
  • 是否include了多余的头文件。
  • 函数原型是否用了#ifdef。
  • 一个画面内不能显示#ifdef和#endif时,是否添加了/* CONFIG_NAME */ 这 样的注释。
  • 应该使用EXPORT_SYMBOL_GPL()的地方是否使用了EXPORT_SYMBOL()。
  • 使用scripts/checkpatch.pl检查一下。
  • 修正后是否再次编译并测试。
  • 修正后编译是否有warning。

1.2 生成patch

生成patch时请注意以下几点:

  • patch是否太大超过邮件服务器接收单封邮件的上限。
  • 一个patch只修正一个问题。类似patch分为多个作成系列,用[n/m]的形式发送。
  • 是否明确描述了patch的目的。patch被采用时,这些说明会直接放入Changelog。尤其是反映了社区的意见后再次投稿时容易忘记,请注意。
  • 是否对正确的版本制作的patch。
  • patch制作时的当前路径是否是新旧两个版本所在路径的父目录。
  • patch制作后是否应用并再次测试过。
  • 内核patch最好使用git生成。
  • diff的参数尽量使用 -Nurp

2.  patch推进

如果推进时已经有人正在社区中推进相关内容的话,请停止patch的提交,而只参与讨论。

2.1 问题再现方式

  • 请假设将要面对的社区的维护人员不能理解你在source层的解释,他只能理解更浅显的说明方式。
  • 再现的程序尽量是一组command的组合。
  • 如果有多种情况可以再现同一个bug的话,那请挑选最自然的方式。假设有个bug导致任何l打头的命令都不能使用。再现方法有多种,以下三种,哪个更好?
a.#lamnotacmd
b.#lshal
c.#ls

首先abc确实都能再现bug,但是a使用了一个不存在的命令,b使用了一个存在的命令,但是并不常用,显然c在实际应用中更加频繁和自然。c作为再现方式的话更容易被社区的维护人员理解和接受。

  • 如果这个bug有时会引起kernel panic,有时不会,那请不要忘了告诉社区kernel panic的事,这样可以引起重视。

2.2 邮件格式

  • 邮件的标题是否合适。
    • 投稿多个不同的patch时,必须分别采用不同的邮件标题。(标题为 patch名。例:”Subject:[PATCH] mm: fix a bug in container driver” → fix-a-bug-in-container-driver.patch)
    • 投稿一个系列的patch(为了一个目的制作的patch,因为太大的原因 而进行了分割)时,标题上必须添加编号。例:”Subject:[PATCH 1/4]…”
  • 邮件采用纯文本格式,并且每行字长小于72字节,不要使用英语以外的文字。
  • 邮件的签名不要使用公司统一的复杂签名。
  • 邮件作成后,直接另存为*.patch,用这个patch再试验一次是否能打上。因为社区维护人员大都直接把mail另存后作为patch使用。
  • 是否添加了必要的Signed-off-by, Reviewed-by, Tested-by。
  • Thunder Bird 发送patch时的配置(防止tab自动转换为空格):
    • 1 工具->邮件/新闻账户设置 选择“通讯录”去掉“以HTML格式编写消息”的选框
    • 2 在C:\Documents and Settings\YourName\Application Data\Thunderbird\Profiles\xxxxxx.default目录下生成user.js文件,文件内容如下
      • user_pref(”mailnews.wraplength”, 0);
      • user_pref(”mailnews.send_plaintext_flowed”, false);
    • 3 重启ThunderBird就可以了

2.3 和社区讨论

向社区投稿时请注意以下几点:

  • 投稿地址是否正确。(查看MAINTAINERS中相关人员后To or CC)
  • 讨论时回复邮件请不要置顶回复,应该在对方的邮件的正文中插入回复。

2.4 patch采用后的对应

patch经过社区review后,认为没有问题,就会被采用。 但是采用后,发生问题的可能性仍然存在。 比如,某个服务器制造商在自己的服务器上运用patch后,可能会由于硬件平台的差异,引起新的障害,这个时候大家就会讨论是否要把patch退回。 因此,出现这种问题后,需要迅速对应,否则很有可能被采用的patch又被退回。

收藏与分享

Tags: , , , , , ,

Leave a Reply