Received: by 10.223.164.221 with SMTP id h29csp1143850wrb; Fri, 13 Oct 2017 12:35:05 -0700 (PDT) X-Google-Smtp-Source: AOwi7QDyAvoYEe9V9QKnohe+ZrW21vQO7ckwdqHS7k3mP6rp0jqgE0A8XjKyA72fW3Aoit/faum8 X-Received: by 10.99.49.130 with SMTP id x124mr2123817pgx.367.1507923305264; Fri, 13 Oct 2017 12:35:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1507923305; cv=none; d=google.com; s=arc-20160816; b=Er9E8eV/zOFVqCko7j1//pXQzApiDexDJuJHOmgk0aMyQb2t/0Z5nn5RNjxnSdL19Y ZkAr9PVWprje1QEuHBYeKBlUGpMfGKdpI5hiKNbC0W3cmNbHy63QwK6rSLZMqDo84TOu 2Tg2r5q6fGRAfZFyjxG+dG+9N/c6gx3Rltd1yMyi11MtdSqxk3aWuYgvbdJ4gz/M7oKD +Q9gW6D/X9YJq7IUPBQam7jAkW+S0cXgOBr+xQlZZXOdayG8+hV3zW+vwQiytLHO18UH p0TpKv8lcFGDKw6uBBYxhnvijoEGfyNRQzkeoW/IKoURh/AYQItdoqQsgVVzNxDfdIxk iVtQ== 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=/y+Dxe5/kAv72LmW5t5pKqqRIOjFvWlr9VABR7yNikc=; b=S582vQcCayz3BuEaDkbMKArk1ZG+LUAZvp7XBP4gOnDudUydxGTNJiTMzhqn2WA/hS 4SH6Ot6HK5chySQL4gxrArwtmiNqyM9vvDTAsMl5njurbz4a6g+3MvqGJwjSuu1nRFcB WIqzVhwSABgHSg9mnhvEuL1b4iMal1m86LpgJUkD97wsEtr28GPrIz/2SH12gdOyUInx nBETKIulZg7SaQdlcqhmit7Fwz9TyXEmchH+F0MAvNGUr0tozGq81BCD8ehgaMxUQb3h Lh5Wbx10OgGGkkHnozyewM57WKlpo3fOMGaBOkkg13D4DRdungbQDChbgWkm2B8i13ce NDxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@EPAM.onmicrosoft.com header.s=selector1-epam-com header.b=NZU6j/+d; 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 92si1005905plw.386.2017.10.13.12.34.51; Fri, 13 Oct 2017 12:35:05 -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=NZU6j/+d; 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 S1753554AbdJMTeB (ORCPT + 99 others); Fri, 13 Oct 2017 15:34:01 -0400 Received: from mail-eopbgr40072.outbound.protection.outlook.com ([40.107.4.72]:64762 "EHLO EUR03-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751057AbdJMTd6 (ORCPT ); Fri, 13 Oct 2017 15:33:58 -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=/y+Dxe5/kAv72LmW5t5pKqqRIOjFvWlr9VABR7yNikc=; b=NZU6j/+d1dDOAQ5o3MaHsl3EdkSZfFvzFFQr73EU6u3wp8X5lZIqjntXC6Mjfl8ZFCdfRbwvVB0B548uM3FLukjcMIraM61GbQnSW70xSuz6kiAOQfsSZjcE0m7sDiVHGUUa/s0UIyTBcqv70cGzxyRSgH9OKqkoukv/y6Od/3I= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Volodymyr_Babchuk@epam.com; Received: from EPUAKYIW2556.kyiv.epam.com (85.223.209.52) by AM4PR0301MB2132.eurprd03.prod.outlook.com (2603:10a6:200:4d::17) 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:33:53 +0000 Received: by EPUAKYIW2556.kyiv.epam.com (sSMTP sendmail emulation); Fri, 13 Oct 2017 22:33:49 +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 07/14] tee: optee: add shared buffer registration functions Date: Fri, 13 Oct 2017 22:32:37 +0300 Message-Id: <1507923164-12796-8-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: VI1PR08CA0110.eurprd08.prod.outlook.com (2603:10a6:800:d4::12) To AM4PR0301MB2132.eurprd03.prod.outlook.com (2603:10a6:200:4d::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2c310cae-2002-4059-3092-08d512715721 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(2017030254152)(2017052603199)(201703131423075)(201703031133081)(201702281549075);SRVR:AM4PR0301MB2132; X-Microsoft-Exchange-Diagnostics: 1;AM4PR0301MB2132;3:m9pe8bTOO8S7rugJruYFWD7Ee3K5rwFCtzEIsNWPJBv0TVL93jcYf9qApCrL3mX+mHpQQNeD2Ow4+snvYK/Emyvwca7IjmxP23XjCP70o6OE5KR5dx/IF0AIu0+nl12V9O52LzNUXlsSaNeFhnWE8O2wgJfv7agXyZJgD1UAx37C0zIGEETOCCjT/sTOfTAI4Ti9PxgfSpLoiWJkstnFqLfHr1niBabM00m+ooXxW9vO3bxO+XM9z/LNxj88XMFg;25:XC6kQkfc1b23PnWpd6EuRniMhjg7oLLnpMJwsjVeFkZPHlWWk+6QlQjyNu8QJ88y9YpbE9pGxzMaXNkXIsCmZKZiS5KkVmZU5UMDwxvV/V0X3apjAjfhqRIVr9iPZeSlV9m9BrA4WIsPzv29/IKIyS4h8xSMHFIaJpW0G/layrH2u/0QWhoDworLOH9I74KmNtbmGcmXvE04sdyi78RKJZiJQPHu8gPVSL3fzx0bzAFGEKEPOVW4LCCmM6zHK/O3k7bLsQLCW1YBfasfM8N706i+IUVYAQxBJWhliKlG3M3iBHJea9xUjBpK+h2OvKPwKNAHHLOBdsQqOn2vmCO5EQ==;31:2RTMgIEUN9jrx6ThjYQqhEg4tyyVVKozpb6VkVNh6cOTVSreWWccZNdtDExYk/S88VjOLfM2UyHuqppThQH483WuUjsB/ZOjy0cNTx85ImWewme3nIriHcGifYoq/wiSR9rI9WWDBKwXhdXMKOS8VxxRo+N59nH+8Qe6KZXC8P4ms7oFsaNDm7hQ03cpnxUytbAQp60pSHX8FAy81XWTlKPDpjTKSY9n90y7FefzJL8= X-MS-TrafficTypeDiagnostic: AM4PR0301MB2132: X-Microsoft-Exchange-Diagnostics: 1;AM4PR0301MB2132;20:OTh7p+oJFticsv/D4JmtpUtP+51XY4grah4DzJWcBPxp5E+Eqd03f44lD0JeMk1Ic2GaVDlyEZVPfDbC93g5pJtvSw5YHv1k1xNNix5UPk57baozdGiekmfIR8Hx6yhgusi3p766Iy7UDCaTRNyCEbAExNgO0SlYs9VlAsPgs3I56aHdfOkjr+AhbslHpO9r480AQB1C62yoHw6Zv0E9Q7Xjk4fiUFcomMCvQP9tA9b3VgExO3sCCEA2q8of8Zad5tI5047lqfh0TOs+jAKHIf02mOy8EEL0vB0F9KsQPrbVnzgko2NvNwggqoZV+Y+mH36R61h/Vp/mJjq3x4MYxLR0zBPlO9djKLx+5NJ+g5RYSk5cj8XQusD/APJZtEQQlLFeEIU4mjMP+s3n1OZkBTePSWgWNIXylrhZAUC8A3oMWLGoBvsTlTOwvD1zGMp1lWtnJ9rnE9P2hfT3ndQ0Au3mr0/DjjUYl5+ouFZnqI+9xpBasqclOl8hCIJPLhES;4:eb1L59CZlTHULBOf0aD+PcPG4CY7w3W3TCxniobreK/HEiHSUEJenGiP3n48/iPO7jMOYBtMJgJkJdECYGhj1qOnFu1PIe+qOrwoYfoHwazoqtuit2KGdBGjwBSb2e3MBg4X0HyJJgdlgylR5I4nOmV80oz6Ip9b8WbNddeMxXG8NdE64P+6tU/WuhIHxRrGJEJI1Gu4cgDhhEx6GjrvCD1SG79lgs3QS2KBeDhii3fxkRVQHldxBPk6KBNx9fj+ 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)(5005006)(8121501046)(10201501046)(3002001)(100000703101)(100105400095)(93006095)(93001095)(6041248)(20161123564025)(20161123560025)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:AM4PR0301MB2132;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:AM4PR0301MB2132; X-Forefront-PRVS: 04599F3534 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(6009001)(376002)(346002)(199003)(189002)(16586007)(6666003)(39060400002)(42186006)(8936002)(81156014)(8676002)(36756003)(48376002)(50466002)(6116002)(3846002)(478600001)(107886003)(4326008)(316002)(86362001)(81166006)(53936002)(50226002)(97736004)(33646002)(101416001)(105586002)(76176999)(47776003)(122856001)(7736002)(66066001)(6916009)(305945005)(68736007)(80792005)(2906002)(5003940100001)(106356001)(72206003)(2950100002)(50986999)(189998001)(5660300001);DIR:OUT;SFP:1101;SCL:1;SRVR:AM4PR0301MB2132;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;AM4PR0301MB2132;23:yETuQ+b9ILY5zRRqOUIvmSfNa2ftYMGmrZLWSES?= =?us-ascii?Q?STOcCqKLIxBzEdDIhMxblZumv8JTHSPFvvQXgGnpV/n0aPuI/jU8s6P0v7cn?= =?us-ascii?Q?w9Thq8lauh+xYH0KcJE6KbatWryXEayxLQm5NId+0L5SUa7xT3SAVStWtAHe?= =?us-ascii?Q?8gbbe1vIGI4+kq6H8/swdBy21+++2OvcdhuLuptUapWqXncRc80jIE0p+BMD?= =?us-ascii?Q?aO2r7WWcOvcXPWgHtJOv3IxKTjsciPV6r8i+zcY6z1Sw2v/gRv4ga95Ijxs7?= =?us-ascii?Q?HZCCCCOGM2CgLZ8vc6p0V4/+8cs205Mdiv8ALoPd8CrEmzJ06StmbsDjmmku?= =?us-ascii?Q?Wy3BG+R8DV9I58V+kUEKkEoyMKsVDlNS02iwW9cIdNN+GGeuUri0nOYfaVs7?= =?us-ascii?Q?Xxv/0tMh++DQx+G+BDW8TS6sdq7JpETkeKr0d/diR6Uyg6zambZ+JFf0UoLP?= =?us-ascii?Q?9Uiel4+/Qtaykp0wRJKNpcq0Q4t9IO+02C1l8sp45jOAnza4BiGVzQxPt/2+?= =?us-ascii?Q?x8D61qch4MTtnFJrqzTeWFXmciR+D6Wq0KxV3T2DMAQA/rzIu22rfGRO8A/d?= =?us-ascii?Q?oHg8jVDSd+VQDeVBay9fxXaUVVHPNjt210jW7zjYu0gl92ALEB+nJSk23kCS?= =?us-ascii?Q?qnVTmnocHUyp/jZpN4VN6iUeGZlwPJX33Divp+6XUIHQ1W7GyD+Wq6jhGsFM?= =?us-ascii?Q?SPI9YOTDr7nOzEvQHFbviqZ38FObxtOTeDv4QqXCsvB55t4l9seQZkW78kqX?= =?us-ascii?Q?79lBKE29z8AXZ0IO0OUMriI2ko+1RCUzNAKnqoqV/rWjm8KXlskmNecjhem6?= =?us-ascii?Q?WE18a7U0Qm5ijQ5q7tUpWNvaowu9UhzzUHUXOioQE8cUrobyg8BX84iIR+9l?= =?us-ascii?Q?rotd/BGBH+Z6/GuCDbHMQITcBlHPqo3ql7R6qnPBtIjnOhMUdT2ci4lPA9BR?= =?us-ascii?Q?fcq1V9nBHfWHNNZI9CNnbw9yKTfeCOuYcuJmCA8c9bsiq2OClBlmojVbQYxn?= =?us-ascii?Q?VZcOsLhxTTAGAlaarGDksrljDymtLttYZOpPo3UkRFkmy4jADoqQLDiojEkh?= =?us-ascii?Q?GIUc/PPAVomv2QU4bL5UPOtsh2KccuyzPhM/gUJdWApzPCo5thg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR0301MB2132;6:jkY6ch0p310R6htmLwYWHeOcrtb4wO4UK/yfAcKK753vl+5kebI1+txem68dHyvh7UYAlMSdwHbuQPUKSTxbIm1QsrBLEhSjwjt6ZskvNtQodhawv5+7zGsXEtvJEvJ+68jbQhv7ImaVk5ZGf81kRElBWbj4ICVWGRyoK6zmCtLj4vDs+3cjULau4lu33RnjmrcToQSV1DBjXmWHR2NX+0cB2tc2cHfNwy1dlXpfoqcTwb85eVHfsU5kecdSOsSKNd9mKeAuGpU1e2e7IK/SSgnqYvfSorcrbnDmi3TX9ozODWpS8uA79BgZBQPaB4n49uLD2JlJ4gbeKSLtSIzEwQ==;5:PgweBFelhOEz7U/Ur8V5BT0FCHI/J5fpQje8TgwAiZCbnyFhRhicav1uW5Ln3dPvqE3SFtvWH/wrxEdo3HawNsJ7hi6y10mRlUHWpXL+h0GQCaAJKjunC+UaAD+HYPO25APKwf67yDpMnnpqq94H8L2C4Aq8VNJBomL19gDAQTY=;24:aoG4yj9OYgwnGYSO2ifYxKcQGSJjIZU6suunBcPSD6+qVYEH+0Y1331THj+86cSU+j56gybthJusH3kLeQDdUDe0sCMWQWjV3uaRASJ914E=;7:V3tm/pv/9wxXukOYuGG+lJP3qSZd8SVCkoZmnHQbzStA99YHVOKNr8qvnxeezZl0LFXzsc3+v4+bm6qo709FRwt+Y4ny0sPKHgmQslT2uVos6nEyysMRU03lC3omQAbMTatT6vjAXYQLoG55ueBvrgiFfDOcCmeo9oXMxOmzOmHDdblLfZxdMEwh5b0nI1Dhfvx4Il+wG1jnyCSqu/bb8XgH1Jjd2N0sqAfoNCcu8wU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: epam.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Oct 2017 19:33:53.9565 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b41b72d0-4e9f-4c26-8a69-f949f367c91d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR0301MB2132 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Volodymyr Babchuk This change adds ops for shm_(un)register functions in tee interface. Client application can use these functions to (un)register an own shared buffer in OP-TEE address space. This allows zero copy data sharing between Normal and Secure Worlds. Please note that while those functions were added to optee code, it does not report to userspace that those functions are available. OP-TEE code does not set TEE_GEN_CAP_REG_MEM flag. This flag will be enabled only after all other features of dynamic shared memory will be implemented in subsequent patches. Of course user can ignore presence of TEE_GEN_CAP_REG_MEM flag and try do call those functions. This is okay, driver will register shared buffer in OP-TEE, but any attempts to use this shared buffer will fail. Signed-off-by: Volodymyr Babchuk --- * Extended commit message. Now it describes what will happen if user will call optee_shm_register() exactly at this patch (without next ones) * Added comment that describesx desctibe why we abuse least bits of msg_arg->params->u.tmem.buf_ptr --- drivers/tee/optee/call.c | 69 +++++++++++++++++++++++++++++++++++++++ drivers/tee/optee/core.c | 2 ++ drivers/tee/optee/optee_private.h | 4 +++ 3 files changed, 75 insertions(+) diff --git a/drivers/tee/optee/call.c b/drivers/tee/optee/call.c index 4873666..a22f5f0 100644 --- a/drivers/tee/optee/call.c +++ b/drivers/tee/optee/call.c @@ -533,3 +533,72 @@ void optee_free_pages_list(void *array, size_t num_entries) free_pages_exact(array, get_pages_list_size(num_entries)); } +int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, + struct page **pages, size_t num_pages) +{ + struct tee_shm *shm_arg = NULL; + struct optee_msg_arg *msg_arg; + u64 *pages_list; + phys_addr_t msg_parg; + int rc = 0; + + if (!num_pages) + return -EINVAL; + + pages_list = optee_allocate_pages_list(num_pages); + if (!pages_list) + return -ENOMEM; + + shm_arg = get_msg_arg(ctx, 1, &msg_arg, &msg_parg); + if (IS_ERR(shm_arg)) { + rc = PTR_ERR(shm_arg); + goto out; + } + + optee_fill_pages_list(pages_list, pages, num_pages, + tee_shm_get_page_offset(shm)); + + msg_arg->cmd = OPTEE_MSG_CMD_REGISTER_SHM; + msg_arg->params->attr = OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT | + OPTEE_MSG_ATTR_NONCONTIG; + msg_arg->params->u.tmem.shm_ref = (unsigned long)shm; + msg_arg->params->u.tmem.size = tee_shm_get_size(shm); + /* + * In the least bits of msg_arg->params->u.tmem.buf_ptr we + * store buffer offset from 4k page, as described in OP-TEE ABI. + */ + msg_arg->params->u.tmem.buf_ptr = virt_to_phys(pages_list) | + (tee_shm_get_page_offset(shm) & (OPTEE_MSG_NONCONTIG_PAGE_SIZE - 1)); + + if (optee_do_call_with_arg(ctx, msg_parg) || + msg_arg->ret != TEEC_SUCCESS) + rc = -EINVAL; + + tee_shm_free(shm_arg); +out: + optee_free_pages_list(pages_list, num_pages); + return rc; +} + +int optee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm) +{ + struct tee_shm *shm_arg; + struct optee_msg_arg *msg_arg; + phys_addr_t msg_parg; + int rc = 0; + + shm_arg = get_msg_arg(ctx, 1, &msg_arg, &msg_parg); + if (IS_ERR(shm_arg)) + return PTR_ERR(shm_arg); + + msg_arg->cmd = OPTEE_MSG_CMD_UNREGISTER_SHM; + + msg_arg->params[0].attr = OPTEE_MSG_ATTR_TYPE_RMEM_INPUT; + msg_arg->params[0].u.rmem.shm_ref = (unsigned long)shm; + + if (optee_do_call_with_arg(ctx, msg_parg) || + msg_arg->ret != TEEC_SUCCESS) + rc = -EINVAL; + tee_shm_free(shm_arg); + return rc; +} diff --git a/drivers/tee/optee/core.c b/drivers/tee/optee/core.c index 7952357..4d448bf 100644 --- a/drivers/tee/optee/core.c +++ b/drivers/tee/optee/core.c @@ -267,6 +267,8 @@ static const struct tee_driver_ops optee_ops = { .close_session = optee_close_session, .invoke_func = optee_invoke_func, .cancel_req = optee_cancel_req, + .shm_register = optee_shm_register, + .shm_unregister = optee_shm_unregister, }; static const struct tee_desc optee_desc = { diff --git a/drivers/tee/optee/optee_private.h b/drivers/tee/optee/optee_private.h index b63213d..d7bc77d 100644 --- a/drivers/tee/optee/optee_private.h +++ b/drivers/tee/optee/optee_private.h @@ -160,6 +160,10 @@ int optee_cancel_req(struct tee_context *ctx, u32 cancel_id, u32 session); void optee_enable_shm_cache(struct optee *optee); void optee_disable_shm_cache(struct optee *optee); +int optee_shm_register(struct tee_context *ctx, struct tee_shm *shm, + struct page **pages, size_t num_pages); +int optee_shm_unregister(struct tee_context *ctx, struct tee_shm *shm); + int optee_from_msg_param(struct tee_param *params, size_t num_params, const struct optee_msg_param *msg_params); int optee_to_msg_param(struct optee_msg_param *msg_params, size_t num_params, -- 2.7.4 From 1579888902223510063@xxx Fri Sep 29 15:37:48 +0000 2017 X-GM-THRID: 1579807711774948113 X-Gmail-Labels: Inbox,Category Forums