LKML patch etiquette
Kernel Development
William Patterson  

LKML Patch Etiquette Guide

You want your LKML patch etiquette to help your changes land cleanly in the linux kernel without endless back-and-forth.

I know the submission process feels heavy at first — documentation, submit-checklist.rst, and driver notes all matter. We’ll show a clear, step-by-step path from local edits to well-formed patches that maintainers can review quickly.

Along the way I explain why preparing sensible patches and using git workflows reduces churn for you and other developers. Expect practical commands, short checklists, and the reasoning that helps your work get merged with less friction.

Table of Contents

Key Takeaways

  • Prepare changes as small, testable patches and follow the official process docs.
  • Use git and unified diffs to create a clear history that reviewers trust.
  • Include checklists and context so developers can bisect and test easily.
  • Follow conventions for metadata and avoid sending patches as attachments.
  • Polished submissions speed review and increase the chance of acceptance.

What LKML patch etiquette means for kernel developers today

When your changes arrive tidy and explained, reviewers can act instead of guessing. I focus on clear, practical habits that help kernel developers get through review queues faster.

Start by stating intent up front: what the change fixes and the user-visible impact. Use unified diffs and subject prefixes like [PATCH] so busy reviewers can sort mail quickly.

User intent: submitting patches the right way, right now

Keep each patch small and testable. A single logical change per commit means reviewers can apply and bisect without extra work.

Include a short problem statement, quantified impact, and any trade-offs. Add Fixes: tags or Message-Id links to show provenance and speed downstream routing.

Why etiquette impacts review speed and acceptance

Good habits cut ambiguity. Plain-text emails, correct threading, and proper recipients let maintainers quote inline and reply quickly.

  1. Prefix subjects with [PATCH] and number series clearly.
  2. Send unified diffs (git format-patch) and keep commits buildable.
  3. Wait about a week before a polite ping; reviewers are often busy.
PracticeWhy it helpsExpected result
Small, focused commitsMakes testing and bisecting straightforwardFaster review and fewer revision cycles
Clear subject + unified diffHelps mail clients and maintainers triageHigher chance of timely feedback
Proper tags & linksSignals quality and links to historySmoother downstream integration

Setting up a clean Linux kernel development workflow

A reliable workflow begins with cloning the correct repository and keeping it current.

I start by fetching the upstream source with the canonical command:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git (or use the https URL).

Many subsystems host their own trees — check the T: entry in MAINTAINERS to find the right base. For driver work, target that subsystem’s tip instead of always using mainline.

Clone strategy and branches

  • Clone Linus’s mainline for general kernel development or the subsystem tree when maintainers request it.
  • Keep one tidy branch per change so you can rebase or abandon work without polluting your main line.
  • Rebase topic branches frequently with git rebase -i to split commits and keep history clean.

Keeping sources current

Pull early and often. Rebasing your topic branch on the latest tree reduces conflicts and helps reviewers apply your patches cleanly.

TargetWhen to useBenefit
MainlineGeneral kernel changesBroad visibility and fewer rebase surprises
Subsystem treeDriver or area-specific fixesAligns with maintainer workflow
Local branchExperimental workIsolates changes and keeps directory clean

Creating high-quality patches that are easy to review

Small, buildable commits let reviewers and bisect tools find problems quickly.

I split logical changes so each commit does one thing—fix a bug, refactor a helper, or adjust an API.

Use git rebase -i to reorder, split, or squash until every commit compiles and passes basic tests. If you prefer, a quilt-style workflow enforces the same discipline.

Generate unified diffs the expected way

Produce your series with git format-patch so metadata is correct and maintainers can apply via git am.

Each commit message should wrap at ~75 columns, include a concise explanation, a Signed-off-by line, the marker, and a small example when it clarifies intent.

Keep every commit buildable and bisect-friendly

  • One logical change per commit avoids mixed intent and speeds review on lkml.
  • Don’t mix whitespace cleanup with functional changes—send those as separate patches.
  • Make sure the kernel builds and runs after each commit so git bisect can traverse the series.
PracticeActionBenefit
Split logical changesUse git rebase -i or quilt-style branchesClear review scope and easier bisecting
Unified diffsRun git format-patch for the seriesProper metadata and easy application
Buildable commitsCompile and test after each commitReduces reviewer friction and regressions

