Project

General

Profile

How to send patches to kernel » History » Version 5

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