Received: by 10.223.164.221 with SMTP id h29csp1145327wrb; Fri, 13 Oct 2017 12:36:55 -0700 (PDT) X-Google-Smtp-Source: AOwi7QAdpZTk3tdayQu772cf0yh9apFkOpUe9+1DQ+jAw5JbkhkUZpmSWMbWIPlTecghWskfKPYe X-Received: by 10.98.220.220 with SMTP id c89mr2222253pfl.167.1507923415490; Fri, 13 Oct 2017 12:36:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507923415; cv=none; d=google.com; s=arc-20160816; b=iqNDaSPLHYXp7RyQyxlPTLagfAlFHg43AKrEFudmlbphRRfe6NkY/UT6b+98uc0iFv PLwT4LRF62LxdW1+NDqPyYQtywTNAm38RD8e0bTmpwRd0pKizoH5VclgfEnKgMtqafEP E/U6ELa6kxaoSZHfvn2a5l+xODQnJqy29gXQx8LveDcBg+oHewVU/0YEYqKdQzsa20te 7+FBRlaOZYVbVc4E/o74FhTyLI/BwV7bQ+YVQvgzb/qp0agMw9jXAlII+ZreK6f+tofH 9ifrRz5wny/cbCxq9zNcvsI/t9w/z7S2TG0i6L9GXEDhuNcXDDMN5gjJOJXEk+wyWn+f irNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:spamdiagnosticmetadata :spamdiagnosticoutput:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature:arc-authentication-results; bh=02Z3Eg+g5k8UbLiTPgobvRPAKHTwdsoC9R26trZkvkQ=; b=i8GD8BCu54s0BBI/RQgs1aiTS4DcGEJtW7Yc9U2vhLKoMANlOZGYCIk9eWA3o9d1P2 QO2aId39XAX+r0KaBZ+Wm/3Ilg6ios3DDCDG0N5qd2wb391Oo9i/zOVyQ+uHQ2d9yC9y P+yWSnoD5g0JigVoFPs651/Nyljgh3F+SNak3Em4bQeukhDTp1MedduU3G/NAUwCyha9 nm4CfWY6mvmb53Kvom9c8BouK1vZ7voVtWCHpJVL6bAz+p7eVWsTizHvpavayXbgzSAp lOMWewxxVFHuZw9PV4KOoAiZkczsawCRgkZFmx9XN2I9Lg1Azm6TUt0ryZIiyw9AidAu sVZw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@EPAM.onmicrosoft.com header.s=selector1-epam-com header.b=N3yhja6e; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g12si1002102plt.452.2017.10.13.12.36.41; Fri, 13 Oct 2017 12:36:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@EPAM.onmicrosoft.com header.s=selector1-epam-com header.b=N3yhja6e; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753723AbdJMTej (ORCPT + 99 others); Fri, 13 Oct 2017 15:34:39 -0400 Received: from mail-db5eur01on0081.outbound.protection.outlook.com ([104.47.2.81]:19168 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753679AbdJMTeg (ORCPT ); Fri, 13 Oct 2017 15:34:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=EPAM.onmicrosoft.com; s=selector1-epam-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=02Z3Eg+g5k8UbLiTPgobvRPAKHTwdsoC9R26trZkvkQ=; b=N3yhja6e3l4uFeSXuhTIE17QEu5+02o+jBbZ+NofxbOCzfBIxFaFjcRB5yE8OgZKe3d22oOFP+YGzLCZYZ3DYpoPYnvRyq2ggIaqcDwGU/fIioe3DCZ//YdbADR/PlQ15jwZgEOC9dhR6+urn3g0jnFukk0vETNKsu7T/G9AXX0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Volodymyr_Babchuk@epam.com; Received: from EPUAKYIW2556.kyiv.epam.com (85.223.209.52) by AM4PR0301MB2131.eurprd03.prod.outlook.com (2603:10a6:200:4d::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Fri, 13 Oct 2017 19:34:33 +0000 Received: by EPUAKYIW2556.kyiv.epam.com (sSMTP sendmail emulation); Fri, 13 Oct 2017 22:34:30 +0300 From: Volodymyr Babchuk To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, tee-dev@lists.linaro.org, Jens Wiklander Cc: Volodymyr Babchuk , volodymyr_babchuk@epam.com Subject: [PATCH v1 12/14] tee: optee: enable dynamic SHM support Date: Fri, 13 Oct 2017 22:32:42 +0300 Message-Id: <1507923164-12796-13-git-send-email-volodymyr_babchuk@epam.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1507923164-12796-1-git-send-email-volodymyr_babchuk@epam.com> References: <1506621851-6929-1-git-send-email-volodymyr_babchuk@epam.com> <1507923164-12796-1-git-send-email-volodymyr_babchuk@epam.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [85.223.209.52] X-ClientProxiedBy: AM0PR0102CA0054.eurprd01.prod.exchangelabs.com (2603:10a6:208::31) To AM4PR0301MB2131.eurprd03.prod.outlook.com (2603:10a6:200:4d::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5e4b4733-eac7-4700-1049-08d512716e5f X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:AM4PR0301MB2131; X-Microsoft-Exchange-Diagnostics: 1;AM4PR0301MB2131;3:KftVnSGRv1aMXHRLnjJZwiUzD5p77TIljKANT4QgMVKn9jbCSp8++t014gLx/sbgIFwZ27ZEtivHVmVOhk5Q5w0s0mdKXlC2iT+QYLEGb0JpUK0pPy3Gte+11nL0DBsL0kWZYFYM6qrsIOBgKLhUZ4Ntp8FUBVpbCo/eLWsYcNBr+CwA6JtQvH6oxNM+4xlddB2XYredebzOJwY9b9jEsDF21dnF3+M3lNqZHINE45SM/VtlLFoFyPM8zuV60rrM;25:vL52l6SNdy8up3b22Uk+MTIbIDsg4GEMbRvstC+mHM2oCuRFV6IrGvjxSVr1yI9aKoEHd/tqtETT+fh3QJStUncR1EHS6JZ8LmEepAmKDYB+ZyI7Om6wZOH6raaSCHfajQP7aLU8nfeZdYi09ejCPGYo29gM4I7hsy9UnPf3zn0szhE7FrV+kgkJ5+x3tJNARdaf61+4Hq5hiV2s5Thg2/NKz0wvYoB92WLvJYrvgj97eHFHaJhI8HVsHCtukxIWB3UBWXqMc2Eu1jw7mbWx4rqVq5vg2OGcXWSN+QCQC1RGSZM0EHLGGxuGaqXm4rNL2lKYsCRkcL15VfjO1aM8vA==;31:SiRcy2FFM0pKS05J6akYtOm+v8EziHseGcVUWpDsMglQ/N1mOaImbnLp/+y4tew405jIZcA7JlUadIeac5jz8KrQeM2RMaWrCX9NM1rYf56KsGHYP3gkQDw/NlOBiLtvOCJ7oQOVNFwB4g4M7+pvopPf+TU0bx7pjdTf3d6xS5ACi8fnqKdXn2+j4uw7XmIf8tyh/MlIVmebBYjqVA/eN7dDNpCkvxXddXYUYeClnEk= X-MS-TrafficTypeDiagnostic: AM4PR0301MB2131: X-Microsoft-Exchange-Diagnostics: 1;AM4PR0301MB2131;20:gHWvYgZwnc19fjX10SZcuXYFoKl8I+EAVoWqeoq6Ko21G3E4i1cCoETJStuXL8cNEVjB7HPfd/PjXDaNueGJpUWbqjci2afFVxjsXAjapBPkgyRCF13KGNdnTT3YP+YKB/aVYsFjG2nyoFP//jYaeeQJ/0C3gJ8dJWje63P2YoeqJ4pU9SYSyLg/o3bzfaebthzxktLtgi4gWvvK9CorqTVO9O0b1QgfRgJzYBMo2Bx/NWZj/Irxh9IlKvc38UYn3UQOug/IfXHjfiGuDlJWBsIx6NgtuisxJpCyJCQY60yPQpDSMnqY9cD7Pk8kW7hjIjnhwvAr9bZmKFO0vIv+WqSGaPryGs6R4RMEmaV9p8sm58nSUuA8I0AHdzMPXOm49VU3+f3SiDm/VzWnW83kiOmmXA6URDvq0s7pBUViVzAheYj+SCRErpJ6J2Jlk2e4eq1bvE+tJYxbeBvFmdYssO+1zuwMIy/dkJUc5qP246h8xRfdSkJFjrYXMgP0KK6O;4:eY0J5xHR4W64qE1TrwknSMRx5dawR7NfrBCVpWtnIJwHl7ltpCKrjdF9GFWF4+ozWQPCPTmLIh2T/Hp8UD1+oqiOZHqPLYsW+VAi3kuYIgTJG9wONfJiOV+wTThR225am4naiVnde7WzvCFjZk7L5DkK4g1hAZmjEZT2yOA6YjTju2Rh6CaruAdXFULFo6MQf6pxwiemB5dapmLra4sYxlTiYFPCZWr0Tf16nFYWFRae7Wk0c5GxOh7g+RSDXGlG X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(8121501046)(5005006)(10201501046)(100000703101)(100105400095)(93006095)(93001095)(3002001)(6041248)(20161123562025)(20161123560025)(20161123558100)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:AM4PR0301MB2131;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:AM4PR0301MB2131; X-Forefront-PRVS: 04599F3534 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(346002)(376002)(199003)(189002)(316002)(16586007)(48376002)(42186006)(86362001)(50466002)(6116002)(47776003)(97736004)(2906002)(80792005)(478600001)(101416001)(7736002)(72206003)(305945005)(106356001)(36756003)(105586002)(107886003)(5003940100001)(8936002)(33646002)(122856001)(68736007)(6666003)(76176999)(39060400002)(50226002)(50986999)(189998001)(4326008)(3846002)(53936002)(66066001)(5660300001)(8676002)(6916009)(2950100002)(81166006)(81156014);DIR:OUT;SFP:1101;SCL:1;SRVR:AM4PR0301MB2131;H:EPUAKYIW2556.kyiv.epam.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (protection.outlook.com: epam.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM4PR0301MB2131;23:xYrlTGOyetzU+G2LbTtDpMkg2Zx2dYJrIZ9zuHO?= =?us-ascii?Q?D5itGM2l98kRskZSHSN0MWg/Wd8zGwzRWuUlnD717chmj/jx3t0BbHqXD+gs?= =?us-ascii?Q?Mrlkf6l2YnnOsxZtewpy7FkTIEzNf8RciCIDaZKjtrqza/rvy9ALP82vVSFF?= =?us-ascii?Q?4xBvG3ThbGwPp9OLWGs2SQkvkc80392IqTG/Nk/Fac4lkTfsSlyYnPHAhtcb?= =?us-ascii?Q?MGm+VjW82bezRwTgeVwVr/gwd3o7ux6Zn+ZfrDQnwMnGNfMh9KQhkanNGE7o?= =?us-ascii?Q?sl/qaadtph/AxPLaJ5vY/LjuRhi4K5X0Fn4sR6ELoVONokT2jecGJ1F4IfyS?= =?us-ascii?Q?+qrNhCOawBny0mPKtO6aiPOVYCDGMuUFuL7xAw0AFdrPXvrnYGIcpkibbh3b?= =?us-ascii?Q?B6pdUCP9FBBVIoz9fwWKcfU/l//NJCGuu2vLbG87WqGRdg4x0nVgaYXwOLdH?= =?us-ascii?Q?uwribQySTKWCSdthN6iTxrU9eyCTCDwZkhAiUxusvTozrZnFVqonp01AurEF?= =?us-ascii?Q?UyfchUPb0JZrsSO21R3aECzDNQ1i946TzeO3b2gvHTOMLfhbkOO0V1Hg/H1l?= =?us-ascii?Q?g77f3qY25FajzFilq++SFA8DIJtSSMJ8r1iNNDpUl98Co4I+8UU9czuEKuml?= =?us-ascii?Q?kLCm79hf6aNAcmCzAKrl+h8GJBt12MyIL7WiTmP34sFtYsY7YMIrW+47aL1x?= =?us-ascii?Q?n3FS1pFoIcD3KH5SIqYjiTl/FpSMN2UtmSnj+J6EeHjCYHim+LxR+NCIMIvK?= =?us-ascii?Q?l4kVg+7hBJe5o8HFCjjAoNw+Ly/WEwpp9yjyLy2ed/PmpILuM9JDjmgaiXQC?= =?us-ascii?Q?GXoxyDDB+alYEO3Hj6gvBsQVXF6gdy/SWgeXHauUyXnslZhgN60wfvX1S2FR?= =?us-ascii?Q?RhwxHTC8qxYP+XLDavx1kmSKrWdmWi17Qm4H1jLV63E67pGDLphRVrjkJGK5?= =?us-ascii?Q?r7p3+ko0zTsqMN5FPqTxYSttiuW+0GHO58Yh4JtCtKjtqpz1Ep2x3owI2JBN?= =?us-ascii?Q?ypmk2flheMiV2CpsvidELJEhpGU7o6T5giEwDzCItoop+gBpJslWKp9YvgYG?= =?us-ascii?Q?ODyCCOKP6rxjSKIpf8zzSlBW5el7r9LS8sKnJi38tg6gyOYYUxg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR0301MB2131;6:MXYX0EnE+OdKPldmQRl56VVeSaw5BZTPw5ZOWc6vyRmOXDtj7ETOXYbMHjlOLSOo3zWHYyQOi2m3ypN5J/PclCNxsikiuQFAz4FFygQKLAMs70pkYJse3Q21lTHpM2LWfi2vRyqhoikYTEpjcO1ciFeK6Kn8butDv+OBDJr+XIXQ4jO52aOnJpW8AYE4ZB/a+oa801Di0r/6z5FxA5QMbh+WqgtlYSJZIqMCTixWgEnyrDcmp10UZARfPsCJpdsATRR5Z5VFp7aR3tEmkNkQWVapjocD43ptW1rNAgx+DFOkbkzhM90cOlZTgipEF2CH09b2fJ5oaYp0QvVmW2CQdg==;5:RaU8vfde2Jn9WueSUZwGiuq34JQpGmgw+dzwkKsAG7b0vpo/1S6PURZQAYOnWOEHGzkJuSFfgeRtdtbi6PQLRK2Fc+sTpfdAjdRJgqcv7sssRqLby3xktQiBs21PKDCKzGYegLtyLTapZ3iDO23iDAsiM7/qztJdihSctmGDHhw=;24:uGvQJiaGRtUT67cUgj2aiYLs3yARpGPQHnCMZH7rIjWRTm9yWXurKQymMUtb4nU5PeUVEzrgGu85FnkO6Hc/rcPIJiqoTvk1qxktmRLsknQ=;7:NQFJJfrlmtChVVtK/vsctkcYEnr37P4tG8nnchfTlkmEfyLfFpXe+edTTJAEf31nCobnMp07oSCvAR3gGRmcj69dBvp9CA/aM0PierTOH79aDcX/BXlAF7Ex/BTml+LjLs8vSm4+1nAymByQLQznHtTpKrg1wpY2HVve4MA7Ty0yo/aAjdBDCM5bXq4/9ZEfU3XyBNrocG6fH5ZcJ+G4RsUTFVCYGxkc28KzQYFBTv4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2017 19:34:33.1526 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b41b72d0-4e9f-4c26-8a69-f949f367c91d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0301MB2131 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Volodymyr Babchuk Previous patches added various features that are needed for dynamic SHM. Dynamic SHM allows Normal World to share any buffers with OP-TEE. While original design suggested to use pre-allocated region (usually of 1M to 2M of size), this new approach allows to use all non-secure RAM for command buffers, RPC allocations and TA parameters. This patch checks capability OPTEE_SMC_SEC_CAP_DYNAMIC_SHM. If it was set by OP-TEE, then kernel part of OP-TEE will use kernel page allocator to allocate command buffers. Also it will set TEE_GEN_CAP_REG_MEM capability to tell userspace that it supports shared memory registration. Signed-off-by: Volodymyr Babchuk --- drivers/tee/optee/core.c | 69 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index dbe5a61..51d5575 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -28,6 +28,7 @@ #include #include "optee_private.h" #include "optee_smc.h" +#include "shm_pool.h" #define DRIVER_NAME "optee" @@ -219,6 +220,10 @@ static void optee_get_version(struct tee_device *teedev, .impl_caps = TEE_OPTEE_CAP_TZ, .gen_caps = TEE_GEN_CAP_GP, }; + struct optee *optee = tee_get_drvdata(teedev); + + if (optee->sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) + v.gen_caps |= TEE_GEN_CAP_REG_MEM; *vers = v; } @@ -397,21 +402,22 @@ static bool optee_msg_exchange_capabilities(optee_invoke_fn *invoke_fn, } static struct tee_shm_pool * -optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm) +optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm, + u32 sec_caps) { union { struct arm_smccc_res smccc; struct optee_smc_get_shm_config_result result; } res; - struct tee_shm_pool *pool; unsigned long vaddr; phys_addr_t paddr; size_t size; phys_addr_t begin; phys_addr_t end; void *va; - struct tee_shm_pool_mem_info priv_info; - struct tee_shm_pool_mem_info dmabuf_info; + struct tee_shm_pool_mgr *priv_mgr; + struct tee_shm_pool_mgr *dmabuf_mgr; + void *rc; invoke_fn(OPTEE_SMC_GET_SHM_CONFIG, 0, 0, 0, 0, 0, 0, 0, &res.smccc); if (res.result.status != OPTEE_SMC_RETURN_OK) { @@ -441,22 +447,49 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm) } vaddr = (unsigned long)va; - priv_info.vaddr = vaddr; - priv_info.paddr = paddr; - priv_info.size = OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; - dmabuf_info.vaddr = vaddr + OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; - dmabuf_info.paddr = paddr + OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; - dmabuf_info.size = size - OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; - - pool = tee_shm_pool_alloc_res_mem(&priv_info, &dmabuf_info); - if (IS_ERR(pool)) { - memunmap(va); - goto out; + /* + * If OP-TEE can work with unregistered SHM, we will use own pool + * for private shm + */ + if (sec_caps & OPTEE_SMC_SEC_CAP_DYNAMIC_SHM) { + rc = optee_shm_pool_alloc_pages(); + if (IS_ERR(rc)) + goto err_memunmap; + priv_mgr = rc; + } else { + const size_t sz = OPTEE_SHM_NUM_PRIV_PAGES * PAGE_SIZE; + + rc = tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, sz, + 3 /* 8 bytes aligned */); + if (IS_ERR(rc)) + goto err_memunmap; + priv_mgr = rc; + + vaddr += sz; + paddr += sz; + size -= sz; } + rc = tee_shm_pool_mgr_alloc_res_mem(vaddr, paddr, size, PAGE_SHIFT); + if (IS_ERR(rc)) + goto err_free_priv_mgr; + dmabuf_mgr = rc; + + rc = tee_shm_pool_alloc(priv_mgr, dmabuf_mgr); + if (IS_ERR(rc)) + goto err_free_dmabuf_mgr; + *memremaped_shm = va; -out: - return pool; + + return rc; + +err_free_dmabuf_mgr: + tee_shm_pool_mgr_destroy(dmabuf_mgr); +err_free_priv_mgr: + tee_shm_pool_mgr_destroy(priv_mgr); +err_memunmap: + memunmap(va); + return rc; } /* Simple wrapper functions to be able to use a function pointer */ @@ -534,7 +567,7 @@ static struct optee *optee_probe(struct device_node *np) if (!(sec_caps & OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM)) return ERR_PTR(-EINVAL); - pool = optee_config_shm_memremap(invoke_fn, &memremaped_shm); + pool = optee_config_shm_memremap(invoke_fn, &memremaped_shm, sec_caps); if (IS_ERR(pool)) return (void *)pool; -- 2.7.4 From 1580327570507056233@xxx Wed Oct 04 11:50:15 +0000 2017 X-GM-THRID: 1579807701882531863 X-Gmail-Labels: Inbox,Category Forums