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 A80DFC6FD1F for ; Wed, 3 Apr 2024 00:30:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 19DC46B0098; Tue, 2 Apr 2024 20:30:38 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 14E756B0099; Tue, 2 Apr 2024 20:30:38 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F09696B009A; Tue, 2 Apr 2024 20:30:37 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id D4CC06B0098 for ; Tue, 2 Apr 2024 20:30:37 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 81D0B40C46 for ; Wed, 3 Apr 2024 00:30:37 +0000 (UTC) X-FDA: 81966339714.24.5570970 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (mail-bn8nam12on2101.outbound.protection.outlook.com [40.107.237.101]) by imf03.hostedemail.com (Postfix) with ESMTP id C04F62000C for ; Wed, 3 Apr 2024 00:30:33 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b="tE5V/xUV"; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); spf=pass (imf03.hostedemail.com: domain of ziy@nvidia.com designates 40.107.237.101 as permitted sender) smtp.mailfrom=ziy@nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1712104234; 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=iq8imWwJkc6VG/ZG2d4cfZLq5zUWA0G35lkcQA3XUB4=; b=PUkEMMk4T7eeZy/f4Qy1Nfa438u1vvmfc33Xm9Ker/CJdF/ml6Yzzg7KOVMIsFwOaNTLx/ ACc8VjkT2z9UscDFTMcWYdYD5KfAF4ZGzXzvArYBccCOx6vUf26OujCj8t7L9nK4rig2rG es1x6n+BrtnVDR+Bc/DsYVuktIC2o4E= ARC-Authentication-Results: i=2; imf03.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b="tE5V/xUV"; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector9901:i=1"); spf=pass (imf03.hostedemail.com: domain of ziy@nvidia.com designates 40.107.237.101 as permitted sender) smtp.mailfrom=ziy@nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1712104234; a=rsa-sha256; cv=pass; b=QGYxyxWIouM2WprOqpAp600aZdsDnyq4MAAQq3xth9zqg51uTQ4HYveBuw+zFwa3BK8AFj SkyFoSa2PnjzMocb6mVp08835Pq89thhF5FHbTDXwBan3Rt5opFuoHgpRVC1/epFEwVv8x Qu2T2haTJwwF3IvSOc4aygxfJS4M680= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=oXwwp9zkRJA0gRSuvurJ/bZtud6K6gSR7/51EQQ7rwRgpW2e8FKx25Zwyiih5eiLGvKZUsaWwCV1pQzpM5Yq1/aGKjuJ/NY3qlyhoD2B6fRM6TxbvWgj+aZIzwPWb/YVLhSUdQjt+h9K4KJmpuVBlRYV8LhoptBjCbjUYh9TliQJbt82uz6t2HzIbHEH//kidFUsjQkxbfljlq0UfEXxb0H8IwEsPmFKixzO0UbXQBUGQmCVHkJTUBU7kBoykuAStyiyeOxzlnx8LEQglg97FsAxPUSjlrq7h4BPG4jztAMcKZGBGgYl+TNY/6l9W4UoXYevDdlEmWr5nyivHHvmRg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=iq8imWwJkc6VG/ZG2d4cfZLq5zUWA0G35lkcQA3XUB4=; b=JaVGxQWEseHgj5KV99wO0jJE86QSfq7248azBjxAjtw8QmnnH5TjheLRZ+/eBWMYZ0BW+inPBRuIEmCRiLq6kwVSQudJ0TXYYWPr32u3WcXS9vj63C1UpL7PQLGBf8P40gzFKZ2kPXETht2wMOOEwAtunA5b/teOvfO3zgeTG+HWFlpXyTQ/WhxB/UNrcIKbKBfKO9BxR0STyCOsxQBOE/mB+ON20oPRyTQG29oTmSMa7r66naybYdQ4GcHr6mElsS3a8kUxKbmklX1l73PWmQev22kXXwk0b4XKsHjdTjrSOXM471/daLL8QR+rLDfAP4drle921FykCSgu9sP7Jg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iq8imWwJkc6VG/ZG2d4cfZLq5zUWA0G35lkcQA3XUB4=; b=tE5V/xUVksNZTre6Ngbv3ygmJng5tk6czI+WnCSloJyKHWamz2fXQ5e0s7S3u8OjsGUNM+QXw+vmTAVQo0p4po+1P1k05Mfz0Bn9usb6HFRJszK3mKxHqSTB0DYHPsc+AsFUbXPOs0em1Bkd8MQqwssRLpkKssDd+gXbSstMF7ZLh1H8pVZV8bwUDz74D7m46Q5FvPXtCe/95XF8yXtitRZ7wUiI9GLeat4swVp6WPpbpgWva2J+THR7mWUiAEQvjr/qGqwR5+akzC+0KGNhHq3ER84BNbKOlku5wgBbvT8ie0w0lw0R+zwBw5AXBvCG0+sAS/hoL0d1hZKBIP6yGQ== Received: from DS7PR12MB5744.namprd12.prod.outlook.com (2603:10b6:8:73::18) by SJ0PR12MB8614.namprd12.prod.outlook.com (2603:10b6:a03:47d::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7409.46; Wed, 3 Apr 2024 00:30:30 +0000 Received: from DS7PR12MB5744.namprd12.prod.outlook.com ([fe80::dc5c:2cf1:d5f5:9753]) by DS7PR12MB5744.namprd12.prod.outlook.com ([fe80::dc5c:2cf1:d5f5:9753%6]) with mapi id 15.20.7409.042; Wed, 3 Apr 2024 00:30:30 +0000 From: Zi Yan To: Ryan Roberts Cc: Andrew Morton , David Hildenbrand , Matthew Wilcox , Huang Ying , Gao Xiang , Yu Zhao , Yang Shi , Michal Hocko , Kefeng Wang , Barry Song <21cnbao@gmail.com>, Chris Li , Lance Yang , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 2/6] mm: swap: free_swap_and_cache_nr() as batched free_swap_and_cache() Date: Tue, 02 Apr 2024 20:30:27 -0400 X-Mailer: MailMate (1.14r6028) Message-ID: In-Reply-To: <20240327144537.4165578-3-ryan.roberts@arm.com> References: <20240327144537.4165578-1-ryan.roberts@arm.com> <20240327144537.4165578-3-ryan.roberts@arm.com> Content-Type: multipart/signed; boundary="=_MailMate_BBAE7ACF-5C80-4C8D-A59B-B7CDCAE2254A_="; micalg=pgp-sha512; protocol="application/pgp-signature" X-ClientProxiedBy: MN2PR16CA0058.namprd16.prod.outlook.com (2603:10b6:208:234::27) To DS7PR12MB5744.namprd12.prod.outlook.com (2603:10b6:8:73::18) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS7PR12MB5744:EE_|SJ0PR12MB8614:EE_ X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +/LZhzmGjzVhZIdIbFnEjzg7ZecGkhmiIHm6jGI+lupXoKmJ8TjOJ6O6aauiJFWZXiKZK1Bs+IeXxlApmIsS56MShXqu6ZNU916gxjHVz0GH0MycmDDI7TLAfcL/yoUh9JeGs974mU7mO9/8gg4pvQrd+xr0ioC+gb0ksDsFwaniXGWgrfz9XGadvwPiuNoKCNdAldJzx6uK8YCFfCNqNHXfvUAgHmWRqOoViDW/uD1PJFus4xClHxJ+MRpXgzRjQ/AapB1wRb6LrDYf4q+y7hbBai5Uz4j68Ccl13ocVOeFqH1bPYNhv/IBY8RekJkoRMZOlP5NYZPV8zq8SjCgFNG/20PwQ59nzJR0VHNnETKv+qWB810LWzGvjsHXDINfqpKF67wat5PNP+nJNiwYFmE0ihH2VT3Ay91yxtGTblw2/HpvGVauCMZOo+ZHRaAwF9CuDaW4YLVcMHdKOH5J1y+C7Fhuw4uR75ZmjQSTYrrqvM3fj3XUxkGHbXGdWtAVwLQeJPZYZJv+/kkNJJrij9iZRmJOQ5AUE0nmi3H0oawaw3O1UMp4ME7KIORAJbHASNEww+lEuTK03qtKC0+234xDz/0H1QqvR07i0vDMyGcJEzUFHgxveXciOG9ck8RWcAJUriwq06ObXVKjL5SBWA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS7PR12MB5744.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366007)(1800799015)(7416005)(376005);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?YuZeBZnvy++t8aM4MHTr8jeFsSlRHH+u7Vr/44T1/cvurM4acBAZ1lSfbGrp?= =?us-ascii?Q?eLLnNXeOo3PzJd990/d9NXXHltDYajy9b/7xd16AyFvv2NnN7oo2/z/DBIGv?= =?us-ascii?Q?zy4yEAtBsbeVNZPhu9iX8ma0/WRsATS7AEnMqbW3UHCYDvzjMN5slm3uUnxj?= =?us-ascii?Q?6U/FTPgeK+DLz+Pi3usSeSfONw4fCsZ8X+EPiNnETe1uaXSzWSiTyx00k1YS?= =?us-ascii?Q?mcZKeB17WbXKmTB2x6fGc96YQKrecnadMeo1/2sEjVUXFgm/mwkAmFz53N6N?= =?us-ascii?Q?GwnLQ1olsZl8AjKmaYx48hf7Y/talT5WTut69Q5OElgqPaHHRmT/vvCFQnF8?= =?us-ascii?Q?DW6ngKcStnRsqdmtEr5c/sMntBRIDpmZKOS6A8mLKIq/SvbgaaowA0DReqS5?= =?us-ascii?Q?HIFlfiVN3vPlr/biVZ6SfZXwOyTs6fsm94DoRUNevqbU11K+kMmBXLmiSDVI?= =?us-ascii?Q?QrX11gZx7VF14sn0Fav6x6isxMWXCtEGi2wWYJMBzrHl0WRHdJb95ABBvOZ+?= =?us-ascii?Q?OHT70gnyKYAT0f6ZEkHIOBykaYa4He9GhlaaV+vK8/36EpTkEKLYbXxcoL/s?= =?us-ascii?Q?cMpM/mZGhrezPkovwTKelfdxl0buoaFFRHP6OY0MUgM2t1lxAgH/Uul7hCLC?= =?us-ascii?Q?XUAxQMatxdYyFwigiOFkfr2S122nE8fCpyNsSViI81TN6MVeoqwhAzKFfGgr?= =?us-ascii?Q?XnzwrmKZxLqnw2D5qbwG4/Z0lYZQZFtD78ITMe1dD85CxffZXOlNUhxdFd8l?= =?us-ascii?Q?jTxVs3mKG2+Pjv4uMB0pSTnSB+E186r7qrSUkTu+QERbjjmwCeyflDaUr28C?= =?us-ascii?Q?/+ljtt5C8RYJiIVaJ1v6dhmr8ZCzum0wfbAqeE5yTW+3zH100EZVwDfTHaj8?= =?us-ascii?Q?QBqpDxv1i1zs7P7R3F3JbrxQIFKOCa6lEGAc6KezbsSVG6lBZd2xOENqIzFY?= =?us-ascii?Q?NjQPJB3TwMwPTE/Njvg/2O38n1OlLKSX0NK6/P3V13RqpwnfVj2CNwZujOjq?= =?us-ascii?Q?f7JoP6fdg+vhc6SrlZ0erkhTLKGiPrS6sJVz2xP6ssKy1Rr3bWI8Xylzysb4?= =?us-ascii?Q?KSdEeC/XV7xNu/gKQSN1pSQm2dc2/Wmm7zqbRWP+pI4YwCcdDxLlw67Sm2Hq?= =?us-ascii?Q?dJO2K66ABDZo9tdG1eiEkHl0ZcY+JRr1GqJ7fvG4NH8e+CJa9V37IJD2hon5?= =?us-ascii?Q?GpCyUMftOOC2yZKlohX7z/oetGqmbBfI9exujGjB9lrJW6KelMJDtsUqjmPQ?= =?us-ascii?Q?njYNwwupupl8nScB97NVIaCBZGDXXEtsN5rOiacsZ7atqxnIByVZGNkZuA7s?= =?us-ascii?Q?i/fGp3vucEzrYfnVzLO+VStzWg50q67iVIL44y1bt5kSdYXzzLupc1Xf+6Pk?= =?us-ascii?Q?ykeOtMwu8wn44NuWpT2JU7HwNsQK4jEBYoqO0rFq1IMbzRImMpn5gIqCm0nd?= =?us-ascii?Q?BYAsTQwl8SjfCnouiOZAVgrjv8dbEuBikJdirsaYT0hmpK9MbNsym/WRllpQ?= =?us-ascii?Q?ghlYOdCgj5WSoLAq779rgoHmzKtkM1Z6ER5zDe6M16NYsGGV2DZ+STSSuL2J?= =?us-ascii?Q?rfztn+2Uau4Nj/cm+wM=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8837c8fe-69d4-4809-8991-08dc5375440e X-MS-Exchange-CrossTenant-AuthSource: DS7PR12MB5744.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Apr 2024 00:30:29.9624 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Y1wgA9u6QPhoiwB+nUqOp77mJEMAK5UAbc3Gggb/R25WwjcE3OosVqiMc56gtn5T X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB8614 X-Rspamd-Queue-Id: C04F62000C X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: ow1yjez5xsg3d518ftn5yxg1hhat8m76 X-HE-Tag: 1712104233-248378 X-HE-Meta: U2FsdGVkX183cJJIBCHrtOBlA585M4jNgP6RYR7DkZbI14Y8By7Gki9FMgUtnczNoL7KLKLECI9+U3R7Mvf3rQW2rCGpzJUOqsjrsR+u6mxrZIwlzrXAU3YCFS2HcAyN/WotColxt0BCd90ZGlUPjII8bLKSAIM8CB9HKY73/bUEZDmGVf/Dmw4h5KQyNjIU6t/J3xF2hXMHI3TLR2mb5Gx2gxiGSk7OUyhNCW+IsYtLfd+AoO+8Fx+5cqUXMv67fieJW8ey0cKfx2N7RUqeZWq7LhdBz7cVr9i//93L9kHKetERVOKblhlAocF0RuED94Wu9ng1j/kjlVmeZHobXxG4kkFUMCL9xxaR6aqtCSC+FjK4UjxfscvAsdZHYvDsUI5OxU8/RqXZ5mdtcoehvyC24Bu1Mfr23aTNfoHl3dyYzfLnql5uKGOkOsx6mCE5353q4VvLeYzqpioauOM5RW0H6INreGUdiz/81AAm8s5SSlmwOgHCBcYNzf+9TlhY3tDd7j6yFIvO01o4w4diaE7nOSG2R4WijKQzqHeOJspncITBXOt0RPcL8Jayxct6vYV7aQYDvqrNGbU4busqE0UvWiplpFifMaRqoGamynwqLqujobuvtAFesdgvRawFUc/zcOT0NRVsZ/zJrHgq7oAnYDZRJ7PmSaO+NvFf0q0ABY7+8i/EHJYeGb5l60DEDujQUvdJj/svQWZTPgS/BZuJhyZC2fEY/2Wl8vvL4W2gsqVeHNfgiVfskx0wcfnW99rgN4yrcBMVYkDRBKJgWJyio378pi8GSt1iZvdY0KobmDI05ikkZzwAHET8YMdF0CsRzVQsS1qCmzfk6xLliTc+RMsM80WwBlZLXwkJxnU8bgqv7fMIVLlvodHEQwL/8DsGFxQaIHP8Co7SQdA+b3iVjHmmQJ3RMFIJCEGAVl8QVjaqaAx9QmopIOsm1SI7hJAD0OQBJj58KRsXrkL E64EOrx+ GHbN6qY1uOXpQMn4DrIntD5X3NaY/xDdt5N4paNfPytVJ7kTj2oFhugQfLGnKWAMjyuYWJsesmcDDQQsqXU5JgBNL7PXvG2nFVlP0hTYRH3YKjRJAVwXMDEjusepOz7NGggFj4063Z4sl5qiBdduGbVqJturjqz6J1F7DsWS0zxiZ3S/KqlLp2TSPUx51nfVD5gaUeiLkEzJ4oqceA5wVmhyDOtMoAMO5TfvYPEZUTHKS3B0g/7K4i/x39d6cc6SMOLHfLg4f+cVAU20Hx+HuO6LEDZf0U3gx151EfQkTCzs59ImP1sVtib9Mq7dhxeOZn8m+dg24a9hFQSog9qqjDgeh63TM1nYUlNPUTzZ3zP/20w8VctQG33DXe6svEXI1K+DvSv6alAL7Xekx/K9E6GFUvzL08hPrfOWU9JtSsnc2xPp/aZNvDc+PlHCVrkhZiqYL X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: --=_MailMate_BBAE7ACF-5C80-4C8D-A59B-B7CDCAE2254A_= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On 27 Mar 2024, at 10:45, Ryan Roberts wrote: > Now that we no longer have a convenient flag in the cluster to determin= e > if a folio is large, free_swap_and_cache() will take a reference and > lock a large folio much more often, which could lead to contention and > (e.g.) failure to split large folios, etc. > > Let's solve that problem by batch freeing swap and cache with a new > function, free_swap_and_cache_nr(), to free a contiguous range of swap > entries together. This allows us to first drop a reference to each swap= > slot before we try to release the cache folio. This means we only try t= o > release the folio once, only taking the reference and lock once - much > better than the previous 512 times for the 2M THP case. > > Contiguous swap entries are gathered in zap_pte_range() and > madvise_free_pte_range() in a similar way to how present ptes are > already gathered in zap_pte_range(). > > While we are at it, let's simplify by converting the return type of bot= h > functions to void. The return value was used only by zap_pte_range() to= > print a bad pte, and was ignored by everyone else, so the extra > reporting wasn't exactly guaranteed. We will still get the warning with= > most of the information from get_swap_device(). With the batch version,= > we wouldn't know which pte was bad anyway so could print the wrong one.= > > Signed-off-by: Ryan Roberts > --- > include/linux/pgtable.h | 28 +++++++++++++++ > include/linux/swap.h | 12 +++++-- > mm/internal.h | 48 +++++++++++++++++++++++++ > mm/madvise.c | 12 ++++--- > mm/memory.c | 13 +++---- > mm/swapfile.c | 78 ++++++++++++++++++++++++++++++-----------= > 6 files changed, 157 insertions(+), 34 deletions(-) > > diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h > index 09c85c7bf9c2..8185939df1e8 100644 > --- a/include/linux/pgtable.h > +++ b/include/linux/pgtable.h > @@ -708,6 +708,34 @@ static inline void pte_clear_not_present_full(stru= ct mm_struct *mm, > } > #endif > > +#ifndef clear_not_present_full_ptes > +/** > + * clear_not_present_full_ptes - Clear consecutive not present PTEs. > + * @mm: Address space the ptes represent. > + * @addr: Address of the first pte. > + * @ptep: Page table pointer for the first entry. > + * @nr: Number of entries to clear. > + * @full: Whether we are clearing a full mm. > + * > + * May be overridden by the architecture; otherwise, implemented as a = simple > + * loop over pte_clear_not_present_full(). > + * > + * Context: The caller holds the page table lock. The PTEs are all no= t present. > + * The PTEs are all in the same PMD. > + */ > +static inline void clear_not_present_full_ptes(struct mm_struct *mm, > + unsigned long addr, pte_t *ptep, unsigned int nr, int full) > +{ > + for (;;) { > + pte_clear_not_present_full(mm, addr, ptep, full); > + if (--nr =3D=3D 0) > + break; > + ptep++; > + addr +=3D PAGE_SIZE; > + } > +} > +#endif > + Would the code below be better? for (i =3D 0; i < nr; i++, ptep++, addr +=3D PAGE_SIZE) pte_clear_not_present_full(mm, addr, ptep, full); -- Best Regards, Yan, Zi --=_MailMate_BBAE7ACF-5C80-4C8D-A59B-B7CDCAE2254A_= Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQJDBAEBCgAtFiEE6rR4j8RuQ2XmaZol4n+egRQHKFQFAmYMoyMPHHppeUBudmlk aWEuY29tAAoJEOJ/noEUByhUeSEP/i690bSUUVVRPvewpwQ771NH0CRmcNBSVOUF 3pMiXVweKtglsMohVmeTlOhzIEP5ZKI5HbBglxq81Jye1IO7T6iFCh9MhmypvNje ZbdRStfJMGN2frUiJz3A9a3Tc7gyVymY8Q4Nmt7avAAno/0FQjvJoavtWPVF9e4H CH4WxbU7zhvcCoNAJw5eIJqzrK7AQF1UsXcTg0dUxLpTA5kulufWyyVqNT2Yu6vz n0HIBqUgVLxxVtz5ogyW5nbfw/9pG0CBRayhl7eqWLpEDSlTo/uCfnY4vlyYZH+0 +IRPHxZHdek9TBDn3gbMJ2FsNcHkeqXBl5y5REBgHMqp7+NObKnJWXHO5bSDoqPQ MPjTDIeptdMxRU4hzfnHufRoAY2HssdNqhQ9oqZMeItjym/XDym8dlqwA7E7k/E/ DQyvQQIkwlUxL6UoX359vxW6fCsianFrChz+ivAymOy27WkWTsPKqjiRhN6VeOb4 r11EWQZlYhi8yW4TdaKtqdrwVN1JNMfAsFfvzJZmR2KsmaIr1Q0XLaHfNu9UBfb5 rdnVWKfG2kHTkCMCuNKEq3Rym7OGQoeJcGLD+Fr5pWsb6GSf0Lkvey7cS2RoblyL Jf6XKdYcMVQcIF6kVPH02DQOU4LrCQB0H6LaXaG/P9NLYyTBCMdmh+pdIEe7l58H 3dYaTzKJ =dZbE -----END PGP SIGNATURE----- --=_MailMate_BBAE7ACF-5C80-4C8D-A59B-B7CDCAE2254A_=--