From patchwork Fri Jan 26 14:32:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Enderborg X-Patchwork-Id: 10186545 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3A41B601D5 for ; Fri, 26 Jan 2018 16:24:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2A8142A1AF for ; Fri, 26 Jan 2018 16:24:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1E6DA2A1BB; Fri, 26 Jan 2018 16:24:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from USFB19PA12.eemsg.mail.mil (uphb19pa09.eemsg.mail.mil [214.24.26.83]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0C9B62A1AF for ; Fri, 26 Jan 2018 16:24:27 +0000 (UTC) Received: from emsm-gh1-uea11.ncsc.mil ([214.29.60.3]) by USFB19PA12.eemsg.mail.mil with ESMTP; 26 Jan 2018 16:24:27 +0000 X-IronPort-AV: E=Sophos;i="5.46,417,1511827200"; d="scan'208";a="8604660" IronPort-PHdr: =?us-ascii?q?9a23=3AD2PghROrVUSgZJO0ykEl6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0LPz+p8bcNUDSrc9gkEXOFd2Cra4c0qyO6+jJYi8p2d65qncMcZhBBVcuqP?= =?us-ascii?q?49uEgeOvODElDxN/XwbiY3T4xoXV5h+GynYwAOQJ6tL1LdrWev4jEMBx7xKRR6?= =?us-ascii?q?JvjvGo7Vks+7y/2+94fcbglUmTaxe69+IAmrpgjNq8cahpdvJLwswRXTuHtIfO?= =?us-ascii?q?pWxWJsJV2Nmhv3+9m98p1+/SlOovwt78FPX7n0cKQ+VrxYES8pM3sp683xtBnM?= =?us-ascii?q?VhWA630BWWgLiBVIAgzF7BbnXpfttybxq+Rw1DWGMcDwULs5Qiqp4bt1RxD0iS?= =?us-ascii?q?cHLz85/3/Risxsl6JQvRatqwViz4LIfI2ZMfxzca3HfdMeWGFPQMBfWSJcCY+4?= =?us-ascii?q?docDEvYNMeNeooLgpVUBsAG+CBGsCu3xxDFGhXj40q800+suDQ7IwRQgEtATvH?= =?us-ascii?q?nastr1L7wfUfypwKTS0TnOde9a1Sv75YPVch4hu/aMXbdofMfW0UkgCR/FgUuK?= =?us-ascii?q?qYD/ITyV0PkCvHaB7+V7UuKvkWEnphpqojiowMctipPFiZ4SylDB7Ch0xps+K9?= =?us-ascii?q?6gSENjfNKpH5RduzuaOodrWM8uXW5ltDggxrEboZK2cioHxI46yxPRb/GLaZWE?= =?us-ascii?q?7xLiWeqLPzt1gHRoc6+liRmo60iv0Oj8W9Gx0FZNsyVKjMHBtmsI1xzP8siHTe?= =?us-ascii?q?Z9/lu51TaPyQ/T7uZELFgolaXBMZ4hw6MwloEJvUTfHi75hEX2jKiMekUi5ueo?= =?us-ascii?q?8Pjobq/jpp+dM494kgD+MqIwlcyjGek0LwcDUmeB9em8ybHv51P1TbpUgvEsj6?= =?us-ascii?q?XVqJXaKt4apq69DQ9VyIEj6xOnAje9ztsYmXgHLFRYeBOIloTmIFbOIO3+Dfij?= =?us-ascii?q?nVusiyxmx+zGP7L9ApXNKWLPkLH6fbln8UJcxw0zzc5H65JOFr4BOO7zWlP2tN?= =?us-ascii?q?HADB85NAq0zPz7CNV9zIweX3mCAq2eMKPUtF+H/PkvI/WSa48PozbxMf8l5+Th?= =?us-ascii?q?jXUhg18SYbGp3YcLaHC/BvlmIUeZbmDwjdcCCmcKuQw+TO30iFCZXz5TY2uyXq?= =?us-ascii?q?0n6TEmDoKmEZrDSpqqgLyb0yexBodWaXxeClCQDXfocJ2JW+8SZy2JPMBhlD0E?= =?us-ascii?q?VaSmS4I61BGhqhH1xKR9IurT4C0Yuorp1MJp6O3LiREy6Tt0AtyA3GGKSWF0mH?= =?us-ascii?q?4HSCEy3KB+ukFy0EmM0bJ/g/BCEtxT/fxJWB8gNZHA1+x6F8zyWgXZc9iUVFap?= =?us-ascii?q?WM+mDCotQdI2xt8Bf1xyG86+jhzZ2SqlHaMVnaSRBJMo6qLcw2TxJ8FlxnbH0q?= =?us-ascii?q?khk0cpQs9ROm2jmKF/6xLTBo7SnkWej6ala6Ic3CvX+2eCyWqBp0ZYUQFqXaXC?= =?us-ascii?q?R3AfaVPcrc7l6UPaU7+uFbMnPxNByM+DLatKbMbkjVBCRPv6OdTeZXi9m2GqCh?= =?us-ascii?q?aSxbOMbZTqdHsH0CXbFkcEjxgZ/WyaOggmGiehv2XeASRgFFLuZ0Ps9PdxqGmg?= =?us-ascii?q?Q0860Q6Fckph16Cv9R4Nn/ycTPET0awYtyc9sTl0G0y9393OAdqauwVhZLlcYc?= =?us-ascii?q?864Fpf22LZrRZyPpq8IKBjnV4TaAF3v1vv1xluEYVBn9MqoGktzApoJqKSyElB?= =?us-ascii?q?eC+A3ZDsJr3XLXH//BO1ZK7V3VHezc2b+qQV5/Q7rFXjoRulFk0483Voy9NVyW?= =?us-ascii?q?eT5o3WDAoOVpL8Slw4+AVgp7HbfCY9/ZjZ2mdwPqmxqDPC3MgpBOQ9wBa6Y9hf?= =?us-ascii?q?KL+EFBP1E8ACG8ehMugqlEaybhIYPOFS87U5P9i6ePuHxqGrOvpgnDO8gmhd5o?= =?us-ascii?q?ByzF6M/TJmSuHUx5YF3+2Y3gyfWjfmkViur9v6mY9BZTAdBGa/zzbrBJJJbK1o?= =?us-ascii?q?YYkLEXuuI9GwxthmnJ7tVWRY9Fm4B1Maw8KpYhySb1vz3A1Vz0sXp2armS2mwD?= =?us-ascii?q?xoizsptLaQ3DTSw+T+cxoKImBKS3NmjVfwP4e0lcsaUVO2bwc3jhuq/lv6x61B?= =?us-ascii?q?qKR4NWnTTl9CfzLqIGF6Tquwqr2CbtZR6JMprSpXTOO8YUqARrHhoxsa1CXjH2?= =?us-ascii?q?RFyTA/djGqvI/2nwZ9iG6HK3ZztnXZc9lqxRjD/NzcWeJR3j0eSSl8iDnXHUS8?= =?us-ascii?q?M8Cy/dqKk5fDs+a+V3+uV5BIainr1YKAtC265WJ2Gh2zhfazlcP7EQIiyy/0y8?= =?us-ascii?q?FqVTnUrBb7eoTrzaO6MeZjfkZ2Hl/z9816G49ln4srmZEfxWMaio+S/Xodnmf5?= =?us-ascii?q?Kc9b1r7mbHoRWT4LxMbY4Av7101lNXKE3IH5WWubwst6Ydm1fH8W1jg678BQB6?= =?us-ascii?q?ee9KZEkjdtolqksQLRZuBwni8Hxvsz7H4VnfkJtxArziWBHL8SB1JVPTH3lxuW?= =?us-ascii?q?9dC+t79bZH2ocbitzkpxgc6uDL+FogFGV3b2ZI0uHSlu4cVjKFjMymH86pn4eN?= =?us-ascii?q?nMatIergOUkxHdgOVONpIxkOcFhSp9NWL7o3Il1/YxjQZy0pGioIiHN2Jt8bqh?= =?us-ascii?q?AhFCKz31Y9ge9S3sjaZCnseaxo6vEY9nGjkRW5voV/2oGioItfv7LwaODCE8qn?= =?us-ascii?q?CDFLrcHQ6f7FlpomnKE5CsOXGXKmcWzcl+RBmdI0xfhR4bUC88npEnCgCg3Nbh?= =?us-ascii?q?f1th5jAN+l74rQNByuxyOBn5TmffowKoZyw6SJeBMRVW6RtC6F3NMcyE6eJzHT?= =?us-ascii?q?9X8YG9rACXLWybfQtIB3kTWkOYH1DjIqWu5d7Y/uiCHOa/IeHCYbCUpuxaUPeJ?= =?us-ascii?q?xYmi3ZF68DaJLMmPOWNiD/Ij0EpZQX95A9jZmykISyEPmSLNddCUqwqn+iJtqM?= =?us-ascii?q?C/7PPrWBn06ISVF7RSNM9j+xesgaeML+SQnjp2KS5E1pMQwn/F0L4f3EQIhCF2?= =?us-ascii?q?bzmgCroAtS/XTKLLhq9XAR8bayVpO8tO86083xNCOcrBhtPyzL54geY/C01ZWl?= =?us-ascii?q?z5hsGpecsKLnmmO1zcA0qLMLWGJSbXw8Hse6+8UqNfg/lOux2rpzmbF07jPjKe?= =?us-ascii?q?lzjmTB2gLeFNjDuGPBxFoo28fAxiCXT4TNLhbB23Kth3jSc5wbcsnHPFKXYcMS?= =?us-ascii?q?Rgc0NKtrCQ6yJYgvF7G2Nf9XpoNvOLlDiD7+nfMJoWtuFrAitsneJA/Hs606dV?= =?us-ascii?q?7D1DRPFtgyTSr9Fuo1agkuSU1zVoTgFBqjdRi4KNp0liPr/Z9pZYU3be4B0N9X?= =?us-ascii?q?mQCwgNp9Z9ENLvtLpfysbRm6/oLzdC68zb/c0ZB8fOKcKHNGEuMR3mGTLOCwsF?= =?us-ascii?q?VzGrP3nFh0NBiPGS6mGVrp8ip5jwn5oOT6VXVEYyFvIbFEtlGscNII1wXjw6kr?= =?us-ascii?q?6Wl9IH5X27rBbNXspapYzHWuiUAfrxNDaTlaNEaAcQwbPkMYQTMZX220p8ZVZg?= =?us-ascii?q?mITHAEnQXddWoi19dAA0pl5N8Ht/TmEp3ULqdB+t6mcJFfGohh42lhd+YeM1+T?= =?us-ascii?q?f2/Vg3PUTFqzEqkEYtmdXomiuecD/rLKitWoFWBTL0t1IvPZL7WQp1axO9nVB8?= =?us-ascii?q?PjfeW71Rl6dgdXxsiALEpJRAA+BcTaxZbx8L3vyYfe8o0U5bqiSp3k9I+/fKCY?= =?us-ascii?q?Z4lAsrbZ6tr2hM2wR9Y94pPabQPrZGzkBMhqKSuS+lzuQxwAgEJ0kT9mOTeSkI?= =?us-ascii?q?tVcHNrkgOiqk5Ots6RaNmzFbYmgDS+Iqou529kM6I+mA1Dzv07pCKkC3KuyeIL?= =?us-ascii?q?iUtHTHlc6NXlw/zFgIl1Vf8bhwz8gjb1KeV1ozw7uJCxQJKc3CJBlIYMVO8XjT?= =?us-ascii?q?eiCOsfnQzZ9uIYWyCProTe6PtaYThEKoBgApEJoQ7s4ZBJmjzFnYLdv7LL4C0R?= =?us-ascii?q?gt+AXrJFCCDPRVeBKKkCwKrNy+zJ53x4ZSPSsRAWNjPiWr/rzXvBMlgOKfXNcq?= =?us-ascii?q?ZXcXRpELNnY3WMKmhSFWp3FADTmx0uIezgiN9STxqT/RDDbmadpvffmUZQ52BN?= =?us-ascii?q?Gw5zo/77C8iUTL/ZXGO2H6KdNit8fU5uwEoZaKEOlbQqRjs0jCgYlYXGalU3TP?= =?us-ascii?q?ENKvIJjwcYYsZ8TuCnmmSly/ly41T8DpMda3KKiIgB3nRYZTsImfxzAtLdazGC?= =?us-ascii?q?wEFRpsoO8O/75zZQoGY5UnexHorBg+O7a5IAiGztWkW3ytJidOT/lD0eW6YKRa?= =?us-ascii?q?wDYubuCg1HQtVY01z+6z8U4JRZEFkAvexeq9aIZCUSj/AHtdex/ApSAhjWhuKv?= =?us-ascii?q?4ywvsjwBPPqVQcKSqEdPZuaGNfpNw8GUmSLm9oCmUmQ1+cjIzD4gGo37AT8Ctd?= =?us-ascii?q?n8pU0eNfv3jku5/TejSsV7K3qZ/NqSovccAmo7FtMYzkOsaHuonSkSDfTJnRtw?= =?us-ascii?q?2FUTS1F/lBl9hRPi1XXudHlXsiOcwctopL8VAxWdsmJ7xTFKksoainaT9+Ai4I?= =?us-ascii?q?zi8WSZ+A3D0EguezwLbbmA2fcJI+PxwAt5VCn8YSUzVsbiMYuqCjS53cl3WYRW?= =?us-ascii?q?gTPAcT8QNM6RoYlo93euDq+pDITZFLyz5SrfJ5SS7LFp5v91vgVG6ZnUL4SPK6?= =?us-ascii?q?k+yy3AJSyv3s3sMcWB5lBkhX3/xWmVcwKLFrN6kQuZbHvSWSdUPnumLh0uimKU?= =?us-ascii?q?JQyc3Vdl34EJHKuXD6UiIC5X0eXZVPx23HFZQOjwp5b74mpElLIICjYUv++yAo?= =?us-ascii?q?x4FyELWiU8Ck2Uolp24cRyi2C9pBF/1msFXPVT1leZ+rso/qO5FPTWJL5ZKStU?= =?us-ascii?q?9ZkF1zPC6915VcMdtB4jkWXDhAuT+dpse9SNVf2c9qCJ8BOtV/u3DjF65fJZee?= =?us-ascii?q?vWY2taL1yn/F5T8zrU22xDOtFK+kV+hZ5XERGh01J2SCrUkiF/cs/XrP/VDMqF?= =?us-ascii?q?90+/xWCaSIjUV0vDlyBItOBipT2XCjMVtzUGFMs/9GJ6TNb8xcX/4yaAe0NBww?= =?us-ascii?q?CfEqw06E8Vx6kHrifyNysQ5a9DzHUAkvSSkZmLHtliMCqsu/Iz8VV4pIbSk9by?= =?us-ascii?q?fCMw+bgz5Yswtfa05wR5AUGdJF+7YF3YRK4MbNVUGsJjwbUxB4MAI3z+Zfn1ZZ?= =?us-ascii?q?sEqEYSDdERaodfHXvx1vZseRsNSmI+nl/ApckYPnt/04978fSHK4nw2tXcreoJ?= =?us-ascii?q?X4ttGQsUuObqj4OfWmYXDdVDjMkQywhbA8ApnW5SjcLhRUJIRhxHo5ZZjhFXTL?= =?us-ascii?q?Mg5YJ6IaIEpbUb51aclcruBdfc9kd74D+bVxCRKfWhPvBIuvoeFDLlnJQTTeKz?= =?us-ascii?q?uO8vCjoY3J97PQUu7gadKQx3bcX614JI965ifhF7fsz4Be5lL82u1x+UNiVVjG?= =?us-ascii?q?LyeBoczjJgwR/smicVDivpkzEjPIG5pwlWftxkVcd8oWXyKq8Y4XyJVC6HrqTu?= =?us-ascii?q?J4yEfzuvVI97Z48Yk3/6xpycCsKKfQM/tat0FnAgKTBgp36JogG3R/SHpXYu8K?= =?us-ascii?q?L/fdZ6IZgt7yq+rvDawY9AWV+/BFadvAP0zBldS/CjCYSRxAgggBrCUXIRaC2P?= =?us-ascii?q?Gemq97U8ClqfL+2kI37Fi0NgQGw6x15YeY5qqIo/fabxnQzbgBQaXqQ938r7Qy?= =?us-ascii?q?tEOI5P0kkrEOdnZzYwK5DOgXTtQdyXv4zaA20SIsFNvOH7Tk+PNYVnI5mDfgl4?= =?us-ascii?q?p8H1UQFPMUB6CE/Z9CnmcihuzWKsEWcr1YmmmRDxKkFaUCyXGz4SuNPGZlmg3O?= =?us-ascii?q?0w33QW6r6V/2qil4QTfDz9j9iUdVU7i3Cl1UXyW3JU95vjSPPBDrtNrso6g16l?= =?us-ascii?q?85MnD8vtKXiGShIK9XH9H4JNGEJSk0v1cXgZ0qS9yhx48UBN29IM0L/3FmdPve?= =?us-ascii?q?7GGrnDFdrKdbnYbe5duV+vrPF3m6k6Kas6mNxCxfynUgvFE+68qvOevS6NCRWP?= =?us-ascii?q?SnyXoRQDljtAfbWB61sLPbpUgOOUOXyEfLhJAKPtZB0HYj10Hm/+YiT8gx9AVf?= =?us-ascii?q?CobAf+kNpS33ODbv3VmfZM84WTeE3DtKBFL1FkN4F7Im1GL3psLJmm/a+0c0SY?= =?us-ascii?q?loa0znmRt3Ap0gKU039FgY3ioDEAYKaRCBD7GkHF/lIpUAVUgCbxSHwbe7d7wv?= =?us-ascii?q?3UJp3rOg+O/TbOJ7B6oXNfZRlA2Ok0ZBGpIQr6IeRKhwe1hH9K7YvgLiEZToX+?= =?us-ascii?q?D6lXosMv24Ws9a/toDt3Q8/ga/RwGt6ZNC77YHlp+IdrRLYYXXvMxm6Udo+yIP?= =?us-ascii?q?fDRXgBdjlxO5TfwcpOf779jUrpWo7PquVKEqR+kQ7Bg7GWB+j5r2gFA+rtDazO?= =?us-ascii?q?NcRZPPiYX/6g9BOXiKt5jG0xNkM+oBN5qrfKp893UAPyUeIXMOMsaRa/k4+SBt?= =?us-ascii?q?Ky/f511FAsMLftMYJ9HAmQVbh0zmQr1T8dDbGlCAAYdpa88o93b3yCwy8ZYkXe?= =?us-ascii?q?bv9CS2JYvG419QMP1NiiRslNTfpOka2vfSBy0X7mOfaxdr2C+CzIONC/no9+WW?= =?us-ascii?q?1N7UT08GHjIxU4pFJjqC/gynRuyvmJr1UgOU7tLzj48/dUKRQHyxh6cFsqdXHO?= =?us-ascii?q?5eiyX7wCJRFoToiPKUqdas7nVYtkFfGoZp8RLFALlfPol8ORngl8mrWFJzBi3k?= =?us-ascii?q?dcHQaxohpeuWxuAX4+lkMEv+f4AbKAoey73m8XpVUhduSLnus1abQ+0RatVmSP?= =?us-ascii?q?ffo3Fb841gLbEAPESHqJzssDhItEg8ABU1Z78osjxaak7OkRVaW6bwv74BhBUT?= =?us-ascii?q?Udp9uUJXAmKwP2Q+5zvbWqhPiqmeFuAV+C2JTqMSS0VoLj9+QxSt1ZVse7uone?= =?us-ascii?q?hHsmRCniN8vPglzSdrRB69uS3wvaICxygs+LaitDUOoXZFVPmRkz/UCVVfy/QH?= =?us-ascii?q?lbscC3fn6VGnfHkDbZf94Lp5KsTk74Uh5WowYQk7dS0cQeugEz3wj7+PAoGXtd?= =?us-ascii?q?JchR2NuMbJbbKoLygdLLc9yRXlR3dj1AjShhBo/3UXQj+49t8rOJ29Odo5xiqv?= =?us-ascii?q?AWXUb0gD4qVVsMbqrl4LSOw2aU99wGV9zMeIWzcBRMvVG2Y6lgIkc3lLcIpf6R?= =?us-ascii?q?8GEKklmjiIsbdC/gEVeDfbDJ+o+4jRncfN3HkyU81qxmbIqaGfgZMqynJlkctu?= =?us-ascii?q?7iGSoHQSa/DYU8h0D3n9zodf0+3+aOmzve0cTYtmyaihUOUcPcW5/mu2wppqUF?= =?us-ascii?q?e/xrsCB1q5LPMDxrDDXieiTW2XR/+Gc3CInzkjKU7y+RioIUEraMdQsUAyLPHO?= =?us-ascii?q?hphCmA39Sbl0XDmfpUfHzGw/NuMXbwY2uIahewwXQ+8dfuycJek1wP0iE1sBdH?= =?us-ascii?q?7JEjFwC++xq1Ktm5J7O3p460Xgfevt6hzmMMeVGhQcFI7VtIJ++fy7RmKHPn9t?= =?us-ascii?q?1wNyPEhy9+jBE1Qxt+lcc4uenNTKgNR7y+EFfe93MSIhot4Thp5j6Y6M3ceIax?= =?us-ascii?q?7RzZHyKsrOr/iFBf3f00QqemZHUroWYQP1+582PtgnVL3PBbFZpwgTBbAmQJw9?= =?us-ascii?q?MGf87KN0LAZ0cg7LfrS0g9Lqq/mNZpROon/Z8FMwID3bux0Zxfy+VRZ7YIyyh3?= =?us-ascii?q?XuPJAwQSpMr8ZjChtjAIRCGsANohG5A5GKgqG7it6w+0R8u+MQt6r/FOzKh5yF?= =?us-ascii?q?2NBJVoVerWmMOyzcTP1zi1lhpvy7n/OF1572E86kctQBAqwzeXLIcr/LGM2ELz?= =?us-ascii?q?uKPs/tMxpd/6W0zKNyUhLXYjvwGaWBqnvgfNh+4E5z8oViffGbmDE15qvaw/Pq?= =?us-ascii?q?bntavT+npHWEcpxF4wqOTc7XWh9PAd+C6nxkBuVDb4Lx+fxINZonx8KG4hJb6y?= =?us-ascii?q?5L28+IZaOmqxmIkm5yc5PWKAPLxjw2VI8RaECzOE0tjGvbgnHQBXBVKM+0b8Jq?= =?us-ascii?q?hYDRRjDq+kY5vWwhaGlbFiK8SdOcNWYcwc6WfgCG9AtXSd0EmrjzMRoju6mzT/?= =?us-ascii?q?R4EolUkuWt8rMcmJBmLD+ZAIAOOyDWMa8zJTdaE//OuEltZxkIrrw4cpk6aILI?= =?us-ascii?q?I04dNkqEjyTowl2GmRnwdtqxxOOKLTwQ/3Fv0b3Iy35PqhO/tPLfhdfsBvSRTZ?= =?us-ascii?q?f5W7b3Ny4jXyvSETEzF0mu0U2pt/oNoLyTJmJJ5hhAayaJAUsfq75iqfDZCnTa?= =?us-ascii?q?3PV5e58Hj+zcXDr/Hmkw3pE/HClG/W3EBbIjHA3SfnmryD5HtRatK9dM9Hbhfr?= =?us-ascii?q?veza1QDb84GIxJJ6mBTsfVY7ZTITsljD8eIumUZNravvAy1VeeHjhRKLXB6FDL?= =?us-ascii?q?FB3eefeb3T++GNxM54U=3D?= X-IPAS-Result: =?us-ascii?q?A2CMBAC4VWta/wHyM5BcGwEBAQEDAQEBCQEBAYM/A4FaJ45?= =?us-ascii?q?1jXaCAplXJodDWBQBAQEBAQEBAQIBaiiCOCQBgkcDAwECJAVNAwMJAQEfHwoIA?= =?us-ascii?q?wFTBgESBYowAwGyCTolg3EBAYY/AQEIAQEBASQThD+CFYM/hl0Eh2sBBIpjmTC?= =?us-ascii?q?VWQ2UKJkbNiKBUHCCfIJVHIEsATt3jiwBAQE?= Received: from tarius.tycho.ncsc.mil ([144.51.242.1]) by emsm-gh1-uea11.NCSC.MIL with ESMTP; 26 Jan 2018 16:24:26 +0000 Received: from prometheus.infosec.tycho.ncsc.mil (prometheus [192.168.25.40]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id w0QGOPt2023488; Fri, 26 Jan 2018 11:24:25 -0500 Received: from tarius.tycho.ncsc.mil (tarius.infosec.tycho.ncsc.mil [144.51.242.1]) by prometheus.infosec.tycho.ncsc.mil (8.15.2/8.15.2) with ESMTP id w0QEXZBH037516 for ; Fri, 26 Jan 2018 09:33:35 -0500 Received: from goalie.tycho.ncsc.mil (goalie [144.51.242.250]) by tarius.tycho.ncsc.mil (8.14.4/8.14.4) with ESMTP id w0QEXaMv007401; Fri, 26 Jan 2018 09:33:36 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A1B8CABOO2taWycbGNZdHAEBAQQBAQoBA?= =?us-ascii?q?YM/A4FaJ5xsggKXRIIXHYUoAoIdVhYBAQEBAQEBAQIGGhWGAgYnBU0QIB8SQxQ?= =?us-ascii?q?GAQ0FijgBsl46JYNxAQGGPwEBAQEBAQQBAQEBAQEBAQEfE4Q/ghWDP4ZdBIdrA?= =?us-ascii?q?QSKY5kwlVkNlCiZGyUBggJwgnyCVRwZgRMBO3eOLAEBAQ?= X-IPAS-Result: =?us-ascii?q?A1B8CABOO2taWycbGNZdHAEBAQQBAQoBAYM/A4FaJ5xsggK?= =?us-ascii?q?XRIIXHYUoAoIdVhYBAQEBAQEBAQIGGhWGAgYnBU0QIB8SQxQGAQ0FijgBsl46J?= =?us-ascii?q?YNxAQGGPwEBAQEBAQQBAQEBAQEBAQEfE4Q/ghWDP4ZdBIdrAQSKY5kwlVkNlCi?= =?us-ascii?q?ZGyUBggJwgnyCVRwZgRMBO3eOLAEBAQ?= X-IronPort-AV: E=Sophos;i="5.46,416,1511845200"; d="scan'208";a="184423" Received: from emsm-gh1-uea11.ncsc.mil ([214.29.60.35]) by goalie.tycho.ncsc.mil with ESMTP; 26 Jan 2018 09:33:36 -0500 IronPort-PHdr: =?us-ascii?q?9a23=3AugqQkhdforJN+ly4F6Ys/4VqlGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc27bRKN2/xhgRfzUJnB7Loc0qyK6/mmATRIyK3CmUhKSIZLWR4BhJ?= =?us-ascii?q?detC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+?= =?us-ascii?q?KPjrFY7OlcS30P2594HObwlSizexfa5+IA+qoQnNq8IbnZZsJqEtxxXTv3BGYf?= =?us-ascii?q?5WxWRmJVKSmxbz+MK994N9/ipTpvws6ddOXb31cKokQ7NYCi8mM30u683wqRbD?= =?us-ascii?q?VwqP6WACXWgQjxFFHhLK7BD+Xpf2ryv6qu9w0zSUMMHqUbw5Xymp4rx1QxH0li?= =?us-ascii?q?gIKz858HnWisNuiqJbvAmhrAF7z4LNfY2ZKOZycqbbcNgHR2ROQ9xRWjRcDI28?= =?us-ascii?q?cYUBAekPM+FaoInzqFQBsQCzBRWwCO711jNFnGP60bE83u88EQ/GxgsgH9cWvX?= =?us-ascii?q?nTtNX6KrsSXv6vzKXS0zrDae5Z1inn6IfTdRAhu/6MUKlrccrWz0kuFxnJgUmX?= =?us-ascii?q?qYzgJj6Y0PkGvWuD7+d4S+6jlmEqpxtvrjWg3MsglIvEipgbx13A7Sl0zoQ4Kc?= =?us-ascii?q?elREN1ZdOoCoZcuiGbOodsXM8vR2dlszsgxLIco560Zi0KxYwnxxHBb/yHdJCF?= =?us-ascii?q?4g/7VOmKPDh0mXZoeKqliBqu8EWs0PPzWdex0FZRoSpJiNzMuWoM1xzX8MSHT/?= =?us-ascii?q?p9/kO51TaO0QDc9P1ELFgqmabGJJMt2KA8m5UJvUjdHCL6gkv7gauOekUh4Oeo?= =?us-ascii?q?6uDnYrv8pp+bMo95khvwPboymsOhG+Q0KAcAX26G9uuizr3s5kr5QK9FjvAtia?= =?us-ascii?q?nZt5baJMQBqqGlBA9V154v6wyjADe+zNQYgX4HIUpeeB2alIjkIE3OIfDkAve/?= =?us-ascii?q?hFSgijFrx+vcMbH7DZXNKWbDmq/7fblh805c1BYzzddH6pJPFL4BJPPzWknstN?= =?us-ascii?q?3XFRI5Lwy1zPrnCNV6zI8eX3mPDbWDPKPdtl+I+LFnH+7ZXIYIvH7YLP8/6ra6?= =?us-ascii?q?lXYknXcFdLStmJ4Qb2q1WP9hJhPdKUHwj88BHGFChQ83SOjnmRXWSjJIT2qjVK?= =?us-ascii?q?I7oDcgAcSpCpmVAsiAmr2KlB+yBJxNLjRLElmWEGzAb4yeWuwUbCuZL4lmiDNS?= =?us-ascii?q?EfCDQooszlmLsxXgyqEveujd/yAD85al0d9v/ezIvRYo/DdwAoKW1GTbCylYl2?= =?us-ascii?q?UJSjt+/r1lrkF70R/X3aF+gvFcF/RW6vdNWwE9JdjXyOksT5jeXR/ONvOERFih?= =?us-ascii?q?WNnuVT01Q94/xMUCS1xwF9WrklbI2C/8R/dBjLGPBZop4orAznPxIIB70H+A26?= =?us-ascii?q?4/2R1uFs9OM3C2w7Vy/BXJBpLY1kCem7uueIwC0yPXsmSO12yDuAdfSgEmFe2R?= =?us-ascii?q?WXEZe1uTrtnj4E7GZ6GhBK5hMQZbz8OGbKxQZYutxXRAS/CrHdPaZWur0zO1BB?= =?us-ascii?q?CHwZuWYYbqcnlb1yLYXgxMxwkX5n/DOQUgCyOJqmbFBXl2D1Xtbkjwt+5kpyX/?= =?us-ascii?q?BgUPwhuFYgVMn/z92hcRge2aAbtHxb8etyoJqzxwGEe7mdnRDozTiRBmefAIed?= =?us-ascii?q?4h7U0B2GTVuhZ3OYavB7tlgE9YeANy6RC9ny5rA5lNxJB55EghyxB/fOfBiAtM?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0C6BgD1O2taWycbGNZdHAEBAQQBAQoBA?= =?us-ascii?q?YM/A4FaJ5xsggKXRIIXHYUoAoIdVhYBAQEBAQEBAQIBBRoVXoI4JAGCRwYnBU0?= =?us-ascii?q?QIB8SQxQGAQ0FijgBslo6JYNxAQGGPwEBAQEBAQQBAQEBAQEBAQEfE4Q/ghWDP?= =?us-ascii?q?4ZdBIdrBYpjmTCVWQ2UKJkbJQGCAnCCfIJVHBmBEwE7d44sAQEB?= X-IPAS-Result: =?us-ascii?q?A0C6BgD1O2taWycbGNZdHAEBAQQBAQoBAYM/A4FaJ5xsggK?= =?us-ascii?q?XRIIXHYUoAoIdVhYBAQEBAQEBAQIBBRoVXoI4JAGCRwYnBU0QIB8SQxQGAQ0Fi?= =?us-ascii?q?jgBslo6JYNxAQGGPwEBAQEBAQQBAQEBAQEBAQEfE4Q/ghWDP4ZdBIdrBYpjmTC?= =?us-ascii?q?VWQ2UKJkbJQGCAnCCfIJVHBmBEwE7d44sAQEB?= X-IronPort-AV: E=Sophos;i="5.46,416,1511827200"; d="scan'208";a="8596727" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown Received: from upbd19pa06.eemsg.mail.mil ([214.24.27.39]) by emsm-gh1-uea11.NCSC.MIL with ESMTP; 26 Jan 2018 14:33:18 +0000 X-EEMSG-check-005: 0 X-EEMSG-check-006: 000-001;f3a0a296-25e0-4f18-93dc-e48907e9f960 Received: from localhost.localdomain (localhost [127.0.0.1]) by UPDCF3IC04.oob.disa.mil (Postfix) with SMTP id 3zShGP3rCKz63cG; Fri, 26 Jan 2018 14:33:17 +0000 (UTC) Received: from UPBD19PA06.eemsg.mil (unknown [192.168.18.7]) by UPDCF3IC04.oob.disa.mil (Postfix) with ESMTP id 3zShGP2scBz63cF; Fri, 26 Jan 2018 14:33:17 +0000 (UTC) Authentication-Results: upbd19pa06.eemsg.mail.mil; dkim=none (message not signed) header.i=none X-EEMSG-check-008: 292905788|UPBD19PA06_EEMSG_MP6.csd.disa.mil X-EEMSG-SBRS: 3.5 X-EEMSG-ORIG-IP: 37.139.156.29 X-EEMSG-check-002: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0DGAQDHO2tahx2ciyVdGwEBAQEDAQEBCQEBAYVDnGyCApdEgheFRQIIghVWFgEBAQEBAQEBAhMBAQEKCwkIKC+FJAMDJwVNECAfElcGAQ0FijmyWjolg3EBAYY/AQEBAQEFAQEBAQEBASEJAQmEP4IVgz+GXQSHawWKY5kwlVkNlCiZGyYJgXlwgnyCVRAMgSwBO0A3jiwBAQE X-IPAS-Result: A0DGAQDHO2tahx2ciyVdGwEBAQEDAQEBCQEBAYVDnGyCApdEgheFRQIIghVWFgEBAQEBAQEBAhMBAQEKCwkIKC+FJAMDJwVNECAfElcGAQ0FijmyWjolg3EBAYY/AQEBAQEFAQEBAQEBASEJAQmEP4IVgz+GXQSHawWKY5kwlVkNlCiZGyYJgXlwgnyCVRAMgSwBO0A3jiwBAQE Received: from seldsegrel01.sonyericsson.com ([37.139.156.29]) by upbd19pa06.eemsg.mail.mil with ESMTP; 26 Jan 2018 14:33:16 +0000 X-Authentication-Warning: seldlx23035.corpusers.net: 23059638 set sender to peter.enderborg@sony.com using -f X-EEMSG-check-009: 444-444 From: To: Paul Moore , Stephen Smalley , Eric Paris , James Morris , Daniel Jurgens , Doug Ledford , , , , Ingo Molnar , , "Serge E . Hallyn" Date: Fri, 26 Jan 2018 15:32:40 +0100 Message-ID: <20180126143241.23108-5-peter.enderborg@sony.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <20180126143241.23108-1-peter.enderborg@sony.com> References: <20180126143241.23108-1-peter.enderborg@sony.com> MIME-Version: 1.0 X-Mailman-Approved-At: Fri, 26 Jan 2018 11:22:23 -0500 Subject: [PATCH v2 4/5] selinux: Use pointer to switch policydb and sidtab X-BeenThere: selinux@tycho.nsa.gov X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Security-Enhanced Linux \(SELinux\) mailing list" List-Post: List-Help: Cc: Peter Enderborg Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP From: Peter Enderborg This i preparation for switching to RCU locks. To be able to use RCU we need atomic switched pointer. This adds the dynamic memory copying to be a single pointer. It copy all the data structures in to new ones. This is an overhead for writing rules but the benifit is RCU. Signed-off-by: Peter Enderborg --- security/selinux/ss/services.c | 139 +++++++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 61 deletions(-) diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 2a8486c..81c5717 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -2064,76 +2064,67 @@ static int security_preserve_bools(struct policydb *p); */ int security_load_policy(void *data, size_t len) { - struct policydb *oldpolicydb, *newpolicydb; + struct policydb *oldpolicydb; struct sidtab oldsidtab, newsidtab; struct selinux_mapping *oldmap = NULL, *map = NULL; struct convert_context_args args; - struct shared_current_mapping *new_mapping; struct shared_current_mapping *next_rcu; - + struct shared_current_mapping *old_rcu; u32 seqno; u16 map_size; int rc = 0; struct policy_file file = { data, len }, *fp = &file; - oldpolicydb = kzalloc(2 * sizeof(*oldpolicydb), GFP_KERNEL); - if (!oldpolicydb) { - rc = -ENOMEM; - goto out; - } - new_mapping = kzalloc(sizeof(struct shared_current_mapping), - GFP_KERNEL); - if (!new_mapping) { - rc = -ENOMEM; - goto out; - } - newpolicydb = oldpolicydb + 1; - next_rcu = kmalloc(sizeof(struct shared_current_mapping), GFP_KERNEL); - if (!next_rcu) { - rc = -ENOMEM; - goto out; - } - if (!ss_initialized) { - crm = kzalloc(sizeof(struct shared_current_mapping), - GFP_KERNEL); - if (!crm) { + struct shared_current_mapping *first_mapping; + + first_mapping = kzalloc(sizeof(struct shared_current_mapping), + GFP_KERNEL); + if (!first_mapping) { rc = -ENOMEM; goto out; } avtab_cache_init(); ebitmap_cache_init(); hashtab_cache_init(); - rc = policydb_read(&crm->policydb, fp); + rc = policydb_read(&first_mapping->policydb, fp); if (rc) { avtab_cache_destroy(); ebitmap_cache_destroy(); hashtab_cache_destroy(); + kfree(first_mapping); goto out; } - crm->policydb.len = len; - rc = selinux_set_mapping(&crm->policydb, secclass_map, - &crm->current_mapping, - &crm->current_mapping_size); + first_mapping->policydb.len = len; + rc = selinux_set_mapping(&first_mapping->policydb, secclass_map, + &first_mapping->current_mapping, + &first_mapping->current_mapping_size); if (rc) { - policydb_destroy(&crm->policydb); + policydb_destroy(&first_mapping->policydb); avtab_cache_destroy(); ebitmap_cache_destroy(); hashtab_cache_destroy(); + kfree(first_mapping); goto out; } - rc = policydb_load_isids(&crm->policydb, &crm->sidtab); + rc = policydb_load_isids(&first_mapping->policydb, + &first_mapping->sidtab); if (rc) { - policydb_destroy(&crm->policydb); + policydb_destroy(&first_mapping->policydb); avtab_cache_destroy(); ebitmap_cache_destroy(); hashtab_cache_destroy(); + kfree(first_mapping); goto out; } - security_load_policycaps(&crm->policydb); + security_load_policycaps(&first_mapping->policydb); + crm = first_mapping; + + smp_mb(); /* make sure that crm exist before we */ + /* switch ss_initialized */ ss_initialized = 1; seqno = ++latest_granting; selinux_complete_init(); @@ -2148,30 +2139,44 @@ int security_load_policy(void *data, size_t len) #if 0 sidtab_hash_eval(&crm->sidtab, "sids"); #endif + oldpolicydb = kzalloc(sizeof(*oldpolicydb), GFP_KERNEL); + if (!oldpolicydb) { + rc = -ENOMEM; + goto out; + } + + next_rcu = kzalloc(sizeof(struct shared_current_mapping), GFP_KERNEL); + if (!next_rcu) { + kfree(oldpolicydb); + rc = -ENOMEM; + goto out; + } - rc = policydb_read(newpolicydb, fp); + rc = policydb_read(&next_rcu->policydb, fp); if (rc) goto out; - newpolicydb->len = len; + next_rcu->policydb.len = len; + read_lock(&policy_rwlock); /* If switching between different policy types, log MLS status */ - if (crm->policydb.mls_enabled && !newpolicydb->mls_enabled) + if (crm->policydb.mls_enabled && !next_rcu->policydb.mls_enabled) printk(KERN_INFO "SELinux: Disabling MLS support...\n"); - else if (!crm->policydb.mls_enabled && newpolicydb->mls_enabled) + else if (!crm->policydb.mls_enabled && next_rcu->policydb.mls_enabled) printk(KERN_INFO "SELinux: Enabling MLS support...\n"); - rc = policydb_load_isids(newpolicydb, &newsidtab); + rc = policydb_load_isids(&next_rcu->policydb, &newsidtab); if (rc) { printk(KERN_ERR "SELinux: unable to load the initial SIDs\n"); - policydb_destroy(newpolicydb); + policydb_destroy(&next_rcu->policydb); goto out; } - rc = selinux_set_mapping(newpolicydb, secclass_map, &map, &map_size); + rc = selinux_set_mapping(&next_rcu->policydb, secclass_map, + &map, &map_size); if (rc) goto err; - rc = security_preserve_bools(newpolicydb); + rc = security_preserve_bools(&next_rcu->policydb); if (rc) { printk(KERN_ERR "SELinux: unable to preserve booleans\n"); goto err; @@ -2189,7 +2194,7 @@ int security_load_policy(void *data, size_t len) * in the new SID table. */ args.oldp = &crm->policydb; - args.newp = newpolicydb; + args.newp = &next_rcu->policydb; rc = sidtab_map(&newsidtab, convert_context, &args); if (rc) { printk(KERN_ERR "SELinux: unable to convert the internal" @@ -2204,8 +2209,9 @@ int security_load_policy(void *data, size_t len) /* Install the new policydb and SID table. */ /* next */ + security_load_policycaps(&next_rcu->policydb); + read_unlock(&policy_rwlock); write_lock_irq(&policy_rwlock); - memcpy(&next_rcu->policydb, newpolicydb, sizeof(struct policydb)); sidtab_set(&next_rcu->sidtab, &newsidtab); security_load_policycaps(&next_rcu->policydb); oldmap = crm->current_mapping; @@ -2213,8 +2219,9 @@ int security_load_policy(void *data, size_t len) next_rcu->current_mapping_size = map_size; seqno = ++latest_granting; - write_unlock_irq(&policy_rwlock); + old_rcu = crm; crm = next_rcu; + write_unlock_irq(&policy_rwlock); /* Free the old policydb and SID table. */ policydb_destroy(oldpolicydb); @@ -2226,17 +2233,16 @@ int security_load_policy(void *data, size_t len) selinux_status_update_policyload(seqno); selinux_netlbl_cache_invalidate(); selinux_xfrm_notify_policyload(); + kfree(oldpolicydb); + kfree(old_rcu); rc = 0; goto out; - err: kfree(map); sidtab_destroy(&newsidtab); - policydb_destroy(newpolicydb); - + policydb_destroy(&next_rcu->policydb); out: - kfree(oldpolicydb); return rc; } @@ -2795,54 +2801,65 @@ int security_get_bools(int *len, char ***names, int **values) goto out; } - int security_set_bools(int len, int *values) { + struct shared_current_mapping *next_rcu, *old_rcu; int i, rc; int lenp, seqno = 0; struct cond_node *cur; - write_lock_irq(&policy_rwlock); - + next_rcu = kzalloc(sizeof(struct shared_current_mapping), GFP_KERNEL); + read_lock(&policy_rwlock); + old_rcu = crm; + memcpy(&next_rcu->policydb, &old_rcu->policydb, + sizeof(struct policydb)); rc = -EFAULT; - lenp = crm->policydb.p_bools.nprim; + lenp = next_rcu->policydb.p_bools.nprim; + if (len != lenp) goto out; for (i = 0; i < len; i++) { if (!!values[i] != - crm->policydb.bool_val_to_struct[i]->state) { + next_rcu->policydb.bool_val_to_struct[i]->state) { audit_log(current->audit_context, GFP_ATOMIC, AUDIT_MAC_CONFIG_CHANGE, "bool=%s val=%d old_val=%d auid=%u ses=%u", - sym_name(&crm->policydb, SYM_BOOLS, i), + sym_name(&next_rcu->policydb, SYM_BOOLS, i), !!values[i], - crm->policydb.bool_val_to_struct[i]->state, + next_rcu->policydb.bool_val_to_struct[i]->state, from_kuid(&init_user_ns, audit_get_loginuid(current)), audit_get_sessionid(current)); } if (values[i]) - crm->policydb.bool_val_to_struct[i]->state = 1; + next_rcu->policydb.bool_val_to_struct[i]->state = 1; else - crm->policydb.bool_val_to_struct[i]->state = 0; + next_rcu->policydb.bool_val_to_struct[i]->state = 0; } - for (cur = crm->policydb.cond_list; cur; cur = cur->next) { - rc = evaluate_cond_node(&crm->policydb, cur); + for (cur = next_rcu->policydb.cond_list; cur; cur = cur->next) { + rc = evaluate_cond_node(&next_rcu->policydb, cur); if (rc) goto out; } + read_unlock(&policy_rwlock); + rc = 0; + write_lock_irq(&policy_rwlock); seqno = ++latest_granting; - rc = 0; -out: + crm = next_rcu; write_unlock_irq(&policy_rwlock); +out: if (!rc) { avc_ss_reset(seqno); selnl_notify_policyload(seqno); selinux_status_update_policyload(seqno); selinux_xfrm_notify_policyload(); + } else { + kfree(next_rcu); } + kfree(old_rcu); + return rc; }