给QEMU发送patch的步骤

最近给QEMU提交了几个小patch,整理下步骤,以便之后查阅:

1. 寻找issues

QEMU的issues页面可以看到等待解决的issues。

从中找到自己能够解决的issues,比如我发现了一个issue很简单,但是还没有人解决。

2. 写代码

接下来,写代码来解决这个issue,以上面我发现的issue为例子:

之所以会出现输入-vga help, QEMU abort是因为代码访问了一个空指针,找到访问空指针的位置,发现是因为def指针是null,但是却被取引用。因此我加了一点代码,在对def取引用之前先确定def不为空。更改之后的代码如下:

if (vga_interface_available(t) && ti->opt_name) {
    printf("%-20s %s%s\n", ti->opt_name, ti->name ?: "",
            (def && g_str_equal(ti->opt_name, def)) ?
            " (default)" : "");
}

3. Git commit

对代码进行commit: commit规范是第一行总结修改,空一行,下面再具体描述修改。另外QEMU社区不希望commit行数过多,在vim里面可以通过在普通模式下选中commit信息,按g和w键来将commit信息格式化,从而不会出现有一些行字数过少,导致行数变多的情况。

在上面这个例子中我的commit信息就是

vga: avoid crash if no default vga card

QEMU in some arch will crash when executing -vga help command, because
there is no default vga model.  Add check to this case and avoid crash.

4. 生成patch

通过git format-patch -s -v 1 -1来生成patch。其中-s是添加committer的签名,-v 1是将这个patch命名为版本1(patch将会以v1开头),-1是指使用最近一次commit的代码来生成patch。

5. 修改patch

在format-patch生成后,还能够直接用vim来修改patch。比如由于我这个patch解决的是一个issue,那么我可以在patch中commit信息下方加入

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/978

这可以使得当patch被接收后,对应的issue自动关闭,同时也能够让你的reviewer更加清楚你为什么要提这个patch。

6. 检查patch

大型项目一般都会有脚本来检查patch是否规范,QEMU中可以通过./scripts/checkpatch.pl来检查patch。在发送邮件之前一定要检查一遍,以免给reviewer带来不必要的工作。

到这一步后,我的patch长下面这个样子:

From b0daca5b03c54596758a1b36e91c85a08a747e4d Mon Sep 17 00:00:00 2001
From: Guo Zhi <qtxuning1999@sjtu.edu.cn>
Date: Tue, 3 May 2022 17:08:43 +0800
Subject: [PATCH v2] vga: avoid crash if no default vga card

QEMU in some arch will crash when executing -vga help command, because
there is no default vga model.  Add check to this case and avoid crash.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/978

Signed-off-by: Guo Zhi <qtxuning1999@sjtu.edu.cn>
---
 softmmu/vl.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/softmmu/vl.c b/softmmu/vl.c
index c2919579fd..a49e29312b 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -977,7 +977,8 @@ static void select_vgahw(const MachineClass *machine_class, const char *p)

             if (vga_interface_available(t) && ti->opt_name) {
                 printf("%-20s %s%s\n", ti->opt_name, ti->name ?: "",
-                       g_str_equal(ti->opt_name, def) ? " (default)" : "");
+                        (def && g_str_equal(ti->opt_name, def)) ?
+                        " (default)" : "");
             }
         }
         exit(0);
-- 
2.35.1

7. 发送邮件

通过git send-email发送邮件。

邮件发送的对象可以通过./scripts/get_maintainer.pl获得,为了方便,推荐使用以下方式直接发送邮件。

在~/.gitconfig中加入以下代码:

[sendemail.qemu]
    tocmd ="`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nol"
    cccmd ="`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --nom"

之后发送一个patch的命令就是

git send-email --identity=qemu v1-0001-vga-crash-if-no-default-vga-card.patch

8. 参与讨论

patch 发送之后,自己的邮箱也会收到邮件,可以用来确认patch是否发送成功。

patch的审核周期可能是几天到一周不定,耐心等待,及时回复,如果reviewer觉得需要更改,重新发送一个修改后的v2版本的patch。