Received: by 10.223.176.5 with SMTP id f5csp1986575wra; Sun, 4 Feb 2018 17:29:41 -0800 (PST) X-Google-Smtp-Source: AH8x227syNZSyBOQomSEI5WM3ujroJn+C4dJLnkTqa4S5z/4SsQwchA9bYwfg52tfX1iYmjq20fR X-Received: by 10.98.213.198 with SMTP id d189mr4788767pfg.136.1517794180900; Sun, 04 Feb 2018 17:29:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517794180; cv=none; d=google.com; s=arc-20160816; b=rUFI4/R9DtSoLefzFmSN3Rb+8/12c4QSfACkkNcYxbgCwARX3j/UXhfOlgRoHClLYN mw0mkU+tvSt/EZdklwzDum50PYfoSpD8wdemBfOjuQvAnYCbd91wqOTEk2XbG6WZFiwN N55D//Iq3MX1U25//jgLggybO0PUx2oO0zJJjlB/Xd4lyNUP2Tzvm9j/nwsHSdMzAP1L RnF5oAh0vkwk+aG9zNXQNpAB3MgtLrReT0tc3RqgMlIn2APDtFLn2PemuxalFqZNHfuQ 4ntPpSZbPcjLiZuEoevbANUZ53aaXDpgzRR0NmPm/Vo/HjAAXPnhkGVXUVh3T+5V1YXL IaZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=6RXASkMzMh+z/MGehSlfGWvqZzaHngnX/5YzKo0HXzM=; b=JPQMiHASB85KVIKVCMkdNmkkUBWoVg6vWnrrtfAGrz1sDYdpwupAm6Yy8TiViFf1yc pdphzM4oL0oaYtCFk+OwGPycb7pwiwh4ayYOgJmvHJWZX6/3v/kTOnjWA8vyBtHb3GbA eI+VBYXY38KRlwyy3NE5W9XQwd0LzrZp/HzZ6iw1Jq/CZAaRcqMaDlx1hC+b/kwhOKI9 XldCqJ5B74wsu/xBHO6Hu7x9IvFFtqJRrl7U6x0q061qUfkPqpJBFQSUmanOsX6VRXcz zAuByR5BGrOWVKwJ4Igr9w+K8sHYuxjzrqH7CwEWpbaTPYdDI3XfrZIXnsODQAWrIkuk F1aQ== ARC-Authentication-Results: i=1; mx.google.com; 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 m11si4840954pgt.592.2018.02.04.17.29.26; Sun, 04 Feb 2018 17:29:40 -0800 (PST) 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; 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 S1752693AbeBEB3D (ORCPT + 99 others); Sun, 4 Feb 2018 20:29:03 -0500 Received: from mx2.suse.de ([195.135.220.15]:43468 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752560AbeBEB2D (ORCPT ); Sun, 4 Feb 2018 20:28:03 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C1BEEADDA; Mon, 5 Feb 2018 01:27:59 +0000 (UTC) From: Davidlohr Bueso To: akpm@linux-foundation.org, mingo@kernel.org Cc: peterz@infradead.org, ldufour@linux.vnet.ibm.com, jack@suse.cz, mhocko@kernel.org, kirill.shutemov@linux.intel.com, mawilcox@microsoft.com, mgorman@techsingularity.net, dave@stgolabs.net, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Davidlohr Bueso Subject: [PATCH 05/64] mm,khugepaged: prepare passing of rangelock field to vm_fault Date: Mon, 5 Feb 2018 02:26:55 +0100 Message-Id: <20180205012754.23615-6-dbueso@wotan.suse.de> X-Mailer: git-send-email 2.12.3 In-Reply-To: <20180205012754.23615-1-dbueso@wotan.suse.de> References: <20180205012754.23615-1-dbueso@wotan.suse.de> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Davidlohr Bueso When collapsing huge pages from swapin, a vm_fault structure is built and passed to do_swap_page(). The new range field of the vm_fault structure must be set correctly when dealing with range_lock. We teach the main workhorse, khugepaged_scan_mm_slot(), to pass on a full range lock. Signed-off-by: Davidlohr Bueso --- mm/khugepaged.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index b7e2268dfc9a..0b91ce730160 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -873,7 +873,8 @@ static int hugepage_vma_revalidate(struct mm_struct *mm, unsigned long address, static bool __collapse_huge_page_swapin(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pmd_t *pmd, - int referenced) + int referenced, + struct range_lock *mmrange) { int swapped_in = 0, ret = 0; struct vm_fault vmf = { @@ -882,6 +883,7 @@ static bool __collapse_huge_page_swapin(struct mm_struct *mm, .flags = FAULT_FLAG_ALLOW_RETRY, .pmd = pmd, .pgoff = linear_page_index(vma, address), + .lockrange = mmrange, }; /* we only decide to swapin, if there is enough young ptes */ @@ -926,9 +928,10 @@ static bool __collapse_huge_page_swapin(struct mm_struct *mm, } static void collapse_huge_page(struct mm_struct *mm, - unsigned long address, - struct page **hpage, - int node, int referenced) + unsigned long address, + struct page **hpage, + int node, int referenced, + struct range_lock *mmrange) { pmd_t *pmd, _pmd; pte_t *pte; @@ -986,7 +989,7 @@ static void collapse_huge_page(struct mm_struct *mm, * If it fails, we release mmap_sem and jump out_nolock. * Continuing to collapse causes inconsistency. */ - if (!__collapse_huge_page_swapin(mm, vma, address, pmd, referenced)) { + if (!__collapse_huge_page_swapin(mm, vma, address, pmd, referenced, mmrange)) { mem_cgroup_cancel_charge(new_page, memcg, true); up_read(&mm->mmap_sem); goto out_nolock; @@ -1093,7 +1096,8 @@ static void collapse_huge_page(struct mm_struct *mm, static int khugepaged_scan_pmd(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, - struct page **hpage) + struct page **hpage, + struct range_lock *mmrange) { pmd_t *pmd; pte_t *pte, *_pte; @@ -1207,7 +1211,8 @@ static int khugepaged_scan_pmd(struct mm_struct *mm, if (ret) { node = khugepaged_find_target_node(); /* collapse_huge_page will return with the mmap_sem released */ - collapse_huge_page(mm, address, hpage, node, referenced); + collapse_huge_page(mm, address, hpage, node, referenced, + mmrange); } out: trace_mm_khugepaged_scan_pmd(mm, page, writable, referenced, @@ -1658,6 +1663,7 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, struct mm_struct *mm; struct vm_area_struct *vma; int progress = 0; + DEFINE_RANGE_LOCK_FULL(mmrange); VM_BUG_ON(!pages); VM_BUG_ON(NR_CPUS != 1 && !spin_is_locked(&khugepaged_mm_lock)); @@ -1731,7 +1737,7 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, } else { ret = khugepaged_scan_pmd(mm, vma, khugepaged_scan.address, - hpage); + hpage, &mmrange); } /* move to next address */ khugepaged_scan.address += HPAGE_PMD_SIZE; -- 2.13.6