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 X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A8223C433EF for ; Thu, 23 Sep 2021 22:29:42 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 0ED876124C for ; Thu, 23 Sep 2021 22:29:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 0ED876124C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvack.org Received: by kanga.kvack.org (Postfix) id 1F4036B006C; Thu, 23 Sep 2021 18:29:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1A3F7900002; Thu, 23 Sep 2021 18:29:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 044626B0073; Thu, 23 Sep 2021 18:29:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id E9DAF6B006C for ; Thu, 23 Sep 2021 18:29:40 -0400 (EDT) Received: from smtpin02.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id A9C0B2D3B5 for ; Thu, 23 Sep 2021 22:29:40 +0000 (UTC) X-FDA: 78620281320.02.5007618 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) by imf11.hostedemail.com (Postfix) with ESMTP id 75707F0000B8 for ; Thu, 23 Sep 2021 22:29:40 +0000 (UTC) Received: by mail-ed1-f41.google.com with SMTP id x7so14111437edd.6 for ; Thu, 23 Sep 2021 15:29:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=cgVSKBEuHze6exBeUanURS4ipvYaInWvl/Yx3hoo6G4=; b=SJwlyYoLdyelvLMaK2xHgiiR1pT0fhjReWqAq6Q5k/vB409dNGMraAGiEq9eR6fSl9 +Wma2r5WbaJCNcuk/HzHCqhaTJWAjju3iyIL1vAlJkLTQcZn7nTMr8vuRlLW2Zr/7C9X UD+cu2FL5UJew+nGvCHT6ITCEjsMzH8uaDzJsdvwQNFhkokX0L58NhHuNax8g6IBtguG +6lCYA+38bDwkNn60Ai7aL004dOj8OsQvO+7Bt6oNIEBzHuFrs+/jkLqSESE61zDTlIG RfxTDfBulzZlhvIHSU3hhXljMz7vUHUZSYtCmB5RTSDRX6ZPgAwYjVj66Q7QAI9gDTQP tDIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=cgVSKBEuHze6exBeUanURS4ipvYaInWvl/Yx3hoo6G4=; b=dW3WRJgFHmjruUMZ29gNL0VaTXv5tesgIpQWjDiOXeZ9FBlfdBOFAhb1TSQKyrivKY YZh6dfe0TJZ4BYybHcPMyqrC65H+5Ri+kc1BdEkjy/GZQfV5/PRaW8j8ThzLSvNdqakg NB7qpqrGeC0VwFMgn1qKMdSEJDc5TQGH3r++Y8uG9LmAFrhtGnX/OS8W/nVEeKO9Kxj3 3VMMHJTNqxOWU1xBTHwOZtDxAx8Ry51Lec0XqzBrUgSYvUp+GZERYl6679iN07EEAYm3 C0U61UpE/sDSj0BC/wuB0ePzmUZchvEluUHbarf5vpgVk8DVgk83Hb3byQ9Mq0GbwrdO rhvw== X-Gm-Message-State: AOAM531g0bHDK2lCMPEPCE02hqHcSZnuz+Qd/EFf4LPOFZHqGMoMilHQ cBztczK77PkL8ia3MHAc38rRy6jQvWGgqlXEP7I= X-Google-Smtp-Source: ABdhPJxpeJzEy3InxgoPqwYS/T5aYWx5nIjPcOP0OIDq7D6ggOaxMmFEBhgQClT9kghoCMTDpL6Zn7ogrlM1EVEDjvw= X-Received: by 2002:a17:906:1341:: with SMTP id x1mr7826650ejb.277.1632436179312; Thu, 23 Sep 2021 15:29:39 -0700 (PDT) MIME-Version: 1.0 References: <20210922102411.34494-1-songmuchun@bytedance.com> <20210922102411.34494-5-songmuchun@bytedance.com> In-Reply-To: <20210922102411.34494-5-songmuchun@bytedance.com> From: Barry Song <21cnbao@gmail.com> Date: Fri, 24 Sep 2021 10:29:28 +1200 Message-ID: Subject: Re: [PATCH v3 4/4] selftests: vm: add a hugetlb test case To: Muchun Song Cc: Mike Kravetz , Andrew Morton , Oscar Salvador , Michal Hocko , Barry Song , David Hildenbrand , Chen Huang , "Bodeddula, Balasubramaniam" , Jonathan Corbet , Matthew Wilcox , Xiongchun duan , fam.zheng@bytedance.com, Muchun Song , Qi Zheng , linux-doc@vger.kernel.org, LKML , Linux-MM Content-Type: text/plain; charset="UTF-8" X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: 75707F0000B8 X-Stat-Signature: 8973rx9k68bhznagfw5pxccs5pwox3u6 Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=SJwlyYoL; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf11.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.208.41 as permitted sender) smtp.mailfrom=21cnbao@gmail.com X-HE-Tag: 1632436180-960695 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 Wed, Sep 22, 2021 at 10:27 PM Muchun Song wrote: > > Since the head vmemmap page frame associated with each HugeTLB page is > reused, we should hide the PG_head flag of tail struct page from the > user. Add a tese case to check whether it is work properly. The test > steps are as follows. > > 1) alloc 2MB hugeTLB > 2) get each page frame > 3) apply those APIs in each page frame > 4) Those APIs work completely the same as before. > > Reading the flags of a page by /proc/kpageflags is done in > stable_page_flags(), which has invoked PageHead(), PageTail(), > PageCompound() and compound_head(). If those APIs work properly, the > head page must have 15 and 17 bits set. And tail pages must have 16 > and 17 bits set but 15 bit unset. Those flags are checked in > check_page_flags(). > > Signed-off-by: Muchun Song > --- > tools/testing/selftests/vm/vmemmap_hugetlb.c | 144 +++++++++++++++++++++++++++ > 1 file changed, 144 insertions(+) > create mode 100644 tools/testing/selftests/vm/vmemmap_hugetlb.c > > diff --git a/tools/testing/selftests/vm/vmemmap_hugetlb.c b/tools/testing/selftests/vm/vmemmap_hugetlb.c > new file mode 100644 > index 000000000000..4cc74dd4c333 > --- /dev/null > +++ b/tools/testing/selftests/vm/vmemmap_hugetlb.c > @@ -0,0 +1,144 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * A test case of using hugepage memory in a user application using the > + * mmap system call with MAP_HUGETLB flag. Before running this program > + * make sure the administrator has allocated enough default sized huge > + * pages to cover the 2 MB allocation. > + * > + * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages. > + * That means the addresses starting with 0x800000... will need to be > + * specified. Specifying a fixed address is not required on ppc64, i386 > + * or x86_64. > + */ > +#include > +#include > +#include > +#include > +#include > + > +#define MAP_LENGTH (2UL * 1024 * 1024) > + > +#ifndef MAP_HUGETLB > +#define MAP_HUGETLB 0x40000 /* arch specific */ > +#endif > + > +#define PAGE_SIZE 4096 > + > +#define PAGE_COMPOUND_HEAD (1UL << 15) > +#define PAGE_COMPOUND_TAIL (1UL << 16) > +#define PAGE_HUGE (1UL << 17) > + > +#define HEAD_PAGE_FLAGS (PAGE_COMPOUND_HEAD | PAGE_HUGE) > +#define TAIL_PAGE_FLAGS (PAGE_COMPOUND_TAIL | PAGE_HUGE) > + > +#define PM_PFRAME_BITS 55 > +#define PM_PFRAME_MASK ~((1UL << PM_PFRAME_BITS) - 1) > + better to move the comment here: + * For ia64 architecture, Linux kernel reserves Region number 4 for hugepages. + * That means the addresses starting with 0x800000... will need to be + * specified. Specifying a fixed address is not required on ppc64, i386 + * or x86_64. With the change, Reviewed-by: Barry Song > +/* Only ia64 requires this */ > +#ifdef __ia64__ > +#define MAP_ADDR (void *)(0x8000000000000000UL) > +#define MAP_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | MAP_FIXED) > +#else > +#define MAP_ADDR NULL > +#define MAP_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB) > +#endif > + > +static void write_bytes(char *addr, size_t length) > +{ > + unsigned long i; > + > + for (i = 0; i < length; i++) > + *(addr + i) = (char)i; > +} > + > +static unsigned long virt_to_pfn(void *addr) > +{ > + int fd; > + unsigned long pagemap; > + > + fd = open("/proc/self/pagemap", O_RDONLY); > + if (fd < 0) > + return -1UL; > + > + lseek(fd, (unsigned long)addr / PAGE_SIZE * sizeof(pagemap), SEEK_SET); > + read(fd, &pagemap, sizeof(pagemap)); > + close(fd); > + > + return pagemap & ~PM_PFRAME_MASK; > +} > + > +static int check_page_flags(unsigned long pfn) > +{ > + int fd, i; > + unsigned long pageflags; > + > + fd = open("/proc/kpageflags", O_RDONLY); > + if (fd < 0) > + return -1; > + > + lseek(fd, pfn * sizeof(pageflags), SEEK_SET); > + > + read(fd, &pageflags, sizeof(pageflags)); > + if ((pageflags & HEAD_PAGE_FLAGS) != HEAD_PAGE_FLAGS) { > + close(fd); > + printf("Head page flags (%lx) is invalid\n", pageflags); > + return -1; > + } > + > + /* > + * pages other than the first page must be tail and shouldn't be head; > + * this also verifies kernel has correctly set the fake page_head to tail > + * while hugetlb_free_vmemmap is enabled. > + */ > + for (i = 1; i < MAP_LENGTH / PAGE_SIZE; i++) { > + read(fd, &pageflags, sizeof(pageflags)); > + if ((pageflags & TAIL_PAGE_FLAGS) != TAIL_PAGE_FLAGS || > + (pageflags & HEAD_PAGE_FLAGS) == HEAD_PAGE_FLAGS) { > + close(fd); > + printf("Tail page flags (%lx) is invalid\n", pageflags); > + return -1; > + } > + } > + > + close(fd); > + > + return 0; > +} > + > +int main(int argc, char **argv) > +{ > + void *addr; > + unsigned long pfn; > + > + addr = mmap(MAP_ADDR, MAP_LENGTH, PROT_READ | PROT_WRITE, MAP_FLAGS, -1, 0); > + if (addr == MAP_FAILED) { > + perror("mmap"); > + exit(1); > + } > + > + /* Trigger allocation of HugeTLB page. */ > + write_bytes(addr, MAP_LENGTH); > + > + pfn = virt_to_pfn(addr); > + if (pfn == -1UL) { > + munmap(addr, MAP_LENGTH); > + perror("virt_to_pfn"); > + exit(1); > + } > + > + printf("Returned address is %p whose pfn is %lx\n", addr, pfn); > + > + if (check_page_flags(pfn) < 0) { > + munmap(addr, MAP_LENGTH); > + perror("check_page_flags"); > + exit(1); > + } > + > + /* munmap() length of MAP_HUGETLB memory must be hugepage aligned */ > + if (munmap(addr, MAP_LENGTH)) { > + perror("munmap"); > + exit(1); > + } > + > + return 0; > +} > -- > 2.11.0 > Thanks barry