From patchwork Tue Nov 22 19:40:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Jurgens X-Patchwork-Id: 9442039 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 04B8E605EE for ; Tue, 22 Nov 2016 19:45:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E54B31FF0B for ; Tue, 22 Nov 2016 19:45:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D70D51FF13; Tue, 22 Nov 2016 19:45:26 +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, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from emsm-gh1-uea11.nsa.gov (emsm-gh1-uea11.nsa.gov [8.44.101.9]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 403A11FF0B for ; Tue, 22 Nov 2016 19:45:25 +0000 (UTC) X-IronPort-AV: E=Sophos;i="5.31,682,1473120000"; d="scan'208";a="995907" IronPort-PHdr: =?us-ascii?q?9a23=3A2x3vfBTLC/mJy+UHJgoSR1kEG9psv+yvbD5Q0YIu?= =?us-ascii?q?jvd0So/mwa68YBOPt8tkgFKBZ4jH8fUM07OQ6PG7HzZdqs/b7zgrS99lb1c9k8?= =?us-ascii?q?IYnggtUoauKHbQC7rUVRE8B9lIT1R//nu2YgB/Ecf6YEDO8DXptWZBUhrwOhBo?= =?us-ascii?q?KevrB4Xck9q41/yo+53Ufg5EmCexbal8IRiyowjdrNcajIttJqos1BfEoGZDdv?= =?us-ascii?q?hLy29vOV+dhQv36N2q/J5k/SRQuvYh+NBFXK7nYak2TqFWASo/PWwt68LlqRfM?= =?us-ascii?q?TQ2U5nsBSWoWiQZHAxLE7B7hQJj8tDbxu/dn1ymbOc32Sq00WSin4qx2RhLklD?= =?us-ascii?q?sLOjgk+27ZkMxwiL9QrgynqRJx3oXYZJiZOOdicq/Ye94RWGhPUdtLVyFZAo2y?= =?us-ascii?q?cZYBAeQCM+hfrYb9qUMOoBmjCQSiC+zg1jBGiWHt3aAhz+QsExvL0BA6Et4Srn?= =?us-ascii?q?jZqsj+OqcIUeCyyanF1TvNYOlQ2Tzg7IbIbwohof6SUrJ2asra1E4iGB7fgVWW?= =?us-ascii?q?qIzqITeV1uYWvmie8eVgUeavhHQhqwF2rTmj3Nsjio7Mho8MzF3P6CZ3wJ4tKN?= =?us-ascii?q?GlR0N2bsSoHZtNuy2AKYd7Td0uT3t1tCoi17ELvZC2cDIFxZkl3RLTdv2KfoiS?= =?us-ascii?q?7h7+SuqcJTF1j29/dr2lnRa9602gx/X5VsmzzVlFsDJIksLJtnARzxzT7dWHSu?= =?us-ascii?q?dl8kehxzmP0wfT5/lYIU8uj6rbKoMhwqUqmpoPsUXMAi/2mELsgK+Qakok4fSn?= =?us-ascii?q?5/7iYrXnop+QL450igfgPaQygsGzHOs1PwcUU2Wb5OiwzqPv8ELnTLlQk/E6iq?= =?us-ascii?q?zZv4rbJcQfqK65GQhV0oM75hakETim1NUYnX8aLFNKYR6IlI/pO0zIIP/kE/i/?= =?us-ascii?q?mE+hkCtrxv/aPr3hBY/BLn7YkLj7Z7p95ElcyBQrwdBF+51UEq0BIO70WkLput?= =?us-ascii?q?zYFAU2MwqozObmE9VwzYYeWXqOAqOAK6PTv0SI6vgoI+mWa48foCz9JOQ95/7y?= =?us-ascii?q?kX85nkcQfaqz0psUb3C4A+9rI0aDbnrvhdcBDH0Gvg0kTOzlkFeCSyJcZ26uX6?= =?us-ascii?q?Ig4TE2EJipAprZRoCsnrOBxjy2EYdKaWBDEFyMFm3od4qcUfcWdC2SOtNhkiAD?= =?us-ascii?q?VbW5S48uyxWutAv9y7d8KurU5zEYtZXm1Ndv/eHTkgsy9TNsBcSHz26NV310nn?= =?us-ascii?q?8PRzIux6B/r1Z9ylCY0ahkmPFYDtpT5/RHUwc/L5HcyfZ2C9bsVQLdZt2JUkqp?= =?us-ascii?q?Qs26ATEtSdI829EPbFx5G9W+kB/DxTGqDqQLl7OVHpw76b/c333rK8Z60XbG27?= =?us-ascii?q?Erj0M6TctXKW2mmql/+hDPB4HUjkqZlryldaAH0SHR82eDyHaBs1tDUA5sS6nF?= =?us-ascii?q?W24QZlfOp9Tj+kzCV6OuCaggMgZZz86CK69Katn3glVdX/rsIsrRY3i2m2uqAh?= =?us-ascii?q?aI3LyMZpLwe2oBxCXdFFQEkwcL8HmbLwc+Gj2urHzQDD1hDl/gf0Ps/vNkqHOn?= =?us-ascii?q?UEA01RuGb0t/2Lqp4hQVn+CTS+sP3rIYvycssyt0HFeh0NLKDNqAvRBtc7lcYd?= =?us-ascii?q?M65ldH2nnUtwh8PpymNa9inFkefx5wv0P02BV9Ep9AntQyrHM20ApyLrqV0FdA?= =?us-ascii?q?dzODwZD8I6bXJXf2/BCuba7Wx17f3c2N+qcX6fQ4rVTjsx2yFkY49XVozcVV2W?= =?us-ascii?q?OG5prWFAoSTY7xUkEv+hhgoLHaZi096J3O1XJwNqm1vCTP28k0BOQ50RasZdBf?= =?us-ascii?q?MLmLFAXqCc0VG9CuKPA2m1iudh8EJPpd9LMwP8+8bfSKwrWkPOFknDK6imRH5p?= =?us-ascii?q?tw0keQ+yp6Te7Hw4wJw/eG0QubTz38lkuustjrmYBYYjEfBm+/ySz9CIFPYK1/?= =?us-ascii?q?ZpgLBnmqI82z2Np+nYThW3hG+16/H1kGwtOmeQKOb1zh2g1dzUcXrmKhmSuj1D?= =?us-ascii?q?F0kC8mrqyE3CzI3eviaAALOmlRRGltlV3sO5S7j8gGXEi0aAgkjAWl5UDnyKVA?= =?us-ascii?q?uqR/KXTcQUdScyjwMW5iTrO6tqCebM5X9JMorSJXXfykYV+AV779pwAX3D/iH2?= =?us-ascii?q?tCxDE3bj+qtY//nxBgj2KdNnlzpmLDec5s3Rff+MDcRflJ0zocWSZ3lCLaBle5?= =?us-ascii?q?P9im59mUkYnMsvymXWK7SpJTaTXrzZ+HtCaj/W1lGwC/n/Stld3/Cwc61zP72M?= =?us-ascii?q?dwVSjTsRb8eZfk176hMe59ZUloA0L869BmFY5gnIswg4sQ2XcEiZmP+3oIj3vz?= =?us-ascii?q?O81B2a3idHoNWSILw9nN7QjrwkJjKG6Jx4X8VniGzMtuecS1YmQM2i0n98BKEq?= =?us-ascii?q?CU7L5akiRpvlq0twXRYeJynj0F0/sh9GYag/0VuAoq1iidDbASElVCPS3sjxSI?= =?us-ascii?q?89e+ob5RZGmxbbiwz1Zxksq5DL6cuA1cXmj2eos6Fy9q8sp/KE7M0GH06oz8fd?= =?us-ascii?q?nfd9YTthmKnBfck+haMog+m+EMhSV5JWL9pmEqxPQjjRNwx526upaIK3l19qKj?= =?us-ascii?q?HhFYLiH1Z98U+jz1l6ZShMiX05qqHpp7HjULW5vpQOmyHz0OsPTrLQGOECczqn?= =?us-ascii?q?2DA7rQARef6Ft6r3LIC52rMWuXK2MBzdV6XxSdKk1fgBoPXDUmkJ45Fwaqy9bn?= =?us-ascii?q?cEhl5zAe/Fr4pgFLyuJyOBn1Sn3fqxuwajcoVJifKwJb7hlc6EjOL8Oe6ONzHz?= =?us-ascii?q?1f/pC6rQyCNHKUaBpSAWEOQEyECEjpPqOy6tnY7+iYGu2+IuPTbrWVt+NRTfiI?= =?us-ascii?q?xYi13Yt45DuMLd+APnp/D/0hwEVPR3R5G9nfmzoVUSwbjj7Nb8mYpBa8/S17tM?= =?us-ascii?q?a//+r3WAj3/4uAF6NSMclz+xCxmaqDLPSfhDhjJjZXyJwM3mTFyKMF014MkS5u?= =?us-ascii?q?eCeiEa8auS7LUq3QhrddDwQHZCNrKMtI86U80xFWNs7ahdP10bh4g+UoBFhbTl?= =?us-ascii?q?Phm9umZcoQL2G6LlPHC16BNK6aKj3T38H3faS8RKVKg+VbrRKwpyiUHlTkPjSb?= =?us-ascii?q?iTbpURWvPvtNjCGfJxNev468fgxqCWj5Q9Lscge7P8NvjT0q3b00gWvHNXIbMT?= =?us-ascii?q?h5aU9NtLqQ7CJGjfV5AGNB9H1lIveHmyuC8+bYLZMWvudxDSRvi+JW+nI6xKVJ?= =?us-ascii?q?7CtcXvx6hDPSrsJyo1GhiuSPyTpmUB5QpTtQgYKLuktiOavH+ZlcRXbE/BUN7W?= =?us-ascii?q?COBBgQodtqFMHvsbhKytfTjKLzNCtC89XM8MsdAcjUNNyIMH4/PhrsBjHUEBEF?= =?us-ascii?q?TD6wOGHYn0xSjveS9niPoZg7rpjjg50OS7BBWFwyDPMaBVxvHMYeL5dvQjMkjb?= =?us-ascii?q?mbgdYO5XWgthbRQN5XvpPAVvKJHfXgMjCZjaJHZxsJ27/4K5ocNpHj0Ux4dlZ6?= =?us-ascii?q?hJjKG1bXXd1VuC1ucBQ0r1tX/3hkUmIz21noZRis4H8JCPG0mRA2ihNkYesz9D?= =?us-ascii?q?bg+VE3KUTWpCEoikk+hc3lgSyNcD72NKq/QIZWCyzyt0csLJz7Rwd1YBaokkN6?= =?us-ascii?q?LjfEQKhdj7x6dWBkkAXco4dAGeZATa1YZx8d3eyYaO820VRdtyqn3lRK6vHfCZ?= =?us-ascii?q?t4kwsrf4WsoGxc1AJ+dt41JLDQJapTwlhWmK2Oojei1votzw8GO0YN7GSSdTYG?= =?us-ascii?q?uEwSKLYpOjGo8fZq6QyenDtDY3MBWOA2rfJv7E89PP6Azy342b5ZNk+xL/CfL7?= =?us-ascii?q?+eu2XYkc6IRUkw2V0Ol0hE+rh7ysgjc0yJV0w1y7uRDRsJP9LYKQ5Jd8pS6GTT?= =?us-ascii?q?fSGWvOXW3511O4S9Fub1Te6Br6sbnkWkHAM1EIsW9cQBAoOg0EfGIsf7NLQF0w?= =?us-ascii?q?ki5Bz3JFWZC/REYBGLkC0Hos6lyp93wYldKyoSAWV6KSW4+qzbpgk0j/qfRN02?= =?us-ascii?q?eGsVXpMYNnIqX823gzJZv3VFDDmwzuIZyAiD4iThqSTRDDjzdcFsaO2SZRxyFN?= =?us-ascii?q?G84S8//LSuiV7L7pXeIHn3NdRlutDR5+MVuYyHBuhVTbZjrUjThZNUR3uwU27A?= =?us-ascii?q?CdS1PYT/a5EwbdzoDXa3SkawizY0T8jtItmiNq2IgAHuRYZTtomUxisuOtS8Fj?= =?us-ascii?q?4EHRd8vu8D5L9maQ0FfZU7fQbitx4iOKynPAeYztKuTn62JjRISflS1v+1aKFJ?= =?us-ascii?q?zyUydO+602EvTos6zuWt9k4NXp4KhAnExfm/f4leTTTzGntFdgXAuCo5lmxhNu?= =?us-ascii?q?Iszec62x7HrEcTPCuKdONzbmxIpdY8BUmdIX9uEGo3W0ecjZbf4g6rx70S5S1d?= =?us-ascii?q?n9dI3u1Ft3j+uoTfbiq1VqK2s5vYry0uYMM6rK12NIzsPtGJtIjCnjDFSpnfrB?= =?us-ascii?q?GFWjagF/VGgthQPD5YQP5QlG45O8wJo5ZO5FEtWcc5I7xPDKgsqa6waTp4EyEd?= =?us-ascii?q?0S8ZW5mH3DwYjee2w6HamQuIcJQ+LBwEt41PgsEHXC5sZSMRv7SuV5nMl2CeVG?= =?us-ascii?q?gEPgMT7QVK5AIPko9wf+/l4IrUTJ9C0TFWufd0XjHNFpZ261vxUnuWjkTgSPW9?= =?us-ascii?q?j+yp2hpfzfL23dkAQhF/DEldx+BNm0spNLF4MbIQsZLQvTOSc0P1on7twvO8JF?= =?us-ascii?q?ZN0c3Ua0H4DI3duGvySCET5X0URY5KyHHeD5sSkBF0aKc1q1pSPo+qYEH+5yYr?= =?us-ascii?q?x45xBbm3Sdirx0o5rXYBXyqlCcBBC/xgsF7NWz1oeJGrqJTkO5VOWWBc4pudpE?= =?us-ascii?q?lFkE91KS621YJcK91R4j4LRDVPri+ds8G0SM1fwsJ2DpgMI9l5u3fhGKNLJpmR?= =?us-ascii?q?o3squrPx0H/V4TY8v0mmxD+rAa+3U/pZ/3ECGgUuP2metk4vD+43/2fO7lzNt0?= =?us-ascii?q?t78/1dBreRkUV7uCx9EYxWBjZVyXClKEx+THlcvOVAMqvVd9FTTuIvahCxIxw+?= =?us-ascii?q?DeAp30iX8kFuh3v5ZDZytgRC8SDHQwY0TTUVgqvqmTAGqMGnPiEVRolVYjo/dC?= =?us-ascii?q?fKNRibmTxJsxlCcU1qXY4WAspd8bEBwYRU5tbCSVqrKSwdRxNiOB433eZdmEJe?= =?us-ascii?q?vkiVYjzSDQ2tdfnTqBJ3ZtuRoNSvLPvn4AdNkpnnv/wg96UfW32mnhWgQcrAoI?= =?us-ascii?q?Dhtt2FrFeOebz8M+27f3/OUibAggy3hbg5EZbG5S7TPxRHK5Ni03orfYDhCXLX?= =?us-ascii?q?PRRBP68bP1FbVbxgZtpbvuBXfNRkeKEU+a93Gh2IWBXvGJC1rPZcKlbfXzPeLz?= =?us-ascii?q?+O8uanu4Lc8aTdSfT8ZsyL33vHX7h3MYlk5jbmALrqzIte+lbs2vh36EN6SF/G?= =?us-ascii?q?MySfo9T9PA8L49OidkT6tJ0zATzWGItwkGbqxkxYasUXRTel/Y8Fx5Nf8nn8U+?= =?us-ascii?q?V40lL8sOdK7blr9ZE346x1ycezParSK+5VsVVgAhiPAgVl7IstDXN6R2BMZu8R?= =?us-ascii?q?NPbRcrgYjc/0reD3DLYb6BqP++xWcdHHPV3OmtGjCjGAThxJhAUBpiQcLguSzf?= =?us-ascii?q?6FnLJ7Rti+qOjlwE0t5UO+LhkcwLBr+4iE5rKCpPXLYBvJ0bgERq/qS9v1rrQo?= =?us-ascii?q?oE6S5PsklLsUdmx0ZQ2nHvIdWdQGxmf816Aq0D4jE9/eH7L65vFPTXU5nijvm5?= =?us-ascii?q?plBVUZBusUHaaX/YRZhmo4ne3ZOcERcqBGgGmPDgSoEr4FyX6s8CuXO3JoghTB?= =?us-ascii?q?3hD/W2+z60X2rSBgSyvW09jjilZVVqWwBUpKQyWmI0t4vy2UPAr0tNv3vr847F?= =?us-ascii?q?oqPWzlqt2NknehOLJNEMHlItyTPzU0rkoNjJItXtyvxZwbGd2lLdcV63F+a/vT?= =?us-ascii?q?5nilkyBfvqhHgJDe7duN+vXNGnmgjbOVpKmRxDxCzXg4p14/4Mi6Nv7S/92KX+?= =?us-ascii?q?io12EJQid6vwvOQRu1qrvFoFAQIkGL31nEmIsRPtFBx3Y4ykDm6/InQNIy8gVe?= =?us-ascii?q?CpjPZ/cGpTDyNzv731CfbM4pWSWE1TtYAE71G0FiGKcgwGLwoN7JlXDI9l0qR4?= =?us-ascii?q?lwclfqhRlpAIQ4N00t8lkXwiwMEQQXbxCUEq2oD1z/LYQYTUgDdQiH3L+id6c2?= =?us-ascii?q?3Ex82Kmg6/PIYOxnGaUNKuhSgRKUkFhcAJIWvrUUQKhgdF9F6K7Xug/iBpD8UP?= =?us-ascii?q?jnjnoxO+e6QsJb8cAFr3st+Bu/Rx675Jhf6LYUlY6HebRZYZjWu8B89V1o6SQI?= =?us-ascii?q?dixXjxh1lwm5XvwEpOD//tjbt4Kl6v60W6YxW+oX9xY1B2Nkj5vzmVwjus/Y1+?= =?us-ascii?q?NdSo3TlIT+/xtAI2aQt4bGzxZ8KeQPK4WxfLZj7XkHJDYRJ2gIPdWIb/kw+Sht?= =?us-ascii?q?MC/c51ZaGMMDecsYPNbRmQBTkkDpRKtT+dTfGlCCDYd8adsl4Hf2yDA68Js8Tv?= =?us-ascii?q?zv6CSsKpDF8lFBJfVDgztwlNjavuga3eLSCDQL4XmecxV1zTmNy4OTBPbs/eWB?= =?us-ascii?q?09XUV1IaHiEoU4dSPieC+Re9SuqziprpThue6tXvj5ImaEKQWnuxkbwKsqlSF+?= =?us-ascii?q?5AliL73j9ZGoDumf2Vt9us6G1KtlxIC4tz6QPKGL9fP5phIxj4kNekRlRkDCvl?= =?us-ascii?q?ZM7UbgYuuPaRxuoU5uV+ME3+ZZMUIh0a0L/67HtVQRFoSLHoolaYU+URZMFlSP?= =?us-ascii?q?PftHxV75xvK7MXNliHuJPqtitIqEwxAAIxZ78/sidadlLXkANIVKj6vr8Aig0B?= =?us-ascii?q?Ud92okJMFmewN3g45zXZT6hVi7ORCPMN+DWJUqMOS1loMj95Qx6t2pVufLupnf?= =?us-ascii?q?ZdvmxaniN9pOUq3CFnRRu9vy3svKEN2TM79bGmtTUBp2ZKTuGDnCfJE1lDyuoF?= =?us-ascii?q?jbsEAXb49VO8eGUDbJf14LR/JMTg65Mu43IkbBUnYi0JQOWgCybrj6+SBYyPqt?= =?us-ascii?q?1cjgaXuMrSdb+zMTQSNrMlxBLhWXd93AbenBJz/WoFWDqg6sErJJmnNcYj2CWo?= =?us-ascii?q?BXDRdEwQ7aNRrMvxqVkLQfM5aVNlx2Vi3NaIRikJRMHUAGY1iQ4kaWRYf55Z7x?= =?us-ascii?q?8VCbUoiC6SvqZa5gEUfCvUEoO994nSncfJ2WE9TdBuxmLXuq2KmIgn0Hhkm9No?= =?us-ascii?q?9C6Bpm4ed+vCU89jGnLzzJtQyfTiZ/WxteAKUJdmyLWkUPIZLsmj+He52JZ0VU?= =?us-ascii?q?+h3LgeGUS2MPMbzLfBTyilUXGYWfiMc2WUmjY5M03y5RqvLlAsasdFtUw9MuzE?= =?us-ascii?q?hpFCkQ3tS7V0STuMpVXD1mwsLfsadx4quIegYwEFV/AeZ+6AJeU12/0+DFwMb2?= =?us-ascii?q?PVHStoFeC5rEShnI9hO3Vv+U/6e/ji8hj6MNuOHRkJCZbarpl1+fOgXGKAN3hg?= =?us-ascii?q?zBl8PERv8uffEFMxtvRCfJmNh9jQgM970fUEd/drPi0xoNkTmphs6YOMyseFbQ?= =?us-ascii?q?nRzoruJdHSuvWYDePQz0AremFCTLUUegL054Q/Pt48RbLTB79ZsgoGCag9Wpwh?= =?us-ascii?q?OH/79LtoIwNrbg7ReLO0j9HqpuKXZptUoHrW4UgrLCrHvh0Dy+C0TRZlYJywgH?= =?us-ascii?q?XyOp8wTCpbr9JxEhtmAJdPG8QYogupG56UgqC7hMOv9E5hvu8KsLbwCurU29ij?= =?us-ascii?q?2IVxRZda71SRPDnNHKlrnlhljuOqj/fH1pn+F9jvecsAVOdhWW7Fdr7GEZmjKj?= =?us-ascii?q?KUJM3zZVRK87iC37JlSh+Rfjz2X7KatC24M/Vp+UE7yo1+fOrOwz0h9rXb2Nrp?= =?us-ascii?q?Z2FHvSeutn+JO4FZ7FzNH+DeWAhUSfWd+mZ/AaIXdZf09PsJMdE629iT/Q1z7D?= =?us-ascii?q?VE0MuYLKmtqUDC2l57dZ3FNkvmxT45VpMRLRS8L0Qsm2nZpWrZAXtHM8ikJtNh?= =?us-ascii?q?gNGPDhzi/0Nxg30iZnZdGmr0QtecIWwb28OlZA2W7w9KDs8Dn+itdkIisK29V/?= =?us-ascii?q?VoMI1fmeq2rLUHjcppKybXSchfJS7fML92PjtXDuXIv1UofB8Es74rVYcxZJiO?= =?us-ascii?q?Jl4HMUiaxSP11wvC3lX+d8aw26aRPCYW7nJHwqrH0TdWpAm5vu2Wj9b+ULDfcJ?= =?us-ascii?q?H2XPnSMDcqVjGaWTQ+C0Cp9km4u/AcpvqXPX8fokwIYiKVEAMcvbtgod/UDm/S?= =?us-ascii?q?gu1jYIYKiOqBWy/uVCJ0jrEyCThPtUCNRfoDCAbXYmT9j2tcogyiO+RM8Wjrbr?= =?us-ascii?q?KC2qpVQOsWAo1Wfv2eWdvYduhUJy00mTUBJOa8Y9rcoq420l3SVmQZCajI+0Oa?= =?us-ascii?q?TEONXPycwyjkXZ4Uv4gpoCYo/MzfnjNvGaTSI7mfvyKu8pK/jCuAu+3eU24tY1?= =?us-ascii?q?YvgOIDG2mM2x9AJ3sBC94LuUHhWKmAZ1xD1Hgxk+JhxwcMeBhvUn1pynBZgvS9?= =?us-ascii?q?GspZSV4Sl2OuR/sGYUt4DDMq4E+K/BP9YcYatcDVWWBe6qMGSZABI/kw9InXJK?= =?us-ascii?q?wQze4y3DJopSw1rySQAlBGgwKb7aXQBqN8x7xF5Wk+5f12WF+AQy/HeGjd1oWm?= =?us-ascii?q?E95PxTtpoX381crUueZtNL9BqoF8HlgFHCx2JtfH/T9dT274wg2ysAinHGfWHD?= =?us-ascii?q?VM6zYRJDcaXv1y0vQ+qxHMMNHb5gfYr6s8rGOzABuPT7+z34ZGTMru0EHwciVQ?= =?us-ascii?q?WSm6HJBx7PBWnZAdZr1jLYWmCkrANSDmBxiZoDgI/RPn5LOxAo4CzmETnqsrMt?= =?us-ascii?q?3BRYQGDdDFmjp/xjIA35cGyyuRD93Dd7X47dB1ATcFMZz5AXniZNTTOC7/susf?= =?us-ascii?q?1ZwtP0mXYeQeemlcts0YjGDvOn+h/8/S4zWCI6ejPWi1MccPPZCqo2xDhqLIMI?= =?us-ascii?q?T+ofdFDCxUruAHlcrcuCWG+XynatGtcyq7m00k?= X-IPAS-Result: =?us-ascii?q?A2HXBACXnzRY/wHyM5BdHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAR+BWaRZlmwkiCBTAQEBAQEBAQECAQJfKIIzGoIcAgEDAQIkExQgCQIDA?= =?us-ascii?q?wkBARcIIQgIAwEtFREHBwsFGASITASxSD0qAoskAQEIAQEBASOPMxEBhX0BBI5?= =?us-ascii?q?si2KQf4oahhCRclVeNB6DKhyBX3CFXoIuAQEB?= Received: from unknown (HELO tarius.tycho.ncsc.mil) ([144.51.242.1]) by emsm-gh1-uea11.nsa.gov with ESMTP; 22 Nov 2016 19:45:22 +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 uAMJjJXC018586; Tue, 22 Nov 2016 14:45:20 -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 uAMJf59h031445 for ; Tue, 22 Nov 2016 14:41:05 -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 uAMJf23U017043 for ; Tue, 22 Nov 2016 14:41:05 -0500 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A1B5BAC6njRY/4GlL8FdHAEBBAEBCgEBgzgBAQEBAYF4pFmSX4QUhiECgm0BAgEBAQEBAmIohGkCAQMnUAIQGAgxVwcSiHGxUT2LUAEBCAIllUIFjmyLYpB/kCqRclWBEh6DKhyBXzw0iAwBAQE X-IPAS-Result: A1B5BAC6njRY/4GlL8FdHAEBBAEBCgEBgzgBAQEBAYF4pFmSX4QUhiECgm0BAgEBAQEBAmIohGkCAQMnUAIQGAgxVwcSiHGxUT2LUAEBCAIllUIFjmyLYpB/kCqRclWBEh6DKhyBXzw0iAwBAQE X-IronPort-AV: E=Sophos;i="5.31,682,1473134400"; d="scan'208";a="5839017" Received: from emsm-gh1-uea10.corp.nsa.gov (HELO emsm-gh1-uea10.nsa.gov) ([10.208.41.36]) by goalie.tycho.ncsc.mil with ESMTP; 22 Nov 2016 14:41:04 -0500 IronPort-PHdr: =?us-ascii?q?9a23=3Ak5cMlBD1SVPMjb+vRFXkUyQJP3N1i/DPJgcQr6Af?= =?us-ascii?q?oPdwSPT+oMbcNUDSrc9gkEXOFd2CrakV0KyM7uu5AzdIyK3CmUhKSIZLWR4BhJ?= =?us-ascii?q?detC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+?= =?us-ascii?q?KPjrFY7OlcS30P2594HObwlSijewZb1/IA+ooQjRucUanJVuJ6gswRbVv3VEfP?= =?us-ascii?q?hby3l1LlyJhRb84cmw/J9n8ytOvv8q6tBNX6bncakmVLJUFDspPXw7683trhnD?= =?us-ascii?q?UBCA5mAAXWUMkxpHGBbK4RfnVZrsqCT6t+592C6HPc3qSL0/RDqv47t3RBLulS?= =?us-ascii?q?wKLCAy/n3JhcNsjaJbuBOhqAJ5w47Ie4GeKf5ycrrAcd8GWWZNW8BcXDFDDIyh?= =?us-ascii?q?dYsCF+oPM/hFoYfzpFUAqhmxBQe3Ce/z1jNFnGP60Lcm3+g9FwzNwQwuH8gJsH?= =?us-ascii?q?TRtNj7Or0dUeaox6fM0DXDdfxW1in76IjTbxsspuyDUqh2ccrQ10YvEwHFg06V?= =?us-ascii?q?qYP7OzOV0v4Cs26c7+tvT+6gl2knqwRorzWp28wiiZHJi5oIxl3A+yh12ok4KN?= =?us-ascii?q?+iREJmYNOpEIFcuzyEO4ZyRM4pXntmtzwgyrIcvJ62ZCgKx4ojxx7Yc/GHdpaH?= =?us-ascii?q?4hbnVOmLJzd4g31kdKijiBa160Sgy+n8WtG10FZMsCVFjsHBum0J2hHd8MSKRf?= =?us-ascii?q?lw8l281TuO1w3f8PxILV4wmKbDLp4u2L8wlp4dsUTZGS/2nV37g7KMeUUi++in?= =?us-ascii?q?9eDnYrf9q5+ZKYB0jgX+Pb4omsy4DuU0KBQBX2+e+eikzr3s4VX5QKlWjv0xiq?= =?us-ascii?q?TZq47VJcAapq6/Hg9U3Z0u6wq/Dji60NQYmmMLLFReeB2dlYTpNFbOIO6rRcu4?= =?us-ascii?q?1l+sijZw2NjdOaD6R47KKj7EirilNa509kp00AMuyZVa4JVOB/cKJ/e3ElT9r/?= =?us-ascii?q?TEHxQ5NEqy2O+hB9JjkssTQWuVA7SxKKrIsESQ4uskLq+LfoBR8Dr5JvQr4OTi?= =?us-ascii?q?pWU0lV8UYe+i2p5TIGu1F/IgI0iXfWvEg9EdHGNMtQ07CKTqgVnESzlIanCpQ6?= =?us-ascii?q?U35Rk0DYunCcHIQYX+rqaG2XKXF5seRH1cBV2KCj+8e4yCWvoIagqXL8tlmzoD?= =?us-ascii?q?Rf6qTIp3hkLmjxPz17cydrmcwSYfr5+2kYEtv+A=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0F4BAA+njRY/4GlL8FdHAEBBAEBCgEBF?= =?us-ascii?q?wEBBAEBCgEBgw0BAQEBAYF4pFmSX4QUhiECgm0BAQEBAQEBAQIBAl8ogjMaAYI?= =?us-ascii?q?bAgEDJ1ACEBgIMVcHEohxsVA9i1ABAQgCJZVCBY5si2KQf5AqkXJVgRIegyocg?= =?us-ascii?q?V88NIgMAQEB?= X-IPAS-Result: =?us-ascii?q?A0F4BAA+njRY/4GlL8FdHAEBBAEBCgEBFwEBBAEBCgEBgw0?= =?us-ascii?q?BAQEBAYF4pFmSX4QUhiECgm0BAQEBAQEBAQIBAl8ogjMaAYIbAgEDJ1ACEBgIM?= =?us-ascii?q?VcHEohxsVA9i1ABAQgCJZVCBY5si2KQf5AqkXJVgRIegyocgV88NIgMAQEB?= X-IronPort-AV: E=Sophos;i="5.31,682,1473120000"; d="scan'208";a="1226318" Received: from mail-il-dmz.mellanox.com (HELO mellanox.co.il) ([193.47.165.129]) by emsm-gh1-uea10.nsa.gov with ESMTP; 22 Nov 2016 19:41:02 +0000 Received: from Internal Mail-Server by MTLPINE1 (envelope-from danielj@mellanox.com) with ESMTPS (AES256-SHA encrypted); 22 Nov 2016 21:41:01 +0200 Received: from x-vnc01.mtx.labs.mlnx. (x-vnc01.mtx.labs.mlnx [10.12.150.16]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id uAMJenMX005134; Tue, 22 Nov 2016 21:40:59 +0200 From: Dan Jurgens To: chrisw@sous-sol.org, paul@paul-moore.com, sds@tycho.nsa.gov, eparis@parisplace.org, dledford@redhat.com, sean.hefty@intel.com, hal.rosenstock@gmail.com Subject: [PATCH v5 3/9] selinux lsm IB/core: Implement LSM notification system Date: Tue, 22 Nov 2016 21:40:32 +0200 Message-Id: <1479843638-67136-4-git-send-email-danielj@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1479843638-67136-1-git-send-email-danielj@mellanox.com> References: <1479843638-67136-1-git-send-email-danielj@mellanox.com> X-Mailman-Approved-At: Tue, 22 Nov 2016 14:41:47 -0500 X-BeenThere: selinux@tycho.nsa.gov X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Security-Enhanced Linux \(SELinux\) mailing list" List-Post: List-Help: Cc: linux-rdma@vger.kernel.org, linux-security-module@vger.kernel.org, selinux@tycho.nsa.gov MIME-Version: 1.0 Errors-To: selinux-bounces@tycho.nsa.gov Sender: "Selinux" X-Virus-Scanned: ClamAV using ClamSMTP From: Daniel Jurgens Add a generic notificaiton mechanism in the LSM. Interested consumers can register a callback with the LSM and security modules can produce events. Because access to Infiniband QPs are enforced in the setup phase of a connection security should be enforced again if the policy changes. Register infiniband devices for policy change notification and check all QPs on that device when the notification is received. Add a call to the notification mechanism from SELinux when the AVC cache changes or setenforce is cleared. Signed-off-by: Daniel Jurgens --- v2: - new patch that has the generic notification, replaces selinux and IB/core patches related to the ib_flush callback. Yuval Shaia and Paul Moore v3: - use notifier chains. Paul Moore v4: - Seperate avc callback for LSM notifier. Paul Moore v5: - Fix link error when CONFIG_SECURITY is not set. Build Robot --- drivers/infiniband/core/device.c | 53 ++++++++++++++++++++++++++++++++++++++++ include/linux/security.h | 23 +++++++++++++++++ security/security.c | 20 +++++++++++++++ security/selinux/hooks.c | 11 +++++++++ security/selinux/selinuxfs.c | 2 ++ 5 files changed, 109 insertions(+) diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index 5b42e83..7b6fd06 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include #include @@ -82,6 +84,14 @@ static LIST_HEAD(client_list); static DEFINE_MUTEX(device_mutex); static DECLARE_RWSEM(lists_rwsem); +static int ib_security_change(struct notifier_block *nb, unsigned long event, + void *lsm_data); +static void ib_policy_change_task(struct work_struct *work); +static DECLARE_WORK(ib_policy_change_work, ib_policy_change_task); + +static struct notifier_block ibdev_lsm_nb = { + .notifier_call = ib_security_change, +}; static int ib_device_check_mandatory(struct ib_device *device) { @@ -344,6 +354,40 @@ static int setup_port_pkey_list(struct ib_device *device) return 0; } +static void ib_policy_change_task(struct work_struct *work) +{ + struct ib_device *dev; + + down_read(&lists_rwsem); + list_for_each_entry(dev, &device_list, core_list) { + int i; + + for (i = rdma_start_port(dev); i <= rdma_end_port(dev); i++) { + u64 sp; + int ret = ib_get_cached_subnet_prefix(dev, + i, + &sp); + + WARN_ONCE(ret, + "ib_get_cached_subnet_prefix err: %d, this should never happen here\n", + ret); + ib_security_cache_change(dev, i, sp); + } + } + up_read(&lists_rwsem); +} + +static int ib_security_change(struct notifier_block *nb, unsigned long event, + void *lsm_data) +{ + if (event != LSM_POLICY_CHANGE) + return NOTIFY_DONE; + + schedule_work(&ib_policy_change_work); + + return NOTIFY_OK; +} + /** * ib_register_device - Register an IB device with IB core * @device:Device to register @@ -1075,10 +1119,18 @@ static int __init ib_core_init(void) goto err_sa; } + ret = register_lsm_notifier(&ibdev_lsm_nb); + if (ret) { + pr_warn("Couldn't register LSM notifier. ret %d\n", ret); + goto err_ibnl_clients; + } + ib_cache_setup(); return 0; +err_ibnl_clients: + ib_remove_ibnl_clients(); err_sa: ib_sa_cleanup(); err_mad: @@ -1098,6 +1150,7 @@ static int __init ib_core_init(void) static void __exit ib_core_cleanup(void) { + unregister_lsm_notifier(&ibdev_lsm_nb); ib_cache_cleanup(); ib_remove_ibnl_clients(); ib_sa_cleanup(); diff --git a/include/linux/security.h b/include/linux/security.h index 342ca4c..0a5de0c 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -69,6 +69,10 @@ struct audit_krule; struct user_namespace; struct timezone; +enum lsm_event { + LSM_POLICY_CHANGE, +}; + /* These functions are in security/commoncap.c */ extern int cap_capable(const struct cred *cred, struct user_namespace *ns, int cap, int audit); @@ -161,6 +165,10 @@ struct security_mnt_opts { int num_mnt_opts; }; +int call_lsm_notifier(enum lsm_event event, void *data); +int register_lsm_notifier(struct notifier_block *nb); +int unregister_lsm_notifier(struct notifier_block *nb); + static inline void security_init_mnt_opts(struct security_mnt_opts *opts) { opts->mnt_opts = NULL; @@ -377,6 +385,21 @@ int security_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen); struct security_mnt_opts { }; +static inline int call_lsm_notifier(enum lsm_event event, void *data) +{ + return 0; +} + +static inline int register_lsm_notifier(struct notifier_block *nb) +{ + return 0; +} + +static inline int unregister_lsm_notifier(struct notifier_block *nb) +{ + return 0; +} + static inline void security_init_mnt_opts(struct security_mnt_opts *opts) { } diff --git a/security/security.c b/security/security.c index 7d3bf2f..40326d4 100644 --- a/security/security.c +++ b/security/security.c @@ -33,6 +33,8 @@ /* Maximum number of letters for an LSM name string */ #define SECURITY_NAME_MAX 10 +static ATOMIC_NOTIFIER_HEAD(lsm_notifier_chain); + /* Boot-time LSM user choice */ static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] = CONFIG_DEFAULT_SECURITY; @@ -98,6 +100,24 @@ int __init security_module_enable(const char *module) return !strcmp(module, chosen_lsm); } +int call_lsm_notifier(enum lsm_event event, void *data) +{ + return atomic_notifier_call_chain(&lsm_notifier_chain, event, data); +} +EXPORT_SYMBOL(call_lsm_notifier); + +int register_lsm_notifier(struct notifier_block *nb) +{ + return atomic_notifier_chain_register(&lsm_notifier_chain, nb); +} +EXPORT_SYMBOL(register_lsm_notifier); + +int unregister_lsm_notifier(struct notifier_block *nb) +{ + return atomic_notifier_chain_unregister(&lsm_notifier_chain, nb); +} +EXPORT_SYMBOL(unregister_lsm_notifier); + /* * Hook list operation macros. * diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 09fd610..2d7a7c1 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -170,6 +170,14 @@ static int selinux_netcache_avc_callback(u32 event) return 0; } +static int selinux_lsm_notifier_avc_callback(u32 event) +{ + if (event == AVC_CALLBACK_RESET) + call_lsm_notifier(LSM_POLICY_CHANGE, NULL); + + return 0; +} + /* * initialise the security for the init task */ @@ -6325,6 +6333,9 @@ static __init int selinux_init(void) if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET)) panic("SELinux: Unable to register AVC netcache callback\n"); + if (avc_add_callback(selinux_lsm_notifier_avc_callback, AVC_CALLBACK_RESET)) + panic("SELinux: Unable to register AVC LSM notifier callback\n"); + if (selinux_enforcing) printk(KERN_DEBUG "SELinux: Starting in enforcing mode\n"); else diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c index 72c145d..d3f9192 100644 --- a/security/selinux/selinuxfs.c +++ b/security/selinux/selinuxfs.c @@ -177,6 +177,8 @@ static ssize_t sel_write_enforce(struct file *file, const char __user *buf, avc_ss_reset(0); selnl_notify_setenforce(selinux_enforcing); selinux_status_update_setenforce(selinux_enforcing); + if (!selinux_enforcing) + call_lsm_notifier(LSM_POLICY_CHANGE, NULL); } length = count; out: