Mauro Carvalho Chehab Updated on 2010 January 30 This file describes the general procedures used by the LinuxTV team (*) and by the v4l-dvb community. (*) This is just an aka for the main developers involved in V4L/DVB drivers. They are a volunteer and unremunerated group of people that have the common interest of providing a good support on Linux for receiving and capturing video streams from webcams, analog TV, digital TV and radio broadcast AM/FM. CONTENTS ======== Part I - Patch management on LinuxTV 1. A brief introduction about patch management 2. Git and Mercurial trees hosted on LinuxTV site 3. Git and Mercurial trees' relationships with v4l/dvb development 4. Patch submission process overall 5. Other Git trees used for v4l/dvb development 6. Other Mercurial trees used for v4l/dvb development Part II - Git trees 1. Kernel development procedures at the kernel upstream 1.1 Subsystem procedures for merging patches upstream 1.2 A practical example 1.3 Patches for stable 2. Kernel development procedures for V4L/DVB 2.1 Fixes and linux-next patches 2.2 How to solve those issues? 3. How to submit a -git pull request 3.1 Tags that a patch receive after its submission 4. Patches submitted via email 4.1 Example Part III - Best Practices 1. Community best practices 2. Mercurial specific procedures 3. Knowing about newer patches committed at the development repositories 4. Patch submission from the community 5. Identifying regressions with Mercurial 6. Identifying regressions with Git 7. Creating a newer driver 7.1. Simple drivers 7.2. Bigger drivers =================================== PART I. PATCH MANAGEMENT ON LINUXTV =================================== 1. A brief introduction about patch management =========================================== V4L/DVB development is based on modern SCM (Source Code Management) systems that fits better into kernel development model. At the beginning, the usage CVS for of a SCM (Source Code Management) were choosen on V4L/DVB. Both of the original V4L and DVB trees were developed with the help of cvs. On that time, upstream Linux kernel used to have another tree (BitKeeper). In 2005, Upstream Kernel development model changed to use git (a SCM tool developed by Linus Torvalds, the inventor and main maintainer of the Linux Kernel). Also in 2005, both V4L and DVB trees got merged into one cvs repository, and the community discussed about what would be the better SCM solution. It were mainly availed the usage of svn, hg and git. On that time, both hg and git were new technologies, based on the concept of a distributed SCM, where there's no need to go to the server every time a command is used at the SCM. This speeds up the development time, and allows descentralized development. Mercurial used to be stable and had more projects using, while git were giving its first steps, being used almost only by the Linux Kernel, and several distros didn't use to package it. Git objects were stored uncompressed, generating very large trees. Also, -git tools were complex to use, and some "porcelain" packages were needed, in order to be used by a normal user. So, the decision was made to use Mercurial. However, as time goes by, git got much more eyes than any other SCM, having all their weakness solved, and being developed really fast. Also, it got adopted by several other projects, due to its capability and its number of features. Technically speaking, -git is currently the most advanced distributed open-source SCM application available today. Yet, Mercurial has been doing a very good job maintaining the V4L/DVB trees, and, except for a few points, it does the job. However, the entire Linux Kernel development happens around -git. Even the ones that were adopting other tools (like -alsa, that used to have also Mercurial repositories) migrated to -git. Despite all technical advantages, the rationale for the migration to git is quite simple: converting patches between different repositories and SCM tools cause development and merge delays, may cause patch mangling and eats lot of the time for people that are part of the process. Also, every time a patch needs to touch on files outside the incomplete tree used at the subsystem, an workaround need to be done, in order to avoid troubles and to be able to send the patch upstream. So, it is simpler to just use -git. 2. Git and Mercurial trees hosted on LinuxTV site ============================================== A list of current available Mercurial repositories used on LinuxTV is available at: http://linuxtv.org/hg/ A list of current available Git repositories used on LinuxTV is available at: http://git.linuxtv.org 3. Git and Mercurial trees' relationships with v4l/dvb development =============================================================== The main subsystem kernel trees are hosted at http://git.kernel.org. Each tree is owned by a maintainer. In the case of LinuxTV, the subsystem maintainer is Mauro Carvalho Chehab, who owns all sybsystem trees. The main kernel tree is owned by Linus Torvalds, being located at: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git The subsystem maintainer's master tree is located at: http://git.kernel.org/?p=linux/kernel/git/mchehab/linux-2.6.git The subsystem maintainer's tree with development patches that aren't ready yet for upstream is handled at: http://git.linuxtv.org/git/v4l-dvb.git The main function of this tree is to merge patches received via email and from other Git and Mercurial repositories and to test the entire subsystem with the finished patches. The subsystem maintainer's tree with development patches that will be sent soon to upstream is located at: http://git.linuxtv.org/git/fixes.git There is also an experimental tree, that contains all experimental patches from all subsystem trees, called linux-next. Its purpose is to check in advance if patches from different trees would conflict. The main tree for linux-next is owned by Stephen Rothwell and it is located at: http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git Warning: linux-next is meant to be used by developers. As it may contain broken +++++++ patches on several subsystems, it may cause damage if used on production systems. The subsystem maintainer's linux-next tree is located at: http://www.kernel.org/git/?p=linux/kernel/git/mchehab/linux-next.git In general, it contains a replica of the contents of the development tree. Michael Krufky maintains a backport tree, containing a subset of the patches from the subsystem tree that are meant to be sent to kernel -stable team, at: http://git.kernel.org/http://git.kernel.org/?p=linux/kernel/git/mkrufky/ v4l-dvb-2.6.x.y.git In order to allow testing the LinuxTV drivers with older kernels, a backport tree is maintained by Douglas Schilling Landgraf . The backport tree is at: http://linuxtv.org/hg/v4l-dvb Basically, all patches added at -git are manually imported on this tree, that also contains some logic to allow compilation of the core system since kernel 2.6.16. It should be noticed, however, that some drivers may require newer kernels in order to compile. Also, those backports are developped as best efforts, and are mainly against upstream stable kernels, so they may not compile with distro-patched kernels, nor they are meant to offer production level of support. So, if you need to run any prodution machine, you should really be using a Linux distribution that offers support for the drivers you need and has a Quality Assurance process when doing backports. You were warned. Users are welcome to use, test and report any issues via the mailing lists or via the Kernel Bug Tracker, available at: http://bugzilla.kernel.org 4. Patch submission process overall ================================ When a developer believes that there are done to be merged, he sends a request for the patches to get merged at the v4l-dvb.git tree, at the linux-media at vger.kernel.org (the main mailing list for LinuxTV). The patches are analyzed and, if they look ok, they got merged into v4l-dvb.git. Currently, there are thre ways to submit a patch: as an email, with the subject [PATCH]; as a hg pull request, with the subject [PULL]; as a git pull request, with the subject [GIT FIXES ...] or [GIT UPDATES ...] If the patch is developed against the Mercurial repositories, it is converted to the format git expects and have any backport code removed. No matter how the patch is received, after being checked and accepted by the maintainer, the patch will receive the maintainer's Certificate of Origin (Signed-off-by, as explained later within this document), and will be added at: http://git.linuxtv.org/git/v4l-dvb.git Later, it will be backported to the -hg tree. The community also reviews the patches and may send emails informing that the patch has problems or were tested/acked. When those reviews happen after the patch merge at the tree, the patch is modified before its upstream submission. Also, the maintainer may need to modify the patch at his trees, in order to fix conflicts that may happen with the patch. The subsystem maintainer, when preparing the kernel patches to be sent to mainstream, send the patches first to linux-next tree, and waits for some to receive contributions from other upstream developers. If, during that period, he notices a problem, he may correct the patch at his upstream submission tree. 5. Other Git trees used for v4l/dvb development ============================================ V4L/DVB Git trees are hosted at git://linuxtv.org. There are a number of trees there each owned by a developer of the LinuxTV team. The submission emails are generated via the usage of git request-pull, as described on part II. Git is a distributed SCM, which means every developer gets his own full copy of the repository (including the complete revision history), and can work and commit locally without network connection. The resulting changesets can then be exchanged between repositories and finally merged into a common repository on linuxtv.org. The Git trees used on LinuxTV have the entire Linux Kernel tree and history since kernel 2.6.12. So, it generally takes some time to update it at the first time. There are several good documents on how to use -git, including: http://git.or.cz/ http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html http://www.kernel.org/pub/software/scm/git/docs 6. Other Mercurial trees used for v4l/dvb development ================================================== V4L/DVB Mercurial trees are hosted at http://linuxtv.org/hg. There are a number of trees there each owned by a developer of the LinuxTV team. A script called v4l/scripts/hg-pull-req.pl is included that will generate this request, providing a list of patches that will be pulled, links to each patch, and a diffstat of the all patches. It will work best if Hg has been configured with the correct username (also used by the commit message generator) and push path. The script is designed to be easy to modify to produce text for a given contributor's style. It is good practice that each developer will have at least one tree called 'v4l-dvb', which keeps their patches, and periodically update this tree with the master tree's patches. Mercurial is a distributed SCM, which means every developer gets his own full copy of the repository (including the complete revision history), and can work and commit locally without network connection. The resulting changesets can then be exchanged between repositories and finally merged into a common repository on linuxtv.org. There are some tutorials, FAQs and other valuable information at http://selenic.com/mercurial/ ================== PART II. GIT TREES ================== 1. Kernel development procedures at the kernel upstream ==================================================== It is important that people understand how upstream development works. Kernel development has 2 phases: a) a merge window typically with 2 weeks (although Linus is gave some indications that he may reduce it on 2.6.34), starting with the release of a new kernel version; b) the -rc period, where the Kernel is tested and receive fixes. The length of the -rc period depends on the number and relevance of the fixes. Considering the recent history, it ranges from -rc6 to -rc8, where each -rc takes one week. Those are the latest -rc kernels since 2.6.12: kernel latest -rc version 2.6.12 rc6 2.6.13 rc7 2.6.14 rc5 2.6.15 rc7 2.6.16 rc6 2.6.17 rc6 2.6.18 rc7 2.6.19 rc6 2.6.20 rc7 2.6.21 rc7 2.6.22 rc7 2.6.23 rc9 2.6.24 rc8 2.6.25 rc9 2.6.26 rc9 2.6.27 rc9 2.6.28 rc9 2.6.29 rc8 2.6.30 rc8 2.6.31 rc9 2.6.32 rc8 In general, the announcement of a new -rc kernel gives some hints when that -rc kernel may be the last one. 1.1. Subsystem procedures for merging patches upstream ================================================= The required procedure on subsystem trees is that: a) During -rc period (e.g. latest main kernel available is 2.6.x, the latest -rc kernel is 2.6.[x+1]-rc): * fix patches for the -rc kernel (2.6.[x+1]) should be sent upstream, being a good idea to send them for some time at linux-next tree, allowing other people to test it, and check for potential conflicts with the other arch's; * patches for 2.6.[x+2] should be sent to linux-next. b) the release of 2.6.[x+1] kernel: * closes the -rc period and starts the merge window. c) During the merge window: * the patch that were added on linux-next during the -rc period for 2.6.[x+2] should be sent upstream; * new non-fix patches should be hold until the next -rc period starts, so, they'll be added on 2.6.[x+3]; * fix patches for 2.6.[x+2] should go to linux-next, wait for a few days and then send upstream. d) the release of 2.6.[x+2]-rc1 kernel: * the merge window has closed. No new features are allowed. * the patches with new features that arrived during the merge window will be moved to linux-next 1.2. A practical example =================== Considering that, at the time this document were written, the last main release is 2.6.32, and the latest -rc release is 2.6.33-rc5, this means that: * Stable patches, after adding upstream, are being received for 2.6.32 kernel series; * Bug fixes are being received for kernel 2.6.33; * New feature patches are being received for kernel 2.6.34. After the release of kernel 2.6.33, starts the period for receiving patches for 2.6.35. In other words, the features being developed are always meant to be included on the next 2 kernels. In the specific case of new drivers that don't touch on existing features, it could be possible to send it during the -rc period, but it is safer to assume that those drivers should follow the above procedure, as a later submission may be nacked. 1.3. Patches for stable ==================== Sometimes, a fix patch corrects a problem that happens also on stable kernels (e. g. on kernel 2.6.x or even 2.6.y, where y < x). In this case, the patch should be sent to stable@kernel.org, in order to be added on stable kernels. In the case of git-submitted patches with fixes, that also need to be send to stable, all the developer needs to do is to add, a the patch description: CC: stable.kernel.org At the moment the patch reaches upstream, a copy of the patch will be automatically be sent to the stable maintainer and will be considered for inclusion on the next stable kernel (2.6.x.y). 2. Kernel development procedures for V4L/DVB ========================================= The upsteam procedures should be followed by every kernel subsystem. The subsystems have their own specific procedures detailing how the development patches are handled before arriving upstream. In the case of v4l/dvb, those are the used procedures. 2.1. Fixes and linux-next patches ============================ One of the big problems of our model used in the past by the subsystem, based on one Mercurial tree, is that there were just one tree/branch for everything. This makes hard to send some fix patches for 2.6.[x+1], as they may have conflicts with the patches for 2.6.[x+2]. So, when the conflict is simple to solve, the patch is sent as fixes. Otherwise, the patch generally needed to hold to the next cycle. The fix patches used to get a special tag, added by the developer ("Priority: high", in the body of the description), to give a hint to the subsystem maintainer that the patch should be sent upstream. Unfortunately, sometimes people mark the driver with the wrong tag. For example, a patch got merged on Jan, 22 2010 that marked with "high". However, that patch didn't apply at the fixes tree, because it fix a regression introduced by a driver that weren't merged upstream yet. 2.2. How to solve those issues? ========================== Well, basically, the subsystem should work with more than one tree (or branch), on upstream submission: * a tree(branch) with the fix patches; * a tree(branch) with the new feature patches. So, the subsystem uses two development -git trees: * http://linuxtv.org/git//v4l-dvb.git - for patches that will be sent to the [x+2] kernel (and merged at upstream linux-next tree) * http://linuxtv.org/git//fixes.git - for bug patches that will be sent to the [x+1] kernel (also, patches that need to go to both [x+1] and [x]) While the patches via -hg, due to the merge conflicts its mentioned, the better is that, even those developers that prefer to develop patches use the old way, to send the fix patches via -git. This way, if is there a conflict, he is the one that can better solve it. Also, it avoids the risk of a patch being wrongly tagged. Also, after having a patch added on one of the above trees, it can't simply remove it, as others will be cloning that tree. So, the only option would be to send a revert patch, causing the patch history to be dirty and could be resulting on some troubles when submitting upstream. I've seen some nacks on receiving patches upstream from dirty git trees. So, we should really avoid this. 3. how to submit a -git pull request ================================= As the same git tree may have more than one branch, and we'll have 2 -git trees for upstream, it is required that people specify what should be done. The internal maintainer's workflow is based on different mail queues for each type of requesting received. There are some scripts to automate the process, so it is important that everyone that sends -git pull do it at the same way. So, a pull request to be send with the following email tags: From: Subject: [GIT FIXES FOR 2.6.33] Fixes for driver cx88 To: linux-media@vger.kernel.org From: Subject: [GIT PATCHES FOR 2.6.34] Updates for the driver saa7134 To: linux-media@vger.kernel.org The from line may later be used by the git mailbomb script to send you a copy when the patch were committed, so it should be your real email. The indication between [] on the subject will be handled by the mailer scripts to put the request at the right queue. So, if tagged wrong, it may not be committed. Don't send a copy of the pull to the maintainer addresses. The pull will be filtering based on the subject and on the mailing list. If you send a c/c to the maintainer, it will be simply discarded. NEVER send a copy of any pull request to a subscribers-only mailing list. Everyone is free to answer to the email, reviewing your patches. Don't penalty people that wants to contribute with you with SPAM bouncing emails, produced by subscribers only lists. When a patch touches on other subsystem codes, please copy the other subsystem maintainers. This is important for patches that touches on arch files, and also for -alsa non-trivial patches. The email should be generated with the usage of git request-pull: git request-pull $ORIGIN $URL where $ORIGIN is the commit hash of the tree before your patches, and $URL is the URL for your repository. For example, for the patches merged directly from -hg at the -git trees on Jan, 22 2010, the above commands produced: The following changes since commit 2f52713ab3cb9af2eb0f9354dba1421d1497f3e7: Abylay Ospan (1): V4L/DVB: 22-kHz set_tone fix for NetUP Dual DVB-S2-CI card. 22kHz logic controlled by demod are available in the git repository at: git://linuxtv.org/v4l-dvb.git master Andy Walls (4): V4L/DVB: cx25840, v4l2-subdev, ivtv, pvrusb2: Fix ivtv/cx25840 tinny audio V4L/DVB: ivtv: Adjust msleep() delays used to prevent tinny audio and PCI bus hang V4L/DVB: cx18-alsa: Initial non-working cx18-alsa files V4L/DVB: cx18-alsa: Add non-working cx18-alsa-pcm.[ch] files to avoid data loss Devin Heitmueller (20): V4L/DVB: xc3028: fix regression in firmware loading time V4L/DVB: cx18: rename cx18-alsa.c V4L/DVB: cx18: make it so cx18-alsa-main.c compiles V4L/DVB: cx18: export a couple of symbols so they can be shared with cx18-alsa V4L/DVB: cx18: overhaul ALSA PCM device handling so it works V4L/DVB: cx18: add cx18-alsa module to Makefile V4L/DVB: cx18: export more symbols required by cx18-alsa V4L/DVB: cx18-alsa: remove unneeded debug line V4L/DVB: cx18: rework cx18-alsa module loading to support automatic loading V4L/DVB: cx18: cleanup cx18-alsa debug logging V4L/DVB: cx18-alsa: name alsa device after the actual card V4L/DVB: cx18-alsa: remove a couple of warnings V4L/DVB: cx18-alsa: fix memory leak in error condition V4L/DVB: cx18-alsa: fix codingstyle issue V4L/DVB: cx18-alsa: codingstyle fixes V4L/DVB: cx18: codingstyle fixes V4L/DVB: cx18-alsa: codingstyle cleanup V4L/DVB: cx18-alsa: codingstyle cleanup V4L/DVB: cx18: address possible passing of NULL to snd_card_free V4L/DVB: cx18-alsa: Fix the rates definition and move some buffer freeing code. Ian Armstrong (1): V4L/DVB: ivtv: Fix race condition for queued udma transfers Igor M. Liplianin (4): V4L/DVB: Add Support for DVBWorld DVB-S2 PCI 2004D card V4L/DVB: dm1105: connect splitted else-if statements V4L/DVB: dm1105: use dm1105_dev & dev instead of dm1105dvb V4L/DVB: dm1105: use macro for read/write registers JD Louw (1): V4L/DVB: Compro S350 GPIO change drivers/media/common/tuners/tuner-xc2028.c | 11 +- drivers/media/dvb/dm1105/Kconfig | 1 + drivers/media/dvb/dm1105/dm1105.c | 501 ++++++++++++++------------- drivers/media/video/cx18/Kconfig | 11 + drivers/media/video/cx18/Makefile | 2 + drivers/media/video/cx18/cx18-alsa-main.c | 293 ++++++++++++++++ drivers/media/video/cx18/cx18-alsa-mixer.c | 191 ++++++++++ drivers/media/video/cx18/cx18-alsa-mixer.h | 23 ++ drivers/media/video/cx18/cx18-alsa-pcm.c | 353 +++++++++++++++++++ drivers/media/video/cx18/cx18-alsa-pcm.h | 27 ++ drivers/media/video/cx18/cx18-alsa.h | 59 ++++ drivers/media/video/cx18/cx18-driver.c | 40 ++- drivers/media/video/cx18/cx18-driver.h | 10 + drivers/media/video/cx18/cx18-fileops.c | 6 +- drivers/media/video/cx18/cx18-fileops.h | 3 + drivers/media/video/cx18/cx18-mailbox.c | 46 +++- drivers/media/video/cx18/cx18-streams.c | 2 + drivers/media/video/cx25840/cx25840-core.c | 48 ++- drivers/media/video/ivtv/ivtv-irq.c | 5 +- drivers/media/video/ivtv/ivtv-streams.c | 6 +- drivers/media/video/ivtv/ivtv-udma.c | 1 + drivers/media/video/pvrusb2/pvrusb2-hdw.c | 1 + drivers/media/video/saa7134/saa7134-cards.c | 4 +- include/media/v4l2-subdev.h | 1 + 24 files changed, 1380 insertions(+), 265 deletions(-) create mode 100644 drivers/media/video/cx18/cx18-alsa-main.c create mode 100644 drivers/media/video/cx18/cx18-alsa-mixer.c create mode 100644 drivers/media/video/cx18/cx18-alsa-mixer.h create mode 100644 drivers/media/video/cx18/cx18-alsa-pcm.c create mode 100644 drivers/media/video/cx18/cx18-alsa-pcm.h create mode 100644 drivers/media/video/cx18/cx18-alsa.h This helps to identify what's expected to be found at the -git tree and to double check if the merge happened fine. 3.1. Tags that a patch receive after its submission ============================================== This is probably the most complex issue to solve. Signed-off-by/Acked-by/Tested-by/Nacked-by tags may be received after a patch or a -git submission. This can happen even while the patch is being tested at linux-next, from people reporting problems on the existing patches, or reporting that a patch worked fine. Also, the driver maintainer and the subsystem maintainer that is committing those patches should sign each one, to indicate that he reviewed and has accepted the patch. Currently, if a new tag is added to a committed patch, its hash will change. There were some discussions at Linux Kernel Mailing List about allowing adding new tags on -git without changing the hash, but I think this weren't implemented (yet?). The same problem occurs with -hg, but, as -hg doesn't support multiple branches (well, it has a "branch" command, but the concept of branch there is different), it was opted that the -hg trees won't have all the needed SOBs. Instead, those would be added only at the submission tree. With -git, a better procedure can be used: The developer may have two separate branches on his tree. For example, let's assume that the developer has the following branches on his tree: * media-master (associated with "linuxtv" remote) * fixes * devel His development happens on devel branch. When the patches are ready to submission will be copied into a new for_submission branch: git branch for_submission devel And a pull request from the branch "for_submission" will be sent. Eventually, he'll write new patches on his devel branch. After merged, the developer updates the linuxtv remote and drops the for_submission branch. This way, "media-master" will contain his patches that got a new hash, due to the maintainer's SOB. However, he has some new patches on his devel, that applies over the old hashes. Fortunately, git has a special command to automatically remove the old objects: git rebase. All the developer needs to do is to run the commands bellow: git remote update # to update his remotes, including "linuxtv" git checkout devel # move to devel branch git pull . media-master # to make a recursive merge from v4l/dvb upstream git rebase media-master # to remove the legacy hashes After this, his development branch will contain only upstream patches + the new ones he added after sending the patches for upstream submission. 4. Patches submitted via email =========================== All valid patches submitted via email to linux-media at vger.kernel.org are automatically stored at http://patchwork.kernel.org/project/linux-media/list. A patch, to be valid, should be in diff unified format. If you're using a -git tree, the simplest way to generate unified diff patches is to run: git diff If you're writing several patches, the better is to create a tag or a branch for the changes you're working. After that, you can use git format-patch to create the patches for email submission. 4.1. Example ======= Suppose that the -git tree were created with: git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git v4l-dvb cd v4l-dvb git remote add linuxtv git://linuxtv.org/v4l-dvb.git git remote update git checkout -b media-master linuxtv/master Before start working, you need to create your work branch: git branch work media-master And move the working copy to the "work" branch: git checkout work Some changes were done at the driver and saved by commit: git commit -as When the patches are ready for submission via email, all that is needed is to run: git format-patch work The command will create a series of emails bodies, one file per email. Just send the email with the patch inlined for it to ge caught by patchwork. BE CAREFUL: several emailers including Thunderdird breaks long lines, causing patch corruption. In the specific case of Thunderbird, an extension is needed to send the patches, called Asalted Patches: https://hg.mozilla.org/users/clarkbw_gnome.org/asalted-patches/ ========================= Part III - BEST PRACTICES ========================= 1. Community best practices ======================== From accumulated experience, there are some basic rules that should be followed by the community: a) Every developer should follow the "rules of thumb" of kernel development stated at Linux source code, especially those stated at kernel, under: Documentation/HOWTO Documentation/SubmittingPatches Documentation/SubmittingDrivers Documentation/SubmitChecklist Documentation/CodingStyle b) All commits at the trees should have a consistent message, describing the patch. When a patch is generated against the git tree, the better is to commit it with: git commit -as This will automatically add all existing patches that got modified and add your Certificate of Origin (Signed-off-by). It will open an editor for you to provide a description of the patch. The first line is a short summary describing why the patch is needed, and the following lines describe what and how the patch does that. If you've added new files, don't forget to add them before the commit, with: git add Before committing a patch, you need to check it with checkpatch.pl tool. This is done by running: git diff | ./script/checkpatch.pl - c) All patches are requested to have their coding style validated by using ./script/checkpatch.pl. On Git, the script checks not only the patch against coding style, but also checks for the usage of functions that are marked to be removed from the kernel ABI. d) All patches shall have a Developer's Certificate of Origin version 1.1 in the commit log or the email description, signed by the patch authors, as postulated in the Linux kernel source at: Documentation/SubmittingPatches This is done by adding Signed-off-by: fields to the commit message. It is not acceptable to use fake signatures, e.g.: Signed-off-by: Fake me The email must be a valid one. The author that is submitting the email should be at the button of the author's signed-off-by (SOB) block. Other SOBs or Acked-by: will be added at the bottom, marking that somebody else reviewed the patch. Each person who is in the kernel patch submission chain (driver author and/or driver maintainer, subsystem/core maintainers, etc) will review each patch. If they agree, the patch will be added to their trees and signed. Otherwise, they may comment on the patch, asking for some review. e) Although not documented at kernel's Documentation/, a common kernel practice is to use Acked-by: and Tested-by: tags. An Acked-by: tag usually means that the acked person didn't write the patch, nor is in the chain responsible for sending the patch to kernel, but reviewed the patch and agreed that it was good. A Tested-by: tag is a stronger variation of Acked-by. It means that the person not only reviewed the patch, but also successfully tested it. The better is that the patch author submitting his patches via git or hg to add any acked-by/tested-by tags he received. When a patch is sent via email, Patchwork tool will automatically include any such tags it receives in reply together with the patch. It is also common to receive acks after having a patch inserted at the maintainer's trees. In this case, the ack will be added only at -git tree used to send patches upstream. f) Another kernel's practice that is agreed to be good is that a patchset should be reviewed/tested by other developers. So, a new tag should be used by testers/reviewers. So, reviewers are welcome. After reviewing a patchset, please send an e-mail indicating that, if possible, with some additional data about the testing, with the tag: Reviewed-by: My Name This is particularly important for Kernel to userspace ABI changes. g) If the patch also affects other parts of kernel (like ALSA or i2c), it is required that, when submitting upstream, the patch also goes to the maintainers of that subsystem. To do this, the developer shall copy the interested parties. When submitting a patch via e-mail, it is better to copy all interested parties directly, by adding them as cc's to the email itself. Please note that those changes generally require ack from the other subsystem maintainers. So, the best practice is to first ask for their acks, then commit to the development tree or send the patch via email with their Acked-by: already included. NOTE: at Mercurial tree, it used to be possible to use the cc: meta tag to warn other users/mailing lists about a patch submission. However, this only works when a patch is merged at the backport tree. So, it's usage is considered obsolete nowadays. h) If the patch modifies the V4L or DVB API's (for example, modifying include/linux/videodev2.h) file, then it must verify be verified that the V4L2 specification document still builds. Of course, any changes you make to the public V4L2 API must be documented anyway. Currently, this can be done only with the Mercurial trees, by running: make spec Patches are welcome to migrate this functionality to upstream kernel DocBook makefile rules. i) By submitting a patch to the subsystem maintainer, either via email or via pull request, the patch author(s) are agreeing that the submitted code will be added on Kernel, and that the submitted code are being released as GPLv2. The author may grant additional licenses to the submitted code (for example, using dual GPL/BSD) or GPLv2 or later. If no specific clause are added, the added code will be assumed as GPLv2 only. j) "Commit earlier and commit often". This is a common used rule at Kernel. This means that a sooner submission of a patch will mean that a review can happen sooner, and help the develop to address the comments. This helps to reduce the life-cycle for having a changeset committed at kernel at the proper time. It also means that the one changeset should ideally address just one issue. So, mixing different things at the same patch should be avoided. k) Sometimes, the maintainer may need to slightly modify patches you receive in order to merge them, because the code is not exactly the same in your tree and the submitters'. In order to save time, it may do the changes and add a line before his SOB, as stated on Documentation/SubmittingPatches, describing what he did to merge it. Something like: Signed-off-by: Random J Developer [lucky@maintainer.example.org: struct foo moved from foo.c to foo.h] Signed-off-by: Lucky K Maintainer 2. Mercurial specific procedures ============================= a) With the -hg trees, some scripts are used to generate the patch. This is done by running: make commit This will run some scripts that check changed files, correct bad whitespace and prepare the last Signed-off-by: field, as described below. A good comment will have a brief description at the first line, up to 68 characters wide, a blank line, the patch author's name on the third line, a blank line, and then a brief description, with no more than 80 chars per line, e. g.: This patch does nothing From: nowhere This is just a sample commit comment, just for reference purposes. This "patch" does nothing. Priority: normal Signed-off-by: nowhere All lines starting with # and all lines starting with HG: will be removed from the Mercurial commit log. *WARNING* Be careful not to leave the first line blank, otherwise hg will leave subject blank. From: line shouldn't be omitted, since it will be used for the patch author when converting to -git. Priority: meta-tag will be used as a hint to the subsystem maintainer, to help him to identify if the patch is an improvement or board addition ("normal"), that will follow the normal lifecycle of a patch (e.g. will be sent upstream on the next merge tree), if the patch is a bug fix tree for a while without merging upstream ("low"). Valid values for "Priority:" are "low", "normal" and "high". b)For "make commit" to work properly, the HGUSER shell environment var should be defined (replacing the names at the right): HGUSER="My Name " If HGUSER is not set, then, if present, the username defined in the user's ~/.hgrc file will be used. Use of the .hgrc file is preferred over the HGUSER variable according to the hg man page. This name will be used for both the user metadata in the Hg commit log and the initial values of the "From:" and "Signed-off-by:" lines in the pre-made commit message. It is also possible to use a different login name at the site hosting the repository, by using: CHANGE_LOG_LOGIN=my_log_name With this, "make push" will use my_log_name, instead of the name for the current Unix user. Don't forget to export the vars at shell, with something like: export CHANGE_LOG_LOGIN HGUSER It is strongly recommended to have those lines in .bashrc or .profile. b) the CodingStyle compliance check on Mercurial trees are done when "make check" is called. This happens also when "make commit" is done. There's a copy of the kernel tool at the mercurial repository. However, this copy may be outdated. So, by default, it will try to use the newest version of the script, between the one found at the kernel tree and its own copy. It is always a good idea to use in-kernel version, since additional tests are performed when called from the kernel tree. Yet, those tests are dependent of the kernel version, so, the results of checkpatch may not reflect the latest rules/deprecated functions, if you're not using -git. It is possible to override the in-kernel checkpatch.pl location, by using the CHECKPATCH shell environment var to something like: CHECKPATCH="/usr/src/linux/scripts/checkpatch.pl" c) Sometimes, mainstream changes affect the v4l-dvb tree, and must be backported to the v4l-dvb tree. This kind of commit to the Mercurial tree should follow the rules above and should also have the line: kernel-sync: Patches with this line will not be submitted upstream. d) Sometimes it is necessary to introduce some testing code inside a module or remove parts that are not yet finished. Also, compatibility tests may be required to provide backporting. To allow compatibility tests, linux/version.h is automatically included by the building system. This allows adding tests like: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 16) #include #else #include #endif It should be noticed, however, that an explicit inclusion of linux/version.h is required if it is needed to use KERNEL_VERSION() macro (this is required, for example, by V4L2 VIDIOC_QUERYCAP ioctl), otherwise, the driver won't compile when submitted to kernel. There are several compatibility procedures already defined in "compat.h" file. If needed, it is better to include it after all other kernel standard headers, and before any specific header for that file. Something like: #include #include ... #include #include #include "compat.h" #include "mydriver-header.h" should be included at the files under v4l-dvb tree. This header also includes linux/version.h. To include testing code, #if 0 or #if 1 may be used. If this code is meant to go also to kernel, a comment with the word "keep" should be used, e.g: #if 0 /* keep */ or #if 1 /* keep */ The kernel submit scripts will remove the compatibility codes, the tests for specific kernel versions and the #if 0/1 that doesn't have the "keep meta tag". See the file v4l/scripts/gentree.pl for a more complete description of what kind of code will be kept and what kind will be removed. e) To import contributed stuff to a developer's, a script is provided. This allows an easy import of mbox-based patch emails. This is done with (called from the root tree directory): ./mailimport For it to work properly, git tools need to be installed on the local machine, since git has a gitimport script that is used by mailimport. There's also a helper script to make easier to retrieve patches from other Mercurial repositories. The syntax is: ./hgimport Also, hg has a feature, called mqueue, that allows having several patches that can be applied/unapplied for testing. mailimport trusts on it to work, so, this extension should be enabled for mailimport script to work. 3. Knowing about newer patches committed at the development repositories ===================================================================== There are patchbomb scripts at linuxtv.org that will send one copy of each patch applied patch to v4l-dvb.git and v4l-dvb trees to announce when a patch is received. This announcement goes to the linuxtv-commits mailing list, hosted on linuxtv.org. The Mercurial script also currently sends a copy of the patch to: 1) The patch author (as stated on the From: field in the patch comments); 2) The patch committer (the "user" at hg metadata); 3) All people with Signed-off-by:, Acked-by:, or CC: metadata clause in the patch's comment. If, for some reason, there's no "From:" metatag (or it is on the first line, instead of the second one), sometimes the script may fail, maybe filling patch authorship wrongly. So people should take care to properly commit patches with "From:". It is recommended that the developers who submit a pull request via Mercurial to not touch on the submission tree, until he receives the notification email, since, even after being merged at -git, the backport maintainer will need to merge it. 4. Patch submission from the community =================================== Patch submission is open to all the Free Software community. The general procedure to have a patch accepted in the v4l/dvb subsystem and in the kernel is the following: a. Post your patches to the mailing list for review and test by other people: linux-media@vger.kernel.org This mailing list doesn't require subscription, although it is recommended to subscribe, expecially if you're developing V4L/DVB drivers. b. Use [PATCH] and a brief description in the email's subject. This will help the LinuxTV team to better handle it. c. Please include a brief description in the headers of your patch, like described above. Something like: This is just a sample commit comment, just for reference purposes. This does nothing. Signed-off-by: nowhere d. Every patch shall have a Developer's Certificate of Origin and should be submitted by one of its authors. All the patch authors should sign it. e. People will eventually comment about the patch. In this case, please fix problems and repeat until everyone is happy ;) f. If the patch is fixing an existing maintained driver, the low-level driver maintainer will apply to his tree, and at some later time, ask the subsystem maintainer to pull it. It is a good idea to send the patch to the maintainer C/C the mailing list for him to know that you're expecting him to forward the patch. g. If it is a newer driver (not yet in one of the development trees), please send the patch to the subsystem maintainer, C/C the proper mailing lists. h. Prefer to submit your patches against git, especially if it contains fixes that needs to go upstream. 5. Identifying regressions with Mercurial ====================================== The better way for you to identify regressions with Mercurial is to use hg bisect. This is an extension provided with the current Mercurial versions. For it to work, you need to have the proper setup at an hgrc file. To test if bisect is working, you can do: hg bisect help If Mercurial answers with hg: unknown command 'bisect' You will need to add the following lines to your ~/.hgrc file: [extensions] hgext.hbisect=/usr/lib/python2.5/site-packages/hgext/hbisect.py (assuming that hbisect.py is installed under python2.5 default dir) The first step is to initialize bisect for a newer regression testing session. This is done with: hg bisect init If the bisect were previously initialized, you should, instead do: hg bisect reset Supposing that the latest kernel version have some regression, you should do something like: hg update -C (This will clean any changes you had on your tree, and will update to the latest patch) Then, you will mark the latest version as "bad": hg bisect bad The next step is to find one version where the your board is properly working. Supposing that review "4000" is ok, you would do: hg update 4000 Test if the review is really ok. If so, you should mark it as good: hg bisect good If everything is ok, it should print something like: Testing changeset 4481:a53c7904e47d (944 changesets remaining, ~9 tests) 405 files updated, 0 files merged, 8 files removed, 0 files unresolved The above line shows that Mercurial selected another revision for you to test. Redo your tests. If this version is ok, you would do: hg bisect good otherwise, if the version is broken, you should do: hg bisect bad This should be repeated until you have an answer like: The first bad revision is: changeset: 4593:26d1ce012c5e user: Someone date: Thu Feb 31 17:52:53 2006 -0300 summary: This is the broken patch that we should find If, in the middle of the process, you need to know on what revision you are, you can do something like: hg log -r `hg id|cut -d' ' -f 1` 6. Identifying regressions with Git ================================ A similar bisect procedure to identify broken patches exist on git, and it is used not only by LinuxTV. So, it is very important that any applied patch at the kernel don't break compilation, to avoid affecting the bisect procedures. There are several good texts explaining how to use bisect with git. Some recommended procedures can be seen at: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#using-bisect http://www.kernel.org/pub/software/scm/git/docs/git-bisect.html 7. Creating a newer driver ======================= This quick HOWTO explains how to create a new driver using v4l-dvb tree. The v4l-dvb tree have a the following basic structure: / |-- Documentation | |-- dvb <== DVB drivers documentation | `-- video4linux <== V4L drivers documentation |-- drivers | `-- media | |-- common <== Common stuff, like IR | |-- dvb <== DVB only drivers | |-- radio <== V4L Radio only drivers | `-- video <== V4L Analog TV (plus radio and/or | DVB) drivers `-- include |-- linux <== V4L userspace API files | `-- dvb <== DVB userspace API files `-- media <== V4L internal API files When using Mercurial trees, an additional /linux prefix should be added on all patches 7.1. Simple drivers ============== For very simple drivers that have only one .c and one .h file, the recommended way is not to create a newer directory, but keep the driver into an existing one. Assuming that the will be V4L+DVB, the better place for it to be is under /drivers/media/video. Assuming also that the newer driver will be called as "newdevice", you need to do: a) add at /drivers/media/video/Kconfig something like: config VIDEO_NEWDEVICE tristate "newdevice driver" select VIDEO_V4L2 select VIDEO_BUF help Support for newdevice Device Say Y if you own such a device and want to use it. b) add at /drivers/media/video/Makefile something like: obj-$(CONFIG_VIDEO_NEWDEVICE) += newdevice.o EXTRA_CFLAGS = -Idrivers/media/video 7.2. Bigger drivers ============== In this case, a driver will be splitted into several different source codes. Ideally, a source file should have up to 1000 source code lines. After that, you should consider splitting it into smaller files. In this case, assuming that the will be V4L+DVB, and that the driver is called "newdevice", all that is needed to add the newer driver is: a) create a newer dir with your driver, for example: /drivers/media/video/newdevice b) create /drivers/media/video/newdevice/Kconfig with something like: config VIDEO_NEWDEVICE tristate "newdevice driver" select VIDEO_V4L2 select VIDEO_BUF help Support for new device Device Say Y if you own such a device and want to use it. c) create /drivers/media/video/newdevice/Makefile with something like: obj-$(CONFIG_VIDEO_NEWDEVICE) += newdevice.o EXTRA_CFLAGS = -Idrivers/media/video d) Add your driver directory at /drivers/media/Makefile: obj-$(CONFIG_VIDEO_NEWDEVICE) += newdevice/ e) Add your driver directory at /drivers/media/Kconfig: source "drivers/media/video/newdevice/Kconfig" After that, you will be able to use v4l-dvb Makefile to compile your driver. In order to test if your patch is properly compiling, you'll need to enable its compilation by using make menuconfig/make qconfig/make xconfig. After that, you can test if your patch compiles well with: make drivers/media (on git) or make (on hg)