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 X-Spam-Level: X-Spam-Status: No, score=-8.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D5147ECE58E for ; Wed, 9 Oct 2019 15:27:42 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8A60621929 for ; Wed, 9 Oct 2019 15:27:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=shutemov-name.20150623.gappssmtp.com header.i=@shutemov-name.20150623.gappssmtp.com header.b="b6eo6v+r" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8A60621929 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=shutemov.name Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 355BA8E0005; Wed, 9 Oct 2019 11:27:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2B8968E0003; Wed, 9 Oct 2019 11:27:42 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 158688E0005; Wed, 9 Oct 2019 11:27:42 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0248.hostedemail.com [216.40.44.248]) by kanga.kvack.org (Postfix) with ESMTP id DC2508E0003 for ; Wed, 9 Oct 2019 11:27:41 -0400 (EDT) Received: from smtpin02.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with SMTP id 73A7D52C5 for ; Wed, 9 Oct 2019 15:27:41 +0000 (UTC) X-FDA: 76024625922.02.bone30_7d44c63cc732d X-HE-Tag: bone30_7d44c63cc732d X-Filterd-Recvd-Size: 9067 Received: from mail-lf1-f68.google.com (mail-lf1-f68.google.com [209.85.167.68]) by imf35.hostedemail.com (Postfix) with ESMTP for ; Wed, 9 Oct 2019 15:27:40 +0000 (UTC) Received: by mail-lf1-f68.google.com with SMTP id c195so1973957lfg.9 for ; Wed, 09 Oct 2019 08:27:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shutemov-name.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=iQQlvVf1KnrDupGieXQiT31DlPt7ngRIn+oWlntJbrA=; b=b6eo6v+rJT+f5py5qdHxkFUU24IJk6MDtdyK7QsLn5YNoKS2Io8CSF0unhd5MezXos Zcuj2GnoBTJD8FPhZkv6DgFglV++T/ayZ7WfL5L/JCfX8hi4+TFrRhJtoe8aioxyRDC8 8R1TGet8cI2X4kMc9Rp2nDGt0wlPtuBiAC5QaDp2Gw0riGJYv9trGOuAejkpce1fjL7m eCQH6ukjMWp9Q3WJELgsKxfUS7ETB6y4Hb1KuzPPpY8yCj+FwgltC+wQgNo7Qt4xUKQ5 tpy+fcFouWSBQE+IzBCPJDBGo/dfFbpXZ1m/UiXErfewbR48Bge918/6LA9Uvr/NQ0/Y +4Jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=iQQlvVf1KnrDupGieXQiT31DlPt7ngRIn+oWlntJbrA=; b=LAvaLxdV2FFfATRIDxuxLo+obzvmnf4QLcgD6jZg5IDwLP4UeOdJ9vvb3829gQ32cL BxRNwQGzwUVfTsAKOn9fyAuW+raU8NqX1vVPL/QMjqBqSRXcJox4Y9LOSba0RsvQ2ub6 kPYnXIpI1ltXKfg73l+TGTMk4W9SGyGtZXfnH/HvsdKMiq4m9O27bhGcY42wEqVnSre7 yq5TzE4Z7sQEPnjHv5KTQ8jlZ7Tr1KjJhvxWyoK8sX8U8Ff7Z+tVI67Dar9PU6NJHsvj IgZ2T9v/EK+DNY8BnakxPAOn2GIl6gBXVPLGS4ogvjTpMinFZ1J7n7BgXd5VjD5j9IhL uX6g== X-Gm-Message-State: APjAAAWu2kVsU9IRlrBmUF3rKGOigRL24WxspjMHtGeiTAUoYv9rbd/6 zuv+hyCdx7TuKWeDZzdpZDoDzA== X-Google-Smtp-Source: APXvYqyAYIbpIxwbWzio0EZMQsTyoULCSbdhI02dK/m5+S3lmVAsOItzeHSa2fMvA22WHbAMrkXg9Q== X-Received: by 2002:ac2:5c4b:: with SMTP id s11mr2521837lfp.18.1570634858609; Wed, 09 Oct 2019 08:27:38 -0700 (PDT) Received: from box.localdomain ([86.57.175.117]) by smtp.gmail.com with ESMTPSA id t27sm542192lfl.48.2019.10.09.08.27.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Oct 2019 08:27:37 -0700 (PDT) Received: by box.localdomain (Postfix, from userid 1000) id C2409102BFA; Wed, 9 Oct 2019 18:27:37 +0300 (+03) Date: Wed, 9 Oct 2019 18:27:37 +0300 From: "Kirill A. Shutemov" To: Thomas =?utf-8?Q?Hellstr=C3=B6m_=28VMware=29?= Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, torvalds@linux-foundation.org, Thomas Hellstrom , Matthew Wilcox , Will Deacon , Peter Zijlstra , Rik van Riel , Minchan Kim , Michal Hocko , Huang Ying , =?utf-8?B?SsOpcsO0bWU=?= Glisse Subject: Re: [PATCH v4 3/9] mm: pagewalk: Don't split transhuge pmds when a pmd_entry is present Message-ID: <20191009152737.p42w7w456zklxz72@box> References: <20191008091508.2682-1-thomas_os@shipmail.org> <20191008091508.2682-4-thomas_os@shipmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <20191008091508.2682-4-thomas_os@shipmail.org> User-Agent: NeoMutt/20180716 Content-Transfer-Encoding: quoted-printable 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: On Tue, Oct 08, 2019 at 11:15:02AM +0200, Thomas Hellstr=F6m (VMware) wro= te: > From: Thomas Hellstrom >=20 > The pagewalk code was unconditionally splitting transhuge pmds when a > pte_entry was present. However ideally we'd want to handle transhuge pm= ds > in the pmd_entry function and ptes in pte_entry function. So don't spli= t > huge pmds when there is a pmd_entry function present, but let the callb= ack > take care of it if necessary. Do we have any current user that expect split_huge_pmd() in this scenario= . >=20 > In order to make sure a virtual address range is handled by one and onl= y > one callback, and since pmd entries may be unstable, we introduce a > pmd_entry return code that tells the walk code to continue processing t= his > pmd entry rather than to move on. Since caller-defined positive return > codes (up to 2) are used by current callers, use a high value that allo= ws a > large range of positive caller-defined return codes for future users. >=20 > Cc: Matthew Wilcox > Cc: Will Deacon > Cc: Peter Zijlstra > Cc: Rik van Riel > Cc: Minchan Kim > Cc: Michal Hocko > Cc: Huang Ying > Cc: J=E9r=F4me Glisse > Cc: Kirill A. Shutemov > Suggested-by: Linus Torvalds > Signed-off-by: Thomas Hellstrom > --- > include/linux/pagewalk.h | 8 ++++++++ > mm/pagewalk.c | 28 +++++++++++++++++++++------- > 2 files changed, 29 insertions(+), 7 deletions(-) >=20 > diff --git a/include/linux/pagewalk.h b/include/linux/pagewalk.h > index bddd9759bab9..c4a013eb445d 100644 > --- a/include/linux/pagewalk.h > +++ b/include/linux/pagewalk.h > @@ -4,6 +4,11 @@ > =20 > #include > =20 > +/* Highest positive pmd_entry caller-specific return value */ > +#define PAGE_WALK_CALLER_MAX (INT_MAX / 2) > +/* The handler did not handle the entry. Fall back to the next level *= / > +#define PAGE_WALK_FALLBACK (PAGE_WALK_CALLER_MAX + 1) > + That's hacky. Maybe just use an error code for this? -EAGAIN? > struct mm_walk; > =20 > /** > @@ -16,6 +21,9 @@ struct mm_walk; > * this handler is required to be able to handle > * pmd_trans_huge() pmds. They may simply choose to > * split_huge_page() instead of handling it explicitly. > + * If the handler did not handle the PMD, or spli= t the > + * PMD and wants it handled by the PTE handler, i= t > + * should return PAGE_WALK_FALLBACK. Indentation is broken. Use tabs. > * @pte_entry: if set, called for each non-empty PTE (4th-level) entr= y > * @pte_hole: if set, called for each hole at all levels > * @hugetlb_entry: if set, called for each hugetlb entry > diff --git a/mm/pagewalk.c b/mm/pagewalk.c > index 83c0b78363b4..f844c2a2aa60 100644 > --- a/mm/pagewalk.c > +++ b/mm/pagewalk.c > @@ -50,10 +50,18 @@ static int walk_pmd_range(pud_t *pud, unsigned long= addr, unsigned long end, > * This implies that each ->pmd_entry() handler > * needs to know about pmd_trans_huge() pmds > */ > - if (ops->pmd_entry) > + if (ops->pmd_entry) { > err =3D ops->pmd_entry(pmd, addr, next, walk); > - if (err) > - break; > + if (!err) > + continue; > + else if (err <=3D PAGE_WALK_CALLER_MAX) > + break; > + WARN_ON(err !=3D PAGE_WALK_FALLBACK); > + err =3D 0; > + if (pmd_trans_unstable(pmd)) > + goto again; > + /* Fall through */ > + } > =20 > /* > * Check this here so we only break down trans_huge > @@ -61,8 +69,8 @@ static int walk_pmd_range(pud_t *pud, unsigned long a= ddr, unsigned long end, > */ > if (!ops->pte_entry) > continue; > - > - split_huge_pmd(walk->vma, pmd, addr); > + if (!ops->pmd_entry) > + split_huge_pmd(walk->vma, pmd, addr); > if (pmd_trans_unstable(pmd)) > goto again; > err =3D walk_pte_range(pmd, addr, next, walk); > @@ -281,11 +289,17 @@ static int __walk_page_range(unsigned long start,= unsigned long end, > * > * - 0 : succeeded to handle the current entry, and if you don't rea= ch the > * end address yet, continue to walk. > - * - >0 : succeeded to handle the current entry, and return to the ca= ller > - * with caller specific value. > + * - >0, and <=3D PAGE_WALK_CALLER_MAX : succeeded to handle the curr= ent entry, > + * and return to the caller with caller specific value. > * - <0 : failed to handle the current entry, and return to the calle= r > * with error code. > * > + * For pmd_entry(), a value <=3D PAGE_WALK_CALLER_MAX indicates that t= he entry > + * was handled by the callback. PAGE_WALK_FALLBACK indicates that the = entry > + * could not be handled by the callback and should be re-checked. If t= he > + * callback needs the entry to be handled by the next level, it should > + * split the entry and then return PAGE_WALK_FALLBACK. > + * > * Before starting to walk page table, some callers want to check whet= her > * they really want to walk over the current vma, typically by checkin= g > * its vm_flags. walk_page_test() and @ops->test_walk() are used for t= his > --=20 > 2.21.0 >=20 --=20 Kirill A. Shutemov 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 X-Spam-Level: X-Spam-Status: No, score=-8.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC6D0C4360C for ; Sat, 12 Oct 2019 23:25:15 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 438C72067B for ; Sat, 12 Oct 2019 23:25:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=shutemov-name.20150623.gappssmtp.com header.i=@shutemov-name.20150623.gappssmtp.com header.b="b6eo6v+r" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 438C72067B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=shutemov.name Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id CEE228E0005; Sat, 12 Oct 2019 19:25:14 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C9F3D8E0001; Sat, 12 Oct 2019 19:25:14 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A7BF48E0005; Sat, 12 Oct 2019 19:25:14 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0102.hostedemail.com [216.40.44.102]) by kanga.kvack.org (Postfix) with ESMTP id 77EBF8E0001 for ; Sat, 12 Oct 2019 19:25:14 -0400 (EDT) Received: from smtpin04.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with SMTP id F407B5DF1 for ; Sat, 12 Oct 2019 23:25:13 +0000 (UTC) X-FDA: 76036715748.04.son09_6791a02311005 X-HE-Tag: son09_6791a02311005 X-Filterd-Recvd-Size: 32660 Received: from listssympa-test.colorado.edu (listssympa-test.colorado.edu [128.138.129.156]) by imf17.hostedemail.com (Postfix) with ESMTP for ; Sat, 12 Oct 2019 23:25:11 +0000 (UTC) Received: from listssympa-test.colorado.edu (localhost [127.0.0.1]) by listssympa-test.colorado.edu (8.15.2/8.15.2/MJC-8.0/sympa) with ESMTPS id x9CNOxNV000668 (version=TLSv1.2 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sat, 12 Oct 2019 17:24:59 -0600 Received: (from root@localhost) by listssympa-test.colorado.edu (8.15.2/8.15.2/MJC-8.0/submit) id x9CNOxGV000662; Sat, 12 Oct 2019 17:24:59 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shutemov-name.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=iQQlvVf1KnrDupGieXQiT31DlPt7ngRIn+oWlntJbrA=; b=b6eo6v+rJT+f5py5qdHxkFUU24IJk6MDtdyK7QsLn5YNoKS2Io8CSF0unhd5MezXos Zcuj2GnoBTJD8FPhZkv6DgFglV++T/ayZ7WfL5L/JCfX8hi4+TFrRhJtoe8aioxyRDC8 8R1TGet8cI2X4kMc9Rp2nDGt0wlPtuBiAC5QaDp2Gw0riGJYv9trGOuAejkpce1fjL7m eCQH6ukjMWp9Q3WJELgsKxfUS7ETB6y4Hb1KuzPPpY8yCj+FwgltC+wQgNo7Qt4xUKQ5 tpy+fcFouWSBQE+IzBCPJDBGo/dfFbpXZ1m/UiXErfewbR48Bge918/6LA9Uvr/NQ0/Y +4Jw== Received: from DM6PR03MB3817.namprd03.prod.outlook.com (2603:10b6:a03:e0::49) by BYAPR03MB4376.namprd03.prod.outlook.com with HTTPS via BYAPR05CA0108.NAMPRD05.PROD.OUTLOOK.COM; Wed, 9 Oct 2019 19:06:37 +0000 Received: from CY4PR03CA0103.namprd03.prod.outlook.com (2603:10b6:910:4d::44) by DM6PR03MB3817.namprd03.prod.outlook.com (2603:10b6:5:50::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2347.16; Wed, 9 Oct 2019 18:06:19 +0000 Received: from SN1NAM01FT033.eop-nam01.prod.protection.outlook.com (2a01:111:f400:7e40::203) by CY4PR03CA0103.outlook.office365.com (2603:10b6:910:4d::44) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2347.17 via Frontend Transport; Wed, 9 Oct 2019 18:06:19 +0000 Received: from ipmx4.colorado.edu (128.138.67.75) by SN1NAM01FT033.mail.protection.outlook.com (10.152.64.173) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2347.16 via Frontend Transport; Wed, 9 Oct 2019 18:06:19 +0000 Received: from mx.colorado.edu ([128.138.67.77]) by mx.colorado.edu with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2019 11:22:50 -0600 Received: from ipmx7.colorado.edu ([128.138.128.233]) by mx.colorado.edu with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2019 10:50:58 -0600 Received: from mx.colorado.edu ([128.138.128.150]) by mx.colorado.edu with ESMTP; 09 Oct 2019 10:19:25 -0600 Received: from mx.colorado.edu ([128.138.128.150]) by mx.colorado.edu with ESMTP; 09 Oct 2019 09:58:36 -0600 Received: from ipmx3.colorado.edu ([128.138.67.74]) by mx.colorado.edu with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2019 09:47:42 -0600 Received: from ipmx2.colorado.edu ([128.138.128.232]) by mx.colorado.edu with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Oct 2019 09:43:17 -0600 Received: from mx.colorado.edu ([128.138.128.150]) by mx.colorado.edu with ESMTP; 09 Oct 2019 09:35:15 -0600 Received: from mx.colorado.edu ([128.138.128.150]) by mx.colorado.edu with ESMTP; 09 Oct 2019 09:30:52 -0600 Received: from vger.kernel.org ([209.132.180.67]) by mx.colorado.edu with ESMTP; 09 Oct 2019 09:28:35 -0600 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731839AbfJIP2e (ORCPT ); Wed, 9 Oct 2019 11:28:34 -0400 Received: from mail-lf1-f66.google.com ([209.85.167.66]:45319 "EHLO mail-lf1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731731AbfJIP1l (ORCPT ); Wed, 9 Oct 2019 11:27:41 -0400 Received: by mail-lf1-f66.google.com with SMTP id r134so1970622lff.12 for ; Wed, 09 Oct 2019 08:27:39 -0700 (PDT) Received: from box.localdomain ([86.57.175.117]) by smtp.gmail.com with ESMTPSA id t27sm542192lfl.48.2019.10.09.08.27.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Oct 2019 08:27:37 -0700 (PDT) Received: by box.localdomain (Postfix, from userid 1000) id C2409102BFA; Wed, 9 Oct 2019 18:27:37 +0300 (+03) Authentication-Results: spf=none (sender IP is 128.138.67.75) smtp.mailfrom=vger.kernel.org; o365.colorado.edu; dkim=fail (body hash did not verify) header.d=shutemov-name.20150623.gappssmtp.com;o365.colorado.edu; dmarc=none action=none header.from=shutemov.name; Received-SPF: None (protection.outlook.com: vger.kernel.org does not designate permitted sender hosts) Authentication-Results-Original: mx.colorado.edu; dkim=pass (signature verified) header.i=@shutemov-name.20150623.gappssmtp.com IronPort-SDR: zmwHmYDc9ULgayy38ks3gE3vr20ya4jjws7a2dyQiY+v8/WU6PPu/c4bf1vbgUvqPB1n+Qk+zN Y3bBLF9uV4K4JkShW0m7Haqo8aaKQCA0g= IronPort-SDR: wBRm4Vp6nRnyNvQLa8rLYhYbAYpQB5eeQG8iHcevvikh+Eaxe6jvSRRnDuCizp9N7ZBmTAtdmp 7LVITMdw/czcD/wTzP2RXSg7lihqkDWMI= IronPort-SDR: AANTDFtxVZmDiP79b40uSJRqJ9+JdxC0rIbsAIQGrsHwSJ2eMXlyQW9hiG0jr7cGvfnzoa3cwW wZG1/jibIaYgrW9ytFKpTkNIY0m7Wxwik= IronPort-SDR: e6sF+/PdoAlBJ0OY5sj6nwTzuJLXix8C8g+YXqe2RbLe/Jf9/9dcXrVp6EmNe/OQrJfqdO6efh f/eS/yjNlGBVNOU78wrdfAK+Y3ENkNEo8= IronPort-SDR: av47k371QRwm0+zX6rDy2Q24X0IFbWwXvokD2/HjdSSo3rGsjZ96j99Qq8iUFgGCoy3d8qKxdy 3t7YL/EFXg31dxUSCTHyb1Dph5wz5lZuY= IronPort-SDR: 0XYDjfq/TfwSb+r9k2klQDbgHIKQ30CSw2UAttbRqkIoqPVRmbARaPyAQnfvOWId6/idSIK0Y0 GT5yIjtA3tYn9ljoT67q603pv7Bz1/iPg= IronPort-SDR: 6mKLQesu5crrwjM3Oe/eNxuuFlulFoMMKuz06UvLassUYc/YvO/J7P8JZsF7Krbyyg3YxA44KD ufR4nqk9va5ayDV8txlUH9oyd7lSXlMlk= IronPort-SDR: 4AKvP5KWNl1+YFQiC9EyN/AOp5puoI7GxBqOa5sA9CP3tfNVK9Y6Zl5rpX2YdIGcmUkQjbTjwN kFit88ajs+QxHCCPHBkCXzqxzzUgLmATg= IronPort-SDR: ALeWsXiGKeWrwDF7n/BcloG6wN92Zg/Qc9X2Q0VSvCR3CH0KQZewMT+K8bNePcNZMuinTUaoF+ 8pMj+Vzxo6tfb9PP/DNyHeweVgtvezKI8= IronPort-PHdr: =?us-ascii?q?9a23=3Al5pvSROPqBAJZuMzmrQl6mtUO3oLmJTReyML45?= =?us-ascii?q?46gq5PdaL8osiwIhmGtr1k2UXSVMDA6/se1rSF+6u1Q2EE6IaMvDcYfZhFRx?= =?us-ascii?q?IJ2qB010RoSIbNQQX3eeXqcjA3GcNcEVls+nz9axAMRZ6gPQaUrXSq9SUJHw?= =?us-ascii?q?nncwFyI7e9AduI153qj77ooM62AU0AzHL1Kfs6LEC6pBnc5McMho4wNqFjwR?= =?us-ascii?q?CbuWZCeeld2TFtKEmIlhnxo8a8roRu/SlKtvQq+tUSVKT/cuEmQKZDDTMgVg?= =?us-ascii?q?J9rIWj/VGLBUPd7XwaTmgQjl9EAhPd6wr7Qpb2tHnxsexh1S+GeNHsRLYvVz?= =?us-ascii?q?m4qqptQxjkiSEIZT8/tXvakshhyb5cxXDp71Q3i8acKMnHKeFzZObUct4cWT?= =?us-ascii?q?kkPI4ZH2QJSsv0ZYtaDtM4OfhmodDeoUEisAORBAScPeLTkWZkgkfqgqs16c?= =?us-ascii?q?UnUgb52Ao8PdgUmSGHybe9fO9aGaj9hKOdx2vOaK1Imi3f1MvGLwgw/OiAfa?= =?us-ascii?q?JzX/fskxUONQCbq3mMpZ3GYAqO8uJQgk6czNE6dOX/oFUJ8xx3ojTy48o+uo?= =?us-ascii?q?7S4+BdghiMvW0xiM4HLsC6EmF9ZvSYMrcAmRmaBYhoHO8tbW5shmV59voPqK?= =?us-ascii?q?zkQyYulbBg5TXRW6yHctTL3jz5buazPTB11Htkf6KuvTqZoS3CgqW0HoH8mB?= =?us-ascii?q?4C/hAcrvbBqiAG9kbjtsuiQapH5h2n9RmTjx/X0v1ZC0EdvvfiIrI5mJEvzo?= =?us-ascii?q?ASnmbyAH7qgmrRkYabdEY88eXx5ebDPbCDxNfUf8c8wkm2eqkFo+zhHOc6Fz?= =?us-ascii?q?cWDlHAxsaR8LL43l33fY4Vo8EczLiFkJqDBtkJnpahMl9E+YRgxQmwCyuNk8?= =?us-ascii?q?shkl8Ac2tZJAK6rLG0XjOGaLiwRb/3yxywiCYoyfvoOaDeOb/0Azvigp3KRZ?= =?us-ascii?q?RRwWFbjwY949pH16AND/Y8IcLeQEH8q9biUk8TPAHlmragVvFUh74AQyWpO/?= =?us-ascii?q?feAcaw+RfArqpna6HEJ9M3p2OoeLA1ov/0inkhnkUBOLOkxoYTdCWgF+99cB?= =?us-ascii?q?/DM1PxntcMF3sLtQMiTevszWePSiNXe23jA/A59ncwD4ahF47PQcagjKHSlC?= =?us-ascii?q?u4H5gDfmldERjMCnbncYyYRu0BIDyfOM5vkzEIFPChRoYt2AvotVrS0Lp6Mu?= =?us-ascii?q?fR/TNds5vm2Z4vv7SOzU9ornp7BtyFyHqIU3kylWQNSg=3D=3D?= IronPort-PHdr: =?us-ascii?q?9a23=3AQ5bMORbj3JIZz+V9ucrqfYP/LSx+5ufYHS8wr7?= =?us-ascii?q?c5grZTe7ii+JK9YRCN+6A03xfACJ/A4rdfi+OM7v6zEWdV+5uFuWAPfNtWWh?= =?us-ascii?q?sMmcgazGlCSIbNQQWzZLbmOjc6AdhPUVh7uneyNEUTQp6nOgWM+Cb04jcKAg?= =?us-ascii?q?7kMBZtYO/yH92alJHtj7nvo8OJOFYt5nL1Kfs6ZF3+rVDdv9Ub04V4LaNj1h?= =?us-ascii?q?ybqXAaYPlcx25jOQCWkg3n78i9uZ9voT5dtf87+shLXL6oeqU9QPlGAS49Mm?= =?us-ascii?q?czga+j/VGLBUPHrjNOWWIQjhdOH03J7QriWYzwrir9sLh23y+GMMvqCKwuUD?= =?us-ascii?q?K54apxDRLugyALNjg2omDRz9Z9lKZK5Q6mwn43i8acKMndfLIsY7jQZ5YTSm?= =?us-ascii?q?dHQpU0NWQJSsv0J8NHBepUPN9hq5fDqQItqwGSGBGDBe7f8z503Sba2ZUmjO?= =?us-ascii?q?IuKyDAnwsfG9QSkn7OhYCmUcVaGaj9hOGAhT+WZa1b3mnjq5LqTlMv/OmdAK?= =?us-ascii?q?t8UdrS53QSTV/krFbOjKD5MyK2id0Wl27G3sxndtn1qml3gDpf+iWpxstxr4?= =?us-ascii?q?TbtoUOrzKMvW0xiM59bZWKQ1N5O/GiF7FslQ3KGbN2cMA8HU1nlik+9P5Fhd?= =?us-ascii?q?mybRpV95oDmjqYSdeJQ9iI406gaMiLGzdamHVoKLu+gAajy2SLmoieHoH8mB?= =?us-ascii?q?4C5mINwuOVil8Ay0zYy5K3FvhY9RabwWyJ+y/Psv5AGVwpv6vyAMMYy5IozL?= =?us-ascii?q?UM6V7CMQ3HhhTqloCxa2wp+Ouw4Om+bLfC+Zr5Vcc8wkm2euxm0sGUOMRmLw?= =?us-ascii?q?sMeleDqN3n65/O2ULiY6VEs8Zpv5Xz7oGGBc5ChbOrOzdN49YywBT8ISip1M?= =?us-ascii?q?gz3mY+I3RCJyub05jUGGiTRZKwRb/3yxzk2H933+GFMLbPBYjyFVL6vfTAb5?= =?us-ascii?q?xW02xw4iU0itxRyZhMOoNYJbXOW3/crtLVERUDb1yezOu2UYU6iKc3CF+RGO?= =?us-ascii?q?i/CfuVgDrqrqpna6HELMdd+2rfNK1wtLb+yH4jnlkFerO1mIEac228AqF+Kl?= =?us-ascii?q?6CMiC20P4cDWcHuBY/R+X2iVqEFARefGu2Q7ltumM+GMStCoPEXImhh/qM0D?= =?us-ascii?q?roVpFVZ2UTElmXCj+obISLXf4QdTifatFsiD0KVLWtCsch2BiiuRW8yu9PNe?= =?us-ascii?q?rJ5iAdsoym0tFw6quJzUhvrWIuVIKS2nmVVHpxgntOTDgz0Q=3D=3D?= IronPort-PHdr: =?us-ascii?q?9a23=3AWyC+rRRVMMPKuHBeCoLQNi7xk9psv+ypbCI2y7?= =?us-ascii?q?9ipqxHdrmq45XlOhOCuadz2QaaFYyO8elNzvHWuvq9Bz9I6sObvXQLYJFAEA?= =?us-ascii?q?UIjcwGkgBzZazNQQWzZLaiJyBvB8RfSFJg+G/+N0FQFYCkPwSP+iPotngdEw?= =?us-ascii?q?3nLhFwOvyzEYnX3IysgrrqosCLPV8T11/fKfs6ZF3+5U3R48UfnYYwJLw2z0?= =?us-ascii?q?nVpSlDcLZN2GlqKFmPzRPx/dy585Mm8igCof8v+tRNV673ZPY9TLlVSSorKX?= =?us-ascii?q?s048uO11GLBUPHrjNUGjcdlRxUDg7ZqR37RY/2qSrmt+17iiKdO9H7S6xxRS?= =?us-ascii?q?6r6bxlRQWthSEMMDI49m6Fi8o1lq9DpAPkuxsaocacKMndfLI2NvHAZt4AAG?= =?us-ascii?q?NOU8BNBEkjSsv0J8NHR6ILPbNZlrD5uWUA9Di4HyWxHMzuxw9xh0OthIE+6/?= =?us-ascii?q?h+Fw78/QpjGO0Ktmj2ps/cYfR3M6j9hOGAhX2LZaZchzr6tpaLaDId4v/RRa?= =?us-ascii?q?MtaMbx2UoBKj6f0nSyqtLAEy+Zx8dSinO/6bdRc+WMsDQGrFFamRb328Esht?= =?us-ascii?q?Tsi5AlzUuhl20xiM59bZXwAHxwfNz+P51XnR24G9tYesMQQH82lCkUxbk4+t?= =?us-ascii?q?2HOyEb+ssYyTqCT7ulWIa4shLiCKWtDy1ChFB5f7/vjhe14Vma5sasM6v8mB?= =?us-ascii?q?4C5mIN2pGcjCkx+BHPusOmEMsh/WKqiAyXjQb/xf0cPkQMibfxKrcKn4c5uo?= =?us-ascii?q?JJnlubBC7ZunTo3bOMWWI50+Wq6Pzsb+zopLvDMuoWwkm2euxm0oT3DM8BEl?= =?us-ascii?q?YTXGq+xvzt7ebc32DdT65pnvMLqfb0jLqENJg7rPeaHh1t6p4SuweUDXSIz9?= =?us-ascii?q?scgVJEM2tKXhXYtpS1K2ztGa2db7/3yxzk2H8jj+zeL/7vCbvKM0f4uo7MPp?= =?us-ascii?q?dvwWVk6iYZ4tcY65x6AKkxEqv2HXLwhPHCABImOTbok8zoBYQkhsRAfUveP7?= =?us-ascii?q?GDd4Xr6Ri5g4Bna6HELMdd8H6+d9o6squ9xW98mEUae7Gux4dScn2jA/B6dl?= =?us-ascii?q?2QemG/2I1TOHoWvgc4UO3hgUGDVjgWXXupQqYg/WBnWoe2S4zEQoe3ibCGmi?= =?us-ascii?q?q3A84eamNHDwWUGGzzP8WfWvgKYT6POMIpjDEeVLagRoNgnRGjvQP30fxme8?= =?us-ascii?q?LP+jAEuJfkyp1z7uje00tqrGEsUZ7GlW6EV3lvhWYUX3k926Vy?= IronPort-PHdr: =?us-ascii?q?9a23=3AARSOpxOpy1HgJ3ShgeIl6mtUO3oLmJTReyML45?= =?us-ascii?q?46gq5PdaL8osiwIhmGtr1k2UXSVMDA6/se1rSF+6u1Q2EE6IaMvDcYfZhFRx?= =?us-ascii?q?IJ2qB010RoSIbNQQX3eeXqcjA3GcNcEVls+nz9axAMRZ6gPQaUrXSq9SUJHw?= =?us-ascii?q?nncwFyI7e9AduI153qj77ooM62AU0AzHL1Kfs6LEC6pBnc5McMho4wNqFjwR?= =?us-ascii?q?CbuWZCeeld2TFtKEmIlhnxo8a8roRu/SlKtvQq+tUSVKT/cuEmQKZDDTMgVg?= =?us-ascii?q?J9rIWj/VGLBUPd7XwaTmgQjl9EAhPd6wr7Qpb2tHnxsexh1S+GeNHsRLYvVz?= =?us-ascii?q?m4qqptQxjkiSEIZT8/tXvakshhyb5cxXDp71Q3i8acKMnHKeFzZObUct4cWT?= =?us-ascii?q?kkPI4ZH2QJSsv0ZYtaDtM4OfhmodDeoUEisAORBAScPeLTkWZkgkfqgqs16c?= =?us-ascii?q?UnUgb52Ao8PdgUmSGHybe9fO9aGaj9hKOdx2vOaK1Imi3f1MvGLwgw/OiAfa?= =?us-ascii?q?JzX/fskxUONQCbq3mMpZ3GYAqO8uJQgk6czNE6dOX/oFUJ8xx3ojTy48o+uo?= =?us-ascii?q?7S4+BdghiMvW0xiM4HLsC6EmF9ZvSYMrcAmRmaBYhoHO8tbW5shmV59voPqK?= =?us-ascii?q?zkQyYulbBg5TXRW6yHctTL3jz5buazPTB11Htkf6KuvTqZoS3CgqW0HoH8mB?= =?us-ascii?q?4C/hAcrvbBqiAG9kbjtsuiQapH5h2n9RmTjx/X0v1ZC0EdvvfiIrI5mJEvzo?= =?us-ascii?q?ASnmbyAH7qgmrRkYabdEY88eXx5ebDPbCDxNfUf8c8wkm2eqkFo+zhHOc6Fz?= =?us-ascii?q?cWDlHAxsaR8LL43l33fY4Vo8EczLiFkJqDBtkJnpahMl9E+YRgxQmwCyuNk8?= =?us-ascii?q?shkl8Ac2tZJAK6rLG0XjOGaLiwRb/3yxywiCYoyfvoOaDeOb/0Azvigp3KRZ?= =?us-ascii?q?RRwWFbjwY949pH16AND/Y8IcLeQEH8q9biUk8TPAHlmragVvFUh74AQyWpO/?= =?us-ascii?q?feAcaw+RfArqpna6HEJ9M3p2OoeLA1ov/0inkhnkUBOLOkxoYTdCWgF+99cB?= =?us-ascii?q?/DM1PxntcMF3sLtQMiTevszWePSiNXe23jA/A59ncwD4ahF47PQcagjKHSlC?= =?us-ascii?q?u4H5gDfmldERjMCnbncYyYRu0BIDyfOM5vkzEIFPChRoYt2AvotVrS0Lp6Mu?= =?us-ascii?q?fR/TNds5vm2Z4vv7SOzU9ornp7BtyFyHqIU3kylWQNSg=3D=3D?= IronPort-PHdr: =?us-ascii?q?9a23=3A6+dtBhVOsuApfQ/7BSCiNHyO8b3V8LGtY1w5yb?= =?us-ascii?q?sCzp9Qe6C+9ojjO0qAuKk/kgqQDs3Svuhfgq/Ns6m6BDJTqZ3Uqn0GeYxBW1?= =?us-ascii?q?gfhMEfjwEsU6vnQQWzZLaiJ2Q2Sd9CSUNo+naldE5cHcu4PQWL/yXst2VUFR?= =?us-ascii?q?znLRFuI/jtXIXVipf/zLXoo8SOO1sS32nYA/s6ZF3+5U2ZtpwaiJdveKgrzR?= =?us-ascii?q?6bvnwacO8E3n5iJ1+Yg0T569yr9ZFutiVc6egs+cNaXKPxcr9qSL1dAXE4Pn?= =?us-ascii?q?ou5crt0HuLBUPHrjNUGi1EmR1OHwXD8FT2X4zptTD7qut63nuROsvqQLYoHC?= =?us-ascii?q?i45qFwRhLyzSoBPDk18WfY2M12ybhWuBaw4gB4puycKMndfLI2NuuPYMgXXy?= =?us-ascii?q?9IUctXS38kYMv0J8NHR6JJN+YNrrDEo0Uwo0KdAxOAGfvAyzJ4v37KhvQW19?= =?us-ascii?q?w9TgfJ5i0mXNUxtHLIjt/vHfJBNIL9hOGAhX2LJ/kD02nw79bWMQoDnbKCAK?= =?us-ascii?q?phLNPd6VksOT741Amxi4+7Gh+J2vUu7FGAy+w9ZMSoqFV9igYhiQOBntoqio?= =?us-ascii?q?WUo48H+lffkEcxiM59bZXwAAZJasOmSrRWsAumFacmbPsicWJ25go15LICh9?= =?us-ascii?q?34QG8D2aZ4+BD7NtjAUaOG0kLjVbrSHRlivnJHZLWy1x+z9lix8MHXBqzWmB?= =?us-ascii?q?4C5mIN2pGE5kpU6zPe9piMa6FNokSE0me1z1rVxs5YeV8wrbbGAZ8I6eMJn7?= =?us-ascii?q?YL62vcRjX3t2fHkv6KbGoD58Gl6ef/abi/qJ24aIoR6Em2euxm0oT3SekTCy?= =?us-ascii?q?hQQmuZ3NukhYS4wm/UZLpRre04r5KGnazwe9VHhqTgIBJH6r472kauJDXl/s?= =?us-ascii?q?sXmWUsb018dzSA0LH1Z0HzA8mlaJX3yxzk2H8jj7jaJqyiDJ7jKWX8q53YUP?= =?us-ascii?q?Vc+WR38Cgf5/9YoJ5aJLsZEMCqXwjMtez1FBE0LAaOn7bNB9gsj9NZB0amU5?= =?us-ascii?q?KHKuT0iAfP14dNa6HELMdd8H61aKQH+Ku73jcp3F4Heq+x2oELLWq1BeliPx?= =?us-ascii?q?CBaGH30Y1bQ04XogozSvDrg1SeUDlVIky/RL84+ipqVNCjHcHIQYSqmrWN22?= =?us-ascii?q?G2EoAFLmxFC1XZCX7zbM3EQPYDbiuOP9Vs2iIJT7mvSoItlFmuuQb2xqAhL7?= =?us-ascii?q?/84S0FqZ/m08Yw4eTWmFdorWUpV5rHiCeCRnlshXgNWydw16d6rA=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0HdAACsG55dfU1DioBlGgEBAQEBAQE?= =?us-ascii?q?BAQMBAQEBEQEBAQICAQEBAYF7AoIZgUcvKpMAgg+PBxGLNwNMEQEBAQEBAQE?= =?us-ascii?q?BAQYBARgVAgEBAYEDhg4jOBMCAQIJAQEBAwEBAQIBBQIBAQICEAEBCRYIhV0?= =?us-ascii?q?MQgEMAYNggTM9AQEBAQIBAQIJBhULAQ0BATcBBAEJAQEKFQMJJQMMHQgBBQE?= =?us-ascii?q?cBhMFHYVYIASjfIEDPIoxgXQzgn0BAQWHNAkSDoEUAYpwgR0SBoF/hCM+ijC?= =?us-ascii?q?MfwYBgjKGEoEic5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewIKBwYPI4FGgXu?= =?us-ascii?q?BBYMnUBAUgU8MFxWDO4pWcQGBBAOIDIgHAQE?= X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0HJAACKFJ5dbemAioBlGgEBAQEBAQE?= =?us-ascii?q?BAQMBAQEBEQEBAQICAQEBAYF7AoIZBYFCLyqSf4IPjwcRizcDTBEBAQEBAQE?= =?us-ascii?q?BAQEGAQEYFQIBAQGBA4YOIzgTAgECCQEBAQMBAQECAQUCAQECAhANCwkGK4U?= =?us-ascii?q?0DEIBDAGDYIEzPQEBAQECAQECCQYVCwENAQE3AQQBCQEBChUDCSUDDB0IAQU?= =?us-ascii?q?BHAYTBR2FWCAEo3WBAzyKMYF0M4J9AQEFhzcJEoEiAYpwgR0SBoF/hCM+ijC?= =?us-ascii?q?MfwYBgjKGEoEic5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewIKBwYPI4FGgXu?= =?us-ascii?q?BBYMnUBAUgU8MFxWDO4pWcQGBBAOIDIgHAQE?= X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0GuAADfAp5dh0pDioBlGQEBAQEBAQE?= =?us-ascii?q?BAQEBAQEBAQEBEQEBAQEBAQEBAQEBgXsCghmBRi8qkn6CD48HEYs3A0wRAQE?= =?us-ascii?q?BAQEBAQEBBgEBGBUCAQEBgQOGDiM4EwIBAgkBAQEDAQEBAgEFAgEBAgIQAQE?= =?us-ascii?q?BCgsJCCmFNAxCAQwBg2CBMz0BAQEBAgEBAgkGFQsBDQEBNwEEAQkBAQoVAwk?= =?us-ascii?q?lAwwdCAEFARwGEwUdgwCBfA8Eo1uBAzyKMYF0M4J9AQEFhzYJEoEiAYpwgR0?= =?us-ascii?q?SBoF/hCM+iiqMfwYBgjKGEoEic5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewI?= =?us-ascii?q?KBwYPI4FGgXuBBYMnUBAUgU8MFxWDO4pWcQGBBAOLOogjAQE?= X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0GuAAAs/Z1dh+iAioBlGQEBAQEBAQE?= =?us-ascii?q?BAQEBAQEBAQEBEQEBAQEBAQEBAQEBgXsCghmBRi8qkn6CD48HEYs3A0wRAQE?= =?us-ascii?q?BAQEBAQEBBgEBGBUCAQEBgQOGDiM4EwIBAgkBAQEDAQEBAgEFAgEBAgIQAQE?= =?us-ascii?q?BCgsJCCmFNAxCAQwBg2CBMz0BAQEBAgEBAgkGFQsBDQEBNwEEAQkBAQoVAwk?= =?us-ascii?q?lAwwdCAEFARwGEwUdgwCBfA8Eo16BAzyKMYF0M4J9AQEFhzcJEoEiAYpwgR0?= =?us-ascii?q?SBoF/hCM+iiqMfwYBgjKGEoEic5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewI?= =?us-ascii?q?KBwYPI4FGgXuBBYMnUBAUgU8MFxWDO4pWcQGBBAOLOogjAQE?= X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0FgAAC/951dh0O0hNFlGQEBAQEBAQE?= =?us-ascii?q?BAQEBAQEBAQEBEQEBAQEBAQEBAQEBgXsCghmBRDEqkn+CDxSOcxGLNwNMEQE?= =?us-ascii?q?BAQEBAQEBAQYBARgUAQIBAQGBA4YOIzgTAgECCQEBAQMBAQECAQUCAQECAhA?= =?us-ascii?q?BAQEKCwkIKYU0DEIBDAGDYIEzPQEBAQECAQECCQYVCwENAQE3AQQBCQEBChU?= =?us-ascii?q?DCSUDDB0IAQUBHAYTBR2DAIF8DwSjTYEDPIoxgXQzgn0BAQWHOAkSgSIBinC?= =?us-ascii?q?BHRIGgX+EIz6KKox/BgGCMoYSgSJzlQpZBQcDgiKMIIhtJwyNb4tFLaI8f4N?= =?us-ascii?q?7AgoHBg8jgUaBe4EFgydQEBSBTwwXFYM7ilY/MgGBBAEBAYs6iCMBAQ?= X-IPAS-Result: =?us-ascii?q?A0HdAACsG55dfU1DioBlGgEBAQEBAQEBAQMBAQEBEQEBA?= =?us-ascii?q?QICAQEBAYF7AoIZgUcvKpMAgg+PBxGLNwNMEQEBAQEBAQEBAQYBARgVAgEBA?= =?us-ascii?q?YEDhg4jOBMCAQIJAQEBAwEBAQIBBQIBAQICEAEBCRYIhV0MQgEMAYNggTM9A?= =?us-ascii?q?QEBAQIBAQIJBhULAQ0BATcBBAEJAQEKFQMJJQMMHQgBBQEcBhMFHYVYIASjf?= =?us-ascii?q?IEDPIoxgXQzgn0BAQWHNAkSDoEUAYpwgR0SBoF/hCM+ijCMfwYBgjKGEoEic?= =?us-ascii?q?5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewIKBwYPI4FGgXuBBYMnUBAUgU8MF?= =?us-ascii?q?xWDO4pWcQGBBAOIDIgHAQE?= X-IPAS-Result: =?us-ascii?q?A0HJAACKFJ5dbemAioBlGgEBAQEBAQEBAQMBAQEBEQEBA?= =?us-ascii?q?QICAQEBAYF7AoIZBYFCLyqSf4IPjwcRizcDTBEBAQEBAQEBAQEGAQEYFQIBA?= =?us-ascii?q?QGBA4YOIzgTAgECCQEBAQMBAQECAQUCAQECAhANCwkGK4U0DEIBDAGDYIEzP?= =?us-ascii?q?QEBAQECAQECCQYVCwENAQE3AQQBCQEBChUDCSUDDB0IAQUBHAYTBR2FWCAEo?= =?us-ascii?q?3WBAzyKMYF0M4J9AQEFhzcJEoEiAYpwgR0SBoF/hCM+ijCMfwYBgjKGEoEic?= =?us-ascii?q?5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewIKBwYPI4FGgXuBBYMnUBAUgU8MF?= =?us-ascii?q?xWDO4pWcQGBBAOIDIgHAQE?= X-IPAS-Result: =?us-ascii?q?A0GuAADfAp5dh0pDioBlGQEBAQEBAQEBAQEBAQEBAQEBE?= =?us-ascii?q?QEBAQEBAQEBAQEBgXsCghmBRi8qkn6CD48HEYs3A0wRAQEBAQEBAQEBBgEBG?= =?us-ascii?q?BUCAQEBgQOGDiM4EwIBAgkBAQEDAQEBAgEFAgEBAgIQAQEBCgsJCCmFNAxCA?= =?us-ascii?q?QwBg2CBMz0BAQEBAgEBAgkGFQsBDQEBNwEEAQkBAQoVAwklAwwdCAEFARwGE?= =?us-ascii?q?wUdgwCBfA8Eo1uBAzyKMYF0M4J9AQEFhzYJEoEiAYpwgR0SBoF/hCM+iiqMf?= =?us-ascii?q?wYBgjKGEoEic5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewIKBwYPI4FGgXuBB?= =?us-ascii?q?YMnUBAUgU8MFxWDO4pWcQGBBAOLOogjAQE?= X-IPAS-Result: =?us-ascii?q?A0GuAAAs/Z1dh+iAioBlGQEBAQEBAQEBAQEBAQEBAQEBE?= =?us-ascii?q?QEBAQEBAQEBAQEBgXsCghmBRi8qkn6CD48HEYs3A0wRAQEBAQEBAQEBBgEBG?= =?us-ascii?q?BUCAQEBgQOGDiM4EwIBAgkBAQEDAQEBAgEFAgEBAgIQAQEBCgsJCCmFNAxCA?= =?us-ascii?q?QwBg2CBMz0BAQEBAgEBAgkGFQsBDQEBNwEEAQkBAQoVAwklAwwdCAEFARwGE?= =?us-ascii?q?wUdgwCBfA8Eo16BAzyKMYF0M4J9AQEFhzcJEoEiAYpwgR0SBoF/hCM+iiqMf?= =?us-ascii?q?wYBgjKGEoEic5UKWQUHA4IijCCIbScMjW+LRS2iPH+DewIKBwYPI4FGgXuBB?= =?us-ascii?q?YMnUBAUgU8MFxWDO4pWcQGBBAOLOogjAQE?= X-IPAS-Result: =?us-ascii?q?A0FgAAC/951dh0O0hNFlGQEBAQEBAQEBAQEBAQEBAQEBE?= =?us-ascii?q?QEBAQEBAQEBAQEBgXsCghmBRDEqkn+CDxSOcxGLNwNMEQEBAQEBAQEBAQYBA?= =?us-ascii?q?RgUAQIBAQGBA4YOIzgTAgECCQEBAQMBAQECAQUCAQECAhABAQEKCwkIKYU0D?= =?us-ascii?q?EIBDAGDYIEzPQEBAQECAQECCQYVCwENAQE3AQQBCQEBChUDCSUDDB0IAQUBH?= =?us-ascii?q?AYTBR2DAIF8DwSjTYEDPIoxgXQzgn0BAQWHOAkSgSIBinCBHRIGgX+EIz6KK?= =?us-ascii?q?ox/BgGCMoYSgSJzlQpZBQcDgiKMIIhtJwyNb4tFLaI8f4N7AgoHBg8jgUaBe?= =?us-ascii?q?4EFgydQEBSBTwwXFYM7ilY/MgGBBAEBAYs6iCMBAQ?= X-IronPort-AV: E=Sophos;i="5.67,277,1566885600"; d="scan'208";a="369307873" X-IronPort-AV: E=Sophos;i="5.67,277,1566885600"; d="scan'208";a="369244395" X-IronPort-AV: E=Sophos;i="5.67,276,1566885600"; d="scan'208";a="286844471" X-IronPort-AV: E=Sophos;i="5.67,276,1566885600"; d="scan'208";a="369084627" X-IronPort-AV: E=Sophos;i="5.67,276,1566885600"; d="scan'208";a="413815179" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: gasiewsk@o365.colorado.edu X-Original-Recipients: migi9492@g.colorado.edu X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=iQQlvVf1KnrDupGieXQiT31DlPt7ngRIn+oWlntJbrA=; b=XlHcD2gpvpf3gRDDmH9dXOUEfa10KbR8m6ujyx0cd16oytECjJfgYZGksFazuzGYfP bzVmPms94onNQeibodD8YQGQDojn/AwQvR6hcGhO0X2tUD4AjDy6VAUgNmyf9q152H4i nI4/FSzMk58QCLBZfpC9W2ubVx1jCiDzcqSYcw7c0goa+rGNuQ5NDV6uIUz8PFrNbhvi veZzsRiUuIYZNHCTrBtaynRvM5X+LAbJolp2TqEa1U+FgiWx+c4mWYfZFpr1JcNqzKcM EYfFURXFzjOpu5lSWQtdla7JchAK2S3I3kxiTW+zhFL1MFWE99yzPjRRJp8rqD4iBktD pMXw== X-Gm-Message-State: APjAAAWVfad82pgejrbb5peCpy/+3wU2gQKri/A/HLcfkVW2RzP7f2sP WqrVT4n3GZeKxFEsIwVW8F8vMw== X-Google-Smtp-Source: APXvYqyAYIbpIxwbWzio0EZMQsTyoULCSbdhI02dK/m5+S3lmVAsOItzeHSa2fMvA22WHbAMrkXg9Q== X-Received: by 2002:ac2:5c4b:: with SMTP id s11mr2521837lfp.18.1570634858609; Wed, 09 Oct 2019 08:27:38 -0700 (PDT) Date: Wed, 9 Oct 2019 18:27:37 +0300 From: "Kirill A. Shutemov" To: "=?iso-8859-1?Q?Thomas_Hellstr=F6m_(VMware)?=" Cc: "linux-kernel@vger.kernel.org" , "linux-mm@kvack.org" , "torvalds@linux-foundation.org" , "Thomas Hellstrom" , "Matthew Wilcox" , "Will Deacon" , "Peter Zijlstra" , "Rik van Riel" , "Minchan Kim" , "Michal Hocko" , "Huang Ying" , =?iso-8859-1?Q?J=E9r=F4me_Glisse?= Subject: Re: [PATCH v4 3/9] mm: pagewalk: Don't split transhuge pmds when a pmd_entry is present Message-ID: <20191009152737.p42w7w456zklxz72@box> References: <20191008091508.2682-1-thomas_os@shipmail.org> <20191008091508.2682-4-thomas_os@shipmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <20191008091508.2682-4-thomas_os@shipmail.org> User-Agent: NeoMutt/20180716 List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-MS-Exchange-Organization-ExpirationStartTime: 09 Oct 2019 18:06:19.3110 (UTC) X-MS-Exchange-Organization-ExpirationStartTimeReason: OriginalSubmit X-MS-Exchange-Organization-ExpirationInterval: 1:00:00:00.0000000 X-MS-Exchange-Organization-ExpirationIntervalReason: OriginalSubmit X-MS-Exchange-Organization-Network-Message-Id: a63270d1-8467-4444-9478-08d74ce362ae X-EOPAttributedMessage: 0 X-MS-Exchange-Organization-MessageDirectionality: Originating X-Forefront-Antispam-Report: CIP:128.138.67.75;IPV:CAL;CTRY:US;EFV:NLI;SFV:SKN;SFS:;DIR:INB;SFP:;SCL:-1;SRVR:DM6PR03MB3817;H:ipmx4.colorado.edu;FPR:;SPF:None;LANG:en;;SKIP:1; X-MS-Exchange-Organization-AuthSource: SN1NAM01FT033.eop-nam01.prod.protection.outlook.com X-MS-Exchange-Organization-AuthAs: Anonymous X-OriginatorOrg: colorado.edu X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a63270d1-8467-4444-9478-08d74ce362ae X-MS-TrafficTypeDiagnostic: DM6PR03MB3817:|DM6PR03MB3817: X-MS-Exchange-Organization-SCL: -1 X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-Microsoft-Antispam: BCL:0; X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Oct 2019 18:06:19.1378 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a63270d1-8467-4444-9478-08d74ce362ae X-MS-Exchange-CrossTenant-Id: 3ded8b1b-070d-4629-82e4-c0b019f46057 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3ded8b1b-070d-4629-82e4-c0b019f46057;Ip=[128.138.67.75];Helo=[ipmx4.colorado.edu] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR03MB3817 X-MS-Exchange-Transport-EndToEndLatency: 01:00:20.2608088 X-MS-Exchange-Processed-By-BccFoldering: 15.20.2347.014 X-Microsoft-Antispam-Mailbox-Delivery: ucf:0;jmr:0;ex:0;auth:0;dest:I;ENG:(750127)(520002050)(944506383)(944626516); X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?/xpQ2rjtEOoK5MlOVTkDoJ46X52/7pt9h/R1Bu1aq2rqlcNkhJGFyQWGGtti?= =?us-ascii?Q?3pwh2o8vx6GA/5Oi/JRtUmKF7jNE+nxLC/Jn4F6/XCwRQbPs5O2ddSKgPfjK?= =?us-ascii?Q?q8GTT4wvmWwTpVtXJGEsmxcpJos3k5I6QaLb/Bwlbwl6+dtYGzuwKEP2d1i5?= =?us-ascii?Q?rE1UJh5tch4kBjqM9eVkBGU3Npcux8K6DCefE3BqAZlzden85Ks44Onyq1bL?= =?us-ascii?Q?1Wj234yKEmX3UVyM2W+bYdkGIOz35CtUwVf0quE2day0BBAAIgvjM659VG4R?= =?us-ascii?Q?iIKfzK2S0gPEJWDkKkkLLjOd7z3q7TodUT8qQHrZyuCrYEMdCWx2rJjyUnNt?= =?us-ascii?Q?QqaZfXdJH/CjirnO3VkOfWACJboK+HFOaC/7xCvUs+b+Q3h9DAJ4VsZqbWNs?= =?us-ascii?Q?sMzzHInZIa3BVFwGTtiBWJLwHK+e10OGjuMlDxtNEM66OdOTHaHChiUW+hXA?= =?us-ascii?Q?3Yw+LzPy0dd4ZyivdWzD+e2/ua1+xWhKZzxsCQDWmHKbj3GR9CSS0zwmex0t?= =?us-ascii?Q?hs3t7OQSrQEUfoopTjauaaM6rV5z/WA6FCLfD4cUGB6B5I8zDj8fLbhcrMoD?= =?us-ascii?Q?OYJ9q3tBkwN7OmJBlR3KzsrCCYBLcLWCcjyzxSonLi9tlh3JZqG+NNVTUZnd?= =?us-ascii?Q?aNcLJlCKCBVjoAiSne3q3HPkjtbCVnVIdDUoVYX3sRmdx9ADBu19pOe2oO84?= =?us-ascii?Q?Q2NibFxcxifImQoPFP1z1Wui5Nn2EjHzKbJzoenb0QOfI6g9kDZAuuDSiZJ2?= =?us-ascii?Q?QMyrv/bcpfXjhkagBcon4Xy0L6zrxDjcdLtOlvC4/LVsETOxVSPYgzHx0TBQ?= =?us-ascii?Q?Gg23wfekCCkxwRQx8RysILF/AeJj1dloB108fx2ujfqtUpsQwUj2gGvkmrqB?= =?us-ascii?Q?Q69tK4vZLUiwlNIhDTkiyl9pt+huXeUaeBD7hQTLxtYsp9c9iLJbjiXZKo4P?= =?us-ascii?Q?Ds0EqHb05lwMCPa9YRMlE5mj+EU9wuEG+NYLby8JmFHCCNlD3oVgOBUAqFwq?= =?us-ascii?Q?8drvSS3ZVftewSM7uxy+EKf0GGyV0dAHzuVk9tevRqa0UfZ1jBsWrySoqKMm?= =?us-ascii?Q?+InKyTglHDUE4isbtWWxFRODpmSJYHb5cVLfKqE+oMaomq4vPGs=3D?= 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: Message-ID: <20191009152737.t50vZ2Gmkq-rFpw3LLJgpC5NZYvpiUxDHl8vLFGqbcw@z> On Tue, Oct 08, 2019 at 11:15:02AM +0200, Thomas Hellstr=C3=B6m (VMware) wr= ote: > From: Thomas Hellstrom >=20 > The pagewalk code was unconditionally splitting transhuge pmds when a > pte_entry was present=2E However ideally we'd want to handle transhuge pm= ds > in the pmd_entry function and ptes in pte_entry function=2E So don't spli= t > huge pmds when there is a pmd_entry function present, but let the callbac= k > take care of it if necessary=2E Do we have any current user that expect split_huge_pmd() in this scenario= =2E >=20 > In order to make sure a virtual address range is handled by one and only > one callback, and since pmd entries may be unstable, we introduce a > pmd_entry return code that tells the walk code to continue processing thi= s > pmd entry rather than to move on=2E Since caller-defined positive return > codes (up to 2) are used by current callers, use a high value that allows= a > large range of positive caller-defined return codes for future users=2E >=20 > Cc: Matthew Wilcox > Cc: Will Deacon > Cc: Peter Zijlstra > Cc: Rik van Riel > Cc: Minchan Kim > Cc: Michal Hocko > Cc: Huang Ying > Cc: J=C3=A9r=C3=B4me Glisse > Cc: Kirill A=2E Shutemov > Suggested-by: Linus Torvalds > Signed-off-by: Thomas Hellstrom > --- > include/linux/pagewalk=2Eh | 8 ++++++++ > mm/pagewalk=2Ec | 28 +++++++++++++++++++++------- > 2 files changed, 29 insertions(+), 7 deletions(-) >=20 > diff --git a/include/linux/pagewalk=2Eh b/include/linux/pagewalk=2Eh > index bddd9759bab9=2E=2Ec4a013eb445d 100644 > --- a/include/linux/pagewalk=2Eh > +++ b/include/linux/pagewalk=2Eh > @@ -4,6 +4,11 @@ > =20 > #include > =20 > +/* Highest positive pmd_entry caller-specific return value */ > +#define PAGE_WALK_CALLER_MAX (INT_MAX / 2) > +/* The handler did not handle the entry=2E Fall back to the next level *= / > +#define PAGE_WALK_FALLBACK (PAGE_WALK_CALLER_MAX + 1) > + That's hacky=2E Maybe just use an error code for this? -EAGAIN? > struct mm_walk; > =20 > /** > @@ -16,6 +21,9 @@ struct mm_walk; > * this handler is required to be able to handle > * pmd_trans_huge() pmds=2E They may simply choose to > * split_huge_page() instead of handling it explicitly=2E > + * If the handler did not handle the PMD, or split = the > + * PMD and wants it handled by the PTE handler, it > + * should return PAGE_WALK_FALLBACK=2E Indentation is broken=2E Use tabs=2E > * @pte_entry: if set, called for each non-empty PTE (4th-level) entry > * @pte_hole: if set, called for each hole at all levels > * @hugetlb_entry: if set, called for each hugetlb entry > diff --git a/mm/pagewalk=2Ec b/mm/pagewalk=2Ec > index 83c0b78363b4=2E=2Ef844c2a2aa60 100644 > --- a/mm/pagewalk=2Ec > +++ b/mm/pagewalk=2Ec > @@ -50,10 +50,18 @@ static int walk_pmd_range(pud_t *pud, unsigned long a= ddr, unsigned long end, > * This implies that each ->pmd_entry() handler > * needs to know about pmd_trans_huge() pmds > */ > - if (ops->pmd_entry) > + if (ops->pmd_entry) { > err =3D ops->pmd_entry(pmd, addr, next, walk); > - if (err) > - break; > + if (!err) > + continue; > + else if (err <=3D PAGE_WALK_CALLER_MAX) > + break; > + WARN_ON(err !=3D PAGE_WALK_FALLBACK); > + err =3D 0; > + if (pmd_trans_unstable(pmd)) > + goto again; > + /* Fall through */ > + } > =20 > /* > * Check this here so we only break down trans_huge > @@ -61,8 +69,8 @@ static int walk_pmd_range(pud_t *pud, unsigned long add= r, unsigned long end, > */ > if (!ops->pte_entry) > continue; > - > - split_huge_pmd(walk->vma, pmd, addr); > + if (!ops->pmd_entry) > + split_huge_pmd(walk->vma, pmd, addr); > if (pmd_trans_unstable(pmd)) > goto again; > err =3D walk_pte_range(pmd, addr, next, walk); > @@ -281,11 +289,17 @@ static int __walk_page_range(unsigned long start, u= nsigned long end, > * > * - 0 : succeeded to handle the current entry, and if you don't reach= the > * end address yet, continue to walk=2E > - * - >0 : succeeded to handle the current entry, and return to the call= er > - * with caller specific value=2E > + * - >0, and <=3D PAGE_WALK_CALLER_MAX : succeeded to handle the curren= t entry, > + * and return to the caller with caller specific value=2E > * - <0 : failed to handle the current entry, and return to the caller > * with error code=2E > * > + * For pmd_entry(), a value <=3D PAGE_WALK_CALLER_MAX indicates that the= entry > + * was handled by the callback=2E PAGE_WALK_FALLBACK indicates that the = entry > + * could not be handled by the callback and should be re-checked=2E If t= he > + * callback needs the entry to be handled by the next level, it should > + * split the entry and then return PAGE_WALK_FALLBACK=2E > + * > * Before starting to walk page table, some callers want to check whethe= r > * they really want to walk over the current vma, typically by checking > * its vm_flags=2E walk_page_test() and @ops->test_walk() are used for t= his > --=20 > 2=2E21=2E0 >=20 --=20 Kirill A=2E Shutemov