From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D53CCC02192 for ; Tue, 4 Feb 2025 01:52:24 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 636F66B0085; Mon, 3 Feb 2025 20:52:24 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 5BF5D6B0088; Mon, 3 Feb 2025 20:52:24 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 411C26B0089; Mon, 3 Feb 2025 20:52:24 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 1E7736B0085 for ; Mon, 3 Feb 2025 20:52:24 -0500 (EST) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id AA06B1C7772 for ; Tue, 4 Feb 2025 01:52:23 +0000 (UTC) X-FDA: 83080587366.20.DA8B50A Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) by imf10.hostedemail.com (Postfix) with ESMTP id CEFC6C0014 for ; Tue, 4 Feb 2025 01:52:21 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=TWfVFDgA; spf=pass (imf10.hostedemail.com: domain of bagasdotme@gmail.com designates 209.85.214.171 as permitted sender) smtp.mailfrom=bagasdotme@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738633941; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=qbW52IjQiNxezbCPrYLHMxQsJPfF46sgw5UxFddLX7E=; b=Mmd7D0kIvDIkkVuU3pV8cSFqmeStdUMt6NnlUf7pAzhnbXB1qQ7f2FI6PWLSpfOTD/5njJ sPyFRaNhqaSAfsV7d1iV8AyOgn++nCsQi+i+mtbgkx+j8PMITEIYRkgMA98x27FCyq9NzS 8FQaJrxLmN3bfZFGmMdjz19SsCknJeA= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=TWfVFDgA; spf=pass (imf10.hostedemail.com: domain of bagasdotme@gmail.com designates 209.85.214.171 as permitted sender) smtp.mailfrom=bagasdotme@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738633941; a=rsa-sha256; cv=none; b=A54rzDYRCSCY7Gp3QyYj/wcUw/6P+v9tqXMwiJVqC6rlSZCWkm0MkwZkOHMRwKdcdb7zXS l9EoNmmfsTtNwBufmydtqcUg3GoGdBMyGvxj1mfzB7hJ3suVI9lptA0guR4Kiim3R/F0cR UPS4JuxmmTPnrX84jUmCspTX+pG4m8o= Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-21670dce0a7so104302495ad.1 for ; Mon, 03 Feb 2025 17:52:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738633940; x=1739238740; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=qbW52IjQiNxezbCPrYLHMxQsJPfF46sgw5UxFddLX7E=; b=TWfVFDgACvGEmzMFH9k0uvG70vMrtCT5ytOag/ZHz3fp6XA787DfDCUyPCoO0xvRMH a/1U0KGoctk4nY0E13LOpo3tX561mGTz7arBVAeAB3dlHDb92cAD2uL6V13lp779tBaQ 0BO7Vxdaztir7E/WM2c/QbAt7nbm5E0RSHr1tZT2/hXudppZDjzhGs6KHoz4Nx1j6zUT sQO12bYbvtH1txHyUPnES5Q5ohej2Psmzb66VLkwZoGwvDX0XdW59cS1ZxAhAaqEr7Aq PTeh5oG2L9Nzq1v5cj19R+oiswUI/v8s/0M0xN0WFTfU5n9cerOPT79kTfsBUzuN+1rh 7MLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738633940; x=1739238740; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=qbW52IjQiNxezbCPrYLHMxQsJPfF46sgw5UxFddLX7E=; b=cRJTDsrLz/yPjudACs67ZqlivWrcxEdurbnroEjmPsy6Vamo5VpqgrxQE/tdu1wOUp kyR9dy4f3/y0a6tBBgFeR6gT44lhGblW7D83tUoLO6gxKkWDZvUDaOWCrnOqv+9oBp+i oLEGrvWGEe0/V6wvUyWe0aw/Opw6PeYsFCIrGgZ1BwbAIP61o83dcimAMV4/pL2mCxgs bBq4Yu/tzzRGLxRbfACvXsykZJNuYgibLzL/hl4tjhB80zdxvdn5dJjkL1O5Ef3K7U7g je8yX3WlXmiY1EQuqmthfLjhD9E3mFsrSanEIIJKJU22cAWT8+SVjaLzdTuJWFR+kTWR fnWg== X-Forwarded-Encrypted: i=1; AJvYcCXfdvI3hDY1XHkg+Rr0c4XqxsMTJE7d1BAXeQ/2jYyRHjFTTFFKpnOEQf6Jdz+JPY3jUfxOdJhSjg==@kvack.org X-Gm-Message-State: AOJu0YzbyIgA7BBHl5GRPdhL2nxynhUq2qaxmZH89TF69YmhdRTPEsHN Glm4LHv4vemwqbfJqrlJIL64RAyaA9WeKlR8bf1OYzU5YMS6PJ5J X-Gm-Gg: ASbGncsnODxlsEsSJhjNJciJY+CJN9fG+4bWWhoo5rArRXZSVMFzmr3JHlZ0BBNYVTw qrFJziq49HzlcgV87OptblECSbcWuKoSFSu1YsRVPed+LzQZG/42uvnzeAdCGgneEn62BcEsIgD IgZTAjXlMV1APYQiOLVq3ukuCOK/+lua8XtxPSEQkAE/fZQGxG2qiVINxKjjDaKNT49lo+uO869 J5CuXJu1Nn35q5kSyOFwIAw6SIbrF8gm+FWdwe8shHa8qPFBBxU0SCh+yHM3y8dzD3argouN50f kufzhzbdNDMoHrw= X-Google-Smtp-Source: AGHT+IH+hoR48GnLXz302q1aM556oTJvCwUveYpSavJ/2CeH+HhtWnIFBYsSe5QkMUDQRF5BOaWY+Q== X-Received: by 2002:a17:903:41c4:b0:215:bf1b:a894 with SMTP id d9443c01a7336-21dd7d73401mr438772395ad.24.1738633940158; Mon, 03 Feb 2025 17:52:20 -0800 (PST) Received: from archie.me ([103.124.138.155]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2f848ade8c2sm10863374a91.48.2025.02.03.17.52.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 03 Feb 2025 17:52:18 -0800 (PST) Received: by archie.me (Postfix, from userid 1000) id 009E74209E79; Tue, 04 Feb 2025 08:52:14 +0700 (WIB) Date: Tue, 4 Feb 2025 08:52:14 +0700 From: Bagas Sanjaya To: Anthony Yznaga , akpm@linux-foundation.org, willy@infradead.org, markhemm@googlemail.com, viro@zeniv.linux.org.uk, david@redhat.com, khalid@kernel.org Cc: jthoughton@google.com, corbet@lwn.net, dave.hansen@intel.com, kirill@shutemov.name, luto@kernel.org, brauner@kernel.org, arnd@arndb.de, ebiederm@xmission.com, catalin.marinas@arm.com, mingo@redhat.com, peterz@infradead.org, liam.howlett@oracle.com, lorenzo.stoakes@oracle.com, vbabka@suse.cz, jannh@google.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, tglx@linutronix.de, cgroups@vger.kernel.org, x86@kernel.org, linux-doc@vger.kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, mhiramat@kernel.org, rostedt@goodmis.org, vasily.averin@linux.dev, xhao@linux.alibaba.com, pcc@google.com, neilb@suse.de, maz@kernel.org Subject: Re: [PATCH 01/20] mm: Add msharefs filesystem Message-ID: References: <20250124235454.84587-1-anthony.yznaga@oracle.com> <20250124235454.84587-2-anthony.yznaga@oracle.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="I4WrBx2o4SxYGPPZ" Content-Disposition: inline In-Reply-To: <20250124235454.84587-2-anthony.yznaga@oracle.com> X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: CEFC6C0014 X-Stat-Signature: pzxef9uwcd4q6qshizb6qdb1jhep7z9q X-Rspam-User: X-HE-Tag: 1738633941-23638 X-HE-Meta: U2FsdGVkX194RHmwt+8wIoktqghF5TylxZ+oFnMoXaU/t+0sO6q6xHG33dQBA83kqUpmEDCxPvrKmwA/DQOoCOStGIkKAXP2dgUKvQ7eOWKO7kBU2C6SAJS7zRLzRL5w2HcRCaNs81m52QkYtHfdoWbxNRXpFDe1MUk17ZgFQBzT91ER1zbNwGAqbRrHGTKX6zjF+7dqemqJcGpHp+ZBkEObJrrwI6N3pxuJ2ZaVNePD0am7tk6MpAEQCve/e+lK2+GRBIx8m0tTLIWBCp3wiwnOxAV4ksVD0iZVrqLPI/HR/QNqlzKtqrVB4afk64+VmH2WH0vGGyZcesCz+PiydDDvrymkMcRmlG4OMakhf/LZKh3lwzy5QdWsf7xYK/CUAyHGNid+INAs1m94h3SU3hHA1HA0lrqgKVHGtJa5Np+O4DF8Q5E3Il/FMg3MVmYHy8+aTM6PO5emjMWQV2EfVHM7e/XD6g/mtLdT6hWF7JPIXKnRiwVyjeqeCbfL0oVZdXLo5VDXGG85LFawSAEo9+mqNxel926ZkMzKE0/qHT8Ure9f3msoHR2HBwIbGIz3hOch/xm1X7Wqz5VbwoTa94QblGOeNImwQM9TJCqpcstf23/apt+1UWPvIIWyQcZL3Qgr+I2NlEz2ysK8M+aPJANLE5TnovjdAgeWgzVbEapz/kpCZ5K3WCS5QbuyWT+EFUZj+SrwrOEdN93ncISI3iLrYPGh3Rta1k5TG2ufGadSBit9PXnw+06rghdxnM6zZ/PpIi2Lt6NxYgmFU8unh5jkaIBaX6yaNmbsYiElYDlPHPTCnfLVqqMcqw0XGfYy414/cWVJA5Nfiwdk4LQPEznsqvlmSiy8YVMgnoj0y5qRI69FW72U+5+l1iEIDMWBuOJ1hrVyV7P4U4yGxBx//lpqcmWmwP8Bu7FCd4DG4WXr5HAYyHa2GXn804TDn7GJN4VfpzX+qXGjEiDmtBR UizQYVPE XoVhzLHIleCICvkhmuHuYadt3JrzyHxWKNmUNuKsrHotHkV8PRIWj/hZ8OsOfjWtO4yv0cEd3H2vi8ecly7/C7Gma9CcZS7guEfxq2w6dqI+SB4PY0kO8qnLBgdO4wUR1k2NBpZj8G8NzjNOOGvAgyc4iBT386Zv6HdyEi8I8ncx+89q2NlNKyrYQYXHPjmRtcyhpQybpo2BPLttlxvNsgk27En/RKmc9XCdo07GCga27wrRFgA+lvinX04dyYLhcAcHgXAu6RyjkQQ/dHkTU6BA+OUaeP2bN8vhrwilKbMD7x7gh/pp40X8XKMlu8pWdEf1TiEUC/nzrzFuAHod/zEInGmbMy4fvEhF/mJfI4Vbm1byeyu+h4h3hKmCiEDcubywmeFKBk0hQvrMBm9cfbviWIJFJU8KWwMXvvigVRfjiEhWkch6I0qptcMJjRKJZnIfgkjazFZPw7mtIdg3TjmbXvVxszmxh6aroyVVzZaptBa8FBs1rSrYF0LymHnyOSFJKFpc/zCXytZxT/+WOzohv8RevYn4INgqgPZcUQLtZqASl45q2cl28WNyPTH+Tpkv5eUXhBaV7shbr8fpqhzNb6vrrJTFtxSnAIAIgAJZghKqWlzQMcMyi9/uFnVU1GJU8ZMGBKyGGB/4MjGyndTk6zBiaEbRGYzuu9m2Q81PSumVmMbPEhCHFpvhtqR4EzsXBMPylr6mqHXRlTQ9FRu3vTAWShA7+Ueu2Is0nuAiuIzRgc2fmt0+Al0n8ceyIAnY5BVNXg0JY0J/F2JYxd7XnnGxIRrVqks9cQWT2VroA7dJJWxghXDZGrfegYC+hiidjStl8pkNDev4TD6ReQhVmKCbLdbCkeOdivfBAadaC3s48H3PZfvIjIGxAAcEXZ59s3c8HhJRYpnxCyj7sVct45TLU76OgKglInDe07gsRuOdxVC/1laaOVMEWxiN4ihI2k+66qc+lU9i2UDjuUmwJ2mO9 1aLvOD2e Ko52oPaMsX8htcazlivpuZxfJ45ijG1jVoxpQWfKIHLA9SJNdK5++6HlcBwODnzHTcdZo3BfrIKTJgQNg5n9Pm5/0dX4xVYUx6Q3HqjtGFn560n/XZe8zPjcKhaIV3TOwzSb7VtjhULVpCDbld+tZS/RKwW+sftdcyWbJ1YO563dX+PA50hMTU6rbAgV7g34kPYyJ3mJO9wZ6/fAseOgn61U1NA8utZOOjeptFbHGX/AMHUrZArPhM9PC+2lA2gX1FfTTMSxmpmBSncmSV5ecvVjANn/Lwgf7PZY1Cz+GCj0eemQdHRvCho7+r2IVxd+qggttoG0AO1qzlyd8KwEtLrrSIgNXi42rSqFz0qmnmSKPP3yZgsPy6STOKKnUwUTYiRtokBgVzaDkUCChbqSBicOimREPzb79eAIW5dOgXBvr9VCA/9npRRVma/2xOeUaNkHUKLE/+ROaF/Q5vOdrAobK187XnDNiPXfWCC/yDQfmqhO04B/F4Zq+vy8awU81wm8dg7ZPJUPXdvisePeapDBv4zO+l1jAPIHA+fu+LJVQVmksoA8GpjmQmXJYG0F3Yxq+1zqM5YZ8LHH8pOcFZCEX3WNCd3YFZ+wh2KkKKOK3ULsOL0a4NbPgRbRPVHiiFcJf8FjTD5zIJTrD1tSkW+SHKz1z37gOf/cAhi6NAnb3Phu77im6rIBq+LsfaRlzHksPS6KZH4n/VwZsXDCAYsQiLhQT0NLh6T+DXU8Jpb3b+3nuk5Dl7bnv+iiAt8Tl193E+f7wwL3dxvTjeG6s1sai71puCMqXmbIzFtyeyOaiYz4hgKiGMmi+bq4PiLaiVBGglbCCgkaV/GgveRhBp24SCU0sPe42TGf0ZEdqzZBj8UYYgKMWZyF7u0eGaaAoYt9aaZqt2PEF/MizgQx+v5EGEIOUjAJg/cYBomYRas92kal+lao5C3c06GElQcRq9PppPsP/8x3z6f2LVpSJ9tZYnSI/ 1wW0B+3w w2ROcl57aH/+J/4ltqSJfc/Ik9Y3LDwQTEYMN1k0JIeeaxoeqF6NlCjoL2pfa3aC/lJzzHQsrKDq/jKrMEghnu+4Ga8GETXOUrE2BpkJav7rgjUqEuvB6dtLEyI6fvloPvsXa2Ku7i20QJxvXjYrxLvLbWYQXaQIJf/qFPYvPeLsoxQ/BuyxfRS+I+PaK3TBojhHv7kDxaSD4Pu8+63em2gsFuh+RmU5qTL2JokMJ90yfclsOTieY3gBgYEePLSfIi+/P8B/ag7Jat5TXy2cbUyzFE/Gm5bHTXTbZzSx9UyQ4FTL23YVyvQZyKdNjgibnj7uq9BKG1jblIB+PUJsQMVnfwBVJ25E7sfLdsatzvje7BRv5B3z9l3zoA0Ntxh/sWI2JQarXRJNHleKS1gZYQt5oaPs6nejC8tsULC1Nqylo/m/3gE3kwjHRXbpWLRGAXy2i3xA5705JMho4DTsD/nUr8GJj/S55o5pH2Bl02delDfKdmUhEdLd6/u4cBX7Z/RyTGVOcKS+R4ZqAXG5m2eX62505rGyG2qr6m2pVuGDRgIDEslFkBpQMXXLpceAi94g4v4sN1CRMSV7OvfXxAeKmZ+koUGkPJlH9MmjAUKBdIuI2VLl/GpWaGDLmnlQ+EwwgziESwRCm1EQpFcnaXF3NYH X-Bogosity: Ham, tests=bogofilter, spamicity=0.000450, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: --I4WrBx2o4SxYGPPZ Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Jan 24, 2025 at 03:54:35PM -0800, Anthony Yznaga wrote: > diff --git a/Documentation/filesystems/msharefs.rst b/Documentation/files= ystems/msharefs.rst > new file mode 100644 > index 000000000000..c3c7168aa18f > --- /dev/null > +++ b/Documentation/filesystems/msharefs.rst > @@ -0,0 +1,107 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > +msharefs - a filesystem to support shared page tables > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D > + > +msharefs is a ram-based filesystem that allows multiple processes to > +share page table entries for shared pages. To enable support for > +msharefs the kernel must be compiled with CONFIG_MSHARE set. > + > +msharefs is typically mounted like this:: > + > + mount -t msharefs none /sys/fs/mshare > + > +A file created on msharefs creates a new shared region where all > +processes mapping that region will map it using shared page table > +entries. ioctls are used to initialize or retrieve the start address > +and size of a shared region and to map objects in the shared > +region. It is important to note that an msharefs file is a control > +file for the shared region and does not contain the contents > +of the region itself. > + > +Here are the basic steps for using mshare:: > + > +1. Mount msharefs on /sys/fs/mshare:: > + > + mount -t msharefs msharefs /sys/fs/mshare > + > +2. mshare regions have alignment and size requirements. Start > + address for the region must be aligned to an address boundary and > + be a multiple of fixed size. This alignment and size requirement > + can be obtained by reading the file ``/sys/fs/mshare/mshare_info`` > + which returns a number in text format. mshare regions must be > + aligned to this boundary and be a multiple of this size. > + > +3. For the process creating an mshare region:: > + > +a. Create a file on /sys/fs/mshare, for example: Should the creating mshare region sublist be nested list? > + > +.. code-block:: c > + > + fd =3D open("/sys/fs/mshare/shareme", > + O_RDWR|O_CREAT|O_EXCL, 0600); > + > +b. Establish the starting address and size of the region: > + > +.. code-block:: c > + > + struct mshare_info minfo; > + > + minfo.start =3D TB(2); > + minfo.size =3D BUFFER_SIZE; > + ioctl(fd, MSHAREFS_SET_SIZE, &minfo); > + > +c. Map some memory in the region: > + > +.. code-block:: c > + > + struct mshare_create mcreate; > + > + mcreate.addr =3D TB(2); > + mcreate.size =3D BUFFER_SIZE; > + mcreate.offset =3D 0; > + mcreate.prot =3D PROT_READ | PROT_WRITE; > + mcreate.flags =3D MAP_ANONYMOUS | MAP_SHARED | MAP_FIXED; > + mcreate.fd =3D -1; > + > + ioctl(fd, MSHAREFS_CREATE_MAPPING, &mcreate); > + > +d. Map the mshare region into the process: > + > +.. code-block:: c > + > + mmap((void *)TB(2), BUF_SIZE, > + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); > + > +e. Write and read to mshared region normally. > + > + > +4. For processes attaching an mshare region:: > + > +a. Open the file on msharefs, for example: > + > +.. code-block:: c > + > + fd =3D open("/sys/fs/mshare/shareme", O_RDWR); > + > +b. Get information about mshare'd region from the file: > + > +.. code-block:: c > + > + struct mshare_info minfo; > + > + ioctl(fd, MSHAREFS_GET_SIZE, &minfo); > + > +c. Map the mshare'd region into the process: > + > +.. code-block:: c > + > + mmap(minfo.start, minfo.size, > + PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); > + > +5. To delete the mshare region: > + > +.. code-block:: c > + > + unlink("/sys/fs/mshare/shareme"); Sphinx reports htmldocs warnings: Documentation/filesystems/msharefs.rst:25: WARNING: Literal block expected;= none found. [docutils] Documentation/filesystems/msharefs.rst:38: WARNING: Literal block expected;= none found. [docutils] Documentation/filesystems/msharefs.rst:82: WARNING: Literal block expected;= none found. [docutils] Thanks. --=20 An old man doll... just what I always wanted! - Clara --I4WrBx2o4SxYGPPZ Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQSSYQ6Cy7oyFNCHrUH2uYlJVVFOowUCZ6FyxgAKCRD2uYlJVVFO o3mqAP0WCRTp6aXVKc1BS+3edGdiVhX5X479v4h3aQF+JIOn/gD7Bh8TkCn4JACk 8nuEOzgt2CpenCSHZTG/7JiA4Rztnwg= =hlZS -----END PGP SIGNATURE----- --I4WrBx2o4SxYGPPZ--