From nobody Mon Jun 29 22:18:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F02F0C433F5 for ; Wed, 2 Feb 2022 01:41:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243688AbiBBBlS (ORCPT ); Tue, 1 Feb 2022 20:41:18 -0500 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:37734 "EHLO mx0b-00069f02.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243588AbiBBBlR (ORCPT ); Tue, 1 Feb 2022 20:41:17 -0500 Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 2120XCvT015791; Wed, 2 Feb 2022 01:41: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=BvqQ5y3f3dwZNLlUZ9/s580M/wXc76Av07SpkWkj8W4=; b=zpsylloabR5ouDmWX3WUhbmKt7BmBO2/eouDA5Tb9sfnG4jy16AIx70o6As9db9VYtSW r8Qph8u9zYT7H7lkrmdHma/Xreu9epBckgkAcDya5JgTlHkIIIukHW/mpTOGSYCabCVu Fy2dqfEuyCZf9C75ylAx05BrH6mE1DoY6dZDJayOgJ7noTg8okntaP4DDLRofmaL988G O+LzMrF2sY3N5oDCxE71Va1oi9MUsAqzDt60Sw/d+qfI8WxJIwVzyWMlQV+BeCLu+yig S20cC787vIzJkokblg+oHdsX/zoVXUM4cqbbxfHS9uUy2BcKfwlAonOgG2jO0L6oD+GC TA== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by mx0b-00069f02.pphosted.com with ESMTP id 3dxj9wcje7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 01:41:06 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 2121VbwZ024096; Wed, 2 Feb 2022 01:41:05 GMT Received: from nam11-co1-obe.outbound.protection.outlook.com (mail-co1nam11lp2175.outbound.protection.outlook.com [104.47.56.175]) by userp3020.oracle.com with ESMTP id 3dvy1r63uu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 01:41:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=DeprMzFyiaVxUpyhz4i8M/WVp12RkbiJz6YN7SLfSYinSlQucM5nBXqKGqqEMsmkAemmkMnZBSHRv5RRx04V1MPQoyr7BZFdZloT96L5HvPRsxWjJbsrIg7SQ3x5LISaotoBKZ1qPre5I980yKJYAaJuoy82FFk6g3+qKPzwcwdh1YvxgXcDgg+qS/ucS0GnFcAoIlJGK2Lt4mLn3ZV+kth3HhgdjUeoH0IrhS5MVcJ1a8XYQhXe5c11MAftrjJHffgd1obvQgaVUzwIgOC8M5wZmxgUxz0H0KHJ2xioXIFTa0sSJFWb1Pb7GSWVgqYCP4YVkqag7CDz4Gctechblw== 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=BvqQ5y3f3dwZNLlUZ9/s580M/wXc76Av07SpkWkj8W4=; b=hEjfwCm5nWmpu4nBTdp9QE9AbceGsMopyZGFYvOHo8DsI09THL0Fc1KX7ypfMNsH4+HJJQ+V7B3OR8ra2xzPu/faUcj4xuOMvusyCR5/X6U5mzWLRA7cAy2HUUjFS1cjDgZ/p6TYua0PdHONmhhDLFVcJ66U6FbV3/qmh1ZuT+j8Gg8AgPSzC5Ls/T8Uv/3iHdSBPfGOpTcWtGQkuHprBW7SekYHy1pA4o1H+eoEfoauj41DVnvPaLOxvs2xDkgqbAet8wl4csUefX/FXhFH3pUfRyev8zP5QU/NdP8HtFojq37u2RqhAJnxcGiVzVxCs7JL/+d3F/soi4eX6lcfPA== 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=BvqQ5y3f3dwZNLlUZ9/s580M/wXc76Av07SpkWkj8W4=; b=sry0/RUR63B6Zm390daNWgrLh05VwgG+U4qGYIVNARLB8BnKJ4qL05dIJQFbcb0uCWVZLCPH2c/Y0KtulQ7nN2KPJUI8Wk+LcgU+Pj36rQfHhzwfNGrFJJgqkI9flj8qo/cYwSTYf8g8oKu7Ahk+d+hRZeRYq0x5cvYeTKiGcpE= Received: from DM6PR10MB4201.namprd10.prod.outlook.com (2603:10b6:5:216::10) by DM6PR10MB3433.namprd10.prod.outlook.com (2603:10b6:5:61::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.11; Wed, 2 Feb 2022 01:41:03 +0000 Received: from DM6PR10MB4201.namprd10.prod.outlook.com ([fe80::1057:d8d1:8372:c8b4]) by DM6PR10MB4201.namprd10.prod.outlook.com ([fe80::1057:d8d1:8372:c8b4%8]) with mapi id 15.20.4930.022; Wed, 2 Feb 2022 01:41: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 , Andrew Morton , Mike Kravetz Subject: [PATCH v2 1/3] mm: enable MADV_DONTNEED for hugetlb mappings Date: Tue, 1 Feb 2022 17:40:32 -0800 Message-Id: <20220202014034.182008-2-mike.kravetz@oracle.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202014034.182008-1-mike.kravetz@oracle.com> References: <20220202014034.182008-1-mike.kravetz@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CO2PR05CA0085.namprd05.prod.outlook.com (2603:10b6:104:1::11) To DM6PR10MB4201.namprd10.prod.outlook.com (2603:10b6:5:216::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 63c47189-2d8b-451c-5648-08d9e5ed129c X-MS-TrafficTypeDiagnostic: DM6PR10MB3433:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 9aIYk+h7GTkMJYfoNXq5Y1bhQloRFP+KQN3+dGexNA/nCMB0cTZWYkkn9KCG/WpAfT3UkCSMOFSLz0qBWqzALYAy5HfMAINWm6Bdwo1xBVP2v5wvtt9+D/mS1HF+rne67DlunjuaycI5ZgfgX3qa/nwE5tlAefrPqX9B38sZoZF4nCv4bUQ/jPz1st8Xpkvw3WYcK320qgaw21Igp2S0/GTs/xq1+6X7ERaMz9VbycTJt4IvNcriCdDkuoGgE1LLXQTgTD2ZRO0ADRvjTM1RrsDFhFIMfLn/1+tIx4ov4uNsjZSMNp17KXLxsPXPkWyBqGv9ZYjJ2fUJGXEiV9RhBL7hZBe5hbfsywz/yv8zDBR8yNqo9j9kCf50bDnAJibgmj+qbAmHbkEUsQGqisRj00RSkYhiW9BF3+0B6GNo6hRPmlZRzeDzKGatJIvS/uujOF8OAFs/dhCy6hlKJcuXMwYnvbAx+OEFMMCbYJ8eyrs4sf0ef4BJn8hmBk0gfiB+8dsKeghRgn9JdqRThuwZt5FiKaTnPErrU7OoTly8C/YGDQNVVOhNh6JeGDeIn6hymoBEnGv9jESpzBDWi6K4zazCUYVt6Pf3OlVJqfy0MR6ZGtQbCdQyQyjSYq8/xzh4nKgy9w9NIiyUUW4dd+Of+9tJtFQOtJoBDo5/aga4W9zHUy2MLcPaHMetzwznVqrdFUY0U4xj6hG1Uymng13qAg== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR10MB4201.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(38350700002)(7416002)(54906003)(44832011)(5660300002)(86362001)(38100700002)(316002)(4326008)(8936002)(66946007)(66476007)(8676002)(66556008)(6486002)(508600001)(83380400001)(36756003)(52116002)(107886003)(2616005)(1076003)(6512007)(26005)(6666004)(186003)(6506007)(2906002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?eJzh8fpveZa/MRBux/+ii6gTEcTNZP8Z+84CuEoK05Q+rfB8SS/NLhtAeeCV?= =?us-ascii?Q?KauiEF8iDbM9vow/Mf7JdAesPzvfDCWpQazfzQo0FR0QAILX3c76sBra3WDt?= =?us-ascii?Q?MB8bQ+WeMUisoKHEin6xzodusoDoJf92V3eCh4A468hD9gMHADzYzP1Bqb8/?= =?us-ascii?Q?01TxO60DxLhzXP6fZA0TBQZDsyw4hMWsiQJVqWukE8nyzFr4qL5VQiEEZjkL?= =?us-ascii?Q?X3F4/G/lYb1MAvELV46nf3gRLWWjH2jrK/DhJJ/NzZj2dtTfy+CEgBwvQZGF?= =?us-ascii?Q?PL3XkrNW9J6WV2KXe+9Li3i/Wh1jhADbpx5YEX2giZcNXrjCyzUNMkwaezfk?= =?us-ascii?Q?CCV6MgGz44KtKykClYb/qxjG2H8f7Avbgjm03lKCYkksEZ0ZNCVfe7vBT9Jy?= =?us-ascii?Q?lv5WbGTSAhnCMBr+BcuyBBmxuBkoXL3LDyfzwHOLJCr7ML5+3smtU2QRLlqi?= =?us-ascii?Q?EI2BM4MCANF+hTRrIO0aquwet7V9z3w/zS6zSBxbUhLjnulg7t7dC28kUJ+n?= =?us-ascii?Q?PdEP+N/cPnknn/FdSrpbivV+35QonNG9DqU6auvNwiH67zrae/ctx9h5kV+v?= =?us-ascii?Q?g/LcHDjGEVXOcYbzIiiYJWvBDRsY5VgB2iMqIY4kQGBGnezJLYYoBZ096Lls?= =?us-ascii?Q?zAqk7uuqsFp0ewpsqkRtgnYB2tupb3zfrsbQUsaZPFJwRj3MlEbDSO5eI/ld?= =?us-ascii?Q?HjyjoIoaPcppTHWi+PqI7LS7oEI1XiKiaBpbv0SlhZXMIgSk5PkCE9TRIy4i?= =?us-ascii?Q?+MZxYiq4pJ66n1ZG1xDDhgL6Zv7DA0iHPonB0/6ut8XppKdOIwRV8VScPGSN?= =?us-ascii?Q?2EHYKBrdKGi65EOILIEbQhjTRSu6wMsR4hC76xVUZ+nS8YnPlgLDqmtJeSN3?= =?us-ascii?Q?2Ob4ThXagscGnUDwwG6OWLWoLlbOMzLSy2yTSD1zQ9kPD9EWX6j3gboOEYBF?= =?us-ascii?Q?WJDs11XDLUfUcB0ZLpXskdTUdYyf51uUdx6I3Hc7B11Dhek+6ucnCHMb0mWO?= =?us-ascii?Q?IjO/TvfcEl3jEHeKXMICTqMHQgJVroXxbl0OKyraRx6mf5s41mm9BShx4M8A?= =?us-ascii?Q?gdsP3+yiwY92/CgD3NWeBSf9sCg2wyRX4csdR5iYrcfyBGhHYGUgVa3ARhni?= =?us-ascii?Q?PbhaUUwlH9oJHJgNpXCdKJeyRN1XBJREUhbdcaUHlw6TRMRB+9SSpnDP29VX?= =?us-ascii?Q?rE9CwM6G4sxXv5PxZkoKn2PN6qm5hw0aKOvXhbNptUoeDU3emB7f9HbO6fA8?= =?us-ascii?Q?tO9jIQ7oLTL9sstepKl3Fas0EF80UXhScgBJBRBgTXrc2LFR6zFjselGMGWG?= =?us-ascii?Q?UQG5qE5SL29yF/eQt3jxa5mlipOyU68luwCjz/DQV5UY8iFXTf3Gafv4jouR?= =?us-ascii?Q?JYFA2P2SxBaYH4AP1lUZijDNcm4NJswPBfKObuWImh0rI7q7YrHOpWGDaWTR?= =?us-ascii?Q?awy6EKpTwHq+5zU7ayBR+QtPpHYiufY1+zvwmRgrfGE3WvBWM0nmwOuzP7On?= =?us-ascii?Q?r6F56O+Ofn4G2bAkxawwaXDYKrWrXrh4GDK1/aHJ2RhqCZUUHEJHLkELz7K1?= =?us-ascii?Q?Ua03vyJdC9zIqFchgNjToA681bfVoVsr8GQl7NnTKIu+GPc1RVzpH4Ods/B5?= =?us-ascii?Q?ujpiMnZcoLQEcTcD3hSjQUI=3D?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 63c47189-2d8b-451c-5648-08d9e5ed129c X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4201.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Feb 2022 01:41:03.3130 (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: A6om8MX0LGt2DlaRyVpCXXc8C8pZDIQL215JN763o7hUuBSIlaUCoCmMcq+3QLRh5mwJjCu3FZ3CXzNeCsrYVw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR10MB3433 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10245 signatures=673430 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 spamscore=0 bulkscore=0 adultscore=0 mlxlogscore=918 phishscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202020004 X-Proofpoint-ORIG-GUID: 6gTJYGYbgXd2uZTpWJST8zAVIS9xH3QQ X-Proofpoint-GUID: 6gTJYGYbgXd2uZTpWJST8zAVIS9xH3QQ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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. The only 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 will allow hugetlb mappings. Also, before calling zap_page_range in the DONTNEED case align start and size to huge page size for hugetlb vmas. madvise only requires PAGE_SIZE alignment, but the hugetlb unmap routine requires huge page size alignment. Signed-off-by: Mike Kravetz --- mm/madvise.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 5604064df464..7ae891e030a4 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -796,10 +796,30 @@ static int madvise_free_single_vma(struct vm_area_str= uct *vma, static long madvise_dontneed_single_vma(struct vm_area_struct *vma, unsigned long start, unsigned long end) { + /* + * start and size (end - start) must be huge page size aligned + * for hugetlb vmas. + */ + if (is_vm_hugetlb_page(vma)) { + struct hstate *h =3D hstate_vma(vma); + + start =3D ALIGN_DOWN(start, huge_page_size(h)); + end =3D ALIGN(end, huge_page_size(h)); + } + zap_page_range(vma, start, end - start); return 0; } =20 +static bool madvise_dontneed_free_valid_vma(struct vm_area_struct *vma, + int behavior) +{ + if (is_vm_hugetlb_page(vma)) + return behavior =3D=3D MADV_DONTNEED; + else + return can_madv_lru_vma(vma); +} + static long madvise_dontneed_free(struct vm_area_struct *vma, struct vm_area_struct **prev, unsigned long start, unsigned long end, @@ -808,7 +828,7 @@ static long madvise_dontneed_free(struct vm_area_struct= *vma, struct mm_struct *mm =3D vma->vm_mm; =20 *prev =3D vma; - if (!can_madv_lru_vma(vma)) + if (!madvise_dontneed_free_valid_vma(vma, behavior)) return -EINVAL; =20 if (!userfaultfd_remove(vma, start, end)) { @@ -830,7 +850,7 @@ static long madvise_dontneed_free(struct vm_area_struct= *vma, */ return -ENOMEM; } - if (!can_madv_lru_vma(vma)) + if (!madvise_dontneed_free_valid_vma(vma, behavior)) return -EINVAL; if (end > vma->vm_end) { /* --=20 2.34.1 From nobody Mon Jun 29 22:18:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2BE33C43217 for ; Wed, 2 Feb 2022 01:41:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243722AbiBBBld (ORCPT ); Tue, 1 Feb 2022 20:41:33 -0500 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:11066 "EHLO mx0a-00069f02.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243588AbiBBBl2 (ORCPT ); Tue, 1 Feb 2022 20:41:28 -0500 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 2120ULKM005139; Wed, 2 Feb 2022 01:41:11 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=h0p0PZ3Y/RzfSf5WE5jDyGoaG1Y9Rm5gpFiIyoOQhHQ=; b=CqDU8vk34cVf/c/xgui3bLGnbxXfnD6Qz+LhITJ3cYvpj0Q2IphSHFPJVo/sSXvkW+vi GQxkUddCMyFUbHOpHOsHV/RlThGzC8+8Mh8jagECRzOjr1TEpVngGE8dwef1ibprho82 mvfGEUWkHfWyYcH6+qGh2VTvJqBYcdO8Poqddns9T3jmbsfZCanBHrUJZCoN5+DSdRno 1mkcdrJxMsvMVEBk1mfpmmkxBCdBcbdxXEHljm+/HQiBDM2A24S+G7JiDbB4Sbi2ap3c VTBB6gOxS3QPWVxSPhyRS9QqmEG7Qgba8GXR4NOCksl27H8Y6PSIbp9tnjlKKPZ/J9Vz Dg== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by mx0b-00069f02.pphosted.com with ESMTP id 3dxjac4mne-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 01:41:10 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 2121VP6I145690; Wed, 2 Feb 2022 01:41:09 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2046.outbound.protection.outlook.com [104.47.66.46]) by userp3030.oracle.com with ESMTP id 3dvtq1hqe4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 01:41:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=O+MPl8bP2R5PLzKZW0IFZlBPKSy8Jx6sL/8bp+VvxbNA0Mnae1GisdL14eiNunKAM5sbXA6EsTj/W1e2FPut/4ckAAVRtjVZ5tTy3CYcivdilKTRRjF4n7/xDLgaGbRJSPMhOndbcZYOwsbxVEf8HOw8YWRzEpYjEKb+Zytgph61OXWZ3hyzmoEI1PY9tBvkwq2y7DtMcu8rw6PzC4ZgWzxwPwjM3cVmFTNuJYo5GMUNoU7iMuQ4pNKeIkrREX6JojeF608e6GPeITpmt8bMCPWjeS6Iwh6JD0jskZOjVwbUNlx/U3fhAnlqc1/pNkAXYhzHThvMAP9736hd6wuQOQ== 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=h0p0PZ3Y/RzfSf5WE5jDyGoaG1Y9Rm5gpFiIyoOQhHQ=; b=j3/FOGtG8RiUvCiIIVvbUAazPoLRkN+BCHnH9kz2E2J9vCqtvH9lxUQqiqVuwPJHWyVTFV3HpTMgg89ZZOW8jLguZyJqbnAajuhTRuXCr0H/lQSXWRyFeeroQY+vOKPl6exguYt43qd7ZiaiJ2mx9WaQDVzRqVJVfwwAmIUnXamQwDr2K5SGDUax6RPUSEo910pME882RKS52SDH2WSRpg12WTVFmUyloSLzvxfASv/oU9XzeYpwNGYkAHtYaD3+0MSLLv0q5povhnWVEwuIW/3+rPEv3DAnEE9QpJLu/QzFR+OCpYsrigDAYkY4cIP7zoA3KONYPL5rH37rayE+hA== 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=h0p0PZ3Y/RzfSf5WE5jDyGoaG1Y9Rm5gpFiIyoOQhHQ=; b=mI69zKy3tFPF6UXpF74Kyj/3yQH6Zp38WmpaApxpm6VP/IGu9DX/atPDtwR9TMHSQ8KzFuBMQ4yb37YOqOl8C7K0J2JPEXJ7JqQsmd6iHOO84unAJFd0en0tozf3pqc802rijWGMCyS1kqUBZ9x7cC/B4EzmWkFgmKQk2l9OPbI= Received: from DM6PR10MB4201.namprd10.prod.outlook.com (2603:10b6:5:216::10) by DM6PR10MB3433.namprd10.prod.outlook.com (2603:10b6:5:61::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.11; Wed, 2 Feb 2022 01:41:06 +0000 Received: from DM6PR10MB4201.namprd10.prod.outlook.com ([fe80::1057:d8d1:8372:c8b4]) by DM6PR10MB4201.namprd10.prod.outlook.com ([fe80::1057:d8d1:8372:c8b4%8]) with mapi id 15.20.4930.022; Wed, 2 Feb 2022 01:41: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 , Andrew Morton , Mike Kravetz , Shuah Khan Subject: [PATCH v2 2/3] selftests/vm: add hugetlb madvise MADV_DONTNEED MADV_REMOVE test Date: Tue, 1 Feb 2022 17:40:33 -0800 Message-Id: <20220202014034.182008-3-mike.kravetz@oracle.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202014034.182008-1-mike.kravetz@oracle.com> References: <20220202014034.182008-1-mike.kravetz@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CO2PR05CA0085.namprd05.prod.outlook.com (2603:10b6:104:1::11) To DM6PR10MB4201.namprd10.prod.outlook.com (2603:10b6:5:216::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 385ce3a5-4c02-482f-6493-08d9e5ed1465 X-MS-TrafficTypeDiagnostic: DM6PR10MB3433: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: iCiMJsgSJvUgJe62V91Y2FgfVqLZ+JmapV+NFI8WkylSSftcvtrCRvYW4o9jqwtF0/HARQ9qtreM3h17YnNSzWeB8icEN4VmBZI12uMGdZsI2LV0qqoxzOgc8clsckZga/YjB6RSLV6Znb2sv8E2Ht3Y51MBMKCcz7H8Mk5s+ciHl3vkN0t/EgQopOZOMQ4TosP+/Mu7ZE9VHr63684c2MtxV5BypM5EhUUT4iN1l3DUhdxOKkOYDw/L4N1YNb6zk7LBe7jhgsw8C00NI4ECykfSB215QV2uB97umZGOgtT3E0++o8rhmrbC4zcMQgb5h2mFmNw7zlp9wLwjF9Axx6mk/gUYHWozpWhbEhbMVG4PLHXnHko+MaWKL59SBjsPbYOna0nmX4QA5udvk611yxOb0hZHnNyKqGCB+gHXBuX5svKBJU4zt3QYi1WZh4AjAXIuuswdPk1NZtYCy4dQCedoli+sFjVlxnUkZnPJNPJOkH40udq92l5+lHIOer8HkEWSG9i/A3rpIRgLd3ofl3ILVVHwEu4fEx3O1rN8WtUDCwG86BFEcYooaFxUhhCEIZ6DV+pma/WAN2EVH3EyrYacKteZ3RFMQR2Ael1OYS+Rciqc6svf30AkUcoMN/7p/FOVhzTAN6hlYjMe2beoHlSl08nsq9rO7nqzhsbjMxSBChm41OGLXe5PR59cTkZFHfqlfsilOk5PqwaQVMFMOPFppJHHuV4fnKAe9M2mCdFgqzwXA5b7ZGoFmS3DKnGz2DXr33D0uKvD0H19s0M+tz2UZ6iTsJpX2KJTlm0oPPg= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR10MB4201.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(38350700002)(7416002)(30864003)(54906003)(44832011)(5660300002)(86362001)(38100700002)(316002)(4326008)(8936002)(66946007)(66476007)(8676002)(66556008)(6486002)(508600001)(83380400001)(36756003)(52116002)(2616005)(1076003)(6512007)(26005)(966005)(6666004)(186003)(6506007)(2906002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?cB+MA3I6WsrfRBqlgLwXglh9rddEDo/XK5n1NxjcndOG0tXYbT1NU0xmyHTY?= =?us-ascii?Q?5h9AtHhB6dGVq0vUeVDJFw/DmOiXY/rP+SqCzfAdg+A766p6XCYN8vkL8Jod?= =?us-ascii?Q?O+LiSKIHmZ+qp4gIRPgcJ7jdk16VH0XFMAQZblk3yFSn0p+2ik5UrXNf+HrQ?= =?us-ascii?Q?SPPCiotVz9nAy3jIwZSU2D2RYTJWOVABZRM0UJ1nqCp8Mg8cchTwrGRBKEXh?= =?us-ascii?Q?ehB4pFSV9RWyLoeygK39bwy9aFT2kDXiCrpsLX9GRcKZ7zJ6AR13hmEh0fx7?= =?us-ascii?Q?qt+JkR3gceHtiiLMuZpy1qbum2HhSj48pPCd3StuNyTAmMK3EenhBXCpI7o2?= =?us-ascii?Q?waWkgHb31SHsZwok/iN5+0/iA/9uhjTcDBsT4pTbFvWd7Eek5yWvRHes8Zba?= =?us-ascii?Q?KDN0ESyocLKpRGWnbJUZVVDPJLdjus+kdqMSg5im0PrFHg2XCs8xFhQ2HR5k?= =?us-ascii?Q?bktMdbJ8QDM5DgaJZJPYp+9b0DZiHVgk62jrPZNhwa2C6NnMXHwgYNRdreVC?= =?us-ascii?Q?ow1VNPNGXQrVo5TBiiSPq9gW4pH8EMihpz31Du7b4AIgYouZxOt5rZXkNitO?= =?us-ascii?Q?inh5IVzmBlSKxMLQTslSWq3Aq6ynXsdrTH8li6qldzJcgryv1MNYQ2F65vjj?= =?us-ascii?Q?YBBdGSgeDmdAfnzn9FHYDNO6GeEdCy3yB15mzGxW0NiwWbuJ2IaPrR5CpD3q?= =?us-ascii?Q?c1i6WHwjv5aHuHIn/CmKpTfdeqZujIusWloCqCaxmzTLOF6Ars5SfvzJFhk+?= =?us-ascii?Q?dImShF+N0PkWXKyiSA5wDp2a313n6vkYiMJMT0UEodcd1T92ry8Ajq8qynZA?= =?us-ascii?Q?eQkWv5mCWW8U5joWwaBoEa+NMj+Omv3FjGmhl1dc7eJ5tspz2ieBJv3aKqC5?= =?us-ascii?Q?ZIUVMZ310r4lJU66KBBUje40erM2OMIJlcbbg0qSWJT9Sq0Nhoz8slOyd/yx?= =?us-ascii?Q?ntZdIfJm25tzT138vv0iyMWcbPcOM5dXy5oXlNrguPuvowkIvb4g2YsmcmD3?= =?us-ascii?Q?yZw2vj9vjebAFITFGiRjRzILq53O32zlfkNdSCOwwnuOw8PvIvLkBQHeZLyQ?= =?us-ascii?Q?2UrMHDn4LJa13zoqP28fwbgmCZz2Wr5s8jIEu5K6lDKeFsdwmS3lLt6Hn1jE?= =?us-ascii?Q?DpQNy5fwSmneuucyy6IP0g1L5qmBfVK+b9jjEDiYYCB2VDR7t3LAkfhudaQL?= =?us-ascii?Q?X0mPyJ6qmsoYO+AY4PJLAZGMlEIYCi2vzcAnSnoCPb90URWXZaBWZs8LVZmo?= =?us-ascii?Q?ySMhsY2nePt9aPz1ZgSlptBLEKjBbur+gFomLPgA5uCvz2NllU18Lyo6yoVp?= =?us-ascii?Q?KUyMoHYJDKN7RwJaNiq1XI7+Oycan44sVpuviRhaUGl+R7kxx3/wzEqzhdKq?= =?us-ascii?Q?zZMqjo0sduN0QGrucuVKjJxqdWR+crDpATwtsa9FZNksMkn1e3YzrseIvLly?= =?us-ascii?Q?9Vr1rx5jmOIKrlX0RMIXA5pTaM42b8IvDC+LKuwgkGSzVa7Vc4kPnxmiXrWO?= =?us-ascii?Q?+KpLxVMlh5arMgiWZtv+4zVWIAXvHltNiM0A0Iu4uSpI4LXYFzqSYF2MQfu8?= =?us-ascii?Q?CXiFTBCLPxKeoTY756BNSlRY6bTpZgaqYXHb+RDTR0ffaCQmuHQmO9Pg1pCV?= =?us-ascii?Q?S21cYD5burSCZOuMbkqvBkY=3D?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 385ce3a5-4c02-482f-6493-08d9e5ed1465 X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4201.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Feb 2022 01:41:06.3240 (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: gtBhbYPeifVIxjD53za37O39J1szLARlXXg2Y60w03OKU/a0193bydAEwgSo3xJEukBD4RTMQ0s8m/pMjYm6SQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR10MB3433 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10245 signatures=673430 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxlogscore=999 adultscore=0 malwarescore=0 bulkscore=0 suspectscore=0 mlxscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202020004 X-Proofpoint-GUID: BYvuFr8kuWpegXby86yDn2Dsgn-m0pVb X-Proofpoint-ORIG-GUID: BYvuFr8kuWpegXby86yDn2Dsgn-m0pVb Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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 | 413 +++++++++++++++++++ tools/testing/selftests/vm/run_vmtests.sh | 12 + 4 files changed, 427 insertions(+) create mode 100644 tools/testing/selftests/vm/hugetlb-madvise.c diff --git a/tools/testing/selftests/vm/.gitignore b/tools/testing/selftest= s/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 =3D -lrt -lpthread TEST_GEN_FILES =3D compaction_test TEST_GEN_FILES +=3D gup_test TEST_GEN_FILES +=3D hmm-tests +TEST_GEN_FILES +=3D hugetlb-madvise TEST_GEN_FILES +=3D hugepage-mmap TEST_GEN_FILES +=3D hugepage-mremap TEST_GEN_FILES +=3D hugepage-shm diff --git a/tools/testing/selftests/vm/hugetlb-madvise.c b/tools/testing/s= elftests/vm/hugetlb-madvise.c new file mode 100644 index 000000000000..77af0ffff01d --- /dev/null +++ b/tools/testing/selftests/vm/hugetlb-madvise.c @@ -0,0 +1,413 @@ +// 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 map/allocation value */ + +#define validate_free_pages(exp_free) \ + do { \ + int fhp =3D get_free_hugepages(); \ + if (fhp !=3D (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 =3D 0; + char *line =3D NULL; + size_t linelen =3D 0; + FILE *f =3D fopen("/proc/meminfo", "r"); + + if (!f) + return 0; + while (getline(&line, &linelen, f) > 0) { + if (sscanf(line, "Hugepagesize: %lu kB", &hps) =3D=3D 1) { + hps <<=3D 10; + break; + } + } + + free(line); + fclose(f); + return hps; +} + +unsigned long get_free_hugepages(void) +{ + unsigned long fhp =3D 0; + char *line =3D NULL; + size_t linelen =3D 0; + FILE *f =3D fopen("/proc/meminfo", "r"); + + if (!f) + return fhp; + while (getline(&line, &linelen, f) > 0) { + if (sscanf(line, "HugePages_Free: %lu", &fhp) =3D=3D 1) + break; + } + + free(line); + fclose(f); + return fhp; +} + +void write_fault_pages(void *addr, unsigned long nr_pages) +{ + unsigned long i; + + for (i =3D 0; i < nr_pages; i++) + *((unsigned long *)(addr + (i * huge_page_size))) =3D i; +} + +void read_fault_pages(void *addr, unsigned long nr_pages) +{ + unsigned long i, tmp; + + for (i =3D 0; i < nr_pages; i++) + tmp +=3D *((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 !=3D 2) { + printf(USAGE, argv[0]); + exit(1); + } + + huge_page_size =3D default_huge_page_size(); + if (!huge_page_size) { + printf("Unable to determine huge page size, exiting!\n"); + exit(1); + } + base_page_size =3D sysconf(_SC_PAGE_SIZE); + if (!huge_page_size) { + printf("Unable to determine base page size, exiting!\n"); + exit(1); + } + + free_hugepages =3D get_free_hugepages(); + if (free_hugepages < MIN_FREE_PAGES) { + printf("Not enough free huge pages to test, exiting!\n"); + exit(1); + } + + fd =3D 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 =3D mmap(NULL, (NR_HUGE_PAGES + 2) * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + if (addr =3D=3D 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 =3D 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 =3D 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 =3D 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 =3D mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + if (addr =3D=3D MAP_FAILED) { + perror("mmap"); + exit(1); + } + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* addr should be aligned down to huge page size */ + if (madvise(addr + base_page_size, + NR_HUGE_PAGES * huge_page_size - base_page_size, + MADV_DONTNEED)) { + perror("madvise"); + exit(1); + } + + /* should free all pages in mapping */ + validate_free_pages(free_hugepages); + + write_fault_pages(addr, NR_HUGE_PAGES); + validate_free_pages(free_hugepages - NR_HUGE_PAGES); + + /* addr + length should be aligned up to huge page size */ + if (madvise(addr, (NR_HUGE_PAGES * 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 =3D mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB, + -1, 0); + if (addr =3D=3D 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 =3D mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0); + if (addr =3D=3D 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 =3D mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr =3D=3D 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 =3D mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, 0); + if (addr =3D=3D 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 =3D mmap(NULL, NR_HUGE_PAGES * huge_page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0); + if (addr2 =3D=3D 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/self= tests/vm/run_vmtests.sh index e09040a3dc08..ff901ee66838 100755 --- a/tools/testing/selftests/vm/run_vmtests.sh +++ b/tools/testing/selftests/vm/run_vmtests.sh @@ -130,6 +130,18 @@ else echo "[PASS]" fi =20 +echo "-----------------------" +echo "running hugetlb-madvise" +echo "-----------------------" +./hugetlb-madvise $mnt/madvise-test +if [ $? -ne 0 ]; then + echo "[FAIL]" + exitcode=3D1 +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." --=20 2.34.1 From nobody Mon Jun 29 22:18:23 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1BB5DC433FE for ; Wed, 2 Feb 2022 01:41:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243710AbiBBBl3 (ORCPT ); Tue, 1 Feb 2022 20:41:29 -0500 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]:45336 "EHLO mx0b-00069f02.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243694AbiBBBl1 (ORCPT ); Tue, 1 Feb 2022 20:41:27 -0500 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 2120TLxB011400; Wed, 2 Feb 2022 01:41:11 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=cGFZdGzsqdEDpSRfU3HL2M3zyg3g1JTSJxsTlOOf+Jc=; b=pXTiB8Pm0wMglpBvLfiMl4JlbkRYx2hqVDpvumbfJ4ELmqrlwOrnQRZPdXUMSbYgjtr+ sRbdIxfmYEXnY1DtNRbzKyruXGogYa5f9GFFlM9HEXNmU0RLiD2Hzlrlfmja5qdRnmrw F2Q7jO4l1Qu0ntGGlRduDivLGWOEr6K4qbrM8f8PK2H72JvAGb3Wbmn7Vqu+y7T/SQ5m zmG5/nnQe2RAhvL0gwMo7vE7yVqAOvRry8CqTKDgfh98NSidT2632omMZKVGgBzrC0uX EOZLnPIBfoeVghXg6OCPbJ8jv91sE+tm2eKddrhIhybw34ExHvWeiDVBS1x3ZT53DiG3 cA== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by mx0b-00069f02.pphosted.com with ESMTP id 3dxj9fvnx6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 01:41:10 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 2121VP6J145690; Wed, 2 Feb 2022 01:41:09 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2046.outbound.protection.outlook.com [104.47.66.46]) by userp3030.oracle.com with ESMTP id 3dvtq1hqe4-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 01:41:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZJm19MaYeVx8Ya08t8EU3ViQKX4a0BZS4DE5iqXZV/xL4NXY+5kuTIUQtoCY5QelGRKFnmScOX98Sm89NN26fAS2Pq51I1x5x9olZQBpxm7lXObzr6oG77Egzha7zvk9ICg3gREEzhwK3YoSKNIVYqs+bmygqENCth841/3ORd2EkQm+ChtksxNRTAYcyQNN6YBSzm2cLN9mX1p4U/pO4/vcC8/D59n1pB1oNgS/EGjcTvPzFQ71cW1fKbaX3WmEWZZFfuO35BYRiPy4xA4DwMFTTIMtySH3XUammJ8J8krjAcM6Ze2jjV0RJBi+aTe2VZGCIJw9WFgFx/BPiyJRnw== 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=cGFZdGzsqdEDpSRfU3HL2M3zyg3g1JTSJxsTlOOf+Jc=; b=LW7MhRYddDRHS48Qazh1adEp2tpSfhgOaymc6mE3QW8yRxjt/jq2cCmoVjFQh9Wl55RcIoJhERWGb/y9ZTlJGHvBNoIsCs98aAwBb08d5HYMt0IytSFRViXpwD+yGYKx85w2IRH2cdeNajX1gimzIiovbyN9PzjLPWIdQHsxUZc8QmlJAP2JySvJBLridnianM0h/0xWH0uHIe77NxRyn5dJzmWeZ1lC5r0nIzIFmzEc824cnAjzlKHoIKSCIr972/mKVW7M3EqXdxud9dS11kQDg2X2R27Br25p5F/lB0HKGdeWK2ayDamvGEZ8uQSX/gvq1q1PyO4SNz00YgPLDw== 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=cGFZdGzsqdEDpSRfU3HL2M3zyg3g1JTSJxsTlOOf+Jc=; b=M514ZVW5ad1C7KZ+r9SFnkYVUhlIT9fMiX6DcrFhx+zV5kS2pkKeP6N4zpKOZOe0Q/4cY0TOeloiSskyVGSXtPm0Ph7Ug0f8TqUPrzfi1LalVA2HTSuaGE4zhTppbmIIsJMpP42jzEBWx6qLrPzapLr+46XZh2IHLs9R0vvniLI= Received: from DM6PR10MB4201.namprd10.prod.outlook.com (2603:10b6:5:216::10) by DM6PR10MB3433.namprd10.prod.outlook.com (2603:10b6:5:61::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.11; Wed, 2 Feb 2022 01:41:08 +0000 Received: from DM6PR10MB4201.namprd10.prod.outlook.com ([fe80::1057:d8d1:8372:c8b4]) by DM6PR10MB4201.namprd10.prod.outlook.com ([fe80::1057:d8d1:8372:c8b4%8]) with mapi id 15.20.4930.022; Wed, 2 Feb 2022 01:41:08 +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 , Andrew Morton , Mike Kravetz Subject: [PATCH v2 3/3] userfaultfd/selftests: enable huegtlb remap and remove event testing Date: Tue, 1 Feb 2022 17:40:34 -0800 Message-Id: <20220202014034.182008-4-mike.kravetz@oracle.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220202014034.182008-1-mike.kravetz@oracle.com> References: <20220202014034.182008-1-mike.kravetz@oracle.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: CO2PR05CA0085.namprd05.prod.outlook.com (2603:10b6:104:1::11) To DM6PR10MB4201.namprd10.prod.outlook.com (2603:10b6:5:216::10) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 620abd26-a53f-49dd-77f7-08d9e5ed15ba X-MS-TrafficTypeDiagnostic: DM6PR10MB3433: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: s3z1tbA/3Ab6LtQBLkQP62rB6cOgBSkj0H/1d2FHWc+Y7elKe8FAP+ROvMAUloR8bJidcu+Yo3hHjP+f1LIk8/FW00iIG+pfgqdpjR8/Nd2dyUZUkw/QfQffw+fUxOBpw0LMnA5UtG5mq62aQeDMpU8ZbuFp6YBrjF8HE69UNZrk4B2XX87XABrS1Nd7pBw5RLg893Yx0ro9Z8COjHNPSiTKwjao7ri/bad1wwb6d954WfunVapE80i+LKhp+703yAgyq8Yk+bkZttPfLJH2Gj3Gd7mtw83RU6ylptwsVcw8BWapQFdSdnl/0xpjwmNNcXRRlRqv5O5Yds7nJRVgNYC6oUEetnRDiTjgzdgNzz18uYGZViSU6UzKpb/Y6K9Wjo5lrGsF9H2lNq+sZWljpS1TXTK5KHsHpM9vSCkO8c3XFCdWQxyaufXmKegYfwGgKTKXh6mTeciIpwy/byn/u0lasa/1yr0D42vf8pXlLseagtLJyUPOXiGKLOoME3q2SEW5udglugIu3tb20PDBgbWBeU5oDximLbQPiZRlSlkIl8UJxdTrud7wCVNYUKCxbbaBHw0YVTdheVPLaiFbvTOIlPCvyfz9qB9ZXHW9yZKYF2XDnptz3hDV1ba1JDQtESSaAAMv6dhJcKMItj2SFLPB10yOVEk8miTN0KBb56a6vBk7NFxDYqhjEAE8yvoZlx9vzr5P5qn0f0pPmYRmvA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR10MB4201.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(38350700002)(7416002)(54906003)(44832011)(5660300002)(86362001)(38100700002)(316002)(4326008)(8936002)(66946007)(66476007)(8676002)(66556008)(6486002)(508600001)(83380400001)(36756003)(52116002)(107886003)(2616005)(1076003)(6512007)(26005)(6666004)(186003)(6506007)(2906002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?OY0BkT3VM2UJYWL7YXtfUNeUDiRXztlgiWmZwHGwUPwiN4Mqf8gJhOTvNH8e?= =?us-ascii?Q?gy75PjtjLPncqbnykWyYJhcV5ICTUXHy7SsUCZPC5oT1zunoIS7M7g27jeRg?= =?us-ascii?Q?mrppHzqCBp+xTN69Dg8i8FGECq8GFgZu3bwZNvnCPYNb8SvYmUEI756gUs6J?= =?us-ascii?Q?oSOPklI8hu1DEKc6yQrzBbBfkkN5Zdj7bLQViYcqX86U1dVXpU0XvjWmD3zk?= =?us-ascii?Q?4hMzkSTziOP1tHS9B59zuOIZudlSIRYk/09LUUKhrRstUOJ/hO6yhKqbTYOR?= =?us-ascii?Q?SEq1PfcH+PlHSRCrGa6QP+9PqWGtp0zzb67hdl6nAdTDVCqYZNJ/AqQhOs3P?= =?us-ascii?Q?U4l851VL+26u+uvhlrkIyae9+u6IobKrBHaJHRHiDMupE4jQdHxbtw5Lmman?= =?us-ascii?Q?RRR/r1rI3IJpRUsV+MoIXO/kAkdg0s4t18WxPS32EhgGDqCWE0T0+YaYmoIE?= =?us-ascii?Q?ThhnxxIHe4czJ7Dt+N2lbKv6x/RrBz+Mfy7WUy6NV7Od9EO0P0NDo27xXbCi?= =?us-ascii?Q?qDN/Tk5ISyWhgxOKT3gf8SXR5pNq7CVm+0PrqASiTGwMo0+Ks/BzhQWGSkAA?= =?us-ascii?Q?B3LL4H4p0lmjyFPNcbIzuu2CLVG6l3y4Mm/r7A7+oSU455FGeExlkuPXh+tr?= =?us-ascii?Q?ybdCUuMY+Rz7jYaB8MeBuZw2I1voNYUnUO7hK9/JMopVUm/PaHZE6Jxgo16C?= =?us-ascii?Q?UaaXryWlU5jd13hFDhKMddtiJKsFhgO+Fjqcj8IVLsZ3pVFak4DcXXTwgRfW?= =?us-ascii?Q?x1Fi92B6CNAwU2/49pQwoW5axq5WxQrOlW/hlg2OGoqmnLrAWYjyqWzDUHLf?= =?us-ascii?Q?fSruTg5i8vY3GutkoSNVV4RUe5LPaBQmaNmu1y67Me+lM/GjDY9ornMJ/mWK?= =?us-ascii?Q?GfhdWBshBo8bLTwJf9JPQQ6TfkimzWBA6I+WdO/XspfWqxCmWh92awG+Pqgi?= =?us-ascii?Q?bBI2YuloZ3iWkEJns+igXuGjeMcodOP67gFITCEtjTZQ7tilkPn2kT8eSrAG?= =?us-ascii?Q?SJBSVaIthYutuuXHMnPbwC5Sc6nZE5CmL1SFRBUI6I+dQ10JCBJIz0+3dw1P?= =?us-ascii?Q?NNVU1TyuWERKywU05etjFnRmjkwWv1hvzp6zq+DAlknLmdmcLzkrVK6+6xY/?= =?us-ascii?Q?n93uKGYgyvGq0kjx75yCbVrROuJU3XCe5vXnCkgTBCpXRQXaJwL+pycpqiRL?= =?us-ascii?Q?HJN2wVXcnXNV9J52w+3nPsvXwH9lzcOFY9tl0Dxxt7rg+flcEYQUpWcZt+tK?= =?us-ascii?Q?mFaCAT61rP7TnGQJmvvcp2oXhqzQ28zdbzss5XKFtvi/j7EFBYuIm/KfQrx/?= =?us-ascii?Q?3at8/MbEoYbpqUEDkQv+Ug0+oiJnZRsw3vl0wfKt2oVN5iHFz+TcGD4DmlrQ?= =?us-ascii?Q?f+7XL0sbYwEerZI2TNXhsKRl9b2mTVbQXTlfWxQmbS1gIpSouh+3C0NRCI56?= =?us-ascii?Q?H3Krqpvf494dQmbZs5kT8xLk/shhp0Nwio9H1k7ZXzOSG6azGwoHUIDVhktK?= =?us-ascii?Q?yhWbCcAfPSu8JK/pOg+EUKTJv7Y095ZC9xM63pYy783Jc435Zu6QwNkdlCs8?= =?us-ascii?Q?CAhSZnDfWVjXufqNLkMIQLZsZVMxS4ThlIfIlWhx+Hy41Fd1aal5kDg9djwU?= =?us-ascii?Q?E2tfQUPu0qp7/pbLQY3QH4s=3D?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 620abd26-a53f-49dd-77f7-08d9e5ed15ba X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4201.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Feb 2022 01:41:08.5124 (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: KDtNlXJK2b8A54DNifFlkMlb03RT6PN4wjlKUtq92oEIe7x249uXyB4qMKFS9o823eSpSj2f5MYWxTlhU0ljgg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR10MB3433 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10245 signatures=673430 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxlogscore=999 adultscore=0 malwarescore=0 bulkscore=0 suspectscore=0 mlxscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202020004 X-Proofpoint-GUID: HRrO9eVvk-ZWJymK3uhB09aSQj6ZImU_ X-Proofpoint-ORIG-GUID: HRrO9eVvk-ZWJymK3uhB09aSQj6ZImU_ Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" 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/self= tests/vm/run_vmtests.sh index ff901ee66838..7178d6fa8c92 100755 --- a/tools/testing/selftests/vm/run_vmtests.sh +++ b/tools/testing/selftests/vm/run_vmtests.sh @@ -207,14 +207,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=3D1 else echo "[PASS]" fi -rm -f $mnt/ufd_test_file =20 echo "-------------------------" echo "running userfaultfd_shmem" diff --git a/tools/testing/selftests/vm/userfaultfd.c b/tools/testing/selft= ests/vm/userfaultfd.c index d2480ab93037..c18beebc0dd6 100644 --- a/tools/testing/selftests/vm/userfaultfd.c +++ b/tools/testing/selftests/vm/userfaultfd.c @@ -88,7 +88,6 @@ static bool test_uffdio_minor =3D 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 =3D -1; static int uffd_flags, finished, *pipefd; @@ -127,9 +126,9 @@ const char *examples =3D "./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 /de= v/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 l= en, unsigned long offset) =20 static void hugetlb_release_pages(char *rel_area) { - if (fallocate(huge_fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, - rel_area =3D=3D 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"); + } } =20 static void hugetlb_allocate_area(void **alloc_area) @@ -237,26 +239,37 @@ static void hugetlb_allocate_area(void **alloc_area) void *area_alias =3D NULL; char **alloc_area_alias; =20 - *alloc_area =3D mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE, - (map_shared ? MAP_SHARED : MAP_PRIVATE) | - MAP_HUGETLB | - (*alloc_area =3D=3D area_src ? 0 : MAP_NORESERVE), - huge_fd, *alloc_area =3D=3D area_src ? 0 : - nr_pages * page_size); + if (!map_shared) + *alloc_area =3D mmap(NULL, + nr_pages * page_size, + PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB | + (*alloc_area =3D=3D area_src ? 0 : MAP_NORESERVE), + -1, + 0); + else + *alloc_area =3D mmap(NULL, + nr_pages * page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED | + (*alloc_area =3D=3D area_src ? 0 : MAP_NORESERVE), + huge_fd, + *alloc_area =3D=3D area_src ? 0 : nr_pages * page_size); if (*alloc_area =3D=3D MAP_FAILED) err("mmap of hugetlbfs file failed"); =20 if (map_shared) { - area_alias =3D mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_HUGETLB, - huge_fd, *alloc_area =3D=3D area_src ? 0 : - nr_pages * page_size); + area_alias =3D mmap(NULL, + nr_pages * page_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + huge_fd, + *alloc_area =3D=3D area_src ? 0 : nr_pages * page_size); if (area_alias =3D=3D MAP_FAILED) err("mmap of hugetlb file alias failed"); } =20 if (*alloc_area =3D=3D area_src) { - huge_fd_off0 =3D *alloc_area; alloc_area_alias =3D &area_src_alias; } else { alloc_area_alias =3D &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 =3D (unsigned long) area_dst_alias + offset; } =20 @@ -427,7 +435,6 @@ static void uffd_test_ctx_clear(void) uffd =3D -1; } =20 - huge_fd_off0 =3D 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 =3D 0; =20 - if (test_type !=3D TEST_HUGETLB) - split_nr_pages =3D (nr_pages + 1) / 2; - else - split_nr_pages =3D nr_pages; + split_nr_pages =3D (nr_pages + 1) / 2; =20 if (signal_test) { sigbuf =3D &jbuf; @@ -985,9 +989,6 @@ static int faulting_process(int signal_test) if (signal_test) return signalled !=3D split_nr_pages; =20 - if (test_type =3D=3D TEST_HUGETLB) - return 0; - area_dst =3D mremap(area_dst, nr_pages * page_size, nr_pages * page_size, MREMAP_MAYMOVE | MREMAP_FIXED, area_src); if (area_dst =3D=3D MAP_FAILED) @@ -1670,7 +1671,7 @@ int main(int argc, char **argv) } nr_pages =3D nr_pages_per_cpu * nr_cpus; =20 - if (test_type =3D=3D TEST_HUGETLB) { + if (test_type =3D=3D TEST_HUGETLB && map_shared) { if (argc < 5) usage(); huge_fd =3D open(argv[4], O_CREAT | O_RDWR, 0755); --=20 2.34.1