Project

General

Profile

How to send patches to kernel » History » Version 10

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