summaryrefslogtreecommitdiffstats
path: root/source/documentation/backports
diff options
Diffstat (limited to 'source/documentation/backports')
-rw-r--r--source/documentation/backports/hacking.rst406
-rw-r--r--source/documentation/backports/hacking/todo.rst120
2 files changed, 526 insertions, 0 deletions
diff --git a/source/documentation/backports/hacking.rst b/source/documentation/backports/hacking.rst
new file mode 100644
index 0000000..72c64a1
--- /dev/null
+++ b/source/documentation/backports/hacking.rst
@@ -0,0 +1,406 @@
+Documentation/backports/hacking
+===============================
+
+.. note::
+
+ the backports project's process is being reworked and redefined.
+ Some of the information in this page may be outdated and will be
+ updated when the changes in the process are finalized.
+
+The project has a :doc:`To-Do List <hacking/todo>` and a :doc:`License
+<../../license>`.
+
+Philosophy
+----------
+
+The project aims to optimize the backporting process by not only
+providing backported drivers but by also aiming to `automatically
+backport the Linux kernel
+<http://www.do-not-panic.com/2012/08/automatically-backporting-linux-kernel.html>`__
+by `optimizing backporting collateral evolutions
+<http://www.do-not-panic.com/2012/08/optimizing-backporting-collateral.html>`__.
+
+Backports development flow
+--------------------------
+
+#. The `backports.git
+ <https://git.kernel.org/cgit/linux/kernel/git/backports/backports.git>`__
+ "master" development branch always tracks "linux-next", allowing it
+ to track all the development trees.
+
+ - This ensures that, at the close of each merge window, the state of
+ the backports will be very close to the state of the first release
+ candidate.
+
+#. At the close of each merge window, the Backports Project creates a new branch.
+
+ - This new branch tracks the progress of the impending release
+ throughout the release candidate evaluation period, to the major
+ release, and on to its lifetime as a stable kernel.
+
+The backports project thus makes three kinds of backports releases possible:
+
+- those derived from linux-next
+- those derived from the most recent release candidate (if any)
+- those derived from recent stable kernels.
+
+Backports git tree tags and branches
+------------------------------------
+
+The project uses two types of git tags:
+
+- daily tags following linux-next
+- stable tags following either Linus' tree for rc releases or Greg's
+ stable tree for stable extra version releases
+
+The project uses a master branch and a series of stable branches, a
+stable branch to track each stable release of the kernel. The master
+branch always tags linux-next, for example the backports tag
+backports-20141114 supports using linux-next tag next-20141114. Once
+Linus makes a release candidate of the kernel a respective *stable
+backports branch* is created based on the version of Linux Linus
+released, this backports branch will be based on a recent backports tag
+which was tracking linux-next. Future release candidates of the same
+version of Linux as well as stable release of Linux under the same
+version will be backported using the respective *backports stable
+branch* created.
+
+If any of this is fuzzy please refer to the `Increasing Automation in
+the Backporting of Linux Drivers Using Coccinelle
+<https://github.com/mcgrof/paper-backports/raw/master/paper.pdf>`__
+paper, in particular the sections:
+
+- 1A - A. The Linux kernel development model
+- 1B - A brief history of the Linux kernel backports project
+
+Git trees you will need
+=======================
+
+The project backports a few subsystems down to older kernels. To be able
+to synchronize backporting the latest and greatest the `linux-next.git
+<https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git>`__
+tree is used as its main source for kernel updates. backports brings a
+general kernel compatibility part containing some backported c functions
+and header files in addition to patches for code in linux-next to make
+it work on older kernel versions and with the general kernel
+compatibility part. You will need first the `backports.git
+<https://git.kernel.org/cgit/linux/kernel/git/backports/backports.git>`__
+tree. Once cloned you can run::
+
+ ./devel/backports-update-manager
+
+That will get you all other trees and sources required for development,
+which are:
+
+- linux-next - Stephen Rothwell's tree which tracks all development trees daily
+- linux - Linus' tree
+- linux-stable - Greg's stable tree for stable extra version releases
+
+This will use git clone --reference to minimize disk usage.
+
+You can generate backports based on different trees depending on your
+needs. We are supporting build based on `linux-next.git
+<https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/>`__,
+`linux.git
+<https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/>`__
+and `linux-stable.git
+<https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/>`__.
+You can also generate builds based on your own tree, but then you
+probably have to patch backports yourself to add support for that.
+
+Tool prerequisites
+------------------
+
+git, python patch and coccinelle are needed to generate a backports
+release. The tools will complain if you do not have any of the required
+dependencies.
+
+Generate new release
+--------------------
+
+To generate a own backport release based on linux-next you need the
+following git trees::
+
+ git://git.kernel.org/pub/scm/linux/kernel/git/backports/backports.git
+ git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
+
+As linux-next changes often you should start with a working version by
+using a tagged version from linux-next.git and backports.git with the
+same date in it like backports-20130607 and next-20130607. This is a
+combination where someone already tested that the patches are still
+applying.
+
+After you have checked out some version of these git trees, you can
+start generating a tar by running ./gentree.py in the backports tree.
+This will take the path to the already checked out linux-next kernel as
+the second last argument and the path to a directory where the newly
+created release should be written to as the last parameter. The releases
+are not created in place any more, but in a new path specified in the
+last parameter::
+
+ ./gentree.py --clean --git-revision v3.x /path/to/your/linux-next /path/to/your/newly/created/release
+
+Adding new driver
+=================
+
+This is a list of steps to be done when adding a new driver. Not all
+steps are needed for every new driver it depends on what type of driver
+is added. You can take the patch adding support for the ieee802154
+subsystem as a reference:
+https://git.kernel.org/cgit/linux/kernel/git/backports/backports.git/commit/?id=a42aa4d474e5859164a00bf451970fb58b676fcf
+
+You should target the master branch of the backports repository.
+
+#. Add directories and files that should be copied from the mainline kernel to ``copy-list``
+#. Add patches to ``patches/collateral-evolutions/`` if needed, it is better to add or modify a header file in ``backport/backport-include/`` than adding a patch.
+#. Add reference to the newly added driver directory in ``backport/Makefile.kernel`` if needed (just needed for new substems)
+#. Add reference to the newly added driver directory in ``backport/Kconfig.sources`` if needed (just needed for new subsystems)
+#. Add a defconfig file for this driver in ``backport/defconfigs/`` and modify other defconfig files if appropriate, e.g. if you add a wifi driver add it to ``backport/defconfigs/wifi``
+#. If the driver does not build on all kernel versions specify a minimum kernel version in ``dependencies``
+
+Backports currently supports the latest minor version of every mainline
+kernel starting from 2.6.24. You should check that backports still
+builds after making your changes. To do so you should install all
+supported kernel with the script in ``devel/get-compat-kernels`` and
+then run ``devel/ckmake`` to build backports against every kernel
+version.
+
+Backporting a kernel feature
+----------------------------
+
+Features being backported should either be backported into a respective
+backports-3.x.c file under backports/compat/ and/or their respective
+header file under backport/backport-include/.
+
+Backports Kconfig operation
+---------------------------
+
+Go read the `backports kconfig operation
+<https://git.kernel.org/cgit/linux/kernel/git/backports/backports.git/tree/devel/doc/kconfig-operation>`__
+documentation.
+
+Backports Makefile operation
+----------------------------
+
+Go read the `backports Makefile operation
+<https://git.kernel.org/cgit/linux/kernel/git/backports/backports.git/tree/devel/doc/makefile-operation>`__
+documentation.
+
+Sending patches
+---------------
+
+backports contributions follow the contribution model implemented by the
+Linux kernel. Patches or pull requests for backports must have be
+signed-offed. If you don't sign off on them **they will not accepted**.
+This means adding a line that says "Signed-off-by: Name " at the end of
+each commit, indicating that you wrote the code and have the right to
+pass it on as an open source patch. For exact definition of what the
+Signed-off-by tag is you can read the definition of the "**Developer's
+Certificate of Origin 1.1**", which you can read here:
+
+http://gerrit.googlecode.com/svn/documentation/2.0/user-signedoffby.html
+
+Remember there are three trees. linux-next itself is a conglomeration of
+kernel git trees itself, so patches for linux-next.git should be sent to
+each respective subsystem for which the patches are targeted for. So for
+example for 802.11 you will want to send them to John Linville and cc
+linux-wireless, for further guidelines on this see the `Submitting
+Patches guidelines for 802.11
+<http://wireless.kernel.org/en/developers/Documentation/SubmittingPatches>`__.
+As another example, for bluetooth you will want to send them to Gustavo
+Padovan and cc the linux-bluetooth mailing list. If your patch touches
+on others areas of the kernel refer to the MAINTAINERS file on the
+kernel.
+
+For backports.git please send patches against to::
+
+ To: hauke@hauke-m.de, mcgrof@kernel.org
+ CC: backports@vger.kernel.org
+ Subject: [PATCH] backports: fix foo
+
+Patches are preferred sent with a clear commit log entry, if unfamiliar
+with how to send patches please refer to `a git guide
+<http://wireless.kernel.org/en/developers/Documentation/git-guide>`__.
+
+Requirements for contributions
+------------------------------
+
+The code quality, and coding style is precisely the same as followed by
+the Linux kernel, for that refer to `the Linux kernel SubmittingPatches
+<https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/SubmittingPatches>`__
+guide. Other than this, since we a supporting backporting you are
+expected to refer to the respective upstream commit which you are
+providing a backport for. This should describe both the git commit
+sha1sum on Linux, and the commit description. The description should
+also include the Linux kernel version which merged the commit upstream
+first, this can be used to help understand what target kernels the
+backport work was for. An example of good commit log follows::
+
+ commit 54584122b3279700f5ef2ba4f260a84273215947
+ Author: Stefan Assmann <sassmann@kpanic.de>
+ Date: Fri May 16 13:21:19 2014 +0200
+
+ backports: handle new get_module_info and get_module_eeprom pointers in struct ethtool_ops
+
+ In kernel 3.5 struct ethtool_ops received 2 new function pointers
+ get_module_info and get_module_eeprom. Address this by putting ifdef around
+ the code.
+
+ commit 41c3cb6d20f0252308e9796fa4f3dacb4960de91
+ Author: Stuart Hodgson <smhodgson@solarflare.com>
+ Date: Thu Apr 19 09:44:42 2012 +0100
+
+ ethtool: Extend the ethtool API to obtain plugin module eeprom data
+
+ git describe --contains 41c3cb6d20f0252308e9796fa4f3dacb4960de91
+ v3.5-rc1~109^2~124^2~2
+
+ Signed-off-by: Stefan Assmann <sassmann@kpanic.de>
+ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+
+Backporting preference for EXPORT_SYMBOL_GPL() and proprietary drivers
+----------------------------------------------------------------------
+
+This framework was designed by intent since its inception **only** for
+*upstream* Linux kernel drivers to avoid excuses about the difficulty to
+support **upstream** Linux kernel development while also supporting
+**users on older kernels**. To ensure the intent is respected currently
+all symbols that we do work on to backport are exported via
+**EXPORT_SYMBOL_GPL()** as we do work to backport them for the supported
+kernels. By using EXPORT_SYMBOL_GPL() we make it **clear** through the
+only current technical means we have that if you use the backported
+symbols your software **is considered derivative works of the Linux
+kernel**.
+
+Backporting more subsystems
+---------------------------
+
+Feel free to any backport subsystems. The requirement is you at least
+list its kernel dependency and also that you have tested compilation
+success with ckmake. If you are adding a new subsystem we are in hopes
+you will also help maintain it.
+
+Generating backports stats
+--------------------------
+
+To help backports developers evaluate the gains of use of Coccinelle
+SmPL a tool has been written as part of the work done towards the
+`Increasing Automation in the Backporting of Linux Drivers Using
+Coccinelle paper
+<http://coccinelle.lip6.fr/papers/backport_edcc15.pdf>`__, the tool has
+a temporary git tree on github, integration of the tool into the
+upstream backports tree is desirable but porting of the tool to Python
+must be done first. Below are instructions on how to use the tool to get
+stats on the latest tree. The statistics give a slew of metrics over the
+gains of using of Coccinelle towards automatically backporting the Linux
+kernel on each release.
+
+First git clone upstream backports git tree, and have a linux-next tree
+available (using Linus' tree is possible as well, you just need to use
+the respective stable backports branch). Then generate a backports
+release using --gitdebug so that each step of the backports process
+creates a commit. This lets the tool evaluate the impact of using
+Coccinelle at each step. Assuming you have backports cloned on
+~/backports/ and the latest linux-next tree with the respective
+linux-next tag associated with the latest backports tree tag you would
+do::
+
+ cd linux-next git reset --hard next-20151218
+ cd ~/backports/
+ mkdir -p ~/build/ rm -rf ~/build/backports-20151218 ./gentree.py --gitdebug ~/linux-next ~/build/backports-20151218
+
+Now go get the temporary backports stats tool and copy over the required
+binary and script::
+
+ cd ~/ git clone https://github.com/mcgrof/backports-cocci-stats.git cd backports-cocci-stats make
+ cp gen-cocci-stats.sh ~/build/backports-20151218/ cp clean ~/build/backports-20151218/
+
+Now generate the stats, you should see something like this::
+
+ mcgrof@ergon ~/build/backports-20151218 (git::master)$ ./gen-cocci-stats.sh
+ Development and Maintenance efficiency metrics:
+
+    dev-efficiency    maint-efficiency   diff-wc      diffstat       clean       SmPL-Patch
+          0.555556             2.33333        21             5           9  0065-ndisc_send_na-argument.cocci
+              2.75                   8        64            22           8  0062-iff-no-queue.cocci
+          0.666667             1.88889        17             6           9  skb_no_xmit_more.cocci
+           1.16667             2.79167        67            28          24  ptp_getsettime64.cocci
+          0.142857                   1        14             2          14  features_check.cocci
+           1.18182             5.45455        60            13          11  0055-netdev-tstats.cocci
+           1.55906             3.55118       451           198         127  0054-struct-proto_ops-sig.cocci
+          0.666667             1.88889        17             6           9  no-pfmemalloc.cocci
+          0.634146              1.4878        61            26          41  set_vf_rate.cocci
+              3.75              10.625        85            30           8  igb_pci_error_handlers.cocci
+           1.07692             4.23077        55            14          13  ethtool_cmd_mdix.cocci
+          0.588235             1.23529        21            10          17      rxnfc.cocci
+          0.285714             1.53571        43             8          28  get_module.cocci
+          0.285714             1.53571        43             8          28  ethtool_eee.cocci
+          0.714286             2.28571        16             5           7  skb_no_fcs.cocci
+              0.25             1.59375        51             8          32  set_vf_spoofchk.cocci
+          0.428571             2.85714        40             6          14  sriov_configure.cocci
+           0.87037              2.7037       146            47          54  0031-sk_data_ready.cocci
+               4.4                17.9       179            44          10  genl-const.cocci
+           7.11111             49.6667       447            64           9  0019-usb_driver_lpm.cocci
+          0.571429             4.14286        58             8          14  get_ts_info.cocci
+           11.5333                45.4       681           173          15  0001-netlink-portid.cocci
+           2.96667               16.35       981           178          60  0002-no_dmabuf.cocci
+          0.444444             1.77778        32             8          18  0002-gpio-parent.cocci
+          0.512821             1.89744        74            20          39  0002-group_attr_bus.cocci
+        �� 0.769231             2.79487       109            30          39  0001-group_attr_class.cocci
+           1.47184              5.6484      3711           967         657   all-SmPL.cocci
+
+ Patch total diff wc -l: 3075 SmPL total diff wc -l: 3711 Total total diff wc -l: 6786
+ Patch diff % contribution: 45.3139 SmPL diff % contribution: 54.6861
+
+Now say you wanted to generate stats for a newer release, say for stats
+based on linux-next tag next-20160122, you would do::
+
+ cd ~/linux-next/
+ git reset --hard next-20160122
+ cd ~/backports/
+ ./gentree.py --gitdebug ~/linux-next/ ~/build/backports-20160122
+ cd ~/build/backports-20160122
+ cp ~/backports-cocci-stats/gen-cocci-stats.sh .
+ cp ~/backports-cocci-stats/clean .
+ ./gen-cocci-stats.sh
+
+ Development and Maintenance efficiency metrics:
+
+    dev-efficiency    maint-efficiency   diff-wc      diffstat       clean       SmPL-Patch
+               0.4                 2.6        13             2           5  0067-mdio-addr.cocci
+          0.555556             2.33333        21             5           9  0065-ndisc_send_na-argument.cocci
+              2.75                   8        64            22           8  0062-iff-no-queue.cocci
+          0.666667             1.88889        17             6           9  skb_no_xmit_more.cocci
+           1.16667             2.79167        67            28          24  ptp_getsettime64.cocci
+          0.142857                   1        14             2          14  features_check.cocci
+           1.18182             5.45455        60            13          11  0055-netdev-tstats.cocci
+           1.55906             3.55118       451           198         127  0054-struct-proto_ops-sig.cocci
+          0.666667             1.88889        17             6           9  no-pfmemalloc.cocci
+          0.634146              1.4878        61            26          41  set_vf_rate.cocci
+              3.75              10.625        85            30           8  igb_pci_error_handlers.cocci
+           1.07692             4.23077        55            14          13  ethtool_cmd_mdix.cocci
+          0.588235             1.23529        21            10          17      rxnfc.cocci
+          0.285714             1.53571        43             8          28  get_module.cocci
+          0.285714             1.53571        43             8          28  ethtool_eee.cocci
+          0.714286             2.28571        16             5           7  skb_no_fcs.cocci
+              0.25             1.59375        51             8          32  set_vf_spoofchk.cocci
+          0.428571             2.85714        40             6          14  sriov_configure.cocci
+           0.87037              2.7037       146            47          54  0031-sk_data_ready.cocci
+               4.4                17.9       179            44          10  genl-const.cocci
+           7.11111             49.6667       447            64           9  0019-usb_driver_lpm.cocci
+          0.571429             4.14286        58             8          14  get_ts_info.cocci
+           11.5333                45.4       681           173          15  0001-netlink-portid.cocci
+           2.96667               16.35       981           178          60  0002-no_dmabuf.cocci
+          0.444444             1.77778        32             8          18  0002-gpio-parent.cocci
+          0.512821             1.89744        74            20          39  0002-group_attr_bus.cocci
+          0.769231             2.79487       109            30          39  0001-group_attr_class.cocci
+           1.46375             5.62538      3724           969         662   all-SmPL.cocci
+
+ Patch total diff wc -l: 3087 SmPL total diff wc -l: 3724 Total total diff wc -l: 6811
+ Patch diff % contribution: 45.3237 SmPL diff % contribution: 54.6763
+
+See also
+--------
+
+- :doc:`To-Do List <hacking/todo>`
+- :doc:`License <../../license>`
diff --git a/source/documentation/backports/hacking/todo.rst b/source/documentation/backports/hacking/todo.rst
new file mode 100644
index 0000000..07244b0
--- /dev/null
+++ b/source/documentation/backports/hacking/todo.rst
@@ -0,0 +1,120 @@
+Documentation/backports/hacking/todo
+====================================
+
+The Linux kernel backports TODO list.
+
+make localmodconfig support
+---------------------------
+
+The Linux kernel has *make localmodconfig* support, random users
+shouldn't be expected to know what modules they need, so in order to
+allow users to get only the drivers they need built we'd need something
+similar to *make localmodconfig*. There are a few ways to do this. The
+best way would be to get upstream a mapping of a kernel object of a
+device to list its respective Kconfig. We'd also need a map of Kconfig
+changes over time as the kernel advances so that if a user is on an
+older system their old kobject Kconfig could be mapped to a new one.
+This should require changes upstream.
+
+Other simpler solutions are to rely on 'lspci -k' output and map this to
+respective device drivers but this solution would be PCI bus specific.
+We should review how the upstream *make localmodconfig* currently works
+and improve upon that to enable support for it on backports.
+
+Who's working on this?
+~~~~~~~~~~~~~~~~~~~~~~
+
+No one.
+
+Module namespaces
+-----------------
+
+Module namespace can consist of either adding prefixes to existing
+symbols or modifying the Linux kernel module data structure so that upon
+request for a symbol it's own namespace can be inspected for its
+requested namespace. The Linux kernel backports project embraces
+prefixing backported versions of symbols by prefixing backported
+versions of symbols with *backports\_*. A macro LINUX_BACKPORT() was
+added to help with this. For example::
+
+ #define crc8 LINUX_BACKPORT(crc8)
+
+Andi Kleen introduced the modular structure modification version of
+`module namespaces
+<http://thread.gmane.org/gmane.linux.network/78674>`__ back in 2007 but
+`Rusty Russell nacked these patches
+<http://article.gmane.org/gmane.linux.kernel/606885>`__. Because of this
+we're left with remapping modules to their own namespaces without
+modifying the in-kernel module structure. It **may** be possible to
+somehow provide module namespaces without requiring modifications to the
+in-kernel module structure, but such mechanisms would end up being
+hacks. We need to evaluate if we can figure a clever way to support this
+that is not so error prone or if we want to respinning Andi's patches
+with the intent to help support kernel backporting.
+
+Original motivation for module namespaces
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Here's a brain dump from Andi about the original motivation behind
+module namespaces:
+
+The original intent was to provide a cleaner export symbol API.
+
+There are roughly two classes of exported symbols:
+
+- Generally usable, well designed, interfaces intended to be used by
+ multiple modules (e.g. functions for drivers to register themselves or
+ library functions)
+- Special purpose exports that are only really for a single module, but
+ are not intended as a general interface. These interfaces are usually
+ not really clean and reusable.
+
+The idea was to mark the later special purpose exports with the name of
+the module that is supposed to them. They wouldn't be available to
+everybody else and wouldn't become part of the general kernel module
+API.
+
+Motivations
+~~~~~~~~~~~
+
+At times Linux distributions may choose, for whatever support-nightmare
+reasons, to support two versions of a subsystem module and have two
+separate device drivers use a different version of that subsystem. The
+reason this is ill-advised is we stand to gain by having development
+done on the upstream and latest versions of each subsystem and drivers;
+that backports framework allows you to get that. An example helps to
+clarify here. Suppose a distribution wants to ship with an old version
+of mac80211 and have the iwlwifi driver use it, but for ath9k they'd
+want to ship the newer version of mac80211 and new version of ath9k.
+This cannot be supported unless module namespaces are created.
+
+Another more reasonable motivation is to avoid regressions with features
+/ symbols being updated only for backported drivers. Non-backported
+drivers will use the non-backported version of the routine. This should
+avoid regressions with non-backported drivers using these routines.
+
+Who's working on this?
+~~~~~~~~~~~~~~~~~~~~~~
+
+No one.
+
+DKMS support
+------------
+
+Someone seems to want add support for `DKMS
+<https://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support>`__. Who
+was that? What benefits does this bring? Isn't DKMS for proprietary
+modules? If so we don't want this support. We don't want proprietary
+drivers using the Linux kernel backports framework.
+
+DKMS is for proprietary modules only because all proprietary modules are
+out-of-tree, and DKMS is for all out-of-tree modules, whether they are
+proprietary or not. Since Linux kernel backports are out-of-tree, DKMS
+brings the benefit of automagically keeping existing backports active
+when a new kernel is installed, rather than going back to the in-tree
+modules with every new kernel.
+
+Who's working on this?
+~~~~~~~~~~~~~~~~~~~~~~
+
+No one