From patchwork Tue Sep 18 11:58:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aneesh Kumar K.V" X-Patchwork-Id: 10604251 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 33E19161F for ; Tue, 18 Sep 2018 11:59:10 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 236E92A75C for ; Tue, 18 Sep 2018 11:59:10 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 177EE2A76D; Tue, 18 Sep 2018 11:59:10 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 68A8B2A75C for ; Tue, 18 Sep 2018 11:59:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 77BFD8E0001; Tue, 18 Sep 2018 07:59:08 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 72A7F8E000C; Tue, 18 Sep 2018 07:59:08 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5F2B68E0001; Tue, 18 Sep 2018 07:59:08 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-oi0-f71.google.com (mail-oi0-f71.google.com [209.85.218.71]) by kanga.kvack.org (Postfix) with ESMTP id 387018E000C for ; Tue, 18 Sep 2018 07:59:08 -0400 (EDT) Received: by mail-oi0-f71.google.com with SMTP id r131-v6so1450511oie.14 for ; Tue, 18 Sep 2018 04:59:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:in-reply-to:references:message-id; bh=u1gVppiH/S1hzYVbM5i+PIAdgPKAyIVrjyAWyo4GCuA=; b=Cv8T8TUFAp54hjIc0QPWma2yM5j4KzrlIO31T/iPDkaXJv3CxB7lODpgZg7UMY4yPz SY3lWhxkibnndIowrc222WxCBcR02lxv0csPJwLhTXCveu/YIcmgEh9rl8IIcS1M8gB6 rf+p1JPQbc0V1bLaV3SxyiSIy1jrMqPeTkpmjyNdhzSYHz61RDspKnAfzCDPopQQroLs tN013s34F5B84yV9ulu132nHIKJlXkJul02WWd5aTB0Tf/l1QIJWKaCPwJci+ieHfnIj /WU0L+kmYUEnJCs6aEAEbbMqk8T7q/J+zNHRZ2+1ILJux1CoPCYbKMCdTXJQJ9t7qb9t kljA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) smtp.mailfrom=aneesh.kumar@linux.ibm.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com X-Gm-Message-State: APzg51ABveUL0Tq4eP445WIKM1r+db7Qj2duIPibuAkUfqja746037kW MmwE5gR6m6rBOnDOVveBEeVPsOnrTjQVdvUmOdOt2JDJft7++t7MPExR63wuQI+8wRxTqjin7fG szE9W89/r9Zooa319n17+hbTVfFDm7Ys1Efrr+2HllB3SBjArArLxv/eHlpcCr/MtcQ== X-Received: by 2002:a54:4783:: with SMTP id o3-v6mr1332673oic.139.1537271947886; Tue, 18 Sep 2018 04:59:07 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZVOYGoIO1PIndooz6jbSOXCPsi57hZPqnRK3zTZS5lf4uU1SO26Mx3T1AcWV4rnqFJaYsK X-Received: by 2002:a54:4783:: with SMTP id o3-v6mr1332619oic.139.1537271946277; Tue, 18 Sep 2018 04:59:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537271946; cv=none; d=google.com; s=arc-20160816; b=ThUpJi//xYo7QlD4rByYAsiKFb/onqa47yMZtXXDTZQ+cMhlGV4GUyymiiKZSVXsJy azZIF1XdF4UDpFZNz/Vaae3NM8trQCy9qtIxPhK07cFvXc/CKbOzrxHstr1MndClDfDa hMmafyNyk5DCWjNnSm33MX7/tGp8xFSOho2c295MP4AvNMNvmWKwdhdUiXEIWxHQtKiP +6OtOVnKtHEqP6H+bgljTSAoBAD1UiBNlbqZ2ZDRYtnhvDqdGe5QX6HRRdKinsNpLPXl CiQkOJwZJcFOjDsyhIXWOfQT6dvsGcgK8CEbO2vC/M/3Flh5TWSjjw4jotUbHM+STsOb 1gkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:references:in-reply-to:date:subject:cc:to:from; bh=u1gVppiH/S1hzYVbM5i+PIAdgPKAyIVrjyAWyo4GCuA=; b=zdA+EUW8Q7vSUkyscCePCDN4J0677J8smE02Nhr5icBBfLZOOha9O9tuX5c6lCc4WS 7l3dyjGVIw/qmb7jbVC2/NboQk3lUNRBOgjQEx0NDAVa//kvG0iddGPAwqQMyZh1i4Ht ut6Sx0CmLElVb0eGsf7pv0KlkUGVZk//JBrdVKQAMmgYmpocsea5m33LTeCsFgizBzbv VJ1pizopdR5q/6STnhGg8as7KoYknh1Q4rhUxNPmogUDgztIL1obeMGvXuiQQ4NEzoEA toRpMrOaQiGs51VVskPALzlOzPBoqkeftTFPHxAY1sP7gx+h7Xm8uw3sN4SrWdCRytln VkLQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) smtp.mailfrom=aneesh.kumar@linux.ibm.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com. [148.163.156.1]) by mx.google.com with ESMTPS id e15-v6si4429924oti.441.2018.09.18.04.59.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 18 Sep 2018 04:59:06 -0700 (PDT) Received-SPF: pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) client-ip=148.163.156.1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) smtp.mailfrom=aneesh.kumar@linux.ibm.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w8IBs1mY058236 for ; Tue, 18 Sep 2018 07:59:04 -0400 Received: from e15.ny.us.ibm.com (e15.ny.us.ibm.com [129.33.205.205]) by mx0a-001b2d01.pphosted.com with ESMTP id 2mjwh5gxbr-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 18 Sep 2018 07:59:03 -0400 Received: from localhost by e15.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 18 Sep 2018 07:59:02 -0400 Received: from b01cxnp23033.gho.pok.ibm.com (9.57.198.28) by e15.ny.us.ibm.com (146.89.104.202) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Tue, 18 Sep 2018 07:59:00 -0400 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp23033.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w8IBwxa625624744 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 18 Sep 2018 11:58:59 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4FF57AE05C; Tue, 18 Sep 2018 07:57:43 -0400 (EDT) Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7B196AE060; Tue, 18 Sep 2018 07:57:40 -0400 (EDT) Received: from skywalker.ibmuc.com (unknown [9.85.75.167]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP; Tue, 18 Sep 2018 07:57:40 -0400 (EDT) From: "Aneesh Kumar K.V" To: akpm@linux-foundation.org, Michal Hocko , Alexey Kardashevskiy , mpe@ellerman.id.au Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K.V" Subject: [PATCH V3 1/2] mm: Add get_user_pages_cma_migrate Date: Tue, 18 Sep 2018 17:28:38 +0530 X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180918115839.22154-1-aneesh.kumar@linux.ibm.com> References: <20180918115839.22154-1-aneesh.kumar@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18091811-0068-0000-0000-0000033D1946 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00009728; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000266; SDB=6.01090083; UDB=6.00563121; IPR=6.00870103; MB=3.00023366; MTD=3.00000008; XFM=3.00000015; UTC=2018-09-18 11:59:02 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18091811-0069-0000-0000-000045C5F38A Message-Id: <20180918115839.22154-2-aneesh.kumar@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-09-18_04:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1809180122 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: X-Virus-Scanned: ClamAV using ClamSMTP This helper does a get_user_pages_fast and if it find pages in the CMA area it will try to migrate them before taking page reference. This makes sure that we don't keep non-movable pages (due to page reference count) in the CMA area. Not able to move pages out of CMA area result in CMA allocation failures. Signed-off-by: Aneesh Kumar K.V --- include/linux/hugetlb.h | 2 + include/linux/migrate.h | 3 + mm/hugetlb.c | 4 +- mm/migrate.c | 132 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 2 deletions(-) diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 6b68e345f0ca..1abccb1a1ecc 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -357,6 +357,8 @@ struct page *alloc_huge_page_nodemask(struct hstate *h, int preferred_nid, nodemask_t *nmask); struct page *alloc_huge_page_vma(struct hstate *h, struct vm_area_struct *vma, unsigned long address); +struct page *alloc_migrate_huge_page(struct hstate *h, gfp_t gfp_mask, + int nid, nodemask_t *nmask); int huge_add_to_page_cache(struct page *page, struct address_space *mapping, pgoff_t idx); diff --git a/include/linux/migrate.h b/include/linux/migrate.h index f2b4abbca55e..d82b35afd2eb 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -286,6 +286,9 @@ static inline int migrate_vma(const struct migrate_vma_ops *ops, } #endif /* IS_ENABLED(CONFIG_MIGRATE_VMA_HELPER) */ +extern int get_user_pages_cma_migrate(unsigned long start, int nr_pages, int write, + struct page **pages); + #endif /* CONFIG_MIGRATION */ #endif /* _LINUX_MIGRATE_H */ diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 3c21775f196b..1abbfcb84f66 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1585,8 +1585,8 @@ static struct page *alloc_surplus_huge_page(struct hstate *h, gfp_t gfp_mask, return page; } -static struct page *alloc_migrate_huge_page(struct hstate *h, gfp_t gfp_mask, - int nid, nodemask_t *nmask) +struct page *alloc_migrate_huge_page(struct hstate *h, gfp_t gfp_mask, + int nid, nodemask_t *nmask) { struct page *page; diff --git a/mm/migrate.c b/mm/migrate.c index d6a2e89b086a..2f92534ea7a1 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -3006,3 +3006,135 @@ int migrate_vma(const struct migrate_vma_ops *ops, } EXPORT_SYMBOL(migrate_vma); #endif /* defined(MIGRATE_VMA_HELPER) */ + +static struct page *new_non_cma_page(struct page *page, unsigned long private) +{ + /* + * We want to make sure we allocate the new page from the same node + * as the source page. + */ + int nid = page_to_nid(page); + gfp_t gfp_mask = GFP_USER | __GFP_THISNODE; + + if (PageHighMem(page)) + gfp_mask |= __GFP_HIGHMEM; + + if (PageTransHuge(page)) { + struct page *thp; + gfp_t thp_gfpmask = GFP_TRANSHUGE | __GFP_THISNODE; + + /* + * Remove the movable mask so that we don't allocate from + * CMA area again. + */ + thp_gfpmask &= ~__GFP_MOVABLE; + thp = __alloc_pages_node(nid, thp_gfpmask, HPAGE_PMD_ORDER); + if (!thp) + return NULL; + prep_transhuge_page(thp); + return thp; + +#ifdef CONFIG_HUGETLB_PAGE + } else if (PageHuge(page)) { + + struct hstate *h = page_hstate(page); + /* + * We don't want to dequeue from the pool because pool pages will + * mostly be from the CMA region. + */ + return alloc_migrate_huge_page(h, gfp_mask, nid, NULL); +#endif + } + + return __alloc_pages_node(nid, gfp_mask, 0); +} + +/** + * get_user_pages_cma_migrate() - pin user pages in memory by migrating pages in CMA region + * @start: starting user address + * @nr_pages: number of pages from start to pin + * @write: whether pages will be written to + * @pages: array that receives pointers to the pages pinned. + * Should be at least nr_pages long. + * + * Attempt to pin user pages in memory without taking mm->mmap_sem. + * If not successful, it will fall back to taking the lock and + * calling get_user_pages(). + * + * If the pinned pages are backed by CMA region, we migrate those pages out, + * allocating new pages from non-CMA region. This helps in avoiding keeping + * pages pinned in the CMA region for a long time thereby resulting in + * CMA allocation failures. + * + * Returns number of pages pinned. This may be fewer than the number + * requested. If nr_pages is 0 or negative, returns 0. If no pages + * were pinned, returns -errno. + */ + +int get_user_pages_cma_migrate(unsigned long start, int nr_pages, int write, + struct page **pages) +{ + int i, ret; + bool drain_allow = true; + bool migrate_allow = true; + LIST_HEAD(cma_page_list); + +get_user_again: + ret = get_user_pages_fast(start, nr_pages, write, pages); + if (ret <= 0) + return ret; + + for (i = 0; i < ret; ++i) { + /* + * If we get a page from the CMA zone, since we are going to + * be pinning these entries, we might as well move them out + * of the CMA zone if possible. + */ + if (is_migrate_cma_page(pages[i]) && migrate_allow) { + if (PageHuge(pages[i])) + isolate_huge_page(pages[i], &cma_page_list); + else { + struct page *head = compound_head(pages[i]); + + if (!PageLRU(head) && drain_allow) { + lru_add_drain_all(); + drain_allow = false; + } + + if (!isolate_lru_page(head)) { + list_add_tail(&head->lru, &cma_page_list); + mod_node_page_state(page_pgdat(head), + NR_ISOLATED_ANON + + page_is_file_cache(head), + hpage_nr_pages(head)); + } + } + } + } + if (!list_empty(&cma_page_list)) { + /* + * drop the above get_user_pages reference. + */ + for (i = 0; i < ret; ++i) + put_page(pages[i]); + + if (migrate_pages(&cma_page_list, new_non_cma_page, + NULL, 0, MIGRATE_SYNC, MR_CONTIG_RANGE)) { + /* + * some of the pages failed migration. Do get_user_pages + * without migration. + */ + migrate_allow = false; + + if (!list_empty(&cma_page_list)) + putback_movable_pages(&cma_page_list); + } + /* + * We did migrate all the pages, Try to get the page references again + * migrating any new CMA pages which we failed to isolate earlier. + */ + drain_allow = true; + goto get_user_again; + } + return ret; +} From patchwork Tue Sep 18 11:58:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aneesh Kumar K.V" X-Patchwork-Id: 10604253 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 875965A4 for ; Tue, 18 Sep 2018 11:59:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 76AB32A75C for ; Tue, 18 Sep 2018 11:59:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6ABDB2A76D; Tue, 18 Sep 2018 11:59:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C165A2A75C for ; Tue, 18 Sep 2018 11:59:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 66AA68E000D; Tue, 18 Sep 2018 07:59:11 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 619C18E000C; Tue, 18 Sep 2018 07:59:11 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4BCBC8E000D; Tue, 18 Sep 2018 07:59:11 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot1-f69.google.com (mail-ot1-f69.google.com [209.85.210.69]) by kanga.kvack.org (Postfix) with ESMTP id 231E38E000C for ; Tue, 18 Sep 2018 07:59:11 -0400 (EDT) Received: by mail-ot1-f69.google.com with SMTP id p23-v6so1307607otl.23 for ; Tue, 18 Sep 2018 04:59:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:in-reply-to:references:message-id; bh=MH1xubOAD/a0Ch5UTzxxgumIftrVXnQELtP4CffADK0=; b=fUUIKoLzye9YWi9UT4hRd11v+aUMkQkK0C8e74uZqsK5O3+2h4ccnK2F+S3sWxlbLc P7cUliR7mXMWx4MFEH19RxmPmAZFTuZNrPkwiYZjsZ6wNhCxJWI3u4wu7HCXjuSQb2AG LMYXCe1jLn7Xi1SiKfZ2LlgxeQ2ckqIxJdsK6xBdeU9GCefGGnYz0c08SoHeaoUpIGuL s6qLmFwt1Ko/9fx0CVjfuJAhm/OYq1PIQ082Z49HDAJWOla3wWi6Mx7bG1SFvKLrWJ8P wN0PrDf1aH3r2cvDNTCu6BwxqvwxkM3eGKpwownZ4gJYMtPYW7G8U2C8ZwiwrIQX9Qjv UYpQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) smtp.mailfrom=aneesh.kumar@linux.ibm.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com X-Gm-Message-State: APzg51CznFYI5FfosSaC6pyGMv80/ik2IQSCgPTApRURgV8YjBt9VpDM o9Sls3T6DuIEubHpZd/vf65gsRvCLg38HHhSZZdHCull9Z8QfgVE7j1xiilXS+FkHSh3Whl3Yld FpQ2vj17/ZsI/O3s1m3KGl0wrqJGgKHyqYD3amccM/PzchHJneW4cEc0NPLBm7qTvDw== X-Received: by 2002:aca:2808:: with SMTP id 8-v6mr40686oix.7.1537271950841; Tue, 18 Sep 2018 04:59:10 -0700 (PDT) X-Google-Smtp-Source: ANB0VdbSS2gSUyz72tUi++bzX+1G5pnNazLCpiU6cOOQ8H1KH2WH+F6OT46Qhv1fysja9ErYvI5e X-Received: by 2002:aca:2808:: with SMTP id 8-v6mr40645oix.7.1537271949571; Tue, 18 Sep 2018 04:59:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537271949; cv=none; d=google.com; s=arc-20160816; b=jLlI34uYXnEdLilhJM9g3Gwcgxi5gW1cWgvWGV9mOFXNHvusZMNzu0w4hpwGwnrHdg Fqll8O46p0VabBEPzmFdsFpMsxX7yLrHJ6meefYaHwreAQA4/O5e2SDEc/m6dsa5/3gr CjCYBa/q34va3WVR3JnRVSzEJPKEuEgk7gtLuzluSRJni6SvHZ5moWOJhZTZb/Sfz+0L Vja07baNjdQcINSIMgzyXdArtZrcjBJo7fwUM3I9hq4VlNhK4dMGQ+D+I0BOWIf1eqXK c0bLlgognwaXkm3T1pUjPkYP59qAe7G0YDlmpyXa/ltVFNhMUFJ8WUIJrtiQoCvfsFRS zraA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:references:in-reply-to:date:subject:cc:to:from; bh=MH1xubOAD/a0Ch5UTzxxgumIftrVXnQELtP4CffADK0=; b=EXdLQ+4nPrskfs70XmQZQ3H9HZ/y5yf3EvqSCQtlyYpRYHUGhdWY5uyURCjD4lOng2 svYP3H6mupdb3oJkxEYgyVa2UKlPHdCY+RhgwB15P1lfZkfDd8oLHlRV61l5wgaHcUaI aSoatjnVU6eFZnEGsl2vtJaQKwXdjIkoMzNEuGDdNA6X3FLRicd7sx7Lxwy4AldLviph JJwZeTOFMDh0eHaQeqjo9ocRNj+0TfeYDHgKqEh3k1Z0K8l25VaIJ7cK80Z/B0isX/1x WXKo29QZQpGEXtd7PqSJSBDhKtEB1BMRYVuxyRjN9AsobYBvkHuwLlhsVckFqR9RQZMK 0j4Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) smtp.mailfrom=aneesh.kumar@linux.ibm.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com. [148.163.156.1]) by mx.google.com with ESMTPS id l81-v6si8304637oig.89.2018.09.18.04.59.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 18 Sep 2018 04:59:09 -0700 (PDT) Received-SPF: pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) client-ip=148.163.156.1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.156.1 as permitted sender) smtp.mailfrom=aneesh.kumar@linux.ibm.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w8IBtrp6075309 for ; Tue, 18 Sep 2018 08:01:01 -0400 Received: from e17.ny.us.ibm.com (e17.ny.us.ibm.com [129.33.205.207]) by mx0a-001b2d01.pphosted.com with ESMTP id 2mk0by9mxf-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Tue, 18 Sep 2018 08:01:01 -0400 Received: from localhost by e17.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 18 Sep 2018 07:59:07 -0400 Received: from b01cxnp22034.gho.pok.ibm.com (9.57.198.24) by e17.ny.us.ibm.com (146.89.104.204) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Tue, 18 Sep 2018 07:59:04 -0400 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp22034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w8IBx3xM5177752 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 18 Sep 2018 11:59:03 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 901E8AE063; Tue, 18 Sep 2018 07:57:47 -0400 (EDT) Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C96E0AE062; Tue, 18 Sep 2018 07:57:44 -0400 (EDT) Received: from skywalker.ibmuc.com (unknown [9.85.75.167]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP; Tue, 18 Sep 2018 07:57:44 -0400 (EDT) From: "Aneesh Kumar K.V" To: akpm@linux-foundation.org, Michal Hocko , Alexey Kardashevskiy , mpe@ellerman.id.au Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K.V" Subject: [PATCH V3 2/2] powerpc/mm/iommu: Allow migration of cma allocated pages during mm_iommu_get Date: Tue, 18 Sep 2018 17:28:39 +0530 X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180918115839.22154-1-aneesh.kumar@linux.ibm.com> References: <20180918115839.22154-1-aneesh.kumar@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18091811-0040-0000-0000-000004719C57 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00009728; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000266; SDB=6.01090083; UDB=6.00563121; IPR=6.00870103; MB=3.00023366; MTD=3.00000008; XFM=3.00000015; UTC=2018-09-18 11:59:06 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18091811-0041-0000-0000-00000878D61A Message-Id: <20180918115839.22154-3-aneesh.kumar@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-09-18_04:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1807170000 definitions=main-1809180122 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: X-Virus-Scanned: ClamAV using ClamSMTP Current code doesn't do page migration if the page allocated is a compound page. With HugeTLB migration support, we can end up allocating hugetlb pages from CMA region. Also THP pages can be allocated from CMA region. This patch updates the code to handle compound pages correctly. This use the new helper get_user_pages_cma_migrate. It does one get_user_pages with right count, instead of doing one get_user_pages per page. That avoids reading page table multiple times. The patch also convert the hpas member of mm_iommu_table_group_mem_t to a union. We use the same storage location to store pointers to struct page. We cannot update alll the code path use struct page *, because we access hpas in real mode and we can't do that struct page * to pfn conversion in real mode. Signed-off-by: Aneesh Kumar K.V --- arch/powerpc/mm/mmu_context_iommu.c | 120 ++++++++-------------------- 1 file changed, 35 insertions(+), 85 deletions(-) diff --git a/arch/powerpc/mm/mmu_context_iommu.c b/arch/powerpc/mm/mmu_context_iommu.c index c9ee9e23845f..f0d8645872cb 100644 --- a/arch/powerpc/mm/mmu_context_iommu.c +++ b/arch/powerpc/mm/mmu_context_iommu.c @@ -20,6 +20,7 @@ #include #include #include +#include static DEFINE_MUTEX(mem_list_mutex); @@ -30,8 +31,18 @@ struct mm_iommu_table_group_mem_t { atomic64_t mapped; unsigned int pageshift; u64 ua; /* userspace address */ - u64 entries; /* number of entries in hpas[] */ - u64 *hpas; /* vmalloc'ed */ + u64 entries; /* number of entries in hpages[] */ + /* + * in mm_iommu_get we temporarily use this to store + * struct page address. + * + * We need to convert ua to hpa in real mode. Make it + * simpler by storing physicall address. + */ + union { + struct page **hpages; /* vmalloc'ed */ + phys_addr_t *hpas; + }; }; static long mm_iommu_adjust_locked_vm(struct mm_struct *mm, @@ -74,63 +85,14 @@ bool mm_iommu_preregistered(struct mm_struct *mm) } EXPORT_SYMBOL_GPL(mm_iommu_preregistered); -/* - * Taken from alloc_migrate_target with changes to remove CMA allocations - */ -struct page *new_iommu_non_cma_page(struct page *page, unsigned long private) -{ - gfp_t gfp_mask = GFP_USER; - struct page *new_page; - - if (PageCompound(page)) - return NULL; - - if (PageHighMem(page)) - gfp_mask |= __GFP_HIGHMEM; - - /* - * We don't want the allocation to force an OOM if possibe - */ - new_page = alloc_page(gfp_mask | __GFP_NORETRY | __GFP_NOWARN); - return new_page; -} - -static int mm_iommu_move_page_from_cma(struct page *page) -{ - int ret = 0; - LIST_HEAD(cma_migrate_pages); - - /* Ignore huge pages for now */ - if (PageCompound(page)) - return -EBUSY; - - lru_add_drain(); - ret = isolate_lru_page(page); - if (ret) - return ret; - - list_add(&page->lru, &cma_migrate_pages); - put_page(page); /* Drop the gup reference */ - - ret = migrate_pages(&cma_migrate_pages, new_iommu_non_cma_page, - NULL, 0, MIGRATE_SYNC, MR_CONTIG_RANGE); - if (ret) { - if (!list_empty(&cma_migrate_pages)) - putback_movable_pages(&cma_migrate_pages); - } - - return 0; -} - long mm_iommu_get(struct mm_struct *mm, unsigned long ua, unsigned long entries, struct mm_iommu_table_group_mem_t **pmem) { struct mm_iommu_table_group_mem_t *mem; - long i, j, ret = 0, locked_entries = 0; + long i, ret = 0, locked_entries = 0; unsigned int pageshift; unsigned long flags; unsigned long cur_ua; - struct page *page = NULL; mutex_lock(&mem_list_mutex); @@ -177,41 +139,24 @@ long mm_iommu_get(struct mm_struct *mm, unsigned long ua, unsigned long entries, goto unlock_exit; } + ret = get_user_pages_cma_migrate(ua, entries, 1, mem->hpages); + if (ret != entries) { + /* free the reference taken */ + for (i = 0; i < ret; i++) + put_page(mem->hpages[i]); + + vfree(mem->hpas); + kfree(mem); + ret = -EFAULT; + goto unlock_exit; + } else + ret = 0; + + pageshift = PAGE_SHIFT; for (i = 0; i < entries; ++i) { + struct page *page = mem->hpages[i]; cur_ua = ua + (i << PAGE_SHIFT); - if (1 != get_user_pages_fast(cur_ua, - 1/* pages */, 1/* iswrite */, &page)) { - ret = -EFAULT; - for (j = 0; j < i; ++j) - put_page(pfn_to_page(mem->hpas[j] >> - PAGE_SHIFT)); - vfree(mem->hpas); - kfree(mem); - goto unlock_exit; - } - /* - * If we get a page from the CMA zone, since we are going to - * be pinning these entries, we might as well move them out - * of the CMA zone if possible. NOTE: faulting in + migration - * can be expensive. Batching can be considered later - */ - if (is_migrate_cma_page(page)) { - if (mm_iommu_move_page_from_cma(page)) - goto populate; - if (1 != get_user_pages_fast(cur_ua, - 1/* pages */, 1/* iswrite */, - &page)) { - ret = -EFAULT; - for (j = 0; j < i; ++j) - put_page(pfn_to_page(mem->hpas[j] >> - PAGE_SHIFT)); - vfree(mem->hpas); - kfree(mem); - goto unlock_exit; - } - } -populate: - pageshift = PAGE_SHIFT; + if (mem->pageshift > PAGE_SHIFT && PageCompound(page)) { pte_t *pte; struct page *head = compound_head(page); @@ -229,7 +174,12 @@ long mm_iommu_get(struct mm_struct *mm, unsigned long ua, unsigned long entries, local_irq_restore(flags); } mem->pageshift = min(mem->pageshift, pageshift); + /* + * We don't need struct page reference any more, switch + * physicall address. + */ mem->hpas[i] = page_to_pfn(page) << PAGE_SHIFT; + } atomic64_set(&mem->mapped, 1);