From patchwork Wed Nov 21 09:22:57 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: 10692167 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 7E3F91709 for ; Wed, 21 Nov 2018 09:23:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6CEB32B7F4 for ; Wed, 21 Nov 2018 09:23:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 609A32B7FD; Wed, 21 Nov 2018 09:23:20 +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 AF1782B7F4 for ; Wed, 21 Nov 2018 09:23:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8F5586B2570; Wed, 21 Nov 2018 04:23:18 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 87D936B2572; Wed, 21 Nov 2018 04:23:18 -0500 (EST) 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 6F67E6B2573; Wed, 21 Nov 2018 04:23:18 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) by kanga.kvack.org (Postfix) with ESMTP id 0E2506B2570 for ; Wed, 21 Nov 2018 04:23:18 -0500 (EST) Received: by mail-ed1-f70.google.com with SMTP id x1-v6so2643351edh.8 for ; Wed, 21 Nov 2018 01:23:18 -0800 (PST) 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=aGzfxiTif8AMlD0Xm8tWOePInchJv7IeHvSARnFd4Sg=; b=V/7C25ggdjKaDY5DF9Wt5gzkbaEpOWz47306uOOQn8CQcOZJ2OPU2DIXwxmO9UOaSn DwgxuyjFNK5uRjMOThhtzqZ+5CPIcYXs02lUXvfzY24AogAh3zhCwz8Ty4AdniVVv69G sqwb6VYuIrfFn3++UEKYcHf1vtGOy4uwobP+JxkmFt7Q+NAPaY5uICJXFuUJQCarH+P3 fF4kj8ZsMl6eKh3iFZ30naGvnRr9It1FDEk+vmHxvpCHlCFAU/mlpQ3c73uab2rIVvYf U17XoPHDsHsX6oplP6vGrfMy8hitFFQwD/KhlnkbTk6cQrDV6HSL9H108NpgYNhYl4k3 vinw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.158.5 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: AA+aEWYTB0TRlfX1ScM4aTn99uUbWNzvWXdI5yua/fDAtms349mcdnuC ZJfRY3YgvFQbbC0wTREOydeP3gAUygHbDRaCARAgIgg0ZXlIZd7EPDf7A/3kgxZeOGGnhuCm7hi rN/aQs9tYABRolaGi6l4QrqOObuyAmiJmOiRsd58+oRsUxPq80Q9gBlLP0ln89VTfnw== X-Received: by 2002:a50:f284:: with SMTP id f4mr4997282edm.77.1542792197530; Wed, 21 Nov 2018 01:23:17 -0800 (PST) X-Google-Smtp-Source: AFSGD/UPolpSHkZ+1yx+V7IFo64uoEzO7AN53Rf7wZBVUINzfFPM3NXDQLK5KMuXdIa38Bq9npel X-Received: by 2002:a50:f284:: with SMTP id f4mr4997202edm.77.1542792195847; Wed, 21 Nov 2018 01:23:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542792195; cv=none; d=google.com; s=arc-20160816; b=Ne9Fwt234CeHNo001YsZDcq3QYSkTRDvND9g9rIVEL6iUrldPJpFNptS9GrCsLOtaN ELe4IRfEeGCygiTNpc8QnRl3OEqQ6LLauPmPA/IHjcSt70Ve2xzq3PXBnIKDkd7RQZJ7 nUl/Pcos39dBTb23mJhLjhpQldPAAIH1c9hEPV8jw8BUdPkav2+r7v1OFQXEZaUOxuSF 8sXi94rlz9xzmbh64LN+tpqQmoKGBtHxzz1MxZwZCapBuPMwMMHMb1NF5j3kfvweaikP ezsagWhSh0kUWKljS5MHPc3hPUznEio7J3ELumaWIYXpiZmf+GJCfec4iAkD8/RKd0tf QIcw== 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=aGzfxiTif8AMlD0Xm8tWOePInchJv7IeHvSARnFd4Sg=; b=iuwdxcOYy/WEOP0288JbcQPRKUVABDCSuqHejLpu6dwbEolRTZDlxOxTTYk19etkpU ynb9heNEcMkiJHEnw0HtdOSBWBL5DHeRsPqFRueukyUUOkgYTakAtj332QLA5xl2m9BT cB2aDzm+HBCHQoVfvw6fdI6ykTCZ9Um1kkb1A3jJRJ2SY+aRflv7M3fZmkMDUjTrj0J6 XCNC+raqNoLaQqwyI2/QlTtXoAG2o2t1mlUh2Ou0zKSUbPHodzGUiiS1ZlogewkjJxgA 1Qrrff0GRsJRMaaAokn50laoiKsC6FWKKDr/v3qegpdxlBNe//kFahcYMiVLQYwy9PZm 7FVA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.158.5 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 (mx0b-001b2d01.pphosted.com. [148.163.158.5]) by mx.google.com with ESMTPS id z4si2650515edz.205.2018.11.21.01.23.15 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Nov 2018 01:23:15 -0800 (PST) Received-SPF: pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.158.5 as permitted sender) client-ip=148.163.158.5; Authentication-Results: mx.google.com; spf=pass (google.com: domain of aneesh.kumar@linux.ibm.com designates 148.163.158.5 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 (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id wAL9J9DZ104909 for ; Wed, 21 Nov 2018 04:23:14 -0500 Received: from e11.ny.us.ibm.com (e11.ny.us.ibm.com [129.33.205.201]) by mx0a-001b2d01.pphosted.com with ESMTP id 2nw32dcsw4-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 21 Nov 2018 04:23:14 -0500 Received: from localhost by e11.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 21 Nov 2018 09:23:13 -0000 Received: from b01cxnp22034.gho.pok.ibm.com (9.57.198.24) by e11.ny.us.ibm.com (146.89.104.198) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 21 Nov 2018 09:23:10 -0000 Received: from b01ledav002.gho.pok.ibm.com (b01ledav002.gho.pok.ibm.com [9.57.199.107]) by b01cxnp22034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id wAL9N9LX56754250 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 21 Nov 2018 09:23:09 GMT Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7CA97124053; Wed, 21 Nov 2018 09:23:09 +0000 (GMT) Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0FE23124052; Wed, 21 Nov 2018 09:23:07 +0000 (GMT) Received: from skywalker.in.ibm.com (unknown [9.124.31.179]) by b01ledav002.gho.pok.ibm.com (Postfix) with ESMTP; Wed, 21 Nov 2018 09:23:06 +0000 (GMT) From: "Aneesh Kumar K.V" To: akpm@linux-foundation.org, Michal Hocko , Alexey Kardashevskiy , mpe@ellerman.id.au, paulus@samba.org, David Gibson Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K.V" Subject: [PATCH V4 1/3] mm: Add get_user_pages_cma_migrate Date: Wed, 21 Nov 2018 14:52:57 +0530 X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181121092259.16482-1-aneesh.kumar@linux.ibm.com> References: <20181121092259.16482-1-aneesh.kumar@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18112109-2213-0000-0000-0000031C186F X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00010091; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000270; SDB=6.01120588; UDB=6.00581487; IPR=6.00900709; MB=3.00024261; MTD=3.00000008; XFM=3.00000015; UTC=2018-11-21 09:23:13 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18112109-2214-0000-0000-00005C549DE8 Message-Id: <20181121092259.16482-2-aneesh.kumar@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-11-21_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-1810050000 definitions=main-1811210085 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 087fd5f48c91..1eed0cdaec0e 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -371,6 +371,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 7f2a28ab46d5..faf3102ae45e 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 f7e4bfdc13b7..b0e47e2c5347 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -2946,3 +2946,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; + +#ifdef CONFIG_HUGETLB_PAGE + 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 + 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; + } + + 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) { + + struct page *head = compound_head(pages[i]); + + if (PageHuge(head)) + isolate_huge_page(head, &cma_page_list); + else { + 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 Wed Nov 21 09:22:58 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: 10692169 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 7CFA51709 for ; Wed, 21 Nov 2018 09:23:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 66DA52B7F4 for ; Wed, 21 Nov 2018 09:23:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 54FEE2B7FD; Wed, 21 Nov 2018 09:23:24 +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 96AF82B7F4 for ; Wed, 21 Nov 2018 09:23:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8A7186B2572; Wed, 21 Nov 2018 04:23:22 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 82E8C6B2574; Wed, 21 Nov 2018 04:23:22 -0500 (EST) 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 6A87C6B2575; Wed, 21 Nov 2018 04:23:22 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by kanga.kvack.org (Postfix) with ESMTP id 18DD86B2572 for ; Wed, 21 Nov 2018 04:23:22 -0500 (EST) Received: by mail-pl1-f198.google.com with SMTP id d23so6960563plj.22 for ; Wed, 21 Nov 2018 01:23:22 -0800 (PST) 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=88VfcEwoUkXk0+5kCRtZ3GovmPULKzM9tFD0O/+wD3w=; b=OBqm1fIUGcpIq292sOJ2ObJqcolz3VGY3esQjghZtHjupcaiS6APGjqK6b5EDslpNE rwAkrKmSt5m1iqOkcF3kia8jM//TACsivKVbhRKeiMHaTC0bSNgWnO1ZKiUo1cG2ux3o vO0/sTqhvFphRwFgAPgoKl55/ZJoZ4d43cczbWI7RGzfgfYrVxtT5aOxFp0V9E2R5NVn jvyeWLT9tG7tffOb0QvhT6D2yE3U7pCWx2G4pkKfQnFemM5qVfSzbPbksJ39Fh1pBMtt ItnrgPk7ugl1OIYLwR4o/2GhFenhaWZNMNjNA/aBn1nyN4NOH3rAqhRMWrAqEukxhjWB j41Q== 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: AGRZ1gKH1EzUiDIVjV2w0U3RWFq+D/9wye9RDO9ii6uyNjO+3VZXSwfo Anbe2B3cnkFZFpZ2Noqya0KPJ5x6sK+OIp9D5z5CDPjdQ6jrGUhuZ+hP1upoerggmUoxb8BSa/T HYbPqf6vRUws/yuH2q4EkniMOyXnIxBJIF+VOqNrDyicnnU7egZYFXRuID5babq5L6A== X-Received: by 2002:a62:d0c1:: with SMTP id p184mr5904781pfg.245.1542792200159; Wed, 21 Nov 2018 01:23:20 -0800 (PST) X-Google-Smtp-Source: AJdET5eNwTW03mZCEyJ+6wW+apb68qvIZ8g9e1FY67HsT+gkazI1KAYMAwHozuB2d+JdiTMPQ7z1 X-Received: by 2002:a62:d0c1:: with SMTP id p184mr5904735pfg.245.1542792199175; Wed, 21 Nov 2018 01:23:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542792199; cv=none; d=google.com; s=arc-20160816; b=mQVBrxZahMidrWvaBvZ+rSVeAWhgy6RXzVMF+oBBdEQaFXxJjnuX6aLFAGjtPKDcs2 7Eyt5W8ABcL5Ahqkk6UsmQRg45Lrnd917ZS5KUDZTG05FOJYN0KExUt/A2SCyEucxIBu QDtUYCgLWg+d4qq1OBHEjrCeIkeuf917vuerKmUawGEzT2DcQ0564PK5FQ4mabL5IAXf SuX8G3MM2GBvfeI66Glie9hppPlLX8c9USmdjR16WkuKU/z2/KJa7DG9FljN2cno8IkW RtKiq0e0LRKrS80mLTfsNwzFg1nCRwBJqwwh6LdxhXYofT3CATGJNq2fO4WfFMTR+WZj hQlg== 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=88VfcEwoUkXk0+5kCRtZ3GovmPULKzM9tFD0O/+wD3w=; b=v2100+CQogpKBO+G4WQctkamuRYBq46jP+ODNB6Pq0XyUy+E/BLgQYngVAU1UCBlxo slU9hbF0vtN2KdQj1mkwd6bPWDAaj9yy5p62IIbmX+ZiqvI5Zv3ghXapaxLezR8FliYv jEfoaiwPAzImmSr0rSET5Ji1DKyVeoANrKK+h8C7inksjlMGe/jlM1i/gCrATEbYJBG0 Ji8NXguwRLzQlRYYZxACSNyISZN6hlkM93X7LMOhDdUc4EHaz1BvV4rWhmZoOp8RrAF+ jFvIuBt/Ve6R51h/taXg3S8J3gDBL8O/b4F1za14m09SV0c4hKZDee27VlE7H4yBhkLk gfWw== 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 c9si2118719pll.439.2018.11.21.01.23.18 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Nov 2018 01:23:19 -0800 (PST) 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 (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id wAL9J7g7051964 for ; Wed, 21 Nov 2018 04:23:18 -0500 Received: from e12.ny.us.ibm.com (e12.ny.us.ibm.com [129.33.205.202]) by mx0a-001b2d01.pphosted.com with ESMTP id 2nw4gjgk4c-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 21 Nov 2018 04:23:18 -0500 Received: from localhost by e12.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 21 Nov 2018 09:23:17 -0000 Received: from b01cxnp22035.gho.pok.ibm.com (9.57.198.25) by e12.ny.us.ibm.com (146.89.104.199) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 21 Nov 2018 09:23:14 -0000 Received: from b01ledav002.gho.pok.ibm.com (b01ledav002.gho.pok.ibm.com [9.57.199.107]) by b01cxnp22035.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id wAL9NDKg44826822 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 21 Nov 2018 09:23:13 GMT Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 650F3124053; Wed, 21 Nov 2018 09:23:13 +0000 (GMT) Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EC50D124052; Wed, 21 Nov 2018 09:23:10 +0000 (GMT) Received: from skywalker.in.ibm.com (unknown [9.124.31.179]) by b01ledav002.gho.pok.ibm.com (Postfix) with ESMTP; Wed, 21 Nov 2018 09:23:10 +0000 (GMT) From: "Aneesh Kumar K.V" To: akpm@linux-foundation.org, Michal Hocko , Alexey Kardashevskiy , mpe@ellerman.id.au, paulus@samba.org, David Gibson Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K.V" Subject: [PATCH V4 2/3] powerpc/mm/iommu: Allow migration of cma allocated pages during mm_iommu_get Date: Wed, 21 Nov 2018 14:52:58 +0530 X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181121092259.16482-1-aneesh.kumar@linux.ibm.com> References: <20181121092259.16482-1-aneesh.kumar@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18112109-0060-0000-0000-000002D6575F X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00010092; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000270; SDB=6.01120588; UDB=6.00581487; IPR=6.00900709; MB=3.00024261; MTD=3.00000008; XFM=3.00000015; UTC=2018-11-21 09:23:17 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18112109-0061-0000-0000-0000474465F9 Message-Id: <20181121092259.16482-3-aneesh.kumar@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-11-21_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-1810050000 definitions=main-1811210085 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 56c2234cc6ae..1d5161f93ce6 100644 --- a/arch/powerpc/mm/mmu_context_iommu.c +++ b/arch/powerpc/mm/mmu_context_iommu.c @@ -21,6 +21,7 @@ #include #include #include +#include static DEFINE_MUTEX(mem_list_mutex); @@ -34,8 +35,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, @@ -78,63 +89,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); @@ -181,41 +143,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); @@ -233,7 +178,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); From patchwork Wed Nov 21 09:22:59 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: 10692171 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 2E53A13BB for ; Wed, 21 Nov 2018 09:23:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1C22A2B7F4 for ; Wed, 21 Nov 2018 09:23:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 100822B7FD; Wed, 21 Nov 2018 09:23:27 +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 93FF72B7F4 for ; Wed, 21 Nov 2018 09:23:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 487A36B2574; Wed, 21 Nov 2018 04:23:25 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 4370D6B2576; Wed, 21 Nov 2018 04:23:25 -0500 (EST) 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 2B1B76B2577; Wed, 21 Nov 2018 04:23:25 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by kanga.kvack.org (Postfix) with ESMTP id D2D8B6B2574 for ; Wed, 21 Nov 2018 04:23:24 -0500 (EST) Received: by mail-pl1-f198.google.com with SMTP id o23so7270651pll.0 for ; Wed, 21 Nov 2018 01:23:24 -0800 (PST) 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=DeCFWKP++ruHsAMRCwDW1v2uov9MK4zya+3krSps6Jw=; b=L7bpChnXf4zuE+FhjsYaWm5IGG1ys8xp0C4oDb3QlmC02eBHT4dn0mqwkL2eNXG4uk oCA/AwbePfWTghYqTVQI4IrW8mCB1LgRUrPVCUUo6NMNOzVFor7aFRtxC0/3bFpHGJS3 E5Z4+OSSxmFmuNEFE0TdB5bjbJrGn1UlSGGT5Luk3R8yc6Ce96GTIOzi2bZlei+3tTmd /Dx2FTV1akCLSb0qBOa7uvVtS8kKjdexxVahEaqZeHhZWLWOgs/+eJU9uZL2XBJPo6gB WbHxdnVosxsnqEoalJvou61002V6OPr7UMOdLYGZ1uBe2medcWJeUSaA5K4PYuamAFKs pNRA== 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: AA+aEWamOA1JldXlLckognCICzryeUmD25w1kmzKUbNztqCLEJPBzCxB eeR0AOdS64F36DKBOW+c6yVoRlkgX2m8P+BMKSzY/kG2FSeY5GDTvPaeVBNvBltr5Sf3MO1RS2U CTibkW2cmBrHk6Q4OhfnkwOm9JafTtZ1gEd6PogkCie9SMEQLN+H1T0eKljDQM1l4Ow== X-Received: by 2002:a65:5a4c:: with SMTP id z12mr5288467pgs.188.1542792204512; Wed, 21 Nov 2018 01:23:24 -0800 (PST) X-Google-Smtp-Source: AFSGD/VmIhk5kw5tzX8hDc5QROkh94zeN08TzhV6MKg/uHe12GEr0jqti/GmX9A5gOmqUYPN7XkS X-Received: by 2002:a65:5a4c:: with SMTP id z12mr5288437pgs.188.1542792203797; Wed, 21 Nov 2018 01:23:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542792203; cv=none; d=google.com; s=arc-20160816; b=u7Hdn7hpYB1UxtBhFCpXosxhNsb/s2wd0Caw+95byTH8epR0DB6mp0HvlECbZpkpJP eP5IrmrtZ9PHrOfvbc7yEAwF+yHk3rUlWc1MW29IzVWDtAF0jooOcYiWPOfNHBFr+OQl 0/fg0Jc5u3kN74HSaYK2xjcW+XP4yVKQnHfqFReTsdYl2iCJObEm6oL55aYYtTZmGgew jRoJZTUjCsrHJtIiiaWzhQeLGum0UteZbT2YJEsJpJjv6O+dFNK0lGm/pbUZ8QgVfM+5 x9Hh4xZeECwLuFRRWE0DKC8vSZhymEUaHqclSlPf+vTpoedje2BexY3xGCHrmZrMa2eI PN+g== 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=DeCFWKP++ruHsAMRCwDW1v2uov9MK4zya+3krSps6Jw=; b=caOt8C2n8zaQpSDAbd5iFfb42nVvN/VjUbO7icHOQQxHQjDQirzOVjD6B++on8S24O X2J5ORgsrUKj/oSWaIkgIDTeUD0rxZlVhJehL72vpw3WiLxCdUSIffMReTjSfpkwJ7Id jjh8wlemszopen/Az7gLhYb6j4OjY1DDlAAUZ/HxSAUea3RBS20wHMZ+YwrNAH3yKX7e wPs5QTwnOjXg/u+WFfCkp3rjUbnpk9pfeVgZKYORG8ZGk/aaLzlVKsIhT/ZDm+0vtSFk X8eKUuBAxseLgrvhDAKn6GVsuipAfRwhJd8fXrzbk391o6vfosm1NSv929/LvEN7CSC1 KsVQ== 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 x1si25766639pfn.111.2018.11.21.01.23.23 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Nov 2018 01:23:23 -0800 (PST) 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 (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id wAL9J9fi088616 for ; Wed, 21 Nov 2018 04:23:23 -0500 Received: from e11.ny.us.ibm.com (e11.ny.us.ibm.com [129.33.205.201]) by mx0a-001b2d01.pphosted.com with ESMTP id 2nw4c313ju-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 21 Nov 2018 04:23:23 -0500 Received: from localhost by e11.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 21 Nov 2018 09:23:21 -0000 Received: from b01cxnp22036.gho.pok.ibm.com (9.57.198.26) by e11.ny.us.ibm.com (146.89.104.198) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 21 Nov 2018 09:23:18 -0000 Received: from b01ledav002.gho.pok.ibm.com (b01ledav002.gho.pok.ibm.com [9.57.199.107]) by b01cxnp22036.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id wAL9NHw033620034 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 21 Nov 2018 09:23:17 GMT Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 79DF5124058; Wed, 21 Nov 2018 09:23:17 +0000 (GMT) Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D0708124052; Wed, 21 Nov 2018 09:23:14 +0000 (GMT) Received: from skywalker.in.ibm.com (unknown [9.124.31.179]) by b01ledav002.gho.pok.ibm.com (Postfix) with ESMTP; Wed, 21 Nov 2018 09:23:14 +0000 (GMT) From: "Aneesh Kumar K.V" To: akpm@linux-foundation.org, Michal Hocko , Alexey Kardashevskiy , mpe@ellerman.id.au, paulus@samba.org, David Gibson Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, "Aneesh Kumar K.V" Subject: [PATCH V4 3/3] powerpc/mm/iommu: Allow large IOMMU page size only for hugetlb backing Date: Wed, 21 Nov 2018 14:52:59 +0530 X-Mailer: git-send-email 2.17.2 In-Reply-To: <20181121092259.16482-1-aneesh.kumar@linux.ibm.com> References: <20181121092259.16482-1-aneesh.kumar@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18112109-2213-0000-0000-0000031C1871 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00010091; HX=3.00000242; KW=3.00000007; PH=3.00000004; SC=3.00000270; SDB=6.01120588; UDB=6.00581487; IPR=6.00900709; MB=3.00024261; MTD=3.00000008; XFM=3.00000015; UTC=2018-11-21 09:23:21 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18112109-2214-0000-0000-00005C549DF4 Message-Id: <20181121092259.16482-4-aneesh.kumar@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-11-21_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-1810050000 definitions=main-1811210085 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 THP pages can get split during different code paths. An incremented reference count do imply we will not split the compound page. But the pmd entry can be converted to level 4 pte entries. Keep the code simpler by allowing large IOMMU page size only if the guest ram is backed by hugetlb pages. Signed-off-by: Aneesh Kumar K.V --- arch/powerpc/mm/mmu_context_iommu.c | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/arch/powerpc/mm/mmu_context_iommu.c b/arch/powerpc/mm/mmu_context_iommu.c index 1d5161f93ce6..0741d905ed04 100644 --- a/arch/powerpc/mm/mmu_context_iommu.c +++ b/arch/powerpc/mm/mmu_context_iommu.c @@ -95,8 +95,6 @@ long mm_iommu_get(struct mm_struct *mm, unsigned long ua, unsigned long entries, struct mm_iommu_table_group_mem_t *mem; long i, ret = 0, locked_entries = 0; unsigned int pageshift; - unsigned long flags; - unsigned long cur_ua; mutex_lock(&mem_list_mutex); @@ -159,23 +157,15 @@ long mm_iommu_get(struct mm_struct *mm, unsigned long ua, unsigned long entries, pageshift = PAGE_SHIFT; for (i = 0; i < entries; ++i) { struct page *page = mem->hpages[i]; - cur_ua = ua + (i << PAGE_SHIFT); - if (mem->pageshift > PAGE_SHIFT && PageCompound(page)) { - pte_t *pte; + /* + * Allow to use larger than 64k IOMMU pages. Only do that + * if we are backed by hugetlb. + */ + if ((mem->pageshift > PAGE_SHIFT) && PageHuge(page)) { struct page *head = compound_head(page); - unsigned int compshift = compound_order(head); - unsigned int pteshift; - - local_irq_save(flags); /* disables as well */ - pte = find_linux_pte(mm->pgd, cur_ua, NULL, &pteshift); - - /* Double check it is still the same pinned page */ - if (pte && pte_page(*pte) == head && - pteshift == compshift + PAGE_SHIFT) - pageshift = max_t(unsigned int, pteshift, - PAGE_SHIFT); - local_irq_restore(flags); + + pageshift = compound_order(head) + PAGE_SHIFT; } mem->pageshift = min(mem->pageshift, pageshift); /*