For a fuller walkthrough of contributing and preparing changes, see our guide on how to contribute to the linux.

Commit and cover letter etiquette for the linux kernel mailing list

Start cover letters with a crisp problem statement and the concrete user impact. Lead with what breaks, who notices it, and the measurable benefit your changes deliver.

Use an imperative subject that begins with a subsystem prefix. Example: [PATCH 001/123] x86: reduce boot-time cache checks. Keep it short so mail clients and reviewers can scan the list quickly.

What to include in each message

  • Open with the problem, user-visible impact, and trade-offs—quantify gains or regressions when possible (hardware, workload, numbers).
  • Use Fixes: tags when relevant with the first 12 chars of the SHA and one-line summary. Example: Fixes: 1a2b3c4d5e6f – reduce cache checks.
  • Reference related discussion using https://lkml.kernel.org/ and the Message-Id so threads remain linkable.

Format and hygiene

Wrap the body at ~75 columns, include a Signed-off-by line, then and the diff. Always resend the full commit message for a new version—do not rely on earlier emails.

FieldActionBenefit
SubjectImperative, subsystem prefixEasy to sort on the kernel mailing list
Cover letterProblem, impact, trade-offsFaster review and clearer context
ReferencesFixes:, Message-Id linksHelps backports and traceability

Style and linting: make checkpatch.pl your ally

I run a quick style pass before I prepare any series. It saves time and reduces fix cycles during review.

Follow Documentation/process/coding-style.rst

Keep the official documentation at hand and align your code with it. Consistent formatting helps reviewers focus on logic, not layout.

When to justify warnings and when to refactor

Use scripts/checkpatch.pl to scan your patches. It reports ERROR, WARNING, and CHECK so you know what to fix and what to consider.

  • Fix ERRORs — they usually indicate real issues.
  • Treat WARNING and CHECK as guidance; explain deviations in the commit message.
  • When moving code, move first and refactor later in a follow-up so history stays clear.
ItemActionWhy
Run checkerscripts/checkpatch.plCatch common issues before review
Follow docDocumentation/process/coding-style.rstKeeps contributions readable
Document choicesNote intentional deviationsShows reviewers it was a conscious decision

Style is a tool, not a dictator. We focus on correctness first, then polish for reviewers on lkml and maintainers in the kernel community.

Finding the right recipients and lists for your patches

Targeted email beats broad blasts — find the right maintainer and list first.

I run scripts/get_maintainer.pl against the files my changes touch. It quickly lists responsible names and suggested mailing lists so my messages reach the right developers.

MAINTAINERS and subsystem mailing lists

The MAINTAINERS file confirms preferred contacts, trees, and lists. I follow those names and lists unless a maintainer asks otherwise.

When to use vger lists and special addresses

Only add linux-kernel@vger.kernel.org as a last resort. Avoid spamming unrelated lists with changes they don’t own.

  • Keep a tight CC list and include developers who recently touched the code.
  • Don’t send more than 15 patches at once to vger lists — stage big series or coordinate first.
  • For exploitable security bugs, email security@kernel.org privately.
  • For severe released-kernel fixes, add Cc: stable@vger.kernel.org in the commit trailer per stable rules.
ActionWho to notifyWhy
Run get_maintainer.plSubsystem maintainersFind owner names and preferred lists
Consult MAINTAINERSMAINTAINERS fileVerify contacts and tree locations
Limit recipientsTarget lists firstReduce noise and speed review

LKML patch etiquette: sending email the acceptable way

Sending clean email saves reviewers time and keeps the review flow predictable. Treat sending as a clear step in your workflow: format, verify, and thread before you press send.

Plain-text inline only

We always submit patches inline in plain text—no MIME, no compression, no attachments. Plain messages let reviewers quote and comment directly in the body.

Follow Documentation/process/email-clients.rst to configure your mailer so it does not mangle whitespace or wrap diffs. If a tool corrupts content, fix the setup before sending.

Subjects and threading

Prefix subjects with [PATCH] and use versioned numbers like [PATCH v2 3/7]. That number format helps the mailing list sort and reviewers track progress.

