Project

General

Profile

How to send patches to kernel » History » Version 7

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