Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754410AbcDFK2p (ORCPT ); Wed, 6 Apr 2016 06:28:45 -0400 Received: from mail-db3on0099.outbound.protection.outlook.com ([157.55.234.99]:9388 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751214AbcDFK2n (ORCPT ); Wed, 6 Apr 2016 06:28:43 -0400 Authentication-Results: kvack.org; dkim=none (message not signed) header.d=none;kvack.org; dmarc=none action=none header.from=nextfour.com; Subject: Re: [PATCH 23/31] huge tmpfs recovery: framework for reconstituting huge pages To: Hugh Dickins , Andrew Morton References: CC: "Kirill A. Shutemov" , Andrea Arcangeli , Andres Lagar-Cavilla , Yang Shi , Ning Qu , , From: =?UTF-8?Q?Mika_Penttil=c3=a4?= Message-ID: <5704E4D2.5020808@nextfour.com> Date: Wed, 6 Apr 2016 13:28:34 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [194.157.170.34] X-ClientProxiedBy: AM2PR09CA0022.eurprd09.prod.outlook.com (10.161.22.160) To VI1PR07MB1568.eurprd07.prod.outlook.com (10.165.239.14) X-MS-Office365-Filtering-Correlation-Id: aa23c859-bf86-4295-c7ec-08d35e0637c2 X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1568;2:U/HLx1xKfOrDeVEmLlmWJLGhakRN12MACFddGsf2f8A26fw/bXoN5r0MywMXvw5QWb/g065oG47ZKpJlCqsXaztMlTfyMbgKwoLtH3e+lEuheg8MHazEijFbMWUpH+I5styk2w+CITjyzKVDR6RVA7aNfKubI9lNbJy6XwncmpUn8+Jkx+VOKJwSdZhWzV2G;3:KzyJv+yp8KDAgUkvX2A2wjWFamx4D78oDZBazJDLXm89QKKaB+WuN4qtjD+TU86pg0R2PVwSsbZfKIyeNSIf+VZkZr2YjJzQ398zXRHSBpP2nV70t3uou7c6AUIuu32r;25:oIitxlecBL2Mwc2ru5807oTIf3t/x9nvIjzG+ayEf3PPgI8okAbGOKoEVkRE1mcX79qwogMjtIY2aVIG/8698I5hJKzap+3jwPipUdCt9kb6kqXRFe3xxn6yrDbq/HpKSCklm5OBOvl4Uw9ot8tfB3uXOvEDPGjAoGM2FJi8A/YE3RESgVToWA/3A3so5pWrYUhxctw3Nb4LRexuDaDM5od35aDaiCUwdfhxZihVvhb0h5sXJ/yVxiePMmU9EZ5JqlRKoDKaDvCLVzHSBt3jze+g0vwvR86+A/VZ6NQjbXeTQaI41JXcS4LHxSdp24ybLtj7qQd1jME2H0oPErbVKq/H4M7DOd+l6wkwJk82u8jYV8GxDHTe7kebQLgxZHgfvKsxPq+Bzoi9lvh4oL5OuZ7+iqJW5vwBANcKlcx/fjYxBZ3CkGShtDazCQ/rXIy3MS15NPCPbPEATEPqcuSQWP/9F2dEQh+loWWGqxX19eAfY0OBx1lMB7ZJ4pcXnQr9EQRv+rQIg0xJrEoREYhJb9SrdTfGcgMiFW8vTtVMF9O40F3aFEep/ymHlvw/Ch9262hx5qwPAtO9cRxGvf03BA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR07MB1568; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001);SRVR:VI1PR07MB1568;BCL:0;PCL:0;RULEID:;SRVR:VI1PR07MB1568; X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1568;4:FKGT97gGAwMP8Uj7wmfsWJ0scUPn3fteYqiJeQ9Y3TvG1dxMuww3DPpOa4ZPLhp3ija36tcHPbnppgiuUdn9Tm991gpGjg/JVNGk924WlWgGqbQHeQDXTFpbY2Sy2D4vvpZgHbeuvZxetmog9x0R1JL2ZVBKsyq+xML6RiXy0Ju8NWLHAy6aVYhOrypNJCD0CYb6Ic5HLc0npZf0zDHNZCeXa3rVomjCeTQbGlXzR3Zj8vYKS8MHnhQeMJgOH2LwmXibfTR3Pl6nCZr3OmfCKShQ9R2NH3DQ/7b91FwDK3BTmpey2jeY/lDMzArSyeJSpp1kpNlzrbk2cY+MKKCyOjAUov4oN2qEspqsYKdlqM7hzALoUMlJxxogzi4jzF2/ X-Forefront-PRVS: 0904004ECB X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6049001)(6009001)(377454003)(24454002)(2950100001)(80316001)(586003)(3846002)(1096002)(2906002)(5008740100001)(6116002)(23746002)(92566002)(81166005)(36756003)(189998001)(5004730100002)(33656002)(76176999)(87266999)(86362001)(47776003)(54356999)(4326007)(5001770100001)(230700001)(77096005)(4001350100001)(50466002)(65816999)(64126003)(50986999)(164054004)(42186005)(66066001)(65806001)(65956001)(14583001)(21314002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR07MB1568;H:[10.10.10.110];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1;VI1PR07MB1568;23:llpZ31oox9WWRxX3LwGMACQ1IvFuS7MqUvlxZ?= =?Windows-1252?Q?NQgYP6UYAMXDC1NOE5clA6sCo4mlgSdRJhbSKIkCb4RIUtswIoUugZUc?= =?Windows-1252?Q?QZRM0dXL7oS05MnoNAFIUW7wLJanD7GQJpt9elzERkbwqGEStYJHMIlv?= =?Windows-1252?Q?yDRjHZKC5XpKyrzyOVkRqfRhd3hSpvUgxZboE1B2X4BZTkNM94OTfTvK?= =?Windows-1252?Q?lDl5+Vw6LfszurNmihoT2FbEsfAhsshl7r/Vrceg1+pNTJuR+ixm74kr?= =?Windows-1252?Q?ZJsPMSPWQ9byFDm3lN/Vs71ZiqT9mq5qJjR3jYPsMqB3YpUa32zkXhSH?= =?Windows-1252?Q?AbitRBHVinqKO7xybaBgsZkYnLggunqLUFJRjWn4Nvb13/FxeagSJwTM?= =?Windows-1252?Q?f4xqCVmQQqOzXIiqrPh115o6AKzAMIw6NQ2Cy+7vl5/MmdkLshvvxI/T?= =?Windows-1252?Q?vLHeFOLN0sg8wiu+WM2ocbj7UGVOvA8+00mKAyE/aXFBHpTpDeWMf4Bi?= =?Windows-1252?Q?QCntlFgwFw7gmY571hgR2+s5LJqr0yvfwatFfuQgqcYkvlSsA3L3oXKC?= =?Windows-1252?Q?DspZ8Z6KEYu6cKqyYz6qKOHP4U2ds/rHD0/ncw2GhOoIeLVT18ooLFZl?= =?Windows-1252?Q?TmuUY8cYKnFWHUWtN/etxUp+SEATsMWGiUOTj7Y78FprojrbaBXFJn+g?= =?Windows-1252?Q?cq3vS8Xh4R5UKIDn3q2eGHbEGeRMPDh+oVHog5oec5m/gVEi1pp+eaQv?= =?Windows-1252?Q?ffcN2uGZkHUNWB5Y4gSTuCuKVazx50R6t1mXGYjSNy0qyw7bxzZkhhC0?= =?Windows-1252?Q?mGFuQJVFF0ROhzIa5HnjnKprTGSjGZjDFbjyqJdYU0ihRc2Sb5kl7a75?= =?Windows-1252?Q?vGrXNGz8BXjjh++CgbqrFvGIV7sm5Yj5XYUNyS4kIC7HrPKc+zWlDk5+?= =?Windows-1252?Q?AdCJB930Y7oueeHgdetTcEpg1tItaSN2ZnFXl1zCsQ14Cvg9uHnhIDoi?= =?Windows-1252?Q?WKRaar2cmD3TqQmSRifXd83EVjmHbfnBKdp6UWwlsT6GlZUx7AGUugIV?= =?Windows-1252?Q?HojYo5+aFVmAMbpu3ZXcOuRbFI9GIJ9L8QWXnWhMTU/DT8frgOgiNUUY?= =?Windows-1252?Q?9DqxjFDC3lGN5RD5aKxV08W2AzhnCSkJ0UaiQMQJW6m?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR07MB1568;5:ahsiuNH9j7wmja2bDQhjaEEvEEh2JKdpFR+0J4KQwiNi9XoGS3d2XU11R7y+Fs/wjDrpQ5dR01uL+8rMwseHCE4+8U+7eyHwdfQ3/yOenG/RIjVy/i4SqJV05cdCqQSng+9AC3IIpl8WgoldzRM7uw==;24:n7zj33fexKg+52DdQgq1gsuq6oVnbW78MJ8uYiacXqWQ4VU7dFNRG3gsSYptPOKPsqJK+eJghSmPXOYv4ItYrS6jmGbp0Ked7Lpi5rhDsHw= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nextfour.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2016 10:28:38.0510 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB1568 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2855 Lines: 105 On 04/06/2016 12:53 AM, Hugh Dickins wrote: > +static void shmem_recovery_work(struct work_struct *work) > +{ > + struct recovery *recovery; > + struct shmem_inode_info *info; > + struct address_space *mapping; > + struct page *page; > + struct page *head = NULL; > + int error = -ENOENT; > + > + recovery = container_of(work, struct recovery, work); > + info = SHMEM_I(recovery->inode); > + if (!shmem_work_still_useful(recovery)) { > + shr_stats(work_too_late); > + goto out; > + } > + > + /* Are we resuming from an earlier partially successful attempt? */ > + mapping = recovery->inode->i_mapping; > + spin_lock_irq(&mapping->tree_lock); > + page = shmem_clear_tag_hugehole(mapping, recovery->head_index); > + if (page) > + head = team_head(page); > + spin_unlock_irq(&mapping->tree_lock); > + if (head) { > + /* Serialize with shrinker so it won't mess with our range */ > + spin_lock(&shmem_shrinklist_lock); > + spin_unlock(&shmem_shrinklist_lock); > + } > + > + /* If team is now complete, no tag and head would be found above */ > + page = recovery->page; > + if (PageTeam(page)) > + head = team_head(page); > + > + /* Get a reference to the head of the team already being assembled */ > + if (head) { > + if (!get_page_unless_zero(head)) > + head = NULL; > + else if (!PageTeam(head) || head->mapping != mapping || > + head->index != recovery->head_index) { > + put_page(head); > + head = NULL; > + } > + } > + > + if (head) { > + /* We are resuming work from a previous partial recovery */ > + if (PageTeam(page)) > + shr_stats(resume_teamed); > + else > + shr_stats(resume_tagged); > + } else { > + gfp_t gfp = mapping_gfp_mask(mapping); > + /* > + * XXX: Note that with swapin readahead, page_to_nid(page) will > + * often choose an unsuitable NUMA node: something to fix soon, > + * but not an immediate blocker. > + */ > + head = __alloc_pages_node(page_to_nid(page), > + gfp | __GFP_NOWARN | __GFP_THISNODE, HPAGE_PMD_ORDER); > + if (!head) { > + shr_stats(huge_failed); > + error = -ENOMEM; > + goto out; > + } Should this head marked PageTeam? Because in patch 27/31 when given as a hint to shmem_getpage_gfp() : hugehint = NULL; + if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && + sgp == SGP_TEAM && *pagep) { + struct page *head; + + if (!get_page_unless_zero(*pagep)) { + error = -ENOENT; + goto decused; + } + page = *pagep; + lock_page(page); + head = page - (index & (HPAGE_PMD_NR-1)); we fail always because : + if (!PageTeam(head)) { + error = -ENOENT; + goto decused; + } > + if (!shmem_work_still_useful(recovery)) { > + __free_pages(head, HPAGE_PMD_ORDER); > + shr_stats(huge_too_late); > + goto out; > + } > + split_page(head, HPAGE_PMD_ORDER); > + get_page(head); > + shr_stats(huge_alloced); > + } Thanks, Mika