| 3: EARLY-STAGE PLANNING | |
| When contemplating a Linux kernel development project, it can be tempting | |
| to jump right in and start coding. As with any significant project, | |
| though, much of the groundwork for success is best laid before the first | |
| line of code is written. Some time spent in early planning and | |
| communication can save far more time later on. | |
| 3.1: SPECIFYING THE PROBLEM | |
| Like any engineering project, a successful kernel enhancement starts with a | |
| clear description of the problem to be solved. In some cases, this step is | |
| easy: when a driver is needed for a specific piece of hardware, for | |
| example. In others, though, it is tempting to confuse the real problem | |
| with the proposed solution, and that can lead to difficulties. | |
| Consider an example: some years ago, developers working with Linux audio | |
| sought a way to run applications without dropouts or other artifacts caused | |
| by excessive latency in the system. The solution they arrived at was a | |
| kernel module intended to hook into the Linux Security Module (LSM) | |
| framework; this module could be configured to give specific applications | |
| access to the realtime scheduler. This module was implemented and sent to | |
| the linux-kernel mailing list, where it immediately ran into problems. | |
| To the audio developers, this security module was sufficient to solve their | |
| immediate problem. To the wider kernel community, though, it was seen as a | |
| misuse of the LSM framework (which is not intended to confer privileges | |
| onto processes which they would not otherwise have) and a risk to system | |
| stability. Their preferred solutions involved realtime scheduling access | |
| via the rlimit mechanism for the short term, and ongoing latency reduction | |
| work in the long term. | |
| The audio community, however, could not see past the particular solution | |
| they had implemented; they were unwilling to accept alternatives. The | |
| resulting disagreement left those developers feeling disillusioned with the | |
| entire kernel development process; one of them went back to an audio list | |
| and posted this: | |
| There are a number of very good Linux kernel developers, but they | |
| tend to get outshouted by a large crowd of arrogant fools. Trying | |
| to communicate user requirements to these people is a waste of | |
| time. They are much too "intelligent" to listen to lesser mortals. | |
| (http://lwn.net/Articles/131776/). | |
| The reality of the situation was different; the kernel developers were far | |
| more concerned about system stability, long-term maintenance, and finding | |
| the right solution to the problem than they were with a specific module. | |
| The moral of the story is to focus on the problem - not a specific solution | |
| - and to discuss it with the development community before investing in the | |
| creation of a body of code. | |
| So, when contemplating a kernel development project, one should obtain | |
| answers to a short set of questions: | |
| - What, exactly, is the problem which needs to be solved? | |
| - Who are the users affected by this problem? Which use cases should the | |
| solution address? | |
| - How does the kernel fall short in addressing that problem now? | |
| Only then does it make sense to start considering possible solutions. | |
| 3.2: EARLY DISCUSSION | |
| When planning a kernel development project, it makes great sense to hold | |
| discussions with the community before launching into implementation. Early | |
| communication can save time and trouble in a number of ways: | |
| - It may well be that the problem is addressed by the kernel in ways which | |
| you have not understood. The Linux kernel is large and has a number of | |
| features and capabilities which are not immediately obvious. Not all | |
| kernel capabilities are documented as well as one might like, and it is | |
| easy to miss things. Your author has seen the posting of a complete | |
| driver which duplicated an existing driver that the new author had been | |
| unaware of. Code which reinvents existing wheels is not only wasteful; | |
| it will also not be accepted into the mainline kernel. | |
| - There may be elements of the proposed solution which will not be | |
| acceptable for mainline merging. It is better to find out about | |
| problems like this before writing the code. | |
| - It's entirely possible that other developers have thought about the | |
| problem; they may have ideas for a better solution, and may be willing | |
| to help in the creation of that solution. | |
| Years of experience with the kernel development community have taught a | |
| clear lesson: kernel code which is designed and developed behind closed | |
| doors invariably has problems which are only revealed when the code is | |
| released into the community. Sometimes these problems are severe, | |
| requiring months or years of effort before the code can be brought up to | |
| the kernel community's standards. Some examples include: | |
| - The Devicescape network stack was designed and implemented for | |
| single-processor systems. It could not be merged into the mainline | |
| until it was made suitable for multiprocessor systems. Retrofitting | |
| locking and such into code is a difficult task; as a result, the merging | |
| of this code (now called mac80211) was delayed for over a year. | |
| - The Reiser4 filesystem included a number of capabilities which, in the | |
| core kernel developers' opinion, should have been implemented in the | |
| virtual filesystem layer instead. It also included features which could | |
| not easily be implemented without exposing the system to user-caused | |
| deadlocks. The late revelation of these problems - and refusal to | |
| address some of them - has caused Reiser4 to stay out of the mainline | |
| kernel. | |
| - The AppArmor security module made use of internal virtual filesystem | |
| data structures in ways which were considered to be unsafe and | |
| unreliable. This concern (among others) kept AppArmor out of the | |
| mainline for years. | |
| In each of these cases, a great deal of pain and extra work could have been | |
| avoided with some early discussion with the kernel developers. | |
| 3.3: WHO DO YOU TALK TO? | |
| When developers decide to take their plans public, the next question will | |
| be: where do we start? The answer is to find the right mailing list(s) and | |
| the right maintainer. For mailing lists, the best approach is to look in | |
| the MAINTAINERS file for a relevant place to post. If there is a suitable | |
| subsystem list, posting there is often preferable to posting on | |
| linux-kernel; you are more likely to reach developers with expertise in the | |
| relevant subsystem and the environment may be more supportive. | |
| Finding maintainers can be a bit harder. Again, the MAINTAINERS file is | |
| the place to start. That file tends to not always be up to date, though, | |
| and not all subsystems are represented there. The person listed in the | |
| MAINTAINERS file may, in fact, not be the person who is actually acting in | |
| that role currently. So, when there is doubt about who to contact, a | |
| useful trick is to use git (and "git log" in particular) to see who is | |
| currently active within the subsystem of interest. Look at who is writing | |
| patches, and who, if anybody, is attaching Signed-off-by lines to those | |
| patches. Those are the people who will be best placed to help with a new | |
| development project. | |
| The task of finding the right maintainer is sometimes challenging enough | |
| that the kernel developers have added a script to ease the process: | |
| .../scripts/get_maintainer.pl | |
| This script will return the current maintainer(s) for a given file or | |
| directory when given the "-f" option. If passed a patch on the | |
| command line, it will list the maintainers who should probably receive | |
| copies of the patch. There are a number of options regulating how hard | |
| get_maintainer.pl will search for maintainers; please be careful about | |
| using the more aggressive options as you may end up including developers | |
| who have no real interest in the code you are modifying. | |
| If all else fails, talking to Andrew Morton can be an effective way to | |
| track down a maintainer for a specific piece of code. | |
| 3.4: WHEN TO POST? | |
| If possible, posting your plans during the early stages can only be | |
| helpful. Describe the problem being solved and any plans that have been | |
| made on how the implementation will be done. Any information you can | |
| provide can help the development community provide useful input on the | |
| project. | |
| One discouraging thing which can happen at this stage is not a hostile | |
| reaction, but, instead, little or no reaction at all. The sad truth of the | |
| matter is (1) kernel developers tend to be busy, (2) there is no shortage | |
| of people with grand plans and little code (or even prospect of code) to | |
| back them up, and (3) nobody is obligated to review or comment on ideas | |
| posted by others. Beyond that, high-level designs often hide problems | |
| which are only reviewed when somebody actually tries to implement those | |
| designs; for that reason, kernel developers would rather see the code. | |
| If a request-for-comments posting yields little in the way of comments, do | |
| not assume that it means there is no interest in the project. | |
| Unfortunately, you also cannot assume that there are no problems with your | |
| idea. The best thing to do in this situation is to proceed, keeping the | |
| community informed as you go. | |
| 3.5: GETTING OFFICIAL BUY-IN | |
| If your work is being done in a corporate environment - as most Linux | |
| kernel work is - you must, obviously, have permission from suitably | |
| empowered managers before you can post your company's plans or code to a | |
| public mailing list. The posting of code which has not been cleared for | |
| release under a GPL-compatible license can be especially problematic; the | |
| sooner that a company's management and legal staff can agree on the posting | |
| of a kernel development project, the better off everybody involved will be. | |
| Some readers may be thinking at this point that their kernel work is | |
| intended to support a product which does not yet have an officially | |
| acknowledged existence. Revealing their employer's plans on a public | |
| mailing list may not be a viable option. In cases like this, it is worth | |
| considering whether the secrecy is really necessary; there is often no real | |
| need to keep development plans behind closed doors. | |
| That said, there are also cases where a company legitimately cannot | |
| disclose its plans early in the development process. Companies with | |
| experienced kernel developers may choose to proceed in an open-loop manner | |
| on the assumption that they will be able to avoid serious integration | |
| problems later. For companies without that sort of in-house expertise, the | |
| best option is often to hire an outside developer to review the plans under | |
| a non-disclosure agreement. The Linux Foundation operates an NDA program | |
| designed to help with this sort of situation; more information can be found | |
| at: | |
| http://www.linuxfoundation.org/en/NDA_program | |
| This kind of review is often enough to avoid serious problems later on | |
| without requiring public disclosure of the project. |