11f19411aSSandrine BailleuxCode Review Guidelines 21f19411aSSandrine Bailleux====================== 31f19411aSSandrine Bailleux 41f19411aSSandrine BailleuxWhy do we do code reviews? 51f19411aSSandrine Bailleux-------------------------- 61f19411aSSandrine Bailleux 71f19411aSSandrine BailleuxThe main goal of code reviews is to improve the code quality. By reviewing each 81f19411aSSandrine Bailleuxother's code, we can help catch issues that were missed by the author 91f19411aSSandrine Bailleuxbefore they are integrated in the source tree. Different people bring different 101f19411aSSandrine Bailleuxperspectives, depending on their past work, experiences and their current use 111f19411aSSandrine Bailleuxcases of TF-A in their products. 121f19411aSSandrine Bailleux 131f19411aSSandrine BailleuxCode reviews also play a key role in sharing knowledge within the 141f19411aSSandrine Bailleuxcommunity. People with more expertise in one area of the code base can 151f19411aSSandrine Bailleuxhelp those that are less familiar with it. 161f19411aSSandrine Bailleux 171f19411aSSandrine BailleuxCode reviews are meant to benefit everyone through team work. It is not about 181f19411aSSandrine Bailleuxunfairly criticizing or belittling the work of any contributor. 191f19411aSSandrine Bailleux 201f19411aSSandrine Bailleux 21ca4febacSSandrine BailleuxOverview of the code review process 22ca4febacSSandrine Bailleux----------------------------------- 23ca4febacSSandrine Bailleux 24ca4febacSSandrine BailleuxAll contributions to Trusted Firmware-A project are reviewed by the community to 25ca4febacSSandrine Bailleuxensure they meet the project's expectations before they get merged, according to 26ca4febacSSandrine Bailleuxthe `Project Maintenance Process`_ defined for all `Trusted Firmware` projects. 27ca4febacSSandrine Bailleux 28ca4febacSSandrine BailleuxTechnical ownership of most parts of the codebase falls on the :ref:`code 29ca4febacSSandrine Bailleuxowners`. All patches are ultimately merged by the :ref:`maintainers`. 30ca4febacSSandrine Bailleux 31ca4febacSSandrine BailleuxApproval of a patch is tracked using Gerrit `labels`. For a patch to be merged, 32ca4febacSSandrine Bailleuxit must get all of the following votes: 33ca4febacSSandrine Bailleux 34ca4febacSSandrine Bailleux- At least one ``Code-Owner-Review+1`` up-vote, and no ``Code-Owner-Review-1`` 35ca4febacSSandrine Bailleux down-vote. 36ca4febacSSandrine Bailleux 37ca4febacSSandrine Bailleux- At least one ``Maintainer-Review+1`` up-vote, and no ``Maintainer-Review-1`` 38ca4febacSSandrine Bailleux down-vote. 39ca4febacSSandrine Bailleux 40ca4febacSSandrine Bailleux- ``Verified+1`` vote applied by the automated Continuous Integration (CI) 41ca4febacSSandrine Bailleux system. 42ca4febacSSandrine Bailleux 43ca4febacSSandrine BailleuxNote that, in some instances, the maintainers might give a waiver for some of 44ca4febacSSandrine Bailleuxthe CI failures and manually override the ``Verified+1`` score. 45ca4febacSSandrine Bailleux 46ca4febacSSandrine Bailleux 47ca4febacSSandrine BailleuxGood practices for all reviewers 48ca4febacSSandrine Bailleux-------------------------------- 491f19411aSSandrine Bailleux 501f19411aSSandrine BailleuxTo ensure the code review gives the greatest possible benefit, participants in 511f19411aSSandrine Bailleuxthe project should: 521f19411aSSandrine Bailleux 531f19411aSSandrine Bailleux- Be considerate of other people and their needs. Participants may be working 541f19411aSSandrine Bailleux to different timescales, and have different priorities. Keep this in 551f19411aSSandrine Bailleux mind - be gracious while waiting for action from others, and timely in your 561f19411aSSandrine Bailleux actions when others are waiting for you. 571f19411aSSandrine Bailleux 581f19411aSSandrine Bailleux- Review other people's patches where possible. The more active reviewers there 591f19411aSSandrine Bailleux are, the more quickly new patches can be reviewed and merged. Contributing to 601f19411aSSandrine Bailleux code review helps everyone in the long run, as it creates a culture of 611f19411aSSandrine Bailleux participation which serves everyone's interests. 621f19411aSSandrine Bailleux 631f19411aSSandrine Bailleux 641f19411aSSandrine BailleuxGuidelines for patch contributors 651f19411aSSandrine Bailleux--------------------------------- 661f19411aSSandrine Bailleux 671f19411aSSandrine BailleuxIn addition to the rules outlined in the :ref:`Contributor's Guide`, as a patch 681f19411aSSandrine Bailleuxcontributor you are expected to: 691f19411aSSandrine Bailleux 701f19411aSSandrine Bailleux- Answer all comments from people who took the time to review your 711f19411aSSandrine Bailleux patches. 721f19411aSSandrine Bailleux 731f19411aSSandrine Bailleux- Be patient and resilient. It is quite common for patches to go through 741f19411aSSandrine Bailleux several rounds of reviews and rework before they get approved, especially 751f19411aSSandrine Bailleux for larger features. 761f19411aSSandrine Bailleux 771f19411aSSandrine Bailleux In the event that a code review takes longer than you would hope for, you 781f19411aSSandrine Bailleux may try the following actions to speed it up: 791f19411aSSandrine Bailleux 801f19411aSSandrine Bailleux - Ping the reviewers on Gerrit or on the mailing list. If it is urgent, 811f19411aSSandrine Bailleux explain why. Please remain courteous and do not abuse this. 821f19411aSSandrine Bailleux 831f19411aSSandrine Bailleux - If one code owner has become unresponsive, ask the other code owners for 841f19411aSSandrine Bailleux help progressing the patch. 851f19411aSSandrine Bailleux 861f19411aSSandrine Bailleux - If there is only one code owner and they have become unresponsive, ask one 871f19411aSSandrine Bailleux of the project maintainers for help. 881f19411aSSandrine Bailleux 891f19411aSSandrine Bailleux- Do the right thing for the project, not the fastest thing to get code merged. 901f19411aSSandrine Bailleux 911f19411aSSandrine Bailleux For example, if some existing piece of code - say a driver - does not quite 921f19411aSSandrine Bailleux meet your exact needs, go the extra mile and extend the code with the missing 931f19411aSSandrine Bailleux functionality you require - as opposed to copying the code into some other 941f19411aSSandrine Bailleux directory to have the freedom to change it in any way. This way, your changes 951f19411aSSandrine Bailleux benefit everyone and will be maintained over time. 961f19411aSSandrine Bailleux 978671000fSManish V Badarkhe- It is the patch-author's responsibility to respond to review comments within 988671000fSManish V Badarkhe 21 days. In the event that the patch-author does not respond within this 998671000fSManish V Badarkhe timeframe, the maintainer is entitled to abandon the patch(es). 1008671000fSManish V Badarkhe Patch author(s) may be busy with other priorities, causing a delay in 1018671000fSManish V Badarkhe responding to active review comments after posting patch(es). In such a 1028671000fSManish V Badarkhe situation, if the author's patch(es) is/are abandoned, they can restore 1038671000fSManish V Badarkhe their work for review by resolving comments, merge-conflicts, and revising 1048671000fSManish V Badarkhe their original submissions. 1051f19411aSSandrine Bailleux 1061f19411aSSandrine BailleuxGuidelines for all reviewers 1071f19411aSSandrine Bailleux---------------------------- 1081f19411aSSandrine Bailleux 1091f19411aSSandrine BailleuxThere are no good or bad review comments. If you have any doubt about a patch or 1101f19411aSSandrine Bailleuxneed some clarifications, it's better to ask rather than letting a potential 1111f19411aSSandrine Bailleuxissue slip. Examples of review comments could be: 1121f19411aSSandrine Bailleux 1131f19411aSSandrine Bailleux- Questions ("Why do you need to do this?", "What if X happens?") 1141f19411aSSandrine Bailleux- Bugs ("I think you need a logical \|\| rather than a bitwise \|.") 1151f19411aSSandrine Bailleux- Design issues ("This won't scale well when we introduce feature X.") 1161f19411aSSandrine Bailleux- Improvements ("Would it be better if we did Y instead?") 1171f19411aSSandrine Bailleux 1181f19411aSSandrine Bailleux 1191f19411aSSandrine BailleuxGuidelines for code owners 1201f19411aSSandrine Bailleux-------------------------- 1211f19411aSSandrine Bailleux 1221f19411aSSandrine BailleuxCode owners are listed on the :ref:`Project Maintenance<code owners>` page, 1231f19411aSSandrine Bailleuxalong with the module(s) they look after. 1241f19411aSSandrine Bailleux 1251f19411aSSandrine BailleuxWhen reviewing a patch, code owners are expected to check the following: 1261f19411aSSandrine Bailleux 1271f19411aSSandrine Bailleux- The patch looks good from a technical point of view. For example: 1281f19411aSSandrine Bailleux 1291f19411aSSandrine Bailleux - The structure of the code is clear. 1301f19411aSSandrine Bailleux 1311f19411aSSandrine Bailleux - It complies with the relevant standards or technical documentation (where 1321f19411aSSandrine Bailleux applicable). 1331f19411aSSandrine Bailleux 1341f19411aSSandrine Bailleux - It leverages existing interfaces rather than introducing new ones 1351f19411aSSandrine Bailleux unnecessarily. 1361f19411aSSandrine Bailleux 1371f19411aSSandrine Bailleux - It fits well in the design of the module. 1381f19411aSSandrine Bailleux 1391f19411aSSandrine Bailleux - It adheres to the security model of the project. In particular, it does not 1401f19411aSSandrine Bailleux increase the attack surface (e.g. new SMCs) without justification. 1411f19411aSSandrine Bailleux 1421f19411aSSandrine Bailleux- The patch adheres to the TF-A :ref:`Coding Style`. The CI system should help 1431f19411aSSandrine Bailleux catch coding style violations. 1441f19411aSSandrine Bailleux 1451f19411aSSandrine Bailleux- (Only applicable to generic code) The code is MISRA-compliant (see 1461f19411aSSandrine Bailleux :ref:`misra-compliance`). The CI system should help catch violations. 1471f19411aSSandrine Bailleux 1481f19411aSSandrine Bailleux- Documentation is provided/updated (where applicable). 1491f19411aSSandrine Bailleux 1501f19411aSSandrine Bailleux- The patch has had an appropriate level of testing. Testing details are 1511f19411aSSandrine Bailleux expected to be provided by the patch author. If they are not, do not hesitate 1521f19411aSSandrine Bailleux to request this information. 1531f19411aSSandrine Bailleux 1541f19411aSSandrine Bailleux- All CI automated tests pass. 1551f19411aSSandrine Bailleux 1561f19411aSSandrine BailleuxIf a code owner is happy with a patch, they should give their approval 1571f19411aSSandrine Bailleuxthrough the ``Code-Owner-Review+1`` label in Gerrit. If instead, they have 1581f19411aSSandrine Bailleuxconcerns, questions, or any other type of blocking comment, they should set 1591f19411aSSandrine Bailleux``Code-Owner-Review-1``. 1601f19411aSSandrine Bailleux 1611f19411aSSandrine BailleuxCode owners are expected to behave professionally and responsibly. Here are some 1621f19411aSSandrine Bailleuxguidelines for them: 1631f19411aSSandrine Bailleux 1641f19411aSSandrine Bailleux- Once you are engaged in a review, make sure you stay involved until the patch 1651f19411aSSandrine Bailleux is merged. Rejecting a patch and going away is not very helpful. You are 1661f19411aSSandrine Bailleux expected to monitor the patch author's answers to your review comments, 1671f19411aSSandrine Bailleux answer back if needed and review new revisions of their patch. 1681f19411aSSandrine Bailleux 1691f19411aSSandrine Bailleux- Provide constructive feedback. Just saying, "This is wrong, you should do X 1701f19411aSSandrine Bailleux instead." is usually not very helpful. The patch author is unlikely to 1711f19411aSSandrine Bailleux understand why you are requesting this change and might feel personally 1721f19411aSSandrine Bailleux attacked. 1731f19411aSSandrine Bailleux 1741f19411aSSandrine Bailleux- Be mindful when reviewing a patch. As a code owner, you are viewed as 1751f19411aSSandrine Bailleux the expert for the relevant module. By approving a patch, you are partially 1761f19411aSSandrine Bailleux responsible for its quality and the effects it has for all TF-A users. Make 1771f19411aSSandrine Bailleux sure you fully understand what the implications of a patch might be. 1781f19411aSSandrine Bailleux 1791f19411aSSandrine Bailleux 1801f19411aSSandrine BailleuxGuidelines for maintainers 1811f19411aSSandrine Bailleux-------------------------- 1821f19411aSSandrine Bailleux 1831f19411aSSandrine BailleuxMaintainers are listed on the :ref:`Project Maintenance<maintainers>` page. 1841f19411aSSandrine Bailleux 1851f19411aSSandrine BailleuxWhen reviewing a patch, maintainers are expected to check the following: 1861f19411aSSandrine Bailleux 1871f19411aSSandrine Bailleux- The general structure of the patch looks good. This covers things like: 1881f19411aSSandrine Bailleux 1891f19411aSSandrine Bailleux - Code organization. 1901f19411aSSandrine Bailleux 1911f19411aSSandrine Bailleux - Files and directories, names and locations. 1921f19411aSSandrine Bailleux 1931f19411aSSandrine Bailleux For example, platform code should be added under the ``plat/`` directory. 1941f19411aSSandrine Bailleux 1951f19411aSSandrine Bailleux - Naming conventions. 1961f19411aSSandrine Bailleux 1971f19411aSSandrine Bailleux For example, platform identifiers should be properly namespaced to avoid 1981f19411aSSandrine Bailleux name clashes with generic code. 1991f19411aSSandrine Bailleux 2001f19411aSSandrine Bailleux - API design. 2011f19411aSSandrine Bailleux 2021f19411aSSandrine Bailleux- Interaction of the patch with other modules in the code base. 2031f19411aSSandrine Bailleux 2041f19411aSSandrine Bailleux- The patch aims at complying with any standard or technical documentation 2051f19411aSSandrine Bailleux that applies. 2061f19411aSSandrine Bailleux 2071f19411aSSandrine Bailleux- New files must have the correct license and copyright headers. See :ref:`this 2081f19411aSSandrine Bailleux paragraph<copyright-license-guidance>` for more information. The CI system 2091f19411aSSandrine Bailleux should help catch files with incorrect or no copyright/license headers. 2101f19411aSSandrine Bailleux 2111f19411aSSandrine Bailleux- There is no third party code or binary blobs with potential IP concerns. 2121f19411aSSandrine Bailleux Maintainers should look for copyright or license notices in code, and use 2131f19411aSSandrine Bailleux their best judgement. If they are unsure about a patch, they should ask 2141f19411aSSandrine Bailleux other maintainers for help. 2151f19411aSSandrine Bailleux 2161f19411aSSandrine Bailleux- Generally speaking, new driver code should be placed in the generic 2171f19411aSSandrine Bailleux layer. There are cases where a driver has to stay into the platform layer but 2181f19411aSSandrine Bailleux this should be the exception, rather than the rule. 2191f19411aSSandrine Bailleux 2201f19411aSSandrine Bailleux- Existing common drivers (in particular for Arm IPs like the GIC driver) should 2211f19411aSSandrine Bailleux not be copied into the platform layer to cater for platform quirks. This 2221f19411aSSandrine Bailleux type of code duplication hurts the maintainability of the project. The 2231f19411aSSandrine Bailleux duplicate driver is less likely to benefit from bug fixes and future 2241f19411aSSandrine Bailleux enhancements. In most cases, it is possible to rework a generic driver to 2251f19411aSSandrine Bailleux make it more flexible and fit slightly different use cases. That way, these 2261f19411aSSandrine Bailleux enhancements benefit everyone. 2271f19411aSSandrine Bailleux 2281f19411aSSandrine Bailleux- When a platform specific driver really is required, the burden lies with the 2291f19411aSSandrine Bailleux patch author to prove the need for it. A detailed justification should be 2301f19411aSSandrine Bailleux posted via the commit message or on the mailing list. 2311f19411aSSandrine Bailleux 2321f19411aSSandrine Bailleux- Before merging a patch, verify that all review comments have been addressed. 2331f19411aSSandrine Bailleux If this is not the case, encourage the patch author and the relevant 2341f19411aSSandrine Bailleux reviewers to resolve these together. 2351f19411aSSandrine Bailleux 2361f19411aSSandrine BailleuxIf a maintainer is happy with a patch, they should give their approval 2371f19411aSSandrine Bailleuxthrough the ``Maintainer-Review+1`` label in Gerrit. If instead, they have 2381f19411aSSandrine Bailleuxconcerns, questions, or any other type of blocking comment, they should set 2391f19411aSSandrine Bailleux``Maintainer-Review-1``. 2401f19411aSSandrine Bailleux 2411f19411aSSandrine Bailleux-------------- 2421f19411aSSandrine Bailleux 243ca4febacSSandrine Bailleux*Copyright (c) 2020-2023, Arm Limited. All rights reserved.* 2441f19411aSSandrine Bailleux 245*979c5482SSandrine Bailleux.. _Project Maintenance Process: https://trusted-firmware-docs.readthedocs.io/en/latest/generic_processes/project_maintenance_process.html 246