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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B9F78C6FD1D for ; Tue, 14 Mar 2023 11:47:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E2E256B0072; Tue, 14 Mar 2023 07:47:32 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DDE2B8E0002; Tue, 14 Mar 2023 07:47:32 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CA56D8E0001; Tue, 14 Mar 2023 07:47:32 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id B6B746B0072 for ; Tue, 14 Mar 2023 07:47:32 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 88177A8509 for ; Tue, 14 Mar 2023 11:47:32 +0000 (UTC) X-FDA: 80567328744.13.E1194C8 Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) by imf17.hostedemail.com (Postfix) with ESMTP id ECC5E40005 for ; Tue, 14 Mar 2023 11:47:27 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf17.hostedemail.com: domain of zhangpeng362@huawei.com designates 45.249.212.255 as permitted sender) smtp.mailfrom=zhangpeng362@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1678794449; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QzfYv7NgtfLIuXJQHYqla5oGQhbw7OWsUIfbSCPEhvY=; b=grUq27TwhgJTZzw+qs3qMvGP3KVcCEJ4VtTGHmaZZxgpUWGdidrQ/ZRyRmRU8DWszc3vMS 0I6rhZI9I8vDOX5xWu5/esAigUiW4L/iJHkYs8BljtrkuXSwZ8GRxOudpu4KGz4ZOhesOb GGgu3SBzVw8d7CMt5nDsZxS0eTF4gSY= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf17.hostedemail.com: domain of zhangpeng362@huawei.com designates 45.249.212.255 as permitted sender) smtp.mailfrom=zhangpeng362@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1678794449; a=rsa-sha256; cv=none; b=nt3QPf/blDi/iMdK6UuZMIymN8nKKqyhRNuYrqRJgz6bSjFiKjqf+BOg9lEjOkxkWnxjmo 5Zv/aqGjtbO+shuKGzS8/sWNwrvQry9PAAcGOhNMFXf3trjvD34ppyUsCTPovxaNK8DuKq g6LzTT9rTUe8M4ETpokVwRac6d3RHEE= Received: from kwepemm600020.china.huawei.com (unknown [172.30.72.53]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4PbWs54lWBz17KsY; Tue, 14 Mar 2023 19:44:25 +0800 (CST) Received: from [10.174.179.160] (10.174.179.160) by kwepemm600020.china.huawei.com (7.193.23.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 14 Mar 2023 19:47:20 +0800 Message-ID: <3b4337fa-77a1-101b-ba93-b7781ecdf925@huawei.com> Date: Tue, 14 Mar 2023 19:47:20 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Subject: Re: [PATCH 2/3] userfaultfd: convert __mcopy_atomic_hugetlb() to use a folio Content-Language: en-US To: Matthew Wilcox CC: , , , , , , , References: <20230314033734.481904-1-zhangpeng362@huawei.com> <20230314033734.481904-3-zhangpeng362@huawei.com> From: "zhangpeng (AS)" In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.179.160] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To kwepemm600020.china.huawei.com (7.193.23.147) X-CFilter-Loop: Reflected X-Rspamd-Queue-Id: ECC5E40005 X-Stat-Signature: wafgs5mnnrry5giomkpyh588facf8rxf X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1678794447-25579 X-HE-Meta: U2FsdGVkX19l1hq8+KnDV5P3bR+LhnfwerEKi9OgPFvjil4MJfEnFPxIDHfkKesMQ1ffzxzAz6gUJ5kp50Mz/dMvFE36J9GJfiF/PxQeJNgM4YZYkgACyD8mPkuffOeMv/dBrxXstQvSOV2wlLr1XWsnbrha6t6bf2xIE5qCs2O6GnqJLVDfw7NW70kUGWlg0FxprxuzYxNJDNhnXbQLXZijjYg3yyrWb02eb55ZH1buXy71Jh6dXnQMdgNAcxwpwnW4yrRwZsj472K2mtzn6C9oiFk7ai8oFbth+RKSDaU+OW9ijODhZJugCMHwJ4aNA/+h8k16bQctBp+GbExWaPw6PV967x5thwF1eU8WIziwmwx5PLdpegWtjA1Z5vNrsuhebCE9ZIucy4r/Z1rEkFw1kZGOHcar2uwhaWJZwg/xUJPGNSvKgz5baxfIpqQGh0sE9RXgEKv1MxfFjSDvPPWxp2g1OiotQMAjt91qtbJbjDcG7aosIJc13q+zmaSGKP9JJXgWggmnEPRjAszsUJ+xmPWWrpI5cxsrBIKTRUH9yCjFC4Hm6T3BrAM5/BJnA1iiXj1uRYd10Cth4MYRn6PfT1hayg0WOsNIJffZ9nlVp3FLRqlxOGOF8M7/X+X6W269KlWE+aK49BMVS2+pzmRulPn48A5cAa+5Xmi++PW6fSwZ1MBopKutC7si4/bDigwCDUnFF96pyWvm69V+htz/DDDMUaFUBjdaw4L9IX1nFNsQG3sF/qGSAcNmbaRSrYzBLOIenSNWz0/bKxjL3mnFgkI8e4z1h2VcB+Z66gv/Ki3zT37TxJkKmVEEppVOYODjeHh3+PwgsTjHtPwDbqWFH6CB4ZhJmDsr27UBlS1ttFFFGbUbalUn3Hnh8N1uEd21xL+Cg/tGj9z0ACP8h6j9n17TiGAwYcjGUSayxnHLlDd7aSyg7ldAPyPkZRwGDiFFjA1o545OtN28FSF XF/I62qy Ll+aKq4PBKkMtLI1mcR2ww7AIptsPKVK8roCtQ1Q2tlMNyLc58NnzbujX7LtRM7kIW3zH1zvWwkQ+edCfmhefUcbmuLfAssabNDDvxxn5j4dk3wrA8RjqdlHKKGZbm2BvTXc/t/RvRfKx57+3vboC83S82qIaOsl6CtglXD+pP7+a1wtBXpWgGy/rv5tN2pQOPve5DsVmekAKMTb7RIqmueVmdfrS0d5X7gBdpwGZmbai1fJzFqwHSJxUkh1Rr0LKcGuWlwJMZOlhsEQ= 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 2023/3/14 16:31, Matthew Wilcox wrote: > On Tue, Mar 14, 2023 at 03:37:33AM +0000, Peng Zhang wrote: >> +++ b/include/linux/mm.h >> @@ -3546,9 +3546,8 @@ extern void copy_user_huge_page(struct page *dst, struct page *src, >> unsigned long addr_hint, >> struct vm_area_struct *vma, >> unsigned int pages_per_huge_page); >> -extern long copy_huge_page_from_user(struct page *dst_page, >> +extern long copy_large_folio_from_user(struct folio *dst_folio, > You can drop the 'extern'. Got it. >> +++ b/mm/memory.c >> @@ -5769,26 +5769,28 @@ void copy_user_huge_page(struct page *dst, struct page *src, >> process_huge_page(addr_hint, pages_per_huge_page, copy_subpage, &arg); >> } >> >> -long copy_huge_page_from_user(struct page *dst_page, >> +long copy_large_folio_from_user(struct folio *dst_folio, >> const void __user *usr_src, >> - unsigned int pages_per_huge_page, >> bool allow_pagefault) >> { >> void *page_kaddr; >> unsigned long i, rc = 0; >> - unsigned long ret_val = pages_per_huge_page * PAGE_SIZE; >> + unsigned int nr_pages = folio_nr_pages(dst_folio); >> + unsigned long ret_val = nr_pages * PAGE_SIZE; >> struct page *subpage; >> + struct folio *inner_folio; > What is an 'inner folio'? > >> - for (i = 0; i < pages_per_huge_page; i++) { >> - subpage = nth_page(dst_page, i); >> + for (i = 0; i < nr_pages; i++) { >> + subpage = folio_page(dst_folio, i); >> + inner_folio = page_folio(subpage); >> if (allow_pagefault) >> - page_kaddr = kmap(subpage); >> + page_kaddr = kmap_local_folio(inner_folio, 0); > This doesn't do what you think it does. Did you test this? > >> else >> page_kaddr = kmap_atomic(subpage); > Pretty sure all this should be converted to kmap_local and the atomic > bits should go away. > >> rc = copy_from_user(page_kaddr, >> usr_src + i * PAGE_SIZE, PAGE_SIZE); >> if (allow_pagefault) >> - kunmap(subpage); >> + kunmap_local(page_kaddr); >> else >> kunmap_atomic(page_kaddr); >> >> @@ -5796,7 +5798,7 @@ long copy_huge_page_from_user(struct page *dst_page, >> if (rc) >> break; >> >> - flush_dcache_page(subpage); >> + flush_dcache_folio(inner_folio); > The flush should probably be pulled outside the loop. > >> + err = copy_large_folio_from_user(folio, >> + (const void __user *) src_addr, true); > I wonder if this shouldn't be 'copy_folio_from_user()'. after all, > it'll work for any size folio, right? Thanks for your review. I'll rename copy_large_folio_from_user() to copy_folio_from_user(). I'll delete the inner_folio. kmap() and kmap_atomic() will be converted to the following code. page_kaddr = kmap_local_page(subpage); if (!allow_pagefault) pagefault_disable(); rc = copy_from_user(page_kaddr, usr_src + i * PAGE_SIZE, PAGE_SIZE); if (!allow_pagefault) pagefault_enable(); kunmap_local(page_kaddr); flush_dcache_folio() will be placed outside the loop. I'll fix all this in a v2 of this patch series. Thanks, Peng.