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 382B2C001DF for ; Wed, 2 Aug 2023 15:12:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8A237280189; Wed, 2 Aug 2023 11:12:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 85244280143; Wed, 2 Aug 2023 11:12:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 71A06280189; Wed, 2 Aug 2023 11:12:11 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 6176D280143 for ; Wed, 2 Aug 2023 11:12:11 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 19CD2120F8A for ; Wed, 2 Aug 2023 15:12:11 +0000 (UTC) X-FDA: 81079505262.09.12B72C4 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf19.hostedemail.com (Postfix) with ESMTP id 2C7F11A000C for ; Wed, 2 Aug 2023 15:12:08 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=none; spf=pass (imf19.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com; dmarc=pass (policy=none) header.from=arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690989129; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=VcWtZv7OGrF7G0rLLZKolH/jJQRw5EbfjQFGrZLP3G0=; b=fuC7onZmVV5SM2l1JuLq6CZkgNDopZS1KewNT4Ja6LxfS6MSNv5MKxZ8+Yk5jpx/XqTSRX 7fUbDPeUFvuhFjpBFEk3mU6dUU6Cirm/5s1n+jjoPvUNnqTPu/Nul62iMCqeH/9KVaxMWY uo54+C4yGNq9hN2IMdsEqMH8XNGJpE4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690989129; a=rsa-sha256; cv=none; b=vZclhmcNeXNYrsMoWZv5K9JvQNyBho2o6GePPwOr9vAIFdRtnIiyUJjRzIdevDPO7MRuBC evgCE9OP+pwH+8DKNnRzp+UpIiO1uH5ZK/pro/EAAscj7lYs6z6fQD3w3GudfM0LJ0kfJC VSMFup6pRM1QOSnXJzEp83U3O3n/t3o= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=none; spf=pass (imf19.hostedemail.com: domain of ryan.roberts@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=ryan.roberts@arm.com; dmarc=pass (policy=none) header.from=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 99811113E; Wed, 2 Aug 2023 08:12:50 -0700 (PDT) Received: from [10.57.77.90] (unknown [10.57.77.90]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id ECCFC3F5A1; Wed, 2 Aug 2023 08:12:05 -0700 (PDT) Message-ID: <7c7b8c39-b412-a120-368c-ba4ab2cc2a15@arm.com> Date: Wed, 2 Aug 2023 16:12:04 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH 1/3] mm: add functions folio_in_range() and folio_within_vma() To: "Yin, Fengwei" , linux-mm@kvack.org, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, yuzhao@google.com, willy@infradead.org, david@redhat.com, shy828301@gmail.com, hughd@google.com References: <20230728070929.2487065-1-fengwei.yin@intel.com> <20230728070929.2487065-2-fengwei.yin@intel.com> <55c9e3f7-099d-6f57-32da-1f318a9688a0@arm.com> <9bba9369-e3f5-53da-bf8f-8ab887d3c3ae@arm.com> From: Ryan Roberts In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 2C7F11A000C X-Rspam-User: X-Stat-Signature: e73jgjr77da6rggdm5jhectgyia339p7 X-Rspamd-Server: rspam03 X-HE-Tag: 1690989128-950862 X-HE-Meta: U2FsdGVkX1/HYBj9NeTTiBooHqf+WOFxgNX0yElMRuGQ2PMcGuvJ7jRhTNihrPWxvqzufLzet/x5asqRI9XVzuL4XR8oJaZ73guWrn48heoUuI/1f54VgmDg/sr84fqQ1TaNcDuSqJTGCAgx5As6sDrrjpnEEM35Wqjr/iFwIpc3kOf8z0dqxtA+ir6RAgzgYNiLd2gbqtFUDdATygcjgsJqnzlhQggfqQnDwvfQ6u/8vsVIHA4dAWO1asA0M6tSbRmq5XNU/Frl1OUOR9Va9uh64tfJBO+jbrdkGOMs3VIn0Sau/6hg5cz3pLtOis0u3hY44WCj9utWD0kkhRp9zphLY0vvKa/Di2N6HiZ7Nw33voE1h+24OHGxLKwbeclHtvTj8zaKWBsKWJFeD17Vm6XWtdnoFy+lURwB/eOzwVRZ1o+ag6x3t0HJKkKz41hyzS93h3+maVC75EP0x1hlGcXQW41/iToLh8MFCXByBm82LomnZ0q0x8cILD7peYgm9dzO9dQRoVMALJYn6IUZMaCEGcnQx+hSln7odvqo8Vc+QonJK4d+w/vML8Lt/e41av+5+f0KmeG9x4f4HQCHDsLDu7pHeT3p/70Cr3Ylq+U4IsDGTeUmmpHNGOdCyo4sRcKSRYuple1uhy8um76S02sAn1Q764/bD/LpMDhWc03E3DZmFRWk417ntJapXH1B2/CmtId+IyeGWfl4fwdgm5JoZVxqyFVge2ySDoPqYWaPY32IEvw9Y70VR7s88+Ryyf+JONZkrhR/vkiH3CJ89P385nRsHINWMi012ZAW1HJKUJTOMCa/86Au5NrtfoKe5xnQIWXMEccN7y4VwYY1VJxIUdjpNVzwh0woti0keMzJtzrMUBxe/e+puhBcJV9477h0TQ/XrGrfUC1+pi0Pszj+ndYT4c2VFrp3/+YoQXdi4tJq0oBbbOHbmyTp+kCihYFMATayjMb7tNPZdSi 5fKCIhAL AfoRkQ72MwqeTryj1RU3LtsmpGH46zOEX7hchTOqzzsT3QNEvWFvlirKQNBdc14BaoQHNdERYJbzbAgkGVGfpuu39sA+YUFkupxdhecK6mw70j4RNbpF+UzrthRQ+0BXmaNvW+isHt29f+EhaAIOTzEcf52Ncj/IIqCUH 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: >> I also wonder if you should change the name of folio_within_vma() to something >> like folio_test_cont_in_vma() to disambiguate from the case where the folio may >> be fully mapped with a discontiguity (although perhaps that's not possible >> because a mremap would result in distinct vmas... would a new mmap in the hole >> cause a merge of all 3?). > I don't think it's possible as mremap reuse original pgoff of VMA to new VMA. I suppose > it will prevent VMA merging. But I didn't check detail. pgoff is not relevant for anon though, right? FWIW, I wrote a test to check if merging is performed. Interestingly, v5.4 (on x86) *does* merge the VMAs in this case, but v6.5-rc3 (on arm64) *does not* merge the VMAs in this case. I think you should assume it might be possible in some cases. #define _GNU_SOURCE #include #include #include #include int main(int argc, char **argv) { size_t pgsize = getpagesize(); char *memarea; char *memlow; char *memmid; char *memhigh; int ret = 0; // Get a free vm area big enough for 5 pages. memarea = mmap(NULL, pgsize * 5, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (memarea == MAP_FAILED) { perror("mmap 1"); exit(1); } // Map 2 pages one page into allocated area. memlow = mmap(memarea + pgsize, pgsize * 2, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (memlow == MAP_FAILED) { perror("mmap 2"); exit(1); } // Move the second allocated page one page higher. memhigh = mremap(memarea + pgsize * 2, pgsize, pgsize, MREMAP_FIXED | MREMAP_MAYMOVE, memarea + pgsize * 3); if (memhigh == MAP_FAILED) { perror("mremap"); exit(1); } // We should now have: // | page 0 | page 1 | page 2 | page 3 | page 4 | // | NONE | vma 1 | empty | vma 2 | NONE | printf("Check for 2 vmas with hole: pid=%d, memarea=%p, memlow=%p, memhigh=%p\n", getpid(), memarea, memlow, memhigh); getchar(); // Now map a page in the empty space. memmid = mmap(memarea + pgsize * 2, pgsize, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (memmid == MAP_FAILED) { perror("mmap 2"); exit(1); } // We should now have: // | page 0 | page 1 | page 2 | page 3 | page 4 | // | NONE | vma 1 | NONE | printf("Check for single merged vma: pid=%d, memarea=%p, memlow=%p, memmid=%p, memhigh=%p\n", getpid(), memarea, memlow, memmid, memhigh); getchar(); return ret; } Output on v5.4: Check for 2 vmas with hole: pid=171038, memarea=0x7fe6c34d9000, memlow=0x7fe6c34da000, memhigh=0x7fe6c34dc000 Check for single merged vma: pid=171038, memarea=0x7fe6c34d9000, memlow=0x7fe6c34da000, memmid=0x7fe6c34db000, memhigh=0x7fe6c34dc000 And maps output at the 2 check points: (base) ryarob01@e125769:/data_nvme0n1/ryarob01/granule_perf$ cat /proc/171038/maps 55e55c258000-55e55c259000 r--p 00000000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c259000-55e55c25a000 r-xp 00001000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c25a000-55e55c25b000 r--p 00002000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c25b000-55e55c25c000 r--p 00002000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c25c000-55e55c25d000 rw-p 00003000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c403000-55e55c424000 rw-p 00000000 00:00 0 [heap] 7fe6c32d2000-7fe6c32f4000 r--p 00000000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c32f4000-7fe6c346c000 r-xp 00022000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c346c000-7fe6c34ba000 r--p 0019a000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c34ba000-7fe6c34be000 r--p 001e7000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c34be000-7fe6c34c0000 rw-p 001eb000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c34c0000-7fe6c34c6000 rw-p 00000000 00:00 0 7fe6c34d9000-7fe6c34da000 ---p 00000000 00:00 0 7fe6c34da000-7fe6c34db000 rw-p 00000000 00:00 0 7fe6c34dc000-7fe6c34dd000 rw-p 00000000 00:00 0 7fe6c34dd000-7fe6c34de000 ---p 00000000 00:00 0 7fe6c34de000-7fe6c34df000 r--p 00000000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c34df000-7fe6c3502000 r-xp 00001000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c3502000-7fe6c350a000 r--p 00024000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c350b000-7fe6c350c000 r--p 0002c000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c350c000-7fe6c350d000 rw-p 0002d000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c350d000-7fe6c350e000 rw-p 00000000 00:00 0 7fff39a11000-7fff39a32000 rw-p 00000000 00:00 0 [stack] 7fff39a83000-7fff39a86000 r--p 00000000 00:00 0 [vvar] 7fff39a86000-7fff39a87000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] (base) ryarob01@e125769:/data_nvme0n1/ryarob01/granule_perf$ cat /proc/171038/maps 55e55c258000-55e55c259000 r--p 00000000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c259000-55e55c25a000 r-xp 00001000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c25a000-55e55c25b000 r--p 00002000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c25b000-55e55c25c000 r--p 00002000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c25c000-55e55c25d000 rw-p 00003000 fd:00 5297466 /data_nvme0n1/ryarob01/granule_perf/merge 55e55c403000-55e55c424000 rw-p 00000000 00:00 0 [heap] 7fe6c32d2000-7fe6c32f4000 r--p 00000000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c32f4000-7fe6c346c000 r-xp 00022000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c346c000-7fe6c34ba000 r--p 0019a000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c34ba000-7fe6c34be000 r--p 001e7000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c34be000-7fe6c34c0000 rw-p 001eb000 fd:02 9573653 /lib/x86_64-linux-gnu/libc-2.31.so 7fe6c34c0000-7fe6c34c6000 rw-p 00000000 00:00 0 7fe6c34d9000-7fe6c34da000 ---p 00000000 00:00 0 7fe6c34da000-7fe6c34dd000 rw-p 00000000 00:00 0 7fe6c34dd000-7fe6c34de000 ---p 00000000 00:00 0 7fe6c34de000-7fe6c34df000 r--p 00000000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c34df000-7fe6c3502000 r-xp 00001000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c3502000-7fe6c350a000 r--p 00024000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c350b000-7fe6c350c000 r--p 0002c000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c350c000-7fe6c350d000 rw-p 0002d000 fd:02 9573649 /lib/x86_64-linux-gnu/ld-2.31.so 7fe6c350d000-7fe6c350e000 rw-p 00000000 00:00 0 7fff39a11000-7fff39a32000 rw-p 00000000 00:00 0 [stack] 7fff39a83000-7fff39a86000 r--p 00000000 00:00 0 [vvar] 7fff39a86000-7fff39a87000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] Output on v6.5-rc3: Check for 2 vmas with hole: pid=3181, memarea=0xfffff7ff2000, memlow=0xfffff7ff3000, memhigh=0xfffff7ff5000 Check for single merged vma: pid=3181, memarea=0xfffff7ff2000, memlow=0xfffff7ff3000, memmid=0xfffff7ff4000, memhigh=0xfffff7ff5000 And maps output at the 2 check points: ubuntu@ubuntuvm:~/linux$ cat /proc/3181/maps aaaaaaaa0000-aaaaaaaa1000 r-xp 00000000 fe:02 8199010 /home/ubuntu/merge aaaaaaab0000-aaaaaaab1000 r--p 00000000 fe:02 8199010 /home/ubuntu/merge aaaaaaab1000-aaaaaaab2000 rw-p 00001000 fe:02 8199010 /home/ubuntu/merge aaaaaaab2000-aaaaaaad3000 rw-p 00000000 00:00 0 [heap] fffff7e00000-fffff7f89000 r-xp 00000000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f89000-fffff7f98000 ---p 00189000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f98000-fffff7f9c000 r--p 00188000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f9c000-fffff7f9e000 rw-p 0018c000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f9e000-fffff7faa000 rw-p 00000000 00:00 0 fffff7fc2000-fffff7fed000 r-xp 00000000 fe:02 41316494 /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 fffff7ff2000-fffff7ff3000 ---p 00000000 00:00 0 fffff7ff3000-fffff7ff4000 rw-p 00000000 00:00 0 fffff7ff5000-fffff7ff6000 rw-p 00000000 00:00 0 fffff7ff6000-fffff7ff7000 ---p 00000000 00:00 0 fffff7ff7000-fffff7ff9000 rw-p 00000000 00:00 0 fffff7ff9000-fffff7ffb000 r--p 00000000 00:00 0 [vvar] fffff7ffb000-fffff7ffc000 r-xp 00000000 00:00 0 [vdso] fffff7ffc000-fffff7ffe000 r--p 0002a000 fe:02 41316494 /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 fffff7ffe000-fffff8000000 rw-p 0002c000 fe:02 41316494 /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 fffffffdf000-1000000000000 rw-p 00000000 00:00 0 [stack] ubuntu@ubuntuvm:~/linux$ cat /proc/3181/maps aaaaaaaa0000-aaaaaaaa1000 r-xp 00000000 fe:02 8199010 /home/ubuntu/merge aaaaaaab0000-aaaaaaab1000 r--p 00000000 fe:02 8199010 /home/ubuntu/merge aaaaaaab1000-aaaaaaab2000 rw-p 00001000 fe:02 8199010 /home/ubuntu/merge aaaaaaab2000-aaaaaaad3000 rw-p 00000000 00:00 0 [heap] fffff7e00000-fffff7f89000 r-xp 00000000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f89000-fffff7f98000 ---p 00189000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f98000-fffff7f9c000 r--p 00188000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f9c000-fffff7f9e000 rw-p 0018c000 fe:02 41410085 /usr/lib/aarch64-linux-gnu/libc.so.6 fffff7f9e000-fffff7faa000 rw-p 00000000 00:00 0 fffff7fc2000-fffff7fed000 r-xp 00000000 fe:02 41316494 /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 fffff7ff2000-fffff7ff3000 ---p 00000000 00:00 0 fffff7ff3000-fffff7ff4000 rw-p 00000000 00:00 0 fffff7ff4000-fffff7ff5000 rw-p 00000000 00:00 0 fffff7ff5000-fffff7ff6000 rw-p 00000000 00:00 0 fffff7ff6000-fffff7ff7000 ---p 00000000 00:00 0 fffff7ff7000-fffff7ff9000 rw-p 00000000 00:00 0 fffff7ff9000-fffff7ffb000 r--p 00000000 00:00 0 [vvar] fffff7ffb000-fffff7ffc000 r-xp 00000000 00:00 0 [vdso] fffff7ffc000-fffff7ffe000 r--p 0002a000 fe:02 41316494 /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 fffff7ffe000-fffff8000000 rw-p 0002c000 fe:02 41316494 /usr/lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 fffffffdf000-1000000000000 rw-p 00000000 00:00 0 [stack]