Project

General

Profile

How to send patches to kernel » History » Version 1

Alexey Khoroshilov, 02/22/2022 08:05 PM

1 1 Alexey Khoroshilov
{{toc}}
2
3
h1. Сообщение об ошибке в виде патча
4
5
6
h2. Предварительная настройка git
7
8
 cat ~/.gitconfig 
9
[user]
10
      name = Alexey Khoroshilov
11
      email = khoroshilov@ispras.ru
12
[sendemail]
13
      smtpserver = mail.ispras.ru
14
      smtpEncryption = tls
15
      smtpserverport = 587
16
17
h2. Обновляем репозиторий до самой свежей версии
18
19
В большинстве случаев - из [git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git].
20
21
 git pull
22
23
h2. Создаем отдельную ветку для подготовки исправления
24
25
В данном примере ветка названа по имени драйвера.
26
27
 git checkout -b usb_gadget master
28
29
h2. Вносим необходимые исправления в код, соблюдая принятые правила форматирования
30
31
См. Documentation/process/coding-style.rst.
32
33
h2. Проверяем компилябельность ядра
34
35
 make allmodconfig
36
make prepare
37
make modules_prepare
38
make M=drivers/xxx/   или    make drivers/xxx/filename.o
39
40
Необходимо убедиться, что измененные файлы, действительно, были скомпилированы.
41
42
h2. Проверяем отсутствие ошибок после исправления
43
44
**TODO:** Предоставить возможность прогнать SVACE на версии с применённым патчем.
45
46
h2. Коммитим исправления
47
48
Делаем коммит.  Используем --signoff, чтобы добавить  строчку "Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>"  (обязательно нужна).
49
50
 git commit --signoff drivers/usb/gadget/inode.c
51
52
В теле коммита, для простоты, можно сразу писать багрепорт.  Шаблон такой:
53
54
<pre>
55
usb-gadget: Add module_put on error path in if_open()
56
57
If something happens (describe the path), then module_put is not 
58
called (describe the problem).
59
    
60
Make if_open() do module_put on error path (describe the solution in imperative mood).
61
If the solution is trivial, this section can be omitted.
62
    
63
Found by Linux Driver Verification project (linuxtesting.org).
64
</pre>
65
66
Рекомендуется познакомиться с "общими правилами оформления сообщений коммитов":https://chris.beams.io/posts/git-commit/, которые применимы в том числе и для коммитов в ядро Linux.
67
68
Вместо usb-gadget нужен определённый идентифицирующий префикс; его можно посмотреть в логе изменений конкретного файла.
69
70
При совместной разработке патча в конце коммита желательно указать учавствующих коллег:
71
72
<pre>
73
Co-developed-by: Co-Author <coauthor@ispras.ru>
74
Signed-off-by: Co-Author <coauthor@ispras.ru>
75
</pre>
76
77
*Hint.* Если известен коммит, ошибку в котором была внесена исправляемая ошибка, то в текст коммита рекомендуется вставить строчку с префиксом "Fixes:". Её можно сгенерировать при помощи команды:
78
79
<pre>
80
 git show -s --pretty="format:Fixes: %h (\"%s\")" HASH-OF-COMMIT
81
</pre>
82
83
В последнее время разработчики достаточно регулярно просят указать данный тег, поэтому рекомедуется делать это в обязательном порядке, даже если при этом приходится ссылаться на первоначальный коммит, который добавил соответствующий драйвер в ядро, т.е. ошибка была в коде изначально.
84
85
h2. Создаем сам патч
86
87
 git format-patch master..usb_gadget
88
89
Гит сделает что-то типа письма из того коммита, который был сделан ранее.
90
91
*Hint.* Имя текущей ветки можно и опустить:
92
93
<pre>
94
 git format-patch master..
95
</pre>
96
97
*Hint.* При генерации второй и последующих версий используйте аргумент -v:
98
99
<pre>
100
 git format-patch -v 2 master..
101
</pre>
102
103
104
h2. Проверяем его форматирование
105
106
 ./scripts/checkpatch.pl 0001-xxx.patch
107
108
h2. Редактируем файл с патчем
109
110
h3. Тема письма
111
112
Если всё сделали правильно, то формат-патч сам создаст такую тему:
113
114
 [PATCH] prefix: short description
115
 
116
h3. Идентифицируем адресатов
117
118
 ./scripts/get_maintainer.pl 0001-xxx.patch
119
120
Удаляем то, что в скобочках круглых, ставим первому адресату To:, а остальным — Cc:.  Дописываем в письмо. Также добавляем в Cc список рассылки: ldv-project@linuxtesting.org.
121
122
На этом этапе в текст письма можно внести произвольные изменения.
123
124
В результате получается что-то типа:
125
126
<pre>
127
From 9bbb34d71038fc7015917646a3365bca20cacb02 Mon Sep 17 00:00:00 2001
128
From: Alexey Khoroshilov <khoroshilov@ispras.ru>
129
To: Mauro Carvalho Chehab <mchehab@infradead.org>
130
Cc: linux-media@vger.kernel.org
131
Cc: linux-kernel@vger.kernel.org
132
Cc: ldv-project@linuxtesting.org
133
Date: Thu, 26 May 2011 00:38:12 +0400
134
Subject: [PATCH] usb-gadget: unlock data->lock mutex on error path in ep_write()
135
136
ep_read() acquires data->lock mutex in get_ready_ep() and releases it on
137
all paths except for one: when usb_endpoint_xfer_isoc() failed. The
138
patch adds mutex_unlock(&data->lock) at that path.
139
140
Found by Linux Verification Center (linuxtesting.org) with SVACE.
141
142
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
143
---
144
 drivers/usb/gadget/inode.c |    4 +++-
145
 1 files changed, 3 insertions(+), 1 deletions(-)
146
147
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
148
index 3ed73f4..a01383f 100644
149
--- a/drivers/usb/gadget/inode.c
150
+++ b/drivers/usb/gadget/inode.c
151
@@ -386,8 +386,10 @@ ep_read (struct file *fd, char __user *buf, size_tlen, loff_t *ptr)
152
153
	/* halt any endpoint by doing a "wrong direction" i/o call */
154
	if (usb_endpoint_dir_in(&data->desc)) {
155
-		if (usb_endpoint_xfer_isoc(&data->desc))
156
+		if (usb_endpoint_xfer_isoc(&data->desc)) {
157
+			mutex_unlock(&data->lock);
158
			return -EINVAL;
159
+		}
160
		DBG (data->dev, "%s halt\n", data->name);
161
		spin_lock_irq (&data->dev->lock);
162
		if (likely (data->ep != NULL))
163
-- 1.7.0.4
164
</pre>
165
166
h3. Внимательно проверяем орфографию
167
168
Например, можно скопировать текст из 0001-xxx.patch в какой-нибудь редактор документов, в котором включены соответствующие проверки. Это позволит не нервировать разработчиков орфографическими ошибками, а также избежать повторной отправки патчей.
169
170
h2. Отправляем
171
172
 git send-email 0001-xxx.patch
173
174
Можно указать несколько патчей сразу через пробел, но если это независимые патчи, то делать этого '''не нужно''', ибо тогда git скомпонует из них одну цепочку (письма будут ответами на первое). Конечно, если вы посылаете серию патчей, то это делается одной командой:
175
176
 git send-email 0001-xxx.patch 0002-yyy.patch 0003-zzz.patch
177
178
Команда git send-email спрашивает кому отправить письма и т.д. Если в теле патча всё указано верно, то можно смело нажимать Enter ничего не вводя и git воспользуется значениями указанными в теле патча.
179
180
181
h1. Сообщение об ошибке без патча
182
183
Если вкратце, то готовим такое же письмо как и выше, и посылаем его тем же адресатам (см. ./scripts/get_maintainer.pl -f path_to_file), но только с описанием проблемы и её последствий, без предложения по исправлению. Посылаем из любого почтового клиента **плоским текстом (не HTML)**.
184
185
В конце письма необходимо вставить строчку:
186
187
 Found by Linux Verification Center (linuxtesting.org) with SVACE.