Project

General

Profile

How to send patches to kernel » History » Version 15

Evgeny Novikov, 08/21/2021 07:48 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 7 Anton Vasilyev
      smtpserver = mail.ispras.ru
14
      smtpEncryption = tls
15
      smtpserverport = 587
16 1 Alexey Khoroshilov
17
h2. Обновляем репозиторий до самой свежей версии
18
19 8 Anton Vasilyev
В большинстве случаев - из [git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git].
20 1 Alexey Khoroshilov
21
 git pull
22
23
h2. Создаем отдельную ветку для подготовки исправления
24
25
В данном примере ветка названа по имени драйвера.
26
27
 git checkout -b usb_gadget master
28
29
h2. Вносим необходимые исправления в код, соблюдая принятые правила форматирования
30
31 10 Anton Vasilyev
См. Documentation/process/coding-style.rst.
32 1 Alexey Khoroshilov
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 12 Evgeny Novikov
h2. Проверяем отсутствие ошибок после исправления
43
44
Достаточно часто исправление одной или даже нескольких ошибок для одного драйвера не приводит к тому, что для данного драйвера не найдутся ещё какие-нибудь ошибки при проверке той же самой спецификации требований. Обязательно нужно добиться, чтобы для исправляемого драйвера в итоге выдавалось бы следующее:
45
* Unsafe, который соответствует ложному сообщению об ошибке по какой-либо причине. Можно попытаться обойти соответствующую проблему, если это не очень сложно.
46
* Safe. При этом желательно убедиться, что покрытие кода более-менее адекватное. Иногда бывает так, что в suspend/resume/remove/disconnect могут быть ошибки похожие на ошибки в probe, например, что-то не удаляется, не чистится или не учитывается код возврата некоторой функции. С большой вероятностью разработчики это заметят и всё равно попросят сделать нужные исправления. Достаточно часто Klever сможет выдать Unsafe для данных ошибок при повторной верификации.
47
* Unknown, например, timeout. В данном случае скорее всего по-простому сделать ничего не получится.
48
49
Процедура проверки отсутствия ошибок после исправления состоит в том, что надо "вручную" внести данные исправления для соответствующих файлов с исходном кодом, которые лежат в базе сборки Clade на том инстансе Klever, на котором осуществлялась верификация, а затем перезапустить верификацию для конркетного драйвера и спецификации требований. Хотя это и занимает дополнительное время, тем не менее это весьма оправдано, как показывает опыт.
50
51 1 Alexey Khoroshilov
h2. Коммитим исправления
52
53
Делаем коммит.  Используем --signoff, чтобы добавить  строчку "Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>"  (обязательно нужна).
54
55
 git commit --signoff drivers/usb/gadget/inode.c
56
57
В теле коммита, для простоты, можно сразу писать багрепорт.  Шаблон такой:
58
59
<pre>
60
usb-gadget: Add module_put on error path in if_open()
61
62
If something happens (describe the path), then module_put is not 
63
called (describe the problem).
64
    
65 9 Anton Vasilyev
Make if_open() do module_put on error path (describe the solution in imperative mood).
66 1 Alexey Khoroshilov
If the solution is trivial, this section can be omitted.
67
    
68
Found by Linux Driver Verification project (linuxtesting.org).
69
</pre>
70
71 15 Evgeny Novikov
Рекомендуется познакомиться с "общими правилами оформления сообщений коммитов":https://chris.beams.io/posts/git-commit/, которые применимы в том числе и для коммитов в ядро Linux.
72
73 1 Alexey Khoroshilov
Вместо usb-gadget нужен определённый идентифицирующий префикс; его можно посмотреть в логе изменений конкретного файла.
74 9 Anton Vasilyev
75
При совместной разработке патча в конце коммита желательно указать учавствующих коллег:
76
77
<pre>
78
Co-developed-by: Co-Author <coauthor@ispras.ru>
79
Signed-off-by: Co-Author <coauthor@ispras.ru>
80
</pre>
81 1 Alexey Khoroshilov
82 6 Alexey Khoroshilov
*Hint.* Если известен коммит, ошибку в котором была внесена исправляемая ошибка, то в текст коммита рекомендуется вставить строчку с префиксом "Fixes:". Её можно сгенерировать при помощи команды:
83 5 Alexey Khoroshilov
84
<pre>
85
 git show -s --pretty="format:Fixes: %h (\"%s\")" HASH-OF-COMMIT
86
</pre>
87
88 14 Evgeny Novikov
В последнее время разработчики достаточно регулярно просят указать данный тег, поэтому рекомедуется делать это в обязательном порядке, даже если при этом приходится ссылаться на первоначальный коммит, который добавил соответствующий драйвер в ядро, т.е. ошибка была в коде изначально.
89 13 Evgeny Novikov
90 1 Alexey Khoroshilov
h2. Создаем сам патч
91
92
 git format-patch master..usb_gadget
93
94 3 Alexey Khoroshilov
Гит сделает что-то типа письма из того коммита, который был сделан ранее.
95
96
*Hint.* Имя текущей ветки можно и опустить:
97
98
<pre>
99
 git format-patch master..
100
</pre>
101
102 4 Alexey Khoroshilov
*Hint.* При генерации второй и последующих версий используйте аргумент -v:
103 3 Alexey Khoroshilov
104 4 Alexey Khoroshilov
<pre>
105
 git format-patch -v 2 master..
106
</pre>
107 3 Alexey Khoroshilov
108 1 Alexey Khoroshilov
109
h2. Проверяем его форматирование
110
111
 ./scripts/checkpatch.pl 0001-xxx.patch
112
113
h2. Редактируем файл с патчем
114
115
h3. Тема письма
116
117
Если всё сделали правильно, то формат-патч сам создаст такую тему:
118
119
 [PATCH] prefix: short description
120
 
121
h3. Идентифицируем адресатов
122
123
 ./scripts/get_maintainer.pl 0001-xxx.patch
124
125 2 Alexey Khoroshilov
Удаляем то, что в скобочках круглых, ставим первому адресату To:, а остальным — Cc:.  Дописываем в письмо. Также добавляем в Cc список рассылки: ldv-project@linuxtesting.org.
126 1 Alexey Khoroshilov
127
На этом этапе в текст письма можно внести произвольные изменения.
128
129
В результате получается что-то типа:
130
131
<pre>
132
From 9bbb34d71038fc7015917646a3365bca20cacb02 Mon Sep 17 00:00:00 2001
133
From: Alexey Khoroshilov <khoroshilov@ispras.ru>
134
To: Mauro Carvalho Chehab <mchehab@infradead.org>
135
Cc: linux-media@vger.kernel.org
136
Cc: linux-kernel@vger.kernel.org
137 2 Alexey Khoroshilov
Cc: ldv-project@linuxtesting.org
138 1 Alexey Khoroshilov
Date: Thu, 26 May 2011 00:38:12 +0400
139
Subject: [PATCH] usb-gadget: unlock data->lock mutex on error path in ep_write()
140
141
ep_read() acquires data->lock mutex in get_ready_ep() and releases it on
142
all paths except for one: when usb_endpoint_xfer_isoc() failed. The
143
patch adds mutex_unlock(&data->lock) at that path.
144
145
Found by Linux Driver Verification project (linuxtesting.org).
146
147
Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
148
---
149
 drivers/usb/gadget/inode.c |    4 +++-
150
 1 files changed, 3 insertions(+), 1 deletions(-)
151
152
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
153
index 3ed73f4..a01383f 100644
154
--- a/drivers/usb/gadget/inode.c
155
+++ b/drivers/usb/gadget/inode.c
156
@@ -386,8 +386,10 @@ ep_read (struct file *fd, char __user *buf, size_tlen, loff_t *ptr)
157
158
	/* halt any endpoint by doing a "wrong direction" i/o call */
159
	if (usb_endpoint_dir_in(&data->desc)) {
160
-		if (usb_endpoint_xfer_isoc(&data->desc))
161
+		if (usb_endpoint_xfer_isoc(&data->desc)) {
162
+			mutex_unlock(&data->lock);
163
			return -EINVAL;
164
+		}
165
		DBG (data->dev, "%s halt\n", data->name);
166
		spin_lock_irq (&data->dev->lock);
167
		if (likely (data->ep != NULL))
168
-- 1.7.0.4
169
</pre>
170
171 11 Evgeny Novikov
h3. Внимательно проверяем орфографию
172
173
Например, можно скопировать текст из 0001-xxx.patch в какой-нибудь редактор документов, в котором включены соответствующие проверки. Это позволит не нервировать разработчиков орфографическими ошибками, а также избежать повторной отправки патчей.
174
175 1 Alexey Khoroshilov
h2. Отправляем
176
177
 git send-email 0001-xxx.patch
178
179 4 Alexey Khoroshilov
Можно указать несколько патчей сразу через пробел, но если это независимые патчи, то делать этого '''не нужно''', ибо тогда git скомпонует из них одну цепочку (письма будут ответами на первое). Конечно, если вы посылаете серию патчей, то это делается одной командой:
180 1 Alexey Khoroshilov
181
 git send-email 0001-xxx.patch 0002-yyy.patch 0003-zzz.patch
182
183
Команда git send-email спрашивает кому отправить письма и т.д. Если в теле патча всё указано верно, то можно смело нажимать Enter ничего не вводя и git воспользуется значениями указанными в теле патча.
184
185
h2. Заводим описание проблемы на linuxtesting.org
186
187
Когда разработчики подтвердят, что они ошибку признают, её нужно опубликовать на linuxtesting.org.
188
189
Для этого логинимся на linuxtesting.org под своим логином.
190
191
Идем сюда: http://linuxtesting.ru/results/impl_reports_admin.
192
193
Заводим проблему с идентификатором LXXXX, где XXXX - следующий свободный номер.
194
195
Пример описания в плоском виде:
196
http://linuxtesting.org/results/impl_reports_admin?action=edit&num=L0044
197
198
В качестве "типа" проблемы указываем подходящий вариант.
199
200
В "краткое описание" копируем заголовок патча. 
201
202
В "подробное описание" добавляем описание патча, исключая упоминания о самом патче. 
203
204
Следующее поле, которое необходимо заполнить - "Компонент (с версией)". Здесь указывается версия ядра, в которой еще не было исправления, указанного в патче. Посмотреть это можно на сайте kernel.org, в соответствии с тегами в ветке Линуса Торвальдса.
205
206
В поле "принято" копируем следующие строчки: 
207
208
<pre>
209
<a href="https://lkml.org/lkml/2012/4/5/373">https://lkml.org/lkml/2012/4/5/373</a><br/>
210
<a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=commitdiff;h=e4459e1682c107d7ee1bf102c1ba534230e9b50b">commit</a>
211
</pre>
212
213
и затем правим их.
214
215
В гугле набираем следующий запрос: "site:lkml.org ХХХ", где вместо ХХХ пишем заголовок нашего патча. Тем самым мы находим публикацию нашего патча на сайте lkml.org.
216
217
Вставляем полученную ссылку вместо той, которая указана в примере.
218
219
Дальше меняем ссылку с git.kernel.org на свою (меняем только номер коммита, остальая часть должна быть такой же).
220
221
В поле "статус" указываем версию ядра, в которой была исправлена данная ошибка. Версию проще всего получить при помощи команды:
222
223
 git describe --contains e4459e1682c107d7ee1bf102c1ba534230e9b50b
224
225
Дату и время берем из коммита из раздела committer. 
226
227
Жмем кнопку "submit".
228
229
h1. Сообщение об ошибке без патча
230
231
Если вкратце, то готовим такое же письмо как и выше, и посылаем его тем же адресатам (см. ./scripts/get_maintainer.pl -f path_to_file), но только с описанием проблемы и её последствий, без предложения по исправлению. Посылаем из любого почтового клиента плоским текстом (не HTML) с адреса на ispras.ru или linuxtesting.org.
232
233
В конце письма необходимо вставить строчку:
234
235
 Found by Linux Driver Verification project (linuxtesting.org).