From patchwork Tue Feb 15 00:23:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Kravetz X-Patchwork-Id: 12746290 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 A3E77C433EF for ; Tue, 15 Feb 2022 00:24:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DACAC6B007D; Mon, 14 Feb 2022 19:24:13 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D55516B0081; Mon, 14 Feb 2022 19:24:13 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B357F6B007E; Mon, 14 Feb 2022 19:24:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0197.hostedemail.com [216.40.44.197]) by kanga.kvack.org (Postfix) with ESMTP id 9C4DD6B0078 for ; Mon, 14 Feb 2022 19:24:13 -0500 (EST) Received: from smtpin21.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 516D68FD2F for ; Tue, 15 Feb 2022 00:24:13 +0000 (UTC) X-FDA: 79143117186.21.BAA7E81 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf07.hostedemail.com (Postfix) with ESMTP id A1CE740004 for ; Tue, 15 Feb 2022 00:24:12 +0000 (UTC) Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 21ELiTcO015623; Tue, 15 Feb 2022 00:24:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2021-07-09; bh=bpI3oA6uvdcXXK38Ap1/ZsnTvdZ3TQXzq3aaurKzXXc=; b=eC47Ahf3WlFyBiCKx3CF2IEj4STsdOaoW93Upw+qcoi+Uhyn9K1LQPb8HwDmQjUi6SeM thvZPGhi2YbznykhHHNF2FIBnjfXB5HPo7zt+dz8WwWZJUNcldXEymuMPeYmVw3a1NJj euV97rhql8i8c2BEmK71nAGythawbSrIKo1q5KzqgTdfKbTgVLNGao+uubKLRn/IxmcI KSxfE3zlVQ9bDFuejG0TkjX0vQX+mjPmoyluSAVCKpInZeni6Qk93urxW+5N30PgOvN7 7URs1gOpHQIz9qSkV6FjNxkUEXUPBJpGio/c7dUS9blSY4oZ3VJ2mgVm7uATWuqN0rnb Aw== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by mx0b-00069f02.pphosted.com with ESMTP id 3e63g1675k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Feb 2022 00:24:05 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 21F0G2M1188442; Tue, 15 Feb 2022 00:24:04 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2041.outbound.protection.outlook.com [104.47.66.41]) by aserp3020.oracle.com with ESMTP id 3e6qkxer0a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Feb 2022 00:24:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=i0FtnTetpf2gIhFjEzbwkFQEEdlRNGV/sElMYwuoTFQX4h8auT6qDOHoDyDV1+xggRQ+l7RtxWhubWImd+2tX4Zh0SxUqSvaEy98ptQQIOQJbozCnxzc9ubHfJX29NY7DkKBI4lqKUJUsUMi59jPm18Ui7tmRyyMbwLt2Q6+zAd22iJtin4yTDNtBnA/Ysqn0JL0jfxqTPULD2me161xTpheyNzVlSSmxxHVYHMWE1poV0lEmDREsX4FaWf0lMxXKUHMeAVPK75WTn0wbA4lmRvmfP5ocM5aIvh9R4s+CsWwpPa4JrIlVpkNPBhnCkJBbjT07uGfhtibmwz70sK23A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bpI3oA6uvdcXXK38Ap1/ZsnTvdZ3TQXzq3aaurKzXXc=; b=mh8TfCpbyMe1HvJCmJUq7p3JvyPnJ/CuZjyNAI5KCa4XdxPtpqmp9QS6ZYTeDYYpvvp8dC/xRyxhboOrqbkbFgsaghY3mSZF27Oudkx+rYRq2tVDjRimYa9vBpXdrvQbA7C7R0I8iOIIgMtalif99eq4Warq1DjtdXrwuWVl6vCaGjOrAO1w5iNTd6xWlW9qwrxUn3XEH0Gl+R61fyJz6NUyZZjIvMf22KJlgFglK/FiSm5qRH9AEX5dMISnnqdLuil8zuhpX2qtNpkkja3zSqM99hmOIpXL7kgt+cEiHuuPQoAEs1Nhai74vflZ7XDtuzOLmu3+v8hI+PozMYkQwg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bpI3oA6uvdcXXK38Ap1/ZsnTvdZ3TQXzq3aaurKzXXc=; b=nuyXZbC1Iz2EACHVC5+93/KcsSmjSqzsW0dAvMmvQ0zsOOca3059pphsugOi6+Pp1i5aiZwuV1AXnK1gCacPKQe8T9/WuKhvOhzqksC6o1TxIwsFglfN5yzslPylW5aD8oDqRCyzkZMUxnK0I79BP+QMxM/u7kw3fhaqAakUfDI= Received: from BY5PR10MB4196.namprd10.prod.outlook.com (2603:10b6:a03:20d::23) by CO1PR10MB4516.namprd10.prod.outlook.com (2603:10b6:303:6e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.11; Tue, 15 Feb 2022 00:24:02 +0000 Received: from BY5PR10MB4196.namprd10.prod.outlook.com ([fe80::11f6:860e:575a:e6f1]) by BY5PR10MB4196.namprd10.prod.outlook.com ([fe80::11f6:860e:575a:e6f1%5]) with mapi id 15.20.4975.019; Tue, 15 Feb 2022 00:24:02 +0000 From: Mike Kravetz To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Naoya Horiguchi , David Hildenbrand , Axel Rasmussen , Mina Almasry , Michal Hocko , Peter Xu , Andrea Arcangeli , Shuah Khan , Mike Rapoport , Andrew Morton , Mike Kravetz Subject: [PATCH v3 1/3] mm: enable MADV_DONTNEED for hugetlb mappings Date: Mon, 14 Feb 2022 16:23:46 -0800 Message-Id: <20220215002348.128823-2-mike.kravetz@oracle.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220215002348.128823-1-mike.kravetz@oracle.com> References: <20220215002348.128823-1-mike.kravetz@oracle.com> X-ClientProxiedBy: MW4PR03CA0128.namprd03.prod.outlook.com (2603:10b6:303:8c::13) To BY5PR10MB4196.namprd10.prod.outlook.com (2603:10b6:a03:20d::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8659d293-d79e-4bb0-f584-08d9f019775c X-MS-TrafficTypeDiagnostic: CO1PR10MB4516:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: PUb+RNBKFSxfy/wKb2ousWFO7GDWrKhu/oVpNssFVgd1bBBViIZVIRvcIlAK2wQdn/sH/S+zTs2+0EbvDoUWKzdHsp8Ac7WPGACkMj2d6gUToEyt3TdTk6aVElxoa+XHVhKMO61JlYdu46qZm8dhH/AprExQNdHfX8e+aXCO1XxuGJlsFYZvtfouaUGu89XyG3VmJZraUGmdS8gVr4JZkg9MKf6et7l5UZFv559TAK8qlUdfr2tj2YFEduaNDyRW0fKNuPj8TECjgDhRuJXvJAA+A8ME6/U+1oKenMX4UvfXyEMVWsiXHb3CpQSjpAno8R9SvpaTwK0a5rLvTe2MYEyfzxjP8cmJ807jn7xQJS/yUdCUMlsqSzkDpyHIU8tKuR654y8dM+7cD52gfN1x7/swDvGkyI/KD7X2sLOZqFRre9v4vIxDdTs1rr1Mi17iqVYcDrzcpgRZvoi+IVaMPiVURBFi2Ikaei7NApNMbAdhhqa0qqaz7tjaICH29C7XrirTrtnifTpmvgHe7CWp4+V0KuENnE+Q8sSPK+hehRzvzaCbf2omLLCm/VjM6kmXP8CT4OrEZWlc8DL+/uQk5VBq+h5YUsBowbdqSL1KJAkINAs7NUsL6JZsAphxi4aOSdGL6xLwDBWu783zeKiD4KrmU9a07Th3ocGMHlIarjVCgZGpnkM1qtzTHaPthuFATeC9gJcgtNaTo3JnHeyHoQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY5PR10MB4196.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(66946007)(4326008)(8676002)(8936002)(66476007)(66556008)(6506007)(5660300002)(508600001)(316002)(52116002)(44832011)(7416002)(38350700002)(38100700002)(54906003)(36756003)(6486002)(6666004)(86362001)(186003)(107886003)(2616005)(6512007)(26005)(83380400001)(2906002)(1076003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 4J5DhqWMHdAFfXDJZQh8gFowVcqJMXnC8kscpYf2rgUs8U6BH40S93We5Pbk29lB+pY+h5eelbYW6PL02DdSfP20D82vDZ9GCugTQJXQHZw0Zzjm7Epry+RFKAipcoppGF4WtT+MN+lswAurnzm+L6UnLpVwU4W8Dpya15EP5bHnJDAkOOIbzadBeF8Do6nLF/bk1RRzBOYDbsNgHTerm7HKcixyZgnZfoFbf+Q1CnETuyxTLnNZg/zZMXr7ENzMfwpW7pOhuqjOoZGyBUv/24TJJqZ5uX8hadBvHp6eHBlkkv7Fwddzz/XcC9ZeNmBbgnj/8SK/1LJ8ttWsVwymHIgPgOtaAdoNjNaW0dxDpHZN2W3xXEDGUwQ/ckMzNnAGz8iKo/xpjTp0d4hyZtNqAVrR65IPi0qDHxpK4IWe5V8hCnb6u7vhaUY6iX9tGsGhkeoUKf08W5XfV5iQ/iJoUU0zUUxDB0nxBjVxwSECL59ByA8anLSYd1IS3R/FcJdrUKOlPkpT6PnM/QwPxBcqDIivfUO/xgqAO7L72KZlKBQscgWrXNOHOK/hzRuyr205YMWj6+KhmFGWKxrntxggXawXkfTzYsjJP8d5gr4uOdXf/kxm3j7S9KLUU3fIiZyRZOPgegcj76O3KaBxiDxo26kA/s/uDAqKwkzKn/u+7KBR0gMtcjIRNXWX3lyqZUGL2u5EQHrRpBmHjAuoBURnlbmXVHYcP93kVA7O45vWRxCxATi57BqQuGM/bWKsCAujVjrNTXh/w1UGJ582J7R9Fg4tFGNsunCctMVsctwLN4SX3EIQuXSgiwnHnRz9irCDQqcOV/KyVRFtMuWJ+BgOwU8kOVB9Nb3w2q/5UEth/bZMmLhj76m9Tfa/+nD3Dy77EUhB2KVhPds92iTf6e/BwK5GgR4XgCjzBUiu+SUo3sk8rx7ObL3nicQnjXyp3y1ThcATBUm52ZT13At2QO1KfClQdOV/Tn24Ejt0lgYCH1BuDlTNhmalKyllLIqyOu6a8rUpDx5ecSpmbY78xjgqr+dRbSmOvSZ8JijKz0T5V8/a2XLg1tniX0ZGeZ4rlkZygQZw0X/H92+YwYazvwzoBHiePS0obxcR7U/PmJxDc+q4UbufJwO35o/wDWwBsm+qRJJ/XjcroHN9NsD4WjaKQQ0zacfM97yH7gFNguLVlH0IQeSHYNeTWIth4bZYquya1Ob5l5cMFEtGcSXrMWlP7sM0Mno8L7Qgka++hkXHor2b1nqk3q4Zacw2NffyW9vr8gJqsQai4dg3IiUKffBs+JyQ6HtZnkKRz3YHrwloyx+kq65jNYk7SnGd3pS6CZsqcmlgHmKv+Cwy9xQPkB5u4yXLTsuSpdvbbTgB+/dbxiaNJYapQ/ZqmDUKSpEvWoMubftGisfVi1jsWvNm+J9qcuCM4pYQGqfdp37Qfl1uxerKPzvYySTlrAUfxDUZ93sSpxuK7aT2MtWADY+w1iQMCTKLd0euek9iiTp8oRSMtV6zi8rIMuqhNt9Q+zlexpyNh8IbqQbZ2rtHLw61dSLWXvFKPh4xrEcittuqSbX2PXZ3qtOer2sqpGvzLlt/HFwGrdrDnwYDYqBO9QoT/R8DyiBkmYzIj89Ll3fMlUwsSlM= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8659d293-d79e-4bb0-f584-08d9f019775c X-MS-Exchange-CrossTenant-AuthSource: BY5PR10MB4196.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2022 00:24:01.9252 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: atX4XXst0mgOxT9zBWXrlBk18Xt8hyfMxPhrlCXPK/reMKNeXINvhS8Pd32SqCzQI5ajcyy+Njq/hCJ9qmXNHg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR10MB4516 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10258 signatures=673431 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 malwarescore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202150000 X-Proofpoint-GUID: Iim7IaqlMWT-8TO0LR_ery1avForENQ0 X-Proofpoint-ORIG-GUID: Iim7IaqlMWT-8TO0LR_ery1avForENQ0 X-Rspam-User: X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: A1CE740004 X-Stat-Signature: htxq6qwnms84jnz5as93ytsj97iw1jbr Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2021-07-09 header.b=eC47Ahf3; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=nuyXZbC1; spf=none (imf07.hostedemail.com: domain of mike.kravetz@oracle.com has no SPF policy when checking 205.220.165.32) smtp.mailfrom=mike.kravetz@oracle.com; dmarc=pass (policy=none) header.from=oracle.com X-HE-Tag: 1644884652-445011 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: MADV_DONTNEED is currently disabled for hugetlb mappings. This certainly makes sense in shared file mappings as the pagecache maintains a reference to the page and it will never be freed. However, it could be useful to unmap and free pages in private mappings. In addition, userfaultfd minor fault users may be able to simplify code by using MADV_DONTNEED. The primary thing preventing MADV_DONTNEED from working on hugetlb mappings is a check in can_madv_lru_vma(). To allow support for hugetlb mappings create and use a new routine madvise_dontneed_free_valid_vma() that allows hugetlb mappings in this specific case. For normal mappings, madvise requires the start address be PAGE aligned and rounds up length to the next multiple of PAGE_SIZE. Do similarly for hugetlb mappings: require start address be huge page size aligned and round up length to the next multiple of huge page size. Use the new madvise_dontneed_free_valid_vma routine to check alignment and round up length/end. zap_page_range requires this alignment for hugetlb vmas otherwise we will hit BUGs. Signed-off-by: Mike Kravetz --- mm/madvise.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index bed872a2ad5f..ede6affa1350 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -554,9 +554,14 @@ static void madvise_cold_page_range(struct mmu_gather *tlb, tlb_end_vma(tlb, vma); } +static inline bool can_madv_lru_non_huge_vma(struct vm_area_struct *vma) +{ + return !(vma->vm_flags & (VM_LOCKED|VM_PFNMAP)); +} + static inline bool can_madv_lru_vma(struct vm_area_struct *vma) { - return !(vma->vm_flags & (VM_LOCKED|VM_HUGETLB|VM_PFNMAP)); + return can_madv_lru_non_huge_vma(vma) && !is_vm_hugetlb_page(vma); } static long madvise_cold(struct vm_area_struct *vma, @@ -829,6 +834,23 @@ static long madvise_dontneed_single_vma(struct vm_area_struct *vma, return 0; } +static bool madvise_dontneed_free_valid_vma(struct vm_area_struct *vma, + unsigned long start, + unsigned long *end, + int behavior) +{ + if (!is_vm_hugetlb_page(vma)) + return can_madv_lru_non_huge_vma(vma); + + if (behavior != MADV_DONTNEED) + return false; + if (start & ~huge_page_mask(hstate_vma(vma))) + return false; + + *end = ALIGN(*end, huge_page_size(hstate_vma(vma))); + return true; +} + static long madvise_dontneed_free(struct vm_area_struct *vma, struct vm_area_struct **prev, unsigned long start, unsigned long end, @@ -837,7 +859,7 @@ static long madvise_dontneed_free(struct vm_area_struct *vma, struct mm_struct *mm = vma->vm_mm; *prev = vma; - if (!can_madv_lru_vma(vma)) + if (!madvise_dontneed_free_valid_vma(vma, start, &end, behavior)) return -EINVAL; if (!userfaultfd_remove(vma, start, end)) { @@ -859,7 +881,12 @@ static long madvise_dontneed_free(struct vm_area_struct *vma, */ return -ENOMEM; } - if (!can_madv_lru_vma(vma)) + /* + * Potential end adjustment for hugetlb vma is OK as + * the check below keeps end within vma. + */ + if (!madvise_dontneed_free_valid_vma(vma, start, &end, + behavior)) return -EINVAL; if (end > vma->vm_end) { /* From patchwork Tue Feb 15 00:23:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Kravetz X-Patchwork-Id: 12746291 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 00CB1C433F5 for ; Tue, 15 Feb 2022 00:24:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 230AB6B007B; Mon, 14 Feb 2022 19:24:14 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 183E66B007E; Mon, 14 Feb 2022 19:24:14 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C6B8D6B0080; Mon, 14 Feb 2022 19:24:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0117.hostedemail.com [216.40.44.117]) by kanga.kvack.org (Postfix) with ESMTP id A77236B007B for ; Mon, 14 Feb 2022 19:24:13 -0500 (EST) Received: from smtpin20.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 61FA9180AD837 for ; Tue, 15 Feb 2022 00:24:13 +0000 (UTC) X-FDA: 79143117186.20.4307E10 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf01.hostedemail.com (Postfix) with ESMTP id 993EB40004 for ; Tue, 15 Feb 2022 00:24:12 +0000 (UTC) Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 21ELiUfH015640; Tue, 15 Feb 2022 00:24:07 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2021-07-09; bh=iAdSXEr3/fKvsA1MmwjjfMm1+K7ln7ewfbUUVyWmSzs=; b=cWvOtXf56Nxvskcqp091q33ejv91lw1PmH2P2seFpt2J+vSMBTYSpuB+2VUfCgYgGb1t 81dCOBKNThrswCLyL6zNIS3lTkQ/q7MaQ2FUU3DykYXv6guFRZn9JnAskeqlh2r8Ja9z wF2+zpAcHp4bcud2SY3NZb/RCRKtVw7EpHWU9lHmVDbrlFoUoFd/OXm7jcg4gWMHEzRT oc6wGqohuew0hdcFjVMfGmeylE2d4SHLrawGYhh1urzY1FRFk2JnV/VVtdXonu7kudJ9 WJDjSUOcoGl9wZdwZdppIOIAo2FTxSCvYs6pi8HPFGjU55P3W6XOrwmVJcuXBWqaSkIx FQ== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by mx0b-00069f02.pphosted.com with ESMTP id 3e63g1675m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Feb 2022 00:24:07 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 21F0G2si188425; Tue, 15 Feb 2022 00:24:06 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2045.outbound.protection.outlook.com [104.47.66.45]) by aserp3020.oracle.com with ESMTP id 3e6qkxer1q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Feb 2022 00:24:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=g2m23/xJcuGoJL6GCTsZrSI/DzpO0TVVnEwdLsqr8108I54aQNU2D13GiIBcMy9TT+wwFCiBT48phEdPXnA23PfMS9allbaQ5BxP5AEAPcrnduOA2PDzXlefySvVW3r2FQhCG/Q7N8grGw9pIC9KhZUa3pVGYEMKMaHFYhh2fXO5ceQ4vrzsi1JWQXeo6hxG6J/9FKGP48iaxz90hyct1FyjYcPqqSS0sqgzupG4MHfodZGE8TvQ9C6R60zDW7sHwxQV8P5bxbNm2iDXC6MCKIuBWWb/Lpb9vkitMfMI+2eKvULl5hcYitA4fB757NmBc4psWFzThvXqYkLbUTrevA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=iAdSXEr3/fKvsA1MmwjjfMm1+K7ln7ewfbUUVyWmSzs=; b=hVWDxTPVEZ4hJoVKcZsuwowHgogdCS59ruXwlbKSctanVMEL6gf/g6AjUh6GciwGDs0Oqt4px//ncuZGDS2eS9eLgizBCtdZaJtIBLffZ6IOcB3NEWPB44vS1cgJYercuf7/rOXlQ4OWWR6pciE/Q7CHnu6/7R9gpZqZilFyBHNnpo+JoN66aTj5cGL200cWffFfvNyuORnGxwk+De+S3p8q1gDyLn+kG1ChPw/qaw3KSBE8bZ7ODUk2ZWZWkpjtTgrESwvglUqssXDYtX2J04CziQEnrJbG8SQ95mXVbX7okrWNyF0L6E47C9C1p41FNfQc0QLiyu7sCm3w7b8XOg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iAdSXEr3/fKvsA1MmwjjfMm1+K7ln7ewfbUUVyWmSzs=; b=crEq6fq+ABKCz40L93TnNn0lGRRXtlv+8jezqWNyYwGJ8nggsarWd6DUtjk6CC2427q/RPO6Lyl8iauqaw7rK3WeHG4YLUNefWzCFb9ktKAKho+ISLEGVNUjjIeZD0NjoAbwUQ22kEZ//Oi7zFI9tRB0bY+9FdTPJQ6EPhAlZR8= Received: from BY5PR10MB4196.namprd10.prod.outlook.com (2603:10b6:a03:20d::23) by CO1PR10MB4516.namprd10.prod.outlook.com (2603:10b6:303:6e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.11; Tue, 15 Feb 2022 00:24:04 +0000 Received: from BY5PR10MB4196.namprd10.prod.outlook.com ([fe80::11f6:860e:575a:e6f1]) by BY5PR10MB4196.namprd10.prod.outlook.com ([fe80::11f6:860e:575a:e6f1%5]) with mapi id 15.20.4975.019; Tue, 15 Feb 2022 00:24:03 +0000 From: Mike Kravetz To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Naoya Horiguchi , David Hildenbrand , Axel Rasmussen , Mina Almasry , Michal Hocko , Peter Xu , Andrea Arcangeli , Shuah Khan , Mike Rapoport , Andrew Morton , Mike Kravetz , Shuah Khan Subject: [PATCH v3 2/3] selftests/vm: add hugetlb madvise MADV_DONTNEED MADV_REMOVE test Date: Mon, 14 Feb 2022 16:23:47 -0800 Message-Id: <20220215002348.128823-3-mike.kravetz@oracle.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220215002348.128823-1-mike.kravetz@oracle.com> References: <20220215002348.128823-1-mike.kravetz@oracle.com> X-ClientProxiedBy: MW4PR03CA0128.namprd03.prod.outlook.com (2603:10b6:303:8c::13) To BY5PR10MB4196.namprd10.prod.outlook.com (2603:10b6:a03:20d::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 8681ec99-8ac6-44a4-bb07-08d9f019788b X-MS-TrafficTypeDiagnostic: CO1PR10MB4516:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4Y/fJFzUOKpxrOHiBkWuJszqHHj54trJ+SsOMc2drMFxoYU442iJQm7Z1gGgYb7UnwHnICBjVskfkSKNPiumSw6/27im/4/pP24i4WJGjheQnAMTD5h1E4kkHHC59awkfPgO2w5WyoR6KgNkuSpxrfKjfHc1xD2YuQbgIsysPbUF2XK64H0t701KrCi0xrRWZbn0z8Wkb6GbErZ8qJbbkx29460frH14+Jr0ueMwKDL5oVM6vW2C/PhIR2Gu9fn2LVE+rF91OtG1H2ipqV/iqwFo9kZ5yzcz5BeUPOAzV1OVG4N6ajm35ItUvo02Q1iewJziZ/12vS4OF7oqyKnExyMuy3R0WyBgCFlYEVfHNBIHE7jL+YtcXwXQBmuKzaG0ntg4chH3xY7KD+bd5w7TZHdMPsXY2Jg6Bs5OZuV7FzFivAqshFflEwoDwK9nbtU/df6uU4/pkjlNx27ddqsbTeUdzkezM6wjGJX4bDh70ah8dLI/oXoKEJP11l7UqikH0MpfY5cVbmqtUBwSQ9wlY3snVldNcvfVg0Q865nwiLbq6ZCwUbehhakLPCskwElCGzT3f78TlSuE6bOymBwD9k2sziPEzehw1keY5FRSr/LzdhBAs3zuF+44e5gAtRRz10ykZpKEOhyoHfktxB3lMH4p9HNH6aD2x+04OE+6IJCr7usoAubIot1FvLH/6D2guj8Kf8mJv0VuVh3jXX7BatpWKbcLp4weRVYGzEqt34sFTpWCzXR39oz5swZmzgXsqy8itT/rBfgWiTDlT8KRlwmrJrf7UGJ1uWN3xGy9JPU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY5PR10MB4196.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(66946007)(4326008)(8676002)(8936002)(66476007)(66556008)(6506007)(5660300002)(508600001)(316002)(30864003)(52116002)(44832011)(7416002)(38350700002)(38100700002)(54906003)(36756003)(6486002)(6666004)(966005)(86362001)(186003)(2616005)(6512007)(26005)(83380400001)(2906002)(1076003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: eN7eDXwHKTdVfLTArsmE2DVCT1/a+tbHT1gW8y/ORM5bvRlEJYsLfcnzDsWJzAFB5zILeRvK9HQjQNn6ww21meqUmyWhfkDfXrNElMisyt7uHIf2jqwwBmM+PyZ3DKcZiBrKclZGB38PrICNEndjQC40FT5qDKVErV1rwn+TLK8Y2fZpyDSP0yvOx5H/7CYiGxpdrOAB8JFjBsJEs1UIZrgspZgtaBAG5K51GC3KYRAxdNzMeWLNS9hShRCRcQ+bu8rvYDdBMIUR1Y6UFHe2euaQZokQbTedGbbJpXU8N0+ZhatWyVBMu2HAob+lVEsEyw7WnIEKgoPvGqqK6JabLzgWqos6vErkm1iphef+CAWNP5Lr+Onh5NVLkG50TKfSrzfxmVBlWrhhMjC3AXBu8yloDyoCOtSN5nlSa5s/5Ds6PISwweV+GPxzgwCiVHSKgv+wGrbIlJP37D3EOa4zqryk46uRkvqUIcBv3Dz0Nx9yopMsPvyQKTtTAv5dUnXf2Ybydsg7RAuzcf+mTM/1kZnbWq7J6lQMiII67spmWAeNbWWZl0Re0B5swhqRzHVk46H5sU2QX6r+PjZqCJcdAXuJ8ll0jjV2nQp5a2BLNe6UhKrF5D7B7TH1xw2K/gjEF36nYr42UWe74cZve6gcr/dUnauMjTkNKJ5VhMBHe2C6BIp2ouWu2+gmQTbjTKbgs5fkYRkamUVlj17V1yGJuE69Ha6oyI5ZuaEXlKum7KFgFO6roMX+gyA8qNg/m0Sp89B7hdt1OzGXDvmNJYYLktk+rrqB3htQ4FX6P50D7xTzUzP1AqeWTa4m2K7qb4BUcId73PLpJpdJnRIxUFggadeBQ+poKBvv0z59kThQ4VK1m2x8FVhWlYi45ZkulvRmF9n7IrgoggbtLxaXqK7mM3q9zKgMbJdc5PcbykJKRrwKJXMHZKyET8qh+hFy1oExNTe5ETBypmaOMmyL4HnaD1MlapYbEyaf7ygp9p5pYrF4YrbGPELyJUWiT7GN31lEDkITxD3s3P6Ke3QDEO4Sr9aA8dl1wYrWnnZ/22xW2TBHgC966kB7/e6sOGSt9dW/bDACIqiF+C80SWYKKPAPb1lBrMf4tylI/BvFzo5/VMYVpvwI3A1VqwUDp9lMvN3I85I7OG6Ug81QMBDCTbd5o6NN8ES7tRbG82yGd0QKF7KwUOHVBFF2tAa1BmLSJ4NkcpB8eSHZhcGn7KhuWqxCn/L+9y0X1G2kHPZSRH7VZdfUsKmA0pNbeMQBeaWBicaqI2kKRNPnqkg4PgO8jc7ZCSzFIryjR3ZN4nhR9zltLh0L0CtmoQuPhL0+UvSpcxc7H36Cfn59Qf/L6JAqrMAW7dS3yVwvBioRmF7yOHVTFnhc+QJ6S+oYYVWKT+Qp7sAzP9jgigYx8VRvwtZ3eat/azRHv4hIlhUx9ts8V0CToQL5fk1A/0gZ4BeJfmDeMvNyviRQ2Kh/rNGMuPLh3VUMqoellvhL3DX2uu0h8nfSsA5cs24LdTVsFeyffksbnpza8fd/h1VHF5e1wiaNj2dz19GW7HWmyKFH7Mzlnljr92Kb2K3ohLu5IC/LQRWfJ4tnfW46GmsC8PbBp2sCxB97lYHeVFu/Hei7I8SW0vUoXug= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8681ec99-8ac6-44a4-bb07-08d9f019788b X-MS-Exchange-CrossTenant-AuthSource: BY5PR10MB4196.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2022 00:24:03.8950 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 1sbAJqy5z1OOw45/Pe3wdF8LKC8AWksg/0+fTqVWbzWaSG/qkxyUwcmz9D0DEDD+/fcPRJo73lFaMtSE0jgMTg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR10MB4516 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10258 signatures=673431 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 bulkscore=0 suspectscore=0 phishscore=0 malwarescore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202150000 X-Proofpoint-GUID: TqcyySQ7UMUcAQA42H7v3AwE5v_enwEl X-Proofpoint-ORIG-GUID: TqcyySQ7UMUcAQA42H7v3AwE5v_enwEl X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 993EB40004 X-Rspam-User: Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2021-07-09 header.b=cWvOtXf5; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=crEq6fq+; spf=none (imf01.hostedemail.com: domain of mike.kravetz@oracle.com has no SPF policy when checking 205.220.165.32) smtp.mailfrom=mike.kravetz@oracle.com; dmarc=pass (policy=none) header.from=oracle.com X-Stat-Signature: 3dj4qfad9wutbypxa49d3fn6y9aqprfb X-HE-Tag: 1644884652-944100 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: Now that MADV_DONTNEED support for hugetlb is enabled, add corresponding tests. MADV_REMOVE has been enabled for some time, but no tests exist so add them as well. Signed-off-by: Mike Kravetz Reviewed-by: Shuah Khan --- tools/testing/selftests/vm/.gitignore | 1 + tools/testing/selftests/vm/Makefile | 1 + tools/testing/selftests/vm/hugetlb-madvise.c | 410 +++++++++++++++++++ tools/testing/selftests/vm/run_vmtests.sh | 12 + 4 files changed, 424 insertions(+) create mode 100644 tools/testing/selftests/vm/hugetlb-madvise.c diff --git a/tools/testing/selftests/vm/.gitignore b/tools/testing/selftests/vm/.gitignore index 3b5faec3c04f..d7507f3c7c76 100644 --- a/tools/testing/selftests/vm/.gitignore +++ b/tools/testing/selftests/vm/.gitignore @@ -3,6 +3,7 @@ hugepage-mmap hugepage-mremap hugepage-shm hugepage-vmemmap +hugetlb-madvise khugepaged map_hugetlb map_populate diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile index 96714d2d49dc..5e43f072f5b7 100644 --- a/tools/testing/selftests/vm/Makefile +++ b/tools/testing/selftests/vm/Makefile @@ -28,6 +28,7 @@ LDLIBS = -lrt -lpthread TEST_GEN_FILES = compaction_test TEST_GEN_FILES += gup_test TEST_GEN_FILES += hmm-tests +TEST_GEN_FILES += hugetlb-madvise TEST_GEN_FILES += hugepage-mmap TEST_GEN_FILES += hugepage-mremap TEST_GEN_FILES += hugepage-shm diff --git a/tools/testing/selftests/vm/hugetlb-madvise.c b/tools/testing/selftests/vm/hugetlb-madvise.c new file mode 100644 index 000000000000..6c6af40f5747 --- /dev/null +++ b/tools/testing/selftests/vm/hugetlb-madvise.c @@ -0,0 +1,410 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * hugepage-madvise: + * + * Basic functional testing of madvise MADV_DONTNEED and MADV_REMOVE + * on hugetlb mappings. + * + * Before running this test, make sure the administrator has pre-allocated + * at least MIN_FREE_PAGES hugetlb pages and they are free. In addition, + * the test takes an argument that is the path to a file in a hugetlbfs + * filesystem. Therefore, a hugetlbfs filesystem must be mounted on some + * directory. + */ + +#include +#include +#include +#include +#define __USE_GNU +#include + +#define USAGE "USAGE: %s \n" +#define MIN_FREE_PAGES 20 +#define NR_HUGE_PAGES 10 /* common number of pages to map/allocate */ + +#define validate_free_pages(exp_free) \ + do { \ + int fhp = get_free_hugepages(); \ + if (fhp != (exp_free)) { \ + printf("Unexpected number of free huge " \ + "pages line %d\n", __LINE__); \ + exit(1); \ + } \ + } while (0) + +unsigned long huge_page_size; +unsigned long base_page_size; + +/* + * default_huge_page_size copied from mlock2-tests.c + */ +unsigned long default_huge_page_size(void) +{ + unsigned long hps = 0; + char *line = NULL; + size_t linelen = 0; + FILE *f = fopen("/proc/meminfo", "r"); + + if (!f) + return 0; + while (getline(&line, &linelen, f) > 0) { + if (sscanf(line, "Hugepagesize: %lu kB", &hps) == 1) { + hps <<= 10; + break; + } + } + + free(line); + fclose(f); + return hps; +} + +unsigned long get_free_hugepages(void) +{ + unsigned long fhp = 0; + char *line = NULL; + size_t linelen = 0; + FILE *f = fopen("/proc/meminfo", "r"); + + if (!f) + return fhp; + while (getline(&line, &linelen, f) > 0) { + if (sscanf(line, "HugePages_Free: %lu", &fhp) == 1) + break; + } + + free(line); + fclose(f); + return fhp; +} + +void write_fault_pages(void *addr, unsigned long nr_pages) +{ + unsigned long i; + + for (i = 0; i < nr_pages; i++) + *((unsigned long *)(addr + (i * huge_page_size))) = i; +} + +void read_fault_pages(void *addr, unsigned long nr_pages) +{ + unsigned long i, tmp; + + for (i = 0; i < nr_pages; i++) + tmp += *((unsigned long *)(addr + (i * huge_page_size))); +} + +int main(int argc, char **argv) +{ + unsigned long free_hugepages; + void *addr, *addr2; + int fd; + int ret; + + if (argc != 2) { + printf(USAGE, argv[0]); + exit(1); + } + + huge_page_size = default_huge_page_size(); + if (!huge_page_size) { + printf("Unable to determine huge page size, exiting!\n"); + exit(1); + } + base_page_size = sysconf(_SC_PAGE_SIZE); + if (!huge_page_size) { + printf("Unable to determine base page size, exiting!\n"); + exit(1); + } + + free_hugepages = get_free_hugepages(); + if (free_hugepages < MIN_FREE_PAGES) { + printf("Not enough free huge pages to test, exiting!\n"); + exit(1); + } + + fd = open(argv[1], O_CREAT | O_RDWR, 0755); + if (fd < 0) { + perror("Open failed"); + exit(1); + } + + /* + * Test validity of MADV_DONTNEED addr and length arguments. mmap + * size is NR_HUGE_PAGES + 2. One page at the beginning and end of + * the mapping will be unmapped so we KNOW there is nothing mapped + * there. + */ + addr = mmap(NULL, (NR_HUGE_PAGES + 2) * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + if (munmap(addr, huge_page_size) || + munmap(addr + (NR_HUGE_PAGES + 1) * huge_page_size, + huge_page_size)) { + perror("munmap"); + exit(1); + } + addr = addr + huge_page_size; + + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* addr before mapping should fail */ + ret = madvise(addr - base_page_size, NR_HUGE_PAGES * huge_page_size, + MADV_DONTNEED); + if (!ret) { + printf("Unexpected success of madvise call with invalid addr line %d\n", + __LINE__); + exit(1); + } + + /* addr + length after mapping should fail */ + ret = madvise(addr, (NR_HUGE_PAGES * huge_page_size) + base_page_size, + MADV_DONTNEED); + if (!ret) { + printf("Unexpected success of madvise call with invalid length line %d\n", + __LINE__); + exit(1); + } + + (void)munmap(addr, NR_HUGE_PAGES * huge_page_size); + + /* + * Test alignment of MADV_DONTNEED addr and length arguments + */ + addr = mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* addr is not huge page size aligned and should fail */ + ret = madvise(addr + base_page_size, + NR_HUGE_PAGES * huge_page_size - base_page_size, + MADV_DONTNEED); + if (!ret) { + printf("Unexpected success of madvise call with unaligned start address %d\n", + __LINE__); + exit(1); + } + + /* addr + length should be aligned up to huge page size */ + if (madvise(addr, + ((NR_HUGE_PAGES - 1) * huge_page_size) + base_page_size, + MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + + /* should free all pages in mapping */ + validate_free_pages(free_hugepages); + + (void)munmap(addr, NR_HUGE_PAGES * huge_page_size); + + /* + * Test MADV_DONTNEED on anonymous private mapping + */ + addr = mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + + /* should free all pages in mapping */ + validate_free_pages(free_hugepages); + + (void)munmap(addr, NR_HUGE_PAGES * huge_page_size); + + /* + * Test MADV_DONTNEED on private mapping of hugetlb file + */ + if (fallocate(fd, 0, 0, NR_HUGE_PAGES * huge_page_size)) { + perror("fallocate"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + addr = mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + /* read should not consume any pages */ + read_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* madvise should not free any pages */ + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* writes should allocate private pages */ + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - (2 * NR_HUGE_PAGES)); + + /* madvise should free private pages */ + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* writes should allocate private pages */ + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - (2 * NR_HUGE_PAGES)); + + /* + * The fallocate below certainly should free the pages associated + * with the file. However, pages in the private mapping are also + * freed. This is not the 'correct' behavior, but is expected + * because this is how it has worked since the initial hugetlb + * implementation. + */ + if (fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, + 0, NR_HUGE_PAGES * huge_page_size)) { + perror("fallocate"); + exit(1); + } + validate_free_pages(free_hugepages); + + (void)munmap(addr, NR_HUGE_PAGES * huge_page_size); + + /* + * Test MADV_DONTNEED on shared mapping of hugetlb file + */ + if (fallocate(fd, 0, 0, NR_HUGE_PAGES * huge_page_size)) { + perror("fallocate"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + addr = mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + /* write should not consume any pages */ + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* madvise should not free any pages */ + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* + * Test MADV_REMOVE on shared mapping of hugetlb file + * + * madvise is same as hole punch and should free all pages. + */ + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_REMOVE)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages); + (void)munmap(addr, NR_HUGE_PAGES * huge_page_size); + + /* + * Test MADV_REMOVE on shared and private mapping of hugetlb file + */ + if (fallocate(fd, 0, 0, NR_HUGE_PAGES * huge_page_size)) { + perror("fallocate"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + addr = mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + /* shared write should not consume any additional pages */ + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + addr2 = mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0); + if (addr2 == MAP_FAILED) { + perror("mmap"); + exit(1); + } + + /* private read should not consume any pages */ + read_fault_pages(addr2, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* private write should consume additional pages */ + write_fault_pages(addr2, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - (2 * NR_HUGE_PAGES)); + + /* madvise of shared mapping should not free any pages */ + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages - (2 * NR_HUGE_PAGES)); + + /* madvise of private mapping should free private pages */ + if (madvise(addr2, NR_HUGE_PAGES * huge_page_size, MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* private write should consume additional pages again */ + write_fault_pages(addr2, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - (2 * NR_HUGE_PAGES)); + + /* + * madvise should free both file and private pages although this is + * not correct. private pages should not be freed, but this is + * expected. See comment associated with FALLOC_FL_PUNCH_HOLE call. + */ + if (madvise(addr, NR_HUGE_PAGES * huge_page_size, MADV_REMOVE)) { + perror("madvise"); + exit(1); + } + validate_free_pages(free_hugepages); + + (void)munmap(addr, NR_HUGE_PAGES * huge_page_size); + (void)munmap(addr2, NR_HUGE_PAGES * huge_page_size); + + close(fd); + unlink(argv[1]); + return 0; +} diff --git a/tools/testing/selftests/vm/run_vmtests.sh b/tools/testing/selftests/vm/run_vmtests.sh index e10d50e0b8e8..1948098f431d 100755 --- a/tools/testing/selftests/vm/run_vmtests.sh +++ b/tools/testing/selftests/vm/run_vmtests.sh @@ -131,6 +131,18 @@ else echo "[PASS]" fi +echo "-----------------------" +echo "running hugetlb-madvise" +echo "-----------------------" +./hugetlb-madvise $mnt/madvise-test +if [ $? -ne 0 ]; then + echo "[FAIL]" + exitcode=1 +else + echo "[PASS]" +fi +rm -f $mnt/madvise-test + echo "NOTE: The above hugetlb tests provide minimal coverage. Use" echo " https://github.com/libhugetlbfs/libhugetlbfs.git for" echo " hugetlb regression testing." From patchwork Tue Feb 15 00:23:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Kravetz X-Patchwork-Id: 12746293 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 582FBC433FE for ; Tue, 15 Feb 2022 00:24:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AE8EE6B007E; Mon, 14 Feb 2022 19:24:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id A9B936B0080; Mon, 14 Feb 2022 19:24:15 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 761D66B0081; Mon, 14 Feb 2022 19:24:15 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0248.hostedemail.com [216.40.44.248]) by kanga.kvack.org (Postfix) with ESMTP id 65EA96B007E for ; Mon, 14 Feb 2022 19:24:15 -0500 (EST) Received: from smtpin19.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 17D7D180AD837 for ; Tue, 15 Feb 2022 00:24:15 +0000 (UTC) X-FDA: 79143117270.19.D05FB44 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf30.hostedemail.com (Postfix) with ESMTP id 60C4280002 for ; Tue, 15 Feb 2022 00:24:14 +0000 (UTC) Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 21ELiLxS014426; Tue, 15 Feb 2022 00:24:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : content-type : mime-version; s=corp-2021-07-09; bh=wcVonqoRRzDl7+60qbP9NLHgvo5182H6pAtpB5P351s=; b=bOJnhH3c+TK+9F98/+RX0wzRPB3NxF1Axb2T+IJ07D9TAlhM7mZlbJ6plHc2895llRyB qt1hlVJ6d7c7a9nxIBTc5QlC/+dH/Y0c5EEkC8TQnODWwd30xYHRWkxQ+ImFwto+FcXp CFA9YkYTNBnWvgITXwZ/1Yobj3OSbBEltd5daaNXpnj6Qvleq03bMH+EBV/EhZrJ0a8A cVT6yJILP00Ac6ZAGz3OnmwclQK0lm075+XtdBEx+VjWufXSeMZnWILbB0lQlDOJOpwG ASQuABsHfbjG0WZYhXuUwKgmj+DGbGT2OqWB6aaQ2NTj2GLpb+T+yibxDA+WEJDA6Xng 5w== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by mx0b-00069f02.pphosted.com with ESMTP id 3e64sbwy2h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Feb 2022 00:24:09 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 21F0GQax044989; Tue, 15 Feb 2022 00:24:08 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2042.outbound.protection.outlook.com [104.47.66.42]) by aserp3030.oracle.com with ESMTP id 3e62xdv8ht-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 15 Feb 2022 00:24:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BJ93SYAs0smVYAjd4GmS+kI/5Q11XqxDDG6NnnUn7foDKOyXe/Ql+mSDJXPZNygkeb2pvvIRvSkXKL0v8B0MLhUIEnI+KXIKDw6MLKMmV8YoDXXHCod7GKTjNcYHDVg0BIe/HraeBxjSOoQAi4pJz7spT66go+TZNXrVW1P8epDX9t0MaOilim+neYpTbA2lsFNF+mGsIeM/4tgJsZJ56MHhNT3zIocVY7dri3AJNK6OnM8sSmk3eUljdVFYvAKbCNqxqIsH4WmYQDmDvHJZVrkBlnpPyjhs2zTtQPAP6y4y27EjdO5MOXRjXvCKoVbDoaGORcfOTL/TPn1XKnJD2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wcVonqoRRzDl7+60qbP9NLHgvo5182H6pAtpB5P351s=; b=O75tPBd87CugQEP4mDWTVCHDf2TLUovWqJ+Xa0tcOKR0T1k4+pIup5vefe4pu1UjMfRA16+mAlLtGuC7n7ISU6ScKhRIysHUOSLDj0YCFq3iFmaQcnfaX0nMQt/yeQKoni2hiRHQnw24i9Fhb/9XoP/D9DM6pbIePwcDLovBs/mIxuSzZ83WzYp/pDpknhuIgKBuFjw/03K+R7IIJUJaLXKTcW3fv4vFe6SlrdO7CoURvxtnSzqVx5mFypvfKWu6XRhqs6Xb0uBpECn6xhaIu6rDY+rlzPlqo+Oed34x6/3Vtp01Qrqkpn65OVuZLX+KjgFrAKApkichq6d2tmyseg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wcVonqoRRzDl7+60qbP9NLHgvo5182H6pAtpB5P351s=; b=ZAtFozS2LDQCsDPp6Q801yAUbSjvi7WIkmUMbHxs69CXK9dxYEXbBbN6DI2GxQ4oxhRH60A7IfSxBStEWBWYCB2MrRR5qs8Kp6mtg9dyIZ25ULtcWsbacoBQ2BakBsDFxjCtFIvy0EvH/VvokLUKkEKNrH/7x5eI/YDqNFbIaAg= Received: from BY5PR10MB4196.namprd10.prod.outlook.com (2603:10b6:a03:20d::23) by CO1PR10MB4516.namprd10.prod.outlook.com (2603:10b6:303:6e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.11; Tue, 15 Feb 2022 00:24:06 +0000 Received: from BY5PR10MB4196.namprd10.prod.outlook.com ([fe80::11f6:860e:575a:e6f1]) by BY5PR10MB4196.namprd10.prod.outlook.com ([fe80::11f6:860e:575a:e6f1%5]) with mapi id 15.20.4975.019; Tue, 15 Feb 2022 00:24:06 +0000 From: Mike Kravetz To: linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: Naoya Horiguchi , David Hildenbrand , Axel Rasmussen , Mina Almasry , Michal Hocko , Peter Xu , Andrea Arcangeli , Shuah Khan , Mike Rapoport , Andrew Morton , Mike Kravetz Subject: [PATCH v3 3/3] userfaultfd/selftests: enable hugetlb remap and remove event testing Date: Mon, 14 Feb 2022 16:23:48 -0800 Message-Id: <20220215002348.128823-4-mike.kravetz@oracle.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220215002348.128823-1-mike.kravetz@oracle.com> References: <20220215002348.128823-1-mike.kravetz@oracle.com> X-ClientProxiedBy: MW4PR03CA0128.namprd03.prod.outlook.com (2603:10b6:303:8c::13) To BY5PR10MB4196.namprd10.prod.outlook.com (2603:10b6:a03:20d::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 9a9f4479-b54d-4b16-598c-08d9f01979e3 X-MS-TrafficTypeDiagnostic: CO1PR10MB4516:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:9508; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dGIYeS+ceSui208jVq9rWj8vVIZ9lD3TclnM6/KMhuoRk6tvEMxOzCId5Q0N8uWkPaGd3E2ALCpUUXdQRb9WQ8G98JG7ozRcJijbiDZDKcB2mHXFzkdnS/lC7EE7uTT7ysy0+Ro7r81nBhMIAJQYjRuvzXhMQJR5MtkDPXKqr87HCcfjehFSQDcfqFPM2wM3t52RTOTpK6GTPt6pS28CLC5jsiZrZnSxpiZPRtNj4DSUmWXTT//5d2Trj2GjI2FIHldiFXfd1Ve1J4Q1yBdorAjwXV4qxtrGFD7CnCbMYmK/DKDTybYQ1dEljuIwMtmrR3evnIZltZV5I1OtHG+EV5rhcr10N/LXLyHg/ZgaB4rLtmxsAksafZagXZ8hhqYWhtqzqJyaV77HF0cUmen6AV4oA6MWNecmSyLQvzO38tO+vOb0j8bp453MjC0AWnm3UosZQ7lAIIEI/K2WJxTxUE1uHePbx33a8j4+k0Bf5syPVBkfspae+GJay+WCjggaHmH729/pmeLyZYICNqHCSeIhnoptlBW4ZXuiLZObRBcOCAZ0IeMFjCw04qCP55nfjMgE5ZWyFg5SjvyNqDE9uBRziwlXsxaMm87t4BkC39oXQfiM8hewu7lyEtZtRCDRgx8BgQ2CS2LeOHbK81ZgJgQJGDlo1HfCGsEftfMgYioPVXZxnWZ06kZuSOGT6PcZY8Lx9nEapalZ/4TZpjl3EA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY5PR10MB4196.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(66946007)(4326008)(8676002)(8936002)(66476007)(66556008)(6506007)(5660300002)(508600001)(316002)(52116002)(44832011)(7416002)(38350700002)(38100700002)(54906003)(36756003)(6486002)(6666004)(86362001)(186003)(107886003)(2616005)(6512007)(26005)(83380400001)(2906002)(1076003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 6f7n71GiZyThxVfmjFwwSpNPr+cTQ4ozWJRPCgrHITXhY/p8Zq2FPJx6933NqxsxWDqbD1MT9RwxrwMw2wCIzxs4LdGVjr8912KiLiuPmUgo8k64fHgIqDO6Gl8K6x4ghdgcE5cNc/bpr+LXM1/N7ekmr/ie0/YWIWV6qp33DohJNRFiDBruaa210eu2vl5IoZIPMeG5XovP3EwyKgR5+zjNz/1EBvvBZpIzUt4FgRaPclTvYoCCufokutt+hMnzvB6oD3ewoyFOyW7FFuxX8UeRDxI3d0L5lKv5eGrxktLMjTd57zFI7ulWWfjQMjxUy7rKrFCKYY68YNGjS6VJ8bKWVhsSGOf1VuRbCvIRjS5jLQ5H2HZrzcmOZRMdq04/slAVM3rKVCUYHQGMIiuTeN0yjxCRmAkdv6kttZK5N4H7z1IzzYMjyr0CvolFM7WsV+ZL8OqeHL8DkJLJY2p5fqVqPU/wuIMNMRUzX1IKV5CLgSNBqV6BeoscxdYKsw6JTH4wZvLp1j9Bbbv5byQvYtu6HojdCsw4EVXSa25Y3NgJzhLJANSntJZ2bEK8hSOLGiu70oj4tacYYS/YeKq6/IcT0yKYX3aR+ODfheT+VaK07VsxafiasfBSQJhhAvz4H2Gxv2MSP2dDf+DFf8SuiWVjNlSuWi4+qCtYb9FWOyXIbREzoRKarOI04aOxlj+iGOwPacYsqQxCFDeuSpeGz80VUmE0Nw6LdpK6CA9MdkxJbfxwHFb6h/7/zmiBBJF41+vzD5kC7JeEGUoxCFVAAOzA4i64M9uIbqcyHy7+ybHwu+CKK/Z6QvZWV8ksFMrWxGJ7bWe3crpKNN9jSlXyUgH8o/LTQGgJNIjP0hXTkBQLUDoHzpqCoWqL3Z6pkr3wkFTMhJkpASQofZgzbAyk4wm1G4mro7OrYQxfolnrUrUgjtT+EZMj+6gCwaB+gRneb0Vm94xPaCxF7cmaH/ricd0jRO37qGf5YUpa5YLkZCwep9K01bJLlw+JssSu9oXxSfo98kIujAMnHl+awBJj/+rMqPvxLjbtNE3Q2IXxK8TzoLS70llMSOXdObEUg4ZGqAjzbxjkd5Sfw1Se0pJ0IC3SZ0KyXky9TYmLSVGQRTv0pflbBZP3FUsHUBGgqGdKXly3Ko3u1+fd9c0SfDkgAavYMnUw9KxKk9MnniYZh0AOcKfMtPypnv//DEzbw+RWFcCKlwuwhfPIT1yWIzZ+wJPnbNj+dcovKwPWjZLPPxV5OhDyk104dZM2f7X9I/A4Iu5kxa1UIw+4cNAtNgQAExWKGJTjgS+SClinWUgA8njhjBHb4oJcpRcxQCUNNQz9AbzoAwwRQVPwSWlp+XprGF0dF3e+Eemv9+OWaPDoPfO36dO8tS2fFMvxgAayKx+ZyTlw6DFjCYfB4qDmxqJRt/JSQLoh17bYNtSIAxC5VPXQ/tbIo7SPOmVJ2AqtqzQatYXSW4Aqwzno0LSDufeLKmzlmQSnweQtlRZ4kjD0YirF6dKheOdu+W+q5qECkba3ikLXYpT3Ld1y3J6ZZdiG9+LxxuUZbO2hquoPVjuwll9LSEYfubCX9jEGmMdLydLIPY+CJFcAPJ/hqqVoh1M3jypMr32fl4Q5xu9e2PBfcks= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9a9f4479-b54d-4b16-598c-08d9f01979e3 X-MS-Exchange-CrossTenant-AuthSource: BY5PR10MB4196.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2022 00:24:06.1145 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 0qcGZP56lVBMGTyf7GIv5N/USyz3VU6+tsAYEFEwb5Z3MjOneu0O0lNLtTkmHJykFrqFCi4vbhLkZ+QrrH6kDw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR10MB4516 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10258 signatures=673431 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 phishscore=0 bulkscore=0 malwarescore=0 adultscore=0 spamscore=0 mlxlogscore=999 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202150000 X-Proofpoint-GUID: vQwl1quEW_KxOEBt8h2H44-512yv3mhh X-Proofpoint-ORIG-GUID: vQwl1quEW_KxOEBt8h2H44-512yv3mhh X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 60C4280002 X-Stat-Signature: q9s955xdnjwmsqk15dcfkuyxtd7yn9st X-Rspam-User: Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2021-07-09 header.b=bOJnhH3c; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=ZAtFozS2; spf=none (imf30.hostedemail.com: domain of mike.kravetz@oracle.com has no SPF policy when checking 205.220.165.32) smtp.mailfrom=mike.kravetz@oracle.com; dmarc=pass (policy=none) header.from=oracle.com X-HE-Tag: 1644884654-222608 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: With MADV_DONTNEED support added to hugetlb mappings, mremap testing can also be enabled for hugetlb. Modify the tests to use madvise MADV_DONTNEED and MADV_REMOVE instead of fallocate hole puch for releasing hugetlb pages. Signed-off-by: Mike Kravetz Reviewed-by: Axel Rasmussen --- tools/testing/selftests/vm/run_vmtests.sh | 3 +- tools/testing/selftests/vm/userfaultfd.c | 69 ++++++++++++----------- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/tools/testing/selftests/vm/run_vmtests.sh b/tools/testing/selftests/vm/run_vmtests.sh index 1948098f431d..3b265f140c25 100755 --- a/tools/testing/selftests/vm/run_vmtests.sh +++ b/tools/testing/selftests/vm/run_vmtests.sh @@ -208,14 +208,13 @@ echo "running userfaultfd_hugetlb" echo "---------------------------" # Test requires source and destination huge pages. Size of source # (half_ufd_size_MB) is passed as argument to test. -./userfaultfd hugetlb $half_ufd_size_MB 32 $mnt/ufd_test_file +./userfaultfd hugetlb $half_ufd_size_MB 32 if [ $? -ne 0 ]; then echo "[FAIL]" exitcode=1 else echo "[PASS]" fi -rm -f $mnt/ufd_test_file echo "-------------------------" echo "running userfaultfd_shmem" diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selftests/vm/userfaultfd.c index 50476ec6c070..388bf4fc9dc6 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -88,7 +88,6 @@ static bool test_uffdio_minor = false; static bool map_shared; static int shm_fd; static int huge_fd; -static char *huge_fd_off0; static unsigned long long *count_verify; static int uffd = -1; static int uffd_flags, finished, *pipefd; @@ -127,9 +126,9 @@ const char *examples = "./userfaultfd anon 100 99999\n\n" "# Run share memory test on 1GiB region with 99 bounces:\n" "./userfaultfd shmem 1000 99\n\n" - "# Run hugetlb memory test on 256MiB region with 50 bounces (using /dev/hugepages/hugefile):\n" - "./userfaultfd hugetlb 256 50 /dev/hugepages/hugefile\n\n" - "# Run the same hugetlb test but using shmem:\n" + "# Run hugetlb memory test on 256MiB region with 50 bounces:\n" + "./userfaultfd hugetlb 256 50\n\n" + "# Run the same hugetlb test but using shared file:\n" "./userfaultfd hugetlb_shared 256 50 /dev/hugepages/hugefile\n\n" "# 10MiB-~6GiB 999 bounces anonymous test, " "continue forever unless an error triggers\n" @@ -226,10 +225,13 @@ static void noop_alias_mapping(__u64 *start, size_t len, unsigned long offset) static void hugetlb_release_pages(char *rel_area) { - if (fallocate(huge_fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, - rel_area == huge_fd_off0 ? 0 : nr_pages * page_size, - nr_pages * page_size)) - err("fallocate() failed"); + if (!map_shared) { + if (madvise(rel_area, nr_pages * page_size, MADV_DONTNEED)) + err("madvise(MADV_DONTNEED) failed"); + } else { + if (madvise(rel_area, nr_pages * page_size, MADV_REMOVE)) + err("madvise(MADV_REMOVE) failed"); + } } static void hugetlb_allocate_area(void **alloc_area) @@ -237,26 +239,37 @@ static void hugetlb_allocate_area(void **alloc_area) void *area_alias = NULL; char **alloc_area_alias; - *alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE, - (map_shared ? MAP_SHARED : MAP_PRIVATE) | - MAP_HUGETLB | - (*alloc_area == area_src ? 0 : MAP_NORESERVE), - huge_fd, *alloc_area == area_src ? 0 : - nr_pages * page_size); + if (!map_shared) + *alloc_area = mmap(NULL, + nr_pages * page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | + (*alloc_area == area_src ? 0 : MAP_NORESERVE), + -1, + 0); + else + *alloc_area = mmap(NULL, + nr_pages * page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED | + (*alloc_area == area_src ? 0 : MAP_NORESERVE), + huge_fd, + *alloc_area == area_src ? 0 : nr_pages * page_size); if (*alloc_area == MAP_FAILED) err("mmap of hugetlbfs file failed"); if (map_shared) { - area_alias = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_HUGETLB, - huge_fd, *alloc_area == area_src ? 0 : - nr_pages * page_size); + area_alias = mmap(NULL, + nr_pages * page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + huge_fd, + *alloc_area == area_src ? 0 : nr_pages * page_size); if (area_alias == MAP_FAILED) err("mmap of hugetlb file alias failed"); } if (*alloc_area == area_src) { - huge_fd_off0 = *alloc_area; alloc_area_alias = &area_src_alias; } else { alloc_area_alias = &area_dst_alias; @@ -269,12 +282,7 @@ static void hugetlb_alias_mapping(__u64 *start, size_t len, unsigned long offset { if (!map_shared) return; - /* - * We can't zap just the pagetable with hugetlbfs because - * MADV_DONTEED won't work. So exercise -EEXIST on a alias - * mapping where the pagetables are not established initially, - * this way we'll exercise the -EEXEC at the fs level. - */ + *start = (unsigned long) area_dst_alias + offset; } @@ -427,7 +435,6 @@ static void uffd_test_ctx_clear(void) uffd = -1; } - huge_fd_off0 = NULL; munmap_area((void **)&area_src); munmap_area((void **)&area_src_alias); munmap_area((void **)&area_dst); @@ -925,10 +932,7 @@ static int faulting_process(int signal_test) struct sigaction act; unsigned long signalled = 0; - if (test_type != TEST_HUGETLB) - split_nr_pages = (nr_pages + 1) / 2; - else - split_nr_pages = nr_pages; + split_nr_pages = (nr_pages + 1) / 2; if (signal_test) { sigbuf = &jbuf; @@ -985,9 +989,6 @@ static int faulting_process(int signal_test) if (signal_test) return signalled != split_nr_pages; - if (test_type == TEST_HUGETLB) - return 0; - area_dst = mremap(area_dst, nr_pages * page_size, nr_pages * page_size, MREMAP_MAYMOVE | MREMAP_FIXED, area_src); if (area_dst == MAP_FAILED) @@ -1675,7 +1676,7 @@ int main(int argc, char **argv) } nr_pages = nr_pages_per_cpu * nr_cpus; - if (test_type == TEST_HUGETLB) { + if (test_type == TEST_HUGETLB && map_shared) { if (argc < 5) usage(); huge_fd = open(argv[4], O_CREAT | O_RDWR, 0755);