Project

General

Profile

Actions

How to send patches to kernel » History » Revision 1

Revision 1/13 | Next »
Alexey Khoroshilov, 02/22/2022 08:05 PM


Сообщение об ошибке в виде патча

Предварительная настройка git

cat ~/.gitconfig 
[user]
name = Alexey Khoroshilov
email =
[sendemail]
smtpserver = mail.ispras.ru
smtpEncryption = tls
smtpserverport = 587

Обновляем репозиторий до самой свежей версии

В большинстве случаев - из [git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git].

git pull

Создаем отдельную ветку для подготовки исправления

В данном примере ветка названа по имени драйвера.

git checkout -b usb_gadget master

Вносим необходимые исправления в код, соблюдая принятые правила форматирования

См. Documentation/process/coding-style.rst.

Проверяем компилябельность ядра

make allmodconfig
make prepare
make modules_prepare
make M=drivers/xxx/ или make drivers/xxx/filename.o

Необходимо убедиться, что измененные файлы, действительно, были скомпилированы.

Проверяем отсутствие ошибок после исправления

TODO: Предоставить возможность прогнать SVACE на версии с применённым патчем.

Коммитим исправления

Делаем коммит. Используем --signoff, чтобы добавить строчку "Signed-off-by: Alexey Khoroshilov <>" (обязательно нужна).

git commit --signoff drivers/usb/gadget/inode.c

В теле коммита, для простоты, можно сразу писать багрепорт. Шаблон такой:

usb-gadget: Add module_put on error path in if_open()

If something happens (describe the path), then module_put is not 
called (describe the problem).

Make if_open() do module_put on error path (describe the solution in imperative mood).
If the solution is trivial, this section can be omitted.

Found by Linux Driver Verification project (linuxtesting.org).

Рекомендуется познакомиться с общими правилами оформления сообщений коммитов, которые применимы в том числе и для коммитов в ядро Linux.

Вместо usb-gadget нужен определённый идентифицирующий префикс; его можно посмотреть в логе изменений конкретного файла.

При совместной разработке патча в конце коммита желательно указать учавствующих коллег:

Co-developed-by: Co-Author <coauthor@ispras.ru>
Signed-off-by: Co-Author <coauthor@ispras.ru>

Hint. Если известен коммит, ошибку в котором была внесена исправляемая ошибка, то в текст коммита рекомендуется вставить строчку с префиксом "Fixes:". Её можно сгенерировать при помощи команды:

 git show -s --pretty="format:Fixes: %h (\"%s\")" HASH-OF-COMMIT

В последнее время разработчики достаточно регулярно просят указать данный тег, поэтому рекомедуется делать это в обязательном порядке, даже если при этом приходится ссылаться на первоначальный коммит, который добавил соответствующий драйвер в ядро, т.е. ошибка была в коде изначально.

Создаем сам патч

git format-patch master..usb_gadget

Гит сделает что-то типа письма из того коммита, который был сделан ранее.

Hint. Имя текущей ветки можно и опустить:

 git format-patch master..

Hint. При генерации второй и последующих версий используйте аргумент -v:

 git format-patch -v 2 master..

Проверяем его форматирование

./scripts/checkpatch.pl 0001-xxx.patch

Редактируем файл с патчем

Тема письма

Если всё сделали правильно, то формат-патч сам создаст такую тему:

[PATCH] prefix: short description

Идентифицируем адресатов

./scripts/get_maintainer.pl 0001-xxx.patch

Удаляем то, что в скобочках круглых, ставим первому адресату To:, а остальным — Cc:. Дописываем в письмо. Также добавляем в Cc список рассылки: .

На этом этапе в текст письма можно внести произвольные изменения.

В результате получается что-то типа:

From 9bbb34d71038fc7015917646a3365bca20cacb02 Mon Sep 17 00:00:00 2001
From: Alexey Khoroshilov <khoroshilov@ispras.ru>
To: Mauro Carvalho Chehab <mchehab@infradead.org>
Cc: linux-media@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: ldv-project@linuxtesting.org
Date: Thu, 26 May 2011 00:38:12 +0400
Subject: [PATCH] usb-gadget: unlock data->lock mutex on error path in ep_write()

ep_read() acquires data->lock mutex in get_ready_ep() and releases it on
all paths except for one: when usb_endpoint_xfer_isoc() failed. The
patch adds mutex_unlock(&data->lock) at that path.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
---
 drivers/usb/gadget/inode.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
index 3ed73f4..a01383f 100644
--- a/drivers/usb/gadget/inode.c
+++ b/drivers/usb/gadget/inode.c
@@ -386,8 +386,10 @@ ep_read (struct file *fd, char __user *buf, size_tlen, loff_t *ptr)

    /* halt any endpoint by doing a "wrong direction" i/o call */
    if (usb_endpoint_dir_in(&data->desc)) {
-        if (usb_endpoint_xfer_isoc(&data->desc))
+        if (usb_endpoint_xfer_isoc(&data->desc)) {
+            mutex_unlock(&data->lock);
            return -EINVAL;
+        }
        DBG (data->dev, "%s halt\n", data->name);
        spin_lock_irq (&data->dev->lock);
        if (likely (data->ep != NULL))
-- 1.7.0.4

Внимательно проверяем орфографию

Например, можно скопировать текст из 0001-xxx.patch в какой-нибудь редактор документов, в котором включены соответствующие проверки. Это позволит не нервировать разработчиков орфографическими ошибками, а также избежать повторной отправки патчей.

Отправляем

git send-email 0001-xxx.patch

Можно указать несколько патчей сразу через пробел, но если это независимые патчи, то делать этого '''не нужно''', ибо тогда git скомпонует из них одну цепочку (письма будут ответами на первое). Конечно, если вы посылаете серию патчей, то это делается одной командой:

git send-email 0001-xxx.patch 0002-yyy.patch 0003-zzz.patch

Команда git send-email спрашивает кому отправить письма и т.д. Если в теле патча всё указано верно, то можно смело нажимать Enter ничего не вводя и git воспользуется значениями указанными в теле патча.

Сообщение об ошибке без патча

Если вкратце, то готовим такое же письмо как и выше, и посылаем его тем же адресатам (см. ./scripts/get_maintainer.pl -f path_to_file), но только с описанием проблемы и её последствий, без предложения по исправлению. Посылаем из любого почтового клиента плоским текстом (не HTML).

В конце письма необходимо вставить строчку:

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Updated by Alexey Khoroshilov over 2 years ago · 13 revisions