For revised series, reply with an In-Reply-To header so the thread stays intact for reviewers, Patchwork, and bots.

git send-email and dry runs

Configure git send-email for your SMTP server. For example, Gmail uses smtp.googlemail.com with TLS on port 587; prompt for the password at send time rather than storing it.

Always do a dry run by sending the message to yourself first. View the email in a plain text client and confirm the diff, trailers, and Signed-off-by lines render exactly as intended.

StepWhyResult
Plain-text inlineAllows quoting & editsEasier review
Versioned subjectClear series numberBetter thread tracking
Dry runCatch mailer issuesCleaner send

Tooling that smooths the process: lore, patchwork, and b4

Good tooling turns inbox hunting into a predictable habit—search, fetch, and apply with fewer surprises.

I use lore.kernel.org to search the list by subject, author, or Message-Id. That view matches what maintainers and bots see, so I verify headers and threading there before I act.

Search and track threads on lore.kernel.org and Patchwork

Patchwork helps me watch state changes—New, Under Review, Accepted—so I don’t miss a maintainer pick-up. A Patchwork account makes it easy to see where my series sits.

Use b4 am to fetch, split, and apply series cleanly

b4 fetches a full thread from lore and auto-splits cover letters, patches, and commentary into a tidy folder. I run b4 am -o patches <Message-Id> and then apply with git am -i on the generated mailbox.

  • b4 preserves trailers like Reviewed-by and Tested-by.
  • It produces a ready-to-apply mailbox, so git am handles the work for you.
  • Integrate b4 with your format-patch/send-email flow to keep inbound and outbound ways consistent.
ToolMain useBenefit
lore.kernel.orgSearch threadsSee headers as maintainers do
PatchworkTrack stateMonitor submissions
b4Fetch & splitReady mailbox for git am

Applying and testing patches from the linux kernel mailing list

Before I apply anything, I make a tidy directory and fetch the thread t.mbox.gz from lore.kernel.org. Then I extract it into a local patches directory so the files are easy to inspect.

I create a local topic branch and run git am -i to apply messages interactively. This gives me control when a message needs manual review or fixes for context drift.

Download, extract, and apply

  • Create a topic branch: git checkout -b topic/series-name.
  • Download the thread mbox.gz from lore, extract into a patches directory and run git am -i patches/*.mbox.
  • When git reports an empty message for a cover letter (0/N), use git am –skip and continue—this is normal.
  • Review each file and commit in the interactive prompt before accepting; it helps catch subtle issues.

Order, dependencies, and tooling

Cover letters often document the intended order and dependencies. Follow that number order and fetch any prerequisite series first to avoid conflicts.

Using b4 to fetch a thread produces a cleaned .mbx that drops most non-patch messages. I then apply the .mbx with git am -i and expect fewer empty messages.

ActionWhyResult
Interactive applyInspect each messageFewer surprise merges
Skip empty messagesCover letters or repliesSmooth continue to next
Verify with git logConfirm commits landedSafe to build and test

For a driver or arch-specific commit, I test-build the relevant config and run quick smoke tests. I document any issues back to the list if a message no longer applies cleanly.

Tags that communicate review state and collaboration

Explicit tags speed triage—reviewers can see a patch’s status at a glance.

I follow a simple rule: put accurate trailers at the end of the message body before the marker so tools can parse them.

patch metadata

  • Signed-off-by—one per author. It attests to the Developer’s Certificate of Origin and shows the delivery path.
  • Co-Developed-by—add this with a matching sign-off when work was shared, and include each author’s Signed-off-by.
  • Reviewed-by, Acked-by, Tested-by—include these exactly as provided. Spell each reviewer’s name and email to keep Patchwork and maintainers happy.
  • Suggested-by and Reported-by—credit ideas and bug reporters to build goodwill among developers.
  • Cc: lines—keep a tight list of interested names so the right people receive the email without adding noise.
TagWhen to useWhy it matters
Signed-off-byEvery authorLegal provenance and delivery path
Acked-byMaintainer approvalSignals informal acceptance; may be partial
Reviewed/Tested-byReviewer or tester confirmsShows review maturity and test coverage

Finally, I keep the thread intact for v2+ series and update the changelog under the trailers. Accurate tags help kernel developers and other developers assess a set of patches quickly and route them to the right tree.

From first submission to merge: patience, pings, and professional follow-ups

Submitting patches is only the first step in the kernel development process. After I send a series, I wait—comments usually arrive within a week. During merge windows or busy times, replies can take longer.

I track state with Patchwork and lore.kernel.org so I don’t guess when a branch picks up my work. If I haven’t heard back after about a week, I send one concise ping in the same thread and summarize what changed.

Keep your branch rebased and be ready to resend as [PATCH v2] with fixes or test updates. For bug follow-ups, acknowledge feedback, refresh trailers like Reviewed-by, and document fixes below the line.

Avoid escalation to Linus for routine work. Work the subsystem tree, stay patient, and keep emails short and helpful until merge.

FAQ

What does following kernel mailing list submission rules mean for developers today?

It means preparing clean, focused changes and sending them in plain-text email so reviewers can read and test them easily. I recommend cloning the right tree, keeping sources current with git, splitting logical changes, and adding clear subject lines with subsystem prefixes. This approach speeds review and raises the chance your code will be accepted.

How should I set up a clean Linux kernel development workflow?

Start by cloning the correct repository and choosing the proper branch—mainline for upstream contributions or a subsystem tree for specialized work. Keep your tree up to date with git fetch and rebase, and adopt a branch strategy that isolates features. I also use tools like b4 and scripts/get_maintainer.pl to streamline series management and recipient selection.

What makes a high-quality code change easy to review?

Split unrelated work into separate changes with git rebase -i so each unit is logical and bisect-friendly. Ensure every commit builds on its own, include context in the commit message, and generate unified diffs with git format-patch. Small, testable commits help maintainers and reviewers provide quicker, clearer feedback.

How do I write an effective commit message and cover letter for the mailing list?

Describe the problem, the user-visible impact, and any trade-offs. Use the imperative mood in the subject line, include subsystem prefixes, and keep the subject concise. Put the rationale and test plan in the body, add Fixes: tags where appropriate, and link related Message-Id threads from lore.kernel.org to help reviewers trace history.

Which style checks should I run before sending changes?

Run make checkpatch or scripts/checkpatch.pl and follow Documentation/process/coding-style.rst. Fix obvious style issues and justify any remaining warnings in the commit body. Keeping warnings low reduces review friction and demonstrates attention to kernel coding norms.

How do I find the right maintainers and lists to CC?

Use scripts/get_maintainer.pl and consult the MAINTAINERS file to identify subsystem maintainers and lists. Add linux-kernel@vger.kernel.org, stable@vger.kernel.org, or security@kernel.org only when relevant. CC people who have worked on the code or who own the subsystem, and document why they’re included.

What email format and sending practices are acceptable for the kernel community?

Send plain-text, inline messages only—no MIME, no compressed files, and avoid attachments. Use subject prefixes like [PATCH v2 1/3] to indicate series and threading; set In-Reply-To for related messages. Configure git send-email, test with dry runs to yourself, and verify Message-Id headers are present for traceability.

Which tools help me manage and track series effectively?

lore.kernel.org and Patchwork help search and track threads. Use b4 to fetch, split, and apply series cleanly, and git send-email to publish. These tools reduce manual errors, preserve metadata, and make it easier for reviewers to apply your changes.

How can I apply and test changes pulled from mailing-list archives?

Download the mbox from lore.kernel.org and apply with git am -i to preserve author info. Respect cover letters, handle empty messages correctly, and apply patches in dependency order. Build and run the test plan described by the author before merging into your tree.

Which tags communicate the review and collaboration state?

Use Signed-off-by, Acked-by, Reviewed-by, Tested-by, Suggested-by, and Co-Developed-by as appropriate. These tags document contribution flow and testing. When adding CCs, explain why they’re included and keep discussion transparent in the message body so collaboration remains traceable.

What’s a professional way to follow up after submitting a series?

Be patient, but if a thread stalls, send a polite, concise ping referencing the original Message-Id and summarizing remaining issues. Avoid noisy reminders—one clear follow-up every week or two is fine. Keep tone professional and include updated test results or rebased stacks when applicable.