From nobody Fri Dec 19 22:04:08 2025 Received: from mail-qk1-f171.google.com (mail-qk1-f171.google.com [209.85.222.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 21872191; Thu, 15 May 2025 13:35:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316126; cv=none; b=Tb2i1UD8NbUFXOJ4plRRTt817VnawH6GtsgbUuCRVV/DBJNdOYRUQW3S9Ec1cNoQ7rbB1uZCEdkAdlCf3JpfNHsCemDrHcANWg2hNQUiDq5Sm6vTJ3cwdFOVjtKk58ncjkcxqhNsXMBRNlGVqDr6yD7YfylYfq4GQb57LKL2CaE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316126; c=relaxed/simple; bh=ywrAeMMuDzvoRx5DiPJuP00JWBZm37GhnxdqiAAQFvc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YD+lLxgd2SKiOjmctb6r9vr8DnmBQ17UOtGF3NsJmok1QdMrl3EvGbgAZoW9TGz7qvX/AovjJaYPDMwGJ9+wd0sOamMICiiT7omUjJQaispG8e+xPlRtBwpzMsSK8uVnpFHpdY28C1s9dg2HhEJRZk8Snu7HdpdtbnfyvN43ANU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KHY1ujhg; arc=none smtp.client-ip=209.85.222.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KHY1ujhg" Received: by mail-qk1-f171.google.com with SMTP id af79cd13be357-7c54b651310so123179685a.0; Thu, 15 May 2025 06:35:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747316124; x=1747920924; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3W70vOJiI6A4ZfVZFm0AS9kx4wlEEr6sA0Z5zAoPECo=; b=KHY1ujhgveni1E6h6Cn74riq9t1Zvwh3BQCeo1WmRlCP/z88WWCPindOimsm8Or0r1 +EB5/hhZ9CBtNHdV/55IWiwyhr5IyoVvsJbC6vMl2TsG1lK52KXTPsVdsKS3A7EymM8C y2bJCk5qY9wjjrDziOvwLcWJqpnQMfJcr2HcWXGNZmEWEJmz+GOTbftaLQ79JPI3A3uF Ew08y+/C2vtatAJnrRzr+DURLF5JM0E0liQj/O787hcOx8nPbqQSH1SC7Z57vd5plbxG pECThbEClXSi5F+dEceLGN13ANAQikW02sQzJW8ftmFQOQ7cNNwKgSQ1WXuPtar5uQ+d IHJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747316124; x=1747920924; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3W70vOJiI6A4ZfVZFm0AS9kx4wlEEr6sA0Z5zAoPECo=; b=L8XFf3lPmnnlU6Q9HVYTFIFDmonBAzqMBgOihnYdybjXJArw+hTdoscnryocic/m3y PqEOqZxdi3CnUXDoXzq0eDEzwwLLK4pRBh4AtHwf2BxNoqdhrLxtFIpSoTxOtnJ8unGh I4EWHFRRtf7yOjlNgHackaqr73tYCqYc1klj3zkHF/K3Suyl9x2FtahYiT8VKSz5ebJd KpwwAmvnYnhMFa9fXONdO1jtYFv4sCylPnLv/ZdMhYWNlu6BxRCUvA/kl5t1xVmmfr+p pfCaZ7snutbibTCXJ+o1Qg2Ho+wDwF4g/MoJ/Q6TPr1dN5yUu6xFhQ68Zn3Lavv5mn+j vsUQ== X-Forwarded-Encrypted: i=1; AJvYcCW3oyB436/XKR0CWi2IVivnbiWPb7Kb2kY5Op0L22w751fETc4akYOCnjTtu80HDOqe/M2C1IG4gPCPp7IW@vger.kernel.org, AJvYcCXqtwbw8nlJNVbQ0URJT6ZwvGSNHkBtv7iwlV3PjtbUZnECS5+ToBNh4EV/ASfgTOPdOM/4UWkMpdw=@vger.kernel.org X-Gm-Message-State: AOJu0YyoA9VB83GTGxwsDWk0t32X2pRQIdlrH8L/c847nj+mB/Yq3ANS CgtYERrAcAykfL1qCjwvCQV+Mv7PgeMFhK6vx4OLjfCasfoC5DIl X-Gm-Gg: ASbGncuYrlhjYfnmL65WmEatGkGiF7yMchHP9uHqpfVXUWniRAxrgPCfV9nM+X2vEST 6C0bIqHatIMPNAXpvCzGefISuPCD3ho2bXxP6f06Dj3QU0T7MVvDq488cpjvZVECsAbHHJIG/hD vanKOaUl8jqUrZTJu4SfJ6cu7XiLePO3N23VSqXCh6YhLVl3Az2lFt8PUfyPmEPmF2wneUz7/Ba xL7hYrjPEPVdVN8s6Tgqk+3he7EZXiJ+cOla1dWfOINvW48JGbkeuVvwyA3UUlFigPHUTPEKS/6 lDCIjRIGXT16ZyqCMKJzEIFK0knEIqRx8eq6MqdZLA3XlnuC X-Google-Smtp-Source: AGHT+IGJfUgB6Cz7ZrvVPSp8W9uKmh5QpcoRFlMZ3ENFrZ5CQG6eq62jYYnhP0dl3rkIpmEEEM3nIA== X-Received: by 2002:a05:620a:2697:b0:7c5:4a8e:b6b with SMTP id af79cd13be357-7cd3c8099d4mr324281385a.46.1747316123724; Thu, 15 May 2025 06:35:23 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:7::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7cd295f0020sm251419785a.3.2025.05.15.06.35.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 06:35:23 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH 1/6] prctl: introduce PR_THP_POLICY_DEFAULT_HUGE for the process Date: Thu, 15 May 2025 14:33:30 +0100 Message-ID: <20250515133519.2779639-2-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250515133519.2779639-1-usamaarif642@gmail.com> References: <20250515133519.2779639-1-usamaarif642@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is set via the new PR_SET_THP_POLICY prctl. This will set the MMF2_THP_VMA_DEFAULT_HUGE process flag which changes the default of new VMAs to be VM_HUGEPAGE. The call also modifies all existing VMAs that are not VM_NOHUGEPAGE to be VM_HUGEPAGE. The policy is inherited during fork+exec. This allows systems where the global policy is set to "madvise" to effectively have THPs always for the process. In an environment where different types of workloads are stacked on the same machine, this will allow workloads that benefit from always having hugepages to do so, without regressing those that don't. Signed-off-by: Usama Arif --- include/linux/huge_mm.h | 3 ++ include/linux/mm_types.h | 11 +++++++ include/uapi/linux/prctl.h | 4 +++ kernel/fork.c | 1 + kernel/sys.c | 21 ++++++++++++ mm/huge_memory.c | 32 +++++++++++++++++++ mm/vma.c | 2 ++ tools/include/uapi/linux/prctl.h | 4 +++ .../trace/beauty/include/uapi/linux/prctl.h | 4 +++ 9 files changed, 82 insertions(+) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 2f190c90192d..e652ad9ddbbd 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -260,6 +260,9 @@ static inline unsigned long thp_vma_suitable_orders(str= uct vm_area_struct *vma, return orders; } =20 +void vma_set_thp_policy(struct vm_area_struct *vma); +void process_vmas_thp_default_huge(struct mm_struct *mm); + unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma, unsigned long vm_flags, unsigned long tva_flags, diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index e76bade9ebb1..2fe93965e761 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -1066,6 +1066,7 @@ struct mm_struct { mm_context_t context; =20 unsigned long flags; /* Must use atomic bitops to access */ + unsigned long flags2; =20 #ifdef CONFIG_AIO spinlock_t ioctx_lock; @@ -1744,6 +1745,11 @@ enum { MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\ MMF_VM_MERGE_ANY_MASK | MMF_TOPDOWN_MASK) =20 +#define MMF2_THP_VMA_DEFAULT_HUGE 0 +#define MMF2_THP_VMA_DEFAULT_HUGE_MASK (1 << MMF2_THP_VMA_DEFAULT_HUGE) + +#define MMF2_INIT_MASK (MMF2_THP_VMA_DEFAULT_HUGE_MASK) + static inline unsigned long mmf_init_flags(unsigned long flags) { if (flags & (1UL << MMF_HAS_MDWE_NO_INHERIT)) @@ -1752,4 +1758,9 @@ static inline unsigned long mmf_init_flags(unsigned l= ong flags) return flags & MMF_INIT_MASK; } =20 +static inline unsigned long mmf2_init_flags(unsigned long flags) +{ + return flags & MMF2_INIT_MASK; +} + #endif /* _LINUX_MM_TYPES_H */ diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index 15c18ef4eb11..325c72f40a93 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -364,4 +364,8 @@ struct prctl_mm_map { # define PR_TIMER_CREATE_RESTORE_IDS_ON 1 # define PR_TIMER_CREATE_RESTORE_IDS_GET 2 =20 +#define PR_SET_THP_POLICY 78 +#define PR_GET_THP_POLICY 79 +#define PR_THP_POLICY_DEFAULT_HUGE 0 + #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/fork.c b/kernel/fork.c index 9e4616dacd82..6e5f4a8869dc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1054,6 +1054,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm= , struct task_struct *p, =20 if (current->mm) { mm->flags =3D mmf_init_flags(current->mm->flags); + mm->flags2 =3D mmf2_init_flags(current->mm->flags2); mm->def_flags =3D current->mm->def_flags & VM_INIT_DEF_MASK; } else { mm->flags =3D default_dump_filter; diff --git a/kernel/sys.c b/kernel/sys.c index c434968e9f5d..1115f258f253 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2658,6 +2658,27 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, a= rg2, unsigned long, arg3, clear_bit(MMF_DISABLE_THP, &me->mm->flags); mmap_write_unlock(me->mm); break; + case PR_GET_THP_POLICY: + if (arg2 || arg3 || arg4 || arg5) + return -EINVAL; + if (!!test_bit(MMF2_THP_VMA_DEFAULT_HUGE, &me->mm->flags2)) + error =3D PR_THP_POLICY_DEFAULT_HUGE; + break; + case PR_SET_THP_POLICY: + if (arg3 || arg4 || arg5) + return -EINVAL; + if (mmap_write_lock_killable(me->mm)) + return -EINTR; + switch (arg2) { + case PR_THP_POLICY_DEFAULT_HUGE: + set_bit(MMF2_THP_VMA_DEFAULT_HUGE, &me->mm->flags2); + process_vmas_thp_default_huge(me->mm); + break; + default: + return -EINVAL; + } + mmap_write_unlock(me->mm); + break; case PR_MPX_ENABLE_MANAGEMENT: case PR_MPX_DISABLE_MANAGEMENT: /* No longer implemented: */ diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 2780a12b25f0..64f66d5295e8 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -98,6 +98,38 @@ static inline bool file_thp_enabled(struct vm_area_struc= t *vma) return !inode_is_open_for_write(inode) && S_ISREG(inode->i_mode); } =20 +void vma_set_thp_policy(struct vm_area_struct *vma) +{ + struct mm_struct *mm =3D vma->vm_mm; + + if (test_bit(MMF2_THP_VMA_DEFAULT_HUGE, &mm->flags2)) + vm_flags_set(vma, VM_HUGEPAGE); +} + +static void vmas_thp_default_huge(struct mm_struct *mm) +{ + struct vm_area_struct *vma; + unsigned long vm_flags; + + VMA_ITERATOR(vmi, mm, 0); + for_each_vma(vmi, vma) { + vm_flags =3D vma->vm_flags; + if (vm_flags & VM_NOHUGEPAGE) + continue; + vm_flags_set(vma, VM_HUGEPAGE); + } +} + +void process_vmas_thp_default_huge(struct mm_struct *mm) +{ + if (test_bit(MMF2_THP_VMA_DEFAULT_HUGE, &mm->flags2)) + return; + + set_bit(MMF2_THP_VMA_DEFAULT_HUGE, &mm->flags2); + vmas_thp_default_huge(mm); +} + + unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma, unsigned long vm_flags, unsigned long tva_flags, diff --git a/mm/vma.c b/mm/vma.c index 1f2634b29568..101b19c96803 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -2476,6 +2476,7 @@ static int __mmap_new_vma(struct mmap_state *map, str= uct vm_area_struct **vmap) if (!vma_is_anonymous(vma)) khugepaged_enter_vma(vma, map->flags); ksm_add_vma(vma); + vma_set_thp_policy(vma); *vmap =3D vma; return 0; =20 @@ -2705,6 +2706,7 @@ int do_brk_flags(struct vma_iterator *vmi, struct vm_= area_struct *vma, mm->map_count++; validate_mm(mm); ksm_add_vma(vma); + vma_set_thp_policy(vma); out: perf_event_mmap(vma); mm->total_vm +=3D len >> PAGE_SHIFT; diff --git a/tools/include/uapi/linux/prctl.h b/tools/include/uapi/linux/pr= ctl.h index 35791791a879..f5945ebfe3f2 100644 --- a/tools/include/uapi/linux/prctl.h +++ b/tools/include/uapi/linux/prctl.h @@ -328,4 +328,8 @@ struct prctl_mm_map { # define PR_PPC_DEXCR_CTRL_CLEAR_ONEXEC 0x10 /* Clear the aspect on exec */ # define PR_PPC_DEXCR_CTRL_MASK 0x1f =20 +#define PR_SET_THP_POLICY 78 +#define PR_GET_THP_POLICY 79 +#define PR_THP_POLICY_DEFAULT_HUGE 0 + #endif /* _LINUX_PRCTL_H */ diff --git a/tools/perf/trace/beauty/include/uapi/linux/prctl.h b/tools/per= f/trace/beauty/include/uapi/linux/prctl.h index 15c18ef4eb11..325c72f40a93 100644 --- a/tools/perf/trace/beauty/include/uapi/linux/prctl.h +++ b/tools/perf/trace/beauty/include/uapi/linux/prctl.h @@ -364,4 +364,8 @@ struct prctl_mm_map { # define PR_TIMER_CREATE_RESTORE_IDS_ON 1 # define PR_TIMER_CREATE_RESTORE_IDS_GET 2 =20 +#define PR_SET_THP_POLICY 78 +#define PR_GET_THP_POLICY 79 +#define PR_THP_POLICY_DEFAULT_HUGE 0 + #endif /* _LINUX_PRCTL_H */ --=20 2.47.1 From nobody Fri Dec 19 22:04:08 2025 Received: from mail-qk1-f178.google.com (mail-qk1-f178.google.com [209.85.222.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3054B86250; Thu, 15 May 2025 13:35:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316127; cv=none; b=pQ2prXHvNvJ/PuX2Xq8mbXhT9kF1EhXvMAHqLYqMg/tkZR0NUu138dpHs3dpc1hPnZBjbWN6ZswGo3pvcXHFoH87urWKFct8PHkVxZ1R6RJxYeWLjcDowh4tP6CQB0TLQgGAAZhJY67GENz8G5ljZ08BrtOI9Hlx2uia3hyvjvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316127; c=relaxed/simple; bh=n/5KG+GgbAhfVnu3caHI6mB6U1b3sTe5vD341ScfX1s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IIe6CJhLjEZrz7AvXvxoWnHeBlvbvQ4kitUS7HJNNyoxwTtxz1fnF5G1i3ITwJ1NauF9vcGFLxAzUm/LysCIS1D1o89Cwv73akF4lQOL7gXT32LdyxG6BkCRAWu+zJoMJMEuzyYMFN0vK/6Lr5FGpSGmMYPqKI+MokoJ5IUKJog= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NjWrQBoc; arc=none smtp.client-ip=209.85.222.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NjWrQBoc" Received: by mail-qk1-f178.google.com with SMTP id af79cd13be357-7c922734cc2so111275185a.1; Thu, 15 May 2025 06:35:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747316125; x=1747920925; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=B/DF6x64D/fKACEnPhLYyL2miQ9EFIvp0WGBVg1OxD0=; b=NjWrQBocHdwRWacf1OTfPsGsqWr2wUvetpufEX+SLYDhOfxvpZzCtyxIJUPyk+dXzW 2ctPRJRSbPwLrwnxY09CVT/7+L3mhTOiCxYSs/hnVUmUGicYcakTrJRdTxua5QrsRd71 XFyI21rrwBLou1QN0ljO47nUvF1CVg3PL41kU+x/D7tYy2JC0cYTNV55SUw8kSWtYQMk S4XJiCdO48ykK6F66KcuFXPzYC9bT4fZXXAtZd+EBkFULTOF+3FVp/BSqZJbYW+srTuM D9Bvz//jTjttM6Fn/YvbFOJU+Ed2e+ePiPGWjCmDcbKSWy2d0k3rXTgqOWmy4UVf3rnd dCSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747316125; x=1747920925; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B/DF6x64D/fKACEnPhLYyL2miQ9EFIvp0WGBVg1OxD0=; b=ankaNlDgp3ZB9OYmdbFdZOX1/FhwkEHxcowkma/lOa5C00azz1LtuyrIi2wE0E2w8j 08NuU3hYWetU2dBdf47qCaGtnZH9vsmxT6yKF31ajsjIGxOuJuXk+tGg/3ZkX8Ahi+eL vrB1yiTrHy6JMyNAK0ZKwFSLpkSlGmAcEnEp8+5mb/S2kmbKjxzayEggQmtWh9EzjYix G9RxxVYVI46LQDx47rztaYDUPyqiAz1+JKYZqkz47wrFGk83NvJ5MCH24MACPEA94Yyv E3XK8qCxCcG8dXbz9YruhMS0rWRnKuLWFRr7o2eHqaQsFm0schh5nuqp4Cwo2TPpPkhQ 3qHg== X-Forwarded-Encrypted: i=1; AJvYcCUnJE0E/EOba7r1L5wBS39gxH6LfZZlYYfnhniYRyiO3yiz2YUj1bZ4c1nH7jAtMp/1EqOLZG11VN9WEdPQ@vger.kernel.org, AJvYcCUvT3NyYbzT1jwdKB7/dKAi+QKcxQrACer/eN7270I0cdTFP/bLoDYlvfqWcxTevK9B635tQ6WF3AE=@vger.kernel.org X-Gm-Message-State: AOJu0YxGKSXtnAEb7uJJJLyr/KOHXHdVmAE57FCeFsT+1JQgqO0rdDSu HcZn7dQBXHan53O3UTQmKQLH9QwLLri82C5vrVFN1RIjtSaeGYtB X-Gm-Gg: ASbGncv1IilA+ev9R6jS50bMrsWhOltXBhJluM6GyylFWFZluyjpIdm0bdR43BCT/i8 pwlEbnpIS0En75rQ84wRm6qhyIPagcSbMdB4bP25Ps4q2ss6MV9q+NRj50YXePgZ/MclRDqPzDR AhYuqwSgnHLD6+rexfaOxpUx7Fd7BP9jLZKPADsQhkte+rw/5OQG4Fo6FJsiLXAJ5EvAcQgdwua NmIH9t23YRgqTNKPTT/w3QM4HqXRZ+SnYjmi3fBDmCq7tpc3o4TROcaWEbbAgrirrf3OiNt9uZ7 zSnwax1CN7MdnZkuOsbQaehCSmlhS0n7K7eelymP6uSuOAQDMQ== X-Google-Smtp-Source: AGHT+IH1T7xQLSTGycqkKe1o9dKahkpCSZkhxgBizqiXTZZ6kY7wkbw61A/jppy451alD4weThfo9w== X-Received: by 2002:a05:620a:44c6:b0:7c5:d71c:6a47 with SMTP id af79cd13be357-7cd39de0c81mr510317185a.8.1747316124803; Thu, 15 May 2025 06:35:24 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:72::]) by smtp.gmail.com with ESMTPSA id af79cd13be357-7cd2464aaf2sm304527985a.7.2025.05.15.06.35.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 06:35:24 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH 2/6] prctl: introduce PR_THP_POLICY_DEFAULT_NOHUGE for the process Date: Thu, 15 May 2025 14:33:31 +0100 Message-ID: <20250515133519.2779639-3-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250515133519.2779639-1-usamaarif642@gmail.com> References: <20250515133519.2779639-1-usamaarif642@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is set via the new PR_SET_THP_POLICY prctl. This will set the MMF2_THP_VMA_DEFAULT_NOHUGE process flag which changes the default of new VMAs to be VM_NOHUGEPAGE. The call also modifies all existing VMAs that are not VM_HUGEPAGE to be VM_NOHUGEPAGE. The policy is inherited during fork+exec. This allows systems where the global policy is set to "always" to effectively have THPs on madvise only for the process. In an environment where different types of workloads are stacked on the same machine,this will allow workloads that benefit from having hugepages on an madvise basis only to do so, without regressing those that benefit from having hugepages always. Signed-off-by: Usama Arif --- include/linux/huge_mm.h | 1 + include/linux/mm_types.h | 5 +++- include/uapi/linux/prctl.h | 1 + kernel/sys.c | 8 +++++++ mm/huge_memory.c | 24 +++++++++++++++++++ tools/include/uapi/linux/prctl.h | 1 + .../trace/beauty/include/uapi/linux/prctl.h | 1 + 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index e652ad9ddbbd..d46bba282701 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -262,6 +262,7 @@ static inline unsigned long thp_vma_suitable_orders(str= uct vm_area_struct *vma, =20 void vma_set_thp_policy(struct vm_area_struct *vma); void process_vmas_thp_default_huge(struct mm_struct *mm); +void process_vmas_thp_default_nohuge(struct mm_struct *mm); =20 unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma, unsigned long vm_flags, diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 2fe93965e761..5e770411d8d1 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -1747,8 +1747,11 @@ enum { =20 #define MMF2_THP_VMA_DEFAULT_HUGE 0 #define MMF2_THP_VMA_DEFAULT_HUGE_MASK (1 << MMF2_THP_VMA_DEFAULT_HUGE) +#define MMF2_THP_VMA_DEFAULT_NOHUGE 1 +#define MMF2_THP_VMA_DEFAULT_NOHUGE_MASK (1 << MMF2_THP_VMA_DEFAULT_NOHUGE) =20 -#define MMF2_INIT_MASK (MMF2_THP_VMA_DEFAULT_HUGE_MASK) +#define MMF2_INIT_MASK (MMF2_THP_VMA_DEFAULT_HUGE_MASK |\ + MMF2_THP_VMA_DEFAULT_NOHUGE_MASK) =20 static inline unsigned long mmf_init_flags(unsigned long flags) { diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index 325c72f40a93..d25458f4db9e 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -367,5 +367,6 @@ struct prctl_mm_map { #define PR_SET_THP_POLICY 78 #define PR_GET_THP_POLICY 79 #define PR_THP_POLICY_DEFAULT_HUGE 0 +#define PR_THP_POLICY_DEFAULT_NOHUGE 1 =20 #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/sys.c b/kernel/sys.c index 1115f258f253..d91203e6dd0d 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2663,6 +2663,8 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, ar= g2, unsigned long, arg3, return -EINVAL; if (!!test_bit(MMF2_THP_VMA_DEFAULT_HUGE, &me->mm->flags2)) error =3D PR_THP_POLICY_DEFAULT_HUGE; + else if (!!test_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &me->mm->flags2)) + error =3D PR_THP_POLICY_DEFAULT_NOHUGE; break; case PR_SET_THP_POLICY: if (arg3 || arg4 || arg5) @@ -2672,8 +2674,14 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, a= rg2, unsigned long, arg3, switch (arg2) { case PR_THP_POLICY_DEFAULT_HUGE: set_bit(MMF2_THP_VMA_DEFAULT_HUGE, &me->mm->flags2); + clear_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &me->mm->flags2); process_vmas_thp_default_huge(me->mm); break; + case PR_THP_POLICY_DEFAULT_NOHUGE: + clear_bit(MMF2_THP_VMA_DEFAULT_HUGE, &me->mm->flags2); + set_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &me->mm->flags2); + process_vmas_thp_default_nohuge(me->mm); + break; default: return -EINVAL; } diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 64f66d5295e8..9d70a365ced3 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -104,6 +104,8 @@ void vma_set_thp_policy(struct vm_area_struct *vma) =20 if (test_bit(MMF2_THP_VMA_DEFAULT_HUGE, &mm->flags2)) vm_flags_set(vma, VM_HUGEPAGE); + else if (test_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &mm->flags2)) + vm_flags_set(vma, VM_NOHUGEPAGE); } =20 static void vmas_thp_default_huge(struct mm_struct *mm) @@ -129,6 +131,28 @@ void process_vmas_thp_default_huge(struct mm_struct *m= m) vmas_thp_default_huge(mm); } =20 +static void vmas_thp_default_nohuge(struct mm_struct *mm) +{ + struct vm_area_struct *vma; + unsigned long vm_flags; + + VMA_ITERATOR(vmi, mm, 0); + for_each_vma(vmi, vma) { + vm_flags =3D vma->vm_flags; + if (vm_flags & VM_HUGEPAGE) + continue; + vm_flags_set(vma, VM_NOHUGEPAGE); + } +} + +void process_vmas_thp_default_nohuge(struct mm_struct *mm) +{ + if (test_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &mm->flags2)) + return; + + set_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &mm->flags2); + vmas_thp_default_nohuge(mm); +} =20 unsigned long __thp_vma_allowable_orders(struct vm_area_struct *vma, unsigned long vm_flags, diff --git a/tools/include/uapi/linux/prctl.h b/tools/include/uapi/linux/pr= ctl.h index f5945ebfe3f2..e03d0ed890c5 100644 --- a/tools/include/uapi/linux/prctl.h +++ b/tools/include/uapi/linux/prctl.h @@ -331,5 +331,6 @@ struct prctl_mm_map { #define PR_SET_THP_POLICY 78 #define PR_GET_THP_POLICY 79 #define PR_THP_POLICY_DEFAULT_HUGE 0 +#define PR_THP_POLICY_DEFAULT_NOHUGE 1 =20 #endif /* _LINUX_PRCTL_H */ diff --git a/tools/perf/trace/beauty/include/uapi/linux/prctl.h b/tools/per= f/trace/beauty/include/uapi/linux/prctl.h index 325c72f40a93..d25458f4db9e 100644 --- a/tools/perf/trace/beauty/include/uapi/linux/prctl.h +++ b/tools/perf/trace/beauty/include/uapi/linux/prctl.h @@ -367,5 +367,6 @@ struct prctl_mm_map { #define PR_SET_THP_POLICY 78 #define PR_GET_THP_POLICY 79 #define PR_THP_POLICY_DEFAULT_HUGE 0 +#define PR_THP_POLICY_DEFAULT_NOHUGE 1 =20 #endif /* _LINUX_PRCTL_H */ --=20 2.47.1 From nobody Fri Dec 19 22:04:08 2025 Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C60614F104; Thu, 15 May 2025 13:35:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316129; cv=none; b=MbTwwq3GUpv18azkwj7xTpwtKk73CHhPi/m0dhch9qKSCCSmiwSo8L0MAkBe0DaYmUr/CntSx3XFuC2hjC2yKuyA8xzTO4Kld5xqJ1+CvEmq5XqS/59JCjgtRLmJ2+gOv5p2351Qh6vxjkUxKeNjGhyMYaYxZ7MMcCRPlpyhvfM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316129; c=relaxed/simple; bh=4hEOlPMN9TGQyacEpK18ok9RPnqMx1M1Y7xAEg3A3uc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VZuMXzErK5QyopRj9DV78PlT3SoHD7adJl+oiarF/12I48e73r0StfiXpZWzNPqMRjTGRkge57WR3BRd1d2LcSWF+2y3fztiluF8hxqBNG+MUst4t+VOJWy1oqYTF/8Rb8x2XFcPa3dR2V0neqrcK3I+vBwxwLYTvpzK1gtr4qY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hbb5w2b0; arc=none smtp.client-ip=209.85.160.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hbb5w2b0" Received: by mail-qt1-f180.google.com with SMTP id d75a77b69052e-4775ccf3e56so23805261cf.0; Thu, 15 May 2025 06:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747316126; x=1747920926; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1B5pkHdPuqQZDbYfrz3XLKt1s6mapVj+8upRwrTiCEE=; b=hbb5w2b0RWeF5ZjZoGx158IKHOEzoXa03rBeKIf0dzNdyDxczRsvnVGVnqxLpf/YeF 8StoE3OkQOrzipSviiRZoOjuuWTsHYta/4WKtDlLb76HsBxD63x6LC1iM2BLHGxSov+y H5sBfxRdF5ESFX+fQdtCoMsZkmIWIkcA21FrGi48k/z4/6Sk3TR6eWBAyiZLO4V/IIMs H66nP/DT1kXY7onwK8YXWRA5LeZboRUJkgv8F0Pa6Q0u7YSUTxHqBuQTY+A1DRrlu39N /RjcQZ8nY3vNN2InODfaOJU6BC3lVONjWIBqzhJ17wKXEEJzfE39Wl1CxpHwoA6zq7xt JA0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747316126; x=1747920926; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1B5pkHdPuqQZDbYfrz3XLKt1s6mapVj+8upRwrTiCEE=; b=mcFsud1OoxDW85U+7UmnNAtmVyXttUFgEOkM1xkVCJG9p2n+SLuTaGS6wGENq4cibp RlJF0WbbdYnSKdxKcjqW9Xr8gf0C+tC280sNIIF9KTjbUFVKwgqBoeBxae4YKLOQPHnO HWO9Q8NJV7ple80y/jNsh7MAfb8yqcUKYOJs85QYuPKWlMiUWIriO3TwCIJT8mSzZNKB VZnJETlifmaGPeIujI6BkyYnjyk7ieBcCYcW7C2nvTEgSSOfWs/RcwA7cK3Y9L5jjTZs TOTfTPurQY5PghlwMZOFchyeU/wFMDA+8BwbDQ0+qNgyDRQsby4UmXMwh3+zD3ffj+6L 9Gvg== X-Forwarded-Encrypted: i=1; AJvYcCVU+X9ToJ9HxejjRdWRQm+DmB8F1H//MVmuaRJqh4I9VNs08ZXPtiRFMEOTzcCdSs4R+CDENms/GWw=@vger.kernel.org, AJvYcCXQ8URk8RHFo4BucT0e4AktsX9GzwZvviVZ6wTloW2tKJeFoHNAMg6ZUWG9C7GTh2qFRwEDuIBx1RfwlatB@vger.kernel.org X-Gm-Message-State: AOJu0YybJm5MeXgjxk92/FAwKEhdyw2q6ZMpXJZGHCaA9E+lkSYME/6m scPcjlo4p747mrlb28XsibaUekX08NWMj7W+FcBCgYxvOqmgoqdI X-Gm-Gg: ASbGnctaOEc1XmS2EFOxK6DPOakzPMKq9Dy7xVWBgkdXPNV3bVGWbIdsZWabQzWu2IL K0bpXhqqBz7JhXH41/96MMx1vDowsHTKNAG8Cgw2O0toUKUos5MGP8dhhX2a9fVcF2wygk0Ft/u xWUCp43jCP5D+lnGl2Ey/t7QvyO9E2reO/YmTX0jyzbLNcxGsU9fQlTpR09TOr4d4XC22AAapqY HaQyE4VahDN4abVjMkpUNj14rIZ/1AVlx+XNAfR8ZVk4iy9ZZzG4LeS1vq/CY4mFAjFzLMtWOPe //t5prceOCg8UoWjIPjbejLeaZclneHrITvBNR6SHKMdvRTa X-Google-Smtp-Source: AGHT+IF0cUWwrVvIqOdNp54cd0CJe0sje3pw33UgRF8p5fdCzNA/tB3SELgqsN+q8TFL5kTOchOR1w== X-Received: by 2002:a05:622a:1f0a:b0:494:9e33:6fa with SMTP id d75a77b69052e-494a0e5d5f2mr68876541cf.23.1747316126166; Thu, 15 May 2025 06:35:26 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:7::]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-494524b7184sm91065811cf.33.2025.05.15.06.35.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 06:35:25 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH 3/6] prctl: introduce PR_THP_POLICY_SYSTEM for the process Date: Thu, 15 May 2025 14:33:32 +0100 Message-ID: <20250515133519.2779639-4-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250515133519.2779639-1-usamaarif642@gmail.com> References: <20250515133519.2779639-1-usamaarif642@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This is set via the new PR_SET_THP_POLICY prctl. This will clear both the MMF2_THP_VMA_DEFAULT_NOHUGE and MMF2_THP_VMA_DEFAULT_HUGE process flags which will make the VMA behaviour of the process the same as system. Signed-off-by: Usama Arif --- include/uapi/linux/prctl.h | 1 + kernel/sys.c | 6 ++++++ tools/include/uapi/linux/prctl.h | 1 + tools/perf/trace/beauty/include/uapi/linux/prctl.h | 1 + 4 files changed, 9 insertions(+) diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h index d25458f4db9e..340d5ff769a9 100644 --- a/include/uapi/linux/prctl.h +++ b/include/uapi/linux/prctl.h @@ -368,5 +368,6 @@ struct prctl_mm_map { #define PR_GET_THP_POLICY 79 #define PR_THP_POLICY_DEFAULT_HUGE 0 #define PR_THP_POLICY_DEFAULT_NOHUGE 1 +#define PR_THP_POLICY_SYSTEM 2 =20 #endif /* _LINUX_PRCTL_H */ diff --git a/kernel/sys.c b/kernel/sys.c index d91203e6dd0d..d556cdea97c4 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -2665,6 +2665,8 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, ar= g2, unsigned long, arg3, error =3D PR_THP_POLICY_DEFAULT_HUGE; else if (!!test_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &me->mm->flags2)) error =3D PR_THP_POLICY_DEFAULT_NOHUGE; + else + error =3D PR_THP_POLICY_SYSTEM; break; case PR_SET_THP_POLICY: if (arg3 || arg4 || arg5) @@ -2682,6 +2684,10 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, a= rg2, unsigned long, arg3, set_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &me->mm->flags2); process_vmas_thp_default_nohuge(me->mm); break; + case PR_THP_POLICY_SYSTEM: + clear_bit(MMF2_THP_VMA_DEFAULT_HUGE, &me->mm->flags2); + clear_bit(MMF2_THP_VMA_DEFAULT_NOHUGE, &me->mm->flags2); + break; default: return -EINVAL; } diff --git a/tools/include/uapi/linux/prctl.h b/tools/include/uapi/linux/pr= ctl.h index e03d0ed890c5..cc209c9a8afb 100644 --- a/tools/include/uapi/linux/prctl.h +++ b/tools/include/uapi/linux/prctl.h @@ -332,5 +332,6 @@ struct prctl_mm_map { #define PR_GET_THP_POLICY 79 #define PR_THP_POLICY_DEFAULT_HUGE 0 #define PR_THP_POLICY_DEFAULT_NOHUGE 1 +#define PR_THP_POLICY_SYSTEM 2 =20 #endif /* _LINUX_PRCTL_H */ diff --git a/tools/perf/trace/beauty/include/uapi/linux/prctl.h b/tools/per= f/trace/beauty/include/uapi/linux/prctl.h index d25458f4db9e..340d5ff769a9 100644 --- a/tools/perf/trace/beauty/include/uapi/linux/prctl.h +++ b/tools/perf/trace/beauty/include/uapi/linux/prctl.h @@ -368,5 +368,6 @@ struct prctl_mm_map { #define PR_GET_THP_POLICY 79 #define PR_THP_POLICY_DEFAULT_HUGE 0 #define PR_THP_POLICY_DEFAULT_NOHUGE 1 +#define PR_THP_POLICY_SYSTEM 2 =20 #endif /* _LINUX_PRCTL_H */ --=20 2.47.1 From nobody Fri Dec 19 22:04:08 2025 Received: from mail-qk1-f169.google.com (mail-qk1-f169.google.com [209.85.222.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 84B36146593; Thu, 15 May 2025 13:35:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316141; cv=none; b=Xa8hCY+E6S1fezOGjiLxUgzG1UtoT2yhaeEH2ftPrxC4u+BmBebAJCb3n6xKbxUm/ohOpLtaJHLOhpmP70T1nDFMeY7jVdVSvAGKMkFvQ9kznu6bn0ouI1aa0HVC/tSVet0I662ZapgW5B5EzGRTZD2yfUSds7t4+/v1YVk1VaE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316141; c=relaxed/simple; bh=vaZj73iCxIRDSHGHMuX6ee72qoDLQu34Sg74SmH+rUo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GJuj3bvVuHYVXF//wfRwLnV/85AymC7kAXkLxkK0XG/9LKhzpbcurKTOyi/LwEmVBf0+XOBL2KvB4M3G/hsQZrXeInCFcTTVj5kXJZ0sun0Czdj/Un+VcJKUlROsn0ghdj2yWbwZ679r1w6Op38OGNtEfN3C1v6wThwpH4TzFl0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NeUAT47r; arc=none smtp.client-ip=209.85.222.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NeUAT47r" Received: by mail-qk1-f169.google.com with SMTP id af79cd13be357-7c5c815f8efso82174885a.2; Thu, 15 May 2025 06:35:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747316138; x=1747920938; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wlNG5Htln8HKvc+6gp+8bgvPUce9d9z2JFDhosQneXo=; b=NeUAT47rIAyVOSSSCHsdi4okh02jULmvhEZEia4qLSc9ECGAf0ozLdnPKGUcbEjziX DCOjpk0YP67p/EDBum0jkRqSBMj986AlwXXJKTgdIe4nQaF3w/wh//eOa3W3zTdAF+z3 8cDW9XURFN2IXfap5qXqj4IaNr2kiwRnOQJ2i95N3HNNdO7YNc7WPaP7vipXVUkVRab5 zpxPrsxcCvyq5eh4UoFaAcpyFoMrr9N3B2snw/HAfiExAcbtd3Rweu7I3sFlSyJTR03L SKPNfMnFPmioFkjL2ulgalInEbY/5dqfYnSm7HC3lhqPqxhlH/WvDxneO+ztRzTge0kH XxPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747316138; x=1747920938; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wlNG5Htln8HKvc+6gp+8bgvPUce9d9z2JFDhosQneXo=; b=kt3/1D3Ni1Q/6wLyfNHwgHkz1h1PfiNr8mfSU496OAuzBwKs/HE5wVAZvdN+roYXxF g21hIw2IX2sEagnfDvL47fOdft980HgzrpiQsgXpzvQN6B+CO5dxGcSxLkdAkA1gWDhM 8BW6FXwK9pjI22wTmxAhIM495O9ARRNlre6FbbwuTBW+VkOCb7Z0BrfDIOPa8Fs3TFGp ckTZnR3TK+nmnbSx2b1aNJ3ivMf/GUT0zqPsDKmSQzztA54vin3hrgXivWxQrfd9408u nJmFlAYULb3AyaPG7YiQQabMTuhqCqANqCUBm2EV+bsL0g4per7Cu7jj4eq4s/CZZSrb D5FQ== X-Forwarded-Encrypted: i=1; AJvYcCXVRTPSYpykWZ+HvJB8/CR7uL9xcbv3nL7qSLmw1ae+qVEFPHTpnVkxejBuQpDCOPtqEdOIZxiiAdxZUH3Q@vger.kernel.org, AJvYcCXvj82PfjTKx9YJPJUPfnMJZHfZ7goCI987EoM+0/l1VTV34pQsWW1AeElqSJuklrv71kpL+fJEBHQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywwt8pGUeqj1xprOMnNY2Iksw1eKxhqteVnKByOvBCwEJ4LtH4E GLS4+XFAs7+lJbM47vFpUwA6eBmlG34BznqnnfKJD+4jpnocdum1esUfLmmv X-Gm-Gg: ASbGnctvMkBerUxNwtJV8rVi2lnP1zVdYa1i+vxoZRidQZmtVva87cR8Ss03nKqzR7g 4wi/i1+V1kDb7ThW5NE/rLmnR1lgttG/wGNH3ShoL0y/cmOQicWeAFAu/Bo9v2X2xbCwU9mfEhb rtK2iWhUCwgFaLBFLXpLYX4n8LEA1Q7Y4EfkYt//hqT+yMuUxbIQX4+oYnZLWPlp76S4z0easUh o+Lw0RwuuGeMjlSdBEwdjCkHdlhyWSawJQ0mP9quIM7XuDP94v6vMQFIunVdmgYRIr6PsU8hDht CJED7ammjfN1a020zTNshQyMw82PMCXdFjXnO11mjKzszftg X-Google-Smtp-Source: AGHT+IEn86Vf0zD3MKqHNneuDkpt+TgrRPxRiPuPRhn5N/sfp5gibmt93u4lmV51ja/uctouLfRO6w== X-Received: by 2002:a05:6214:260d:b0:6f5:35fe:6a80 with SMTP id 6a1803df08f44-6f896e3f49emr111367906d6.11.1747316127235; Thu, 15 May 2025 06:35:27 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:3::]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6f8a793fe1fsm5417566d6.108.2025.05.15.06.35.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 06:35:26 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH 4/6] selftests: prctl: introduce tests for PR_THP_POLICY_DEFAULT_NOHUGE Date: Thu, 15 May 2025 14:33:33 +0100 Message-ID: <20250515133519.2779639-5-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250515133519.2779639-1-usamaarif642@gmail.com> References: <20250515133519.2779639-1-usamaarif642@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The test is limited to 2M PMD THPs. It does not modify the system settings in order to not disturb other process running in the system. It checks if the PMD size is 2M, if the 2M policy is set to inherit and if the system global THP policy is set to "always", so that the change in behaviour due to PR_THP_POLICY_DEFAULT_NOHUGE can be seen. This tests if: - the process can successfully set the policy - carry it over to the new process with fork - if no hugepage is gotten when the process doesn't MADV_HUGEPAGE - if hugepage is gotten when the process does MADV_HUGEPAGE - the process can successfully reset the policy to PR_THP_POLICY_SYSTEM - if hugepage is gotten after the policy reset Signed-off-by: Usama Arif --- tools/testing/selftests/prctl/Makefile | 2 +- tools/testing/selftests/prctl/thp_policy.c | 214 +++++++++++++++++++++ 2 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/prctl/thp_policy.c diff --git a/tools/testing/selftests/prctl/Makefile b/tools/testing/selftes= ts/prctl/Makefile index 01dc90fbb509..ee8c98e45b53 100644 --- a/tools/testing/selftests/prctl/Makefile +++ b/tools/testing/selftests/prctl/Makefile @@ -5,7 +5,7 @@ ARCH ?=3D $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s= /x86_64/x86/) =20 ifeq ($(ARCH),x86) TEST_PROGS :=3D disable-tsc-ctxt-sw-stress-test disable-tsc-on-off-stress-= test \ - disable-tsc-test set-anon-vma-name-test set-process-name + disable-tsc-test set-anon-vma-name-test set-process-name thp_policy all: $(TEST_PROGS) =20 include ../lib.mk diff --git a/tools/testing/selftests/prctl/thp_policy.c b/tools/testing/sel= ftests/prctl/thp_policy.c new file mode 100644 index 000000000000..e39872a6d429 --- /dev/null +++ b/tools/testing/selftests/prctl/thp_policy.c @@ -0,0 +1,214 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * This test covers the PR_GET/SET_THP_POLICY functionality of prctl calls + */ +#include +#include +#include +#include +#include +#include +#include + +#ifndef PR_SET_THP_POLICY +#define PR_SET_THP_POLICY 78 +#define PR_GET_THP_POLICY 79 +#define PR_THP_POLICY_DEFAULT_HUGE 0 +#define PR_THP_POLICY_DEFAULT_NOHUGE 1 +#define PR_THP_POLICY_SYSTEM 2 +#endif + +#define CONTENT_SIZE 256 +#define BUF_SIZE (12 * 2 * 1024 * 1024) // 12 x 2MB pages + +enum system_policy { + SYSTEM_POLICY_ALWAYS, + SYSTEM_POLICY_MADVISE, + SYSTEM_POLICY_NEVER, +}; + +int system_thp_policy; + +/* check if the sysfs file contains the expected substring */ +static int check_file_content(const char *file_path, const char *expected_= substring) +{ + FILE *file =3D fopen(file_path, "r"); + char buffer[CONTENT_SIZE]; + + if (!file) { + perror("Failed to open file"); + return -1; + } + if (fgets(buffer, CONTENT_SIZE, file) =3D=3D NULL) { + perror("Failed to read file"); + fclose(file); + return -1; + } + fclose(file); + // Remove newline character from the buffer + buffer[strcspn(buffer, "\n")] =3D '\0'; + if (strstr(buffer, expected_substring)) + return 0; + else + return 1; +} + +/* + * The test is designed for 2M hugepages only. + * Check if hugepage size is 2M, if 2M size inherits from global + * setting, and if the global setting is madvise or always. + */ +static int sysfs_check(void) +{ + int res =3D 0; + + res =3D check_file_content("/sys/kernel/mm/transparent_hugepage/hpage_pmd= _size", "2097152"); + if (res) { + printf("hpage_pmd_size is not set to 2MB. Skipping test.\n"); + return -1; + } + res |=3D check_file_content("/sys/kernel/mm/transparent_hugepage/hugepage= s-2048kB/enabled", + "[inherit]"); + if (res) { + printf("hugepages-2048kB does not inherit global setting. Skipping test.= \n"); + return -1; + } + + res =3D check_file_content("/sys/kernel/mm/transparent_hugepage/enabled",= "[madvise]"); + if (!res) { + system_thp_policy =3D SYSTEM_POLICY_MADVISE; + return 0; + } + res =3D check_file_content("/sys/kernel/mm/transparent_hugepage/enabled",= "[always]"); + if (!res) { + system_thp_policy =3D SYSTEM_POLICY_ALWAYS; + return 0; + } + printf("Global THP policy not set to madvise or always. Skipping test.\n"= ); + return -1; +} + +static int check_smaps_for_huge(void) +{ + FILE *file =3D fopen("/proc/self/smaps", "r"); + int is_anonhuge =3D 0; + char line[256]; + + if (!file) { + perror("fopen"); + return -1; + } + + while (fgets(line, sizeof(line), file)) { + if (strstr(line, "AnonHugePages:") && strstr(line, "24576 kB")) { + is_anonhuge =3D 1; + break; + } + } + fclose(file); + return is_anonhuge; +} + +static int test_mmap_thp(int madvise_buffer) +{ + int is_anonhuge; + + char *buffer =3D (char *)mmap(NULL, BUF_SIZE, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (buffer =3D=3D MAP_FAILED) { + perror("mmap"); + return -1; + } + if (madvise_buffer) + madvise(buffer, BUF_SIZE, MADV_HUGEPAGE); + + // set memory to ensure it's allocated + memset(buffer, 0, BUF_SIZE); + is_anonhuge =3D check_smaps_for_huge(); + munmap(buffer, BUF_SIZE); + return is_anonhuge; +} + +/* Global policy is always, process is changed to NOHUGE (process becomes = madvise) */ +static int test_global_always_process_nohuge(void) +{ + int is_anonhuge =3D 0, res =3D 0, status =3D 0; + pid_t pid; + + if (prctl(PR_SET_THP_POLICY, PR_THP_POLICY_DEFAULT_NOHUGE, NULL, NULL, NU= LL) !=3D 0) { + perror("prctl failed to set policy to madvise"); + return -1; + } + + /* Make sure prctl changes are carried across fork */ + pid =3D fork(); + if (pid < 0) { + perror("fork"); + exit(EXIT_FAILURE); + } + + res =3D prctl(PR_GET_THP_POLICY, NULL, NULL, NULL, NULL); + if (res !=3D PR_THP_POLICY_DEFAULT_NOHUGE) { + printf("prctl PR_GET_THP_POLICY returned %d pid %d\n", res, pid); + goto err_out; + } + + /* global =3D always, process =3D madvise, we shouldn't get HPs without m= advise */ + is_anonhuge =3D test_mmap_thp(0); + if (is_anonhuge) { + printf( + "PR_THP_POLICY_DEFAULT_NOHUGE set but still got hugepages without MADV_H= UGEPAGE\n"); + goto err_out; + } + + is_anonhuge =3D test_mmap_thp(1); + if (!is_anonhuge) { + printf( + "PR_THP_POLICY_DEFAULT_NOHUGE set but did't get hugepages with MADV_HUGE= PAGE\n"); + goto err_out; + } + + /* Reset to system policy */ + if (prctl(PR_SET_THP_POLICY, PR_THP_POLICY_SYSTEM, NULL, NULL, NULL) !=3D= 0) { + perror("prctl failed to set policy to system"); + goto err_out; + } + + is_anonhuge =3D test_mmap_thp(0); + if (!is_anonhuge) { + printf("global policy is always but we still didn't get hugepages\n"); + goto err_out; + } + + is_anonhuge =3D test_mmap_thp(1); + if (!is_anonhuge) { + printf("global policy is always but we still didn't get hugepages\n"); + goto err_out; + } + + if (pid =3D=3D 0) { + exit(EXIT_SUCCESS); + } else { + wait(&status); + if (WIFEXITED(status)) + return 0; + else + return -1; + } + +err_out: + if (pid =3D=3D 0) + exit(EXIT_FAILURE); + else + return -1; +} + +int main(void) +{ + if (sysfs_check()) + return 0; + + if (system_thp_policy =3D=3D SYSTEM_POLICY_ALWAYS) + return test_global_always_process_nohuge(); + +} --=20 2.47.1 From nobody Fri Dec 19 22:04:08 2025 Received: from mail-qt1-f180.google.com (mail-qt1-f180.google.com [209.85.160.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9134F19D8A2; Thu, 15 May 2025 13:35:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316131; cv=none; b=sMQts+QIcXcEePC7M1DUPq+oa+u27x/poieNWgZBSZxK44h/bhOi0hEA35ezDqzwdmPH59XBVvUnFNYI8E9pdTAjaMkjPzBvms179lLGhDm5jfoMJqp28u3HuhJ7QE3jN46c03fEx84L56+8iBQe22oM1ph4zx8XxKJNvXNuI4A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316131; c=relaxed/simple; bh=hGGuJghPcdb6HZzVWly862+7+gPR+zLj1lYd2lXjcq0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=P1+iOxDg8U6W9r5ZKhawb+p1kcDQ/kd09mmtGbFQLWTIGRjtTCF5IKyPW/jCLjq6oInrcQ0XrdExFQW0dPCGpTxXZKmm3F987ItNssl7qC2DxPYqaG9rPqlDauiA9+x18AiwV8AE5Hj9tPN5P25uV64WF1fiF+9n6KZcXcfBBU0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LSB21ncE; arc=none smtp.client-ip=209.85.160.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LSB21ncE" Received: by mail-qt1-f180.google.com with SMTP id d75a77b69052e-4769aef457bso11905671cf.2; Thu, 15 May 2025 06:35:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747316128; x=1747920928; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CtvBBE4lYcv74+ivoM7qVOvxBm5IPUDZF94M62uE0Ws=; b=LSB21ncEoA1Y4S/xV3877x5D1o14lRtmtgPWKH0SszGuUWaqSucEu7w01nGEuALOgp CdSmpPQdiGzKmuxuSm1hqznQTm9vE1aG/8I+Hyj3DZ+LfgqDCne3e66LMSjrXoXtjlkM KBTd/OOthowWVqVCynafqnN4mq00dFdkBIeo8LwWcruaerqJvfidLHUJ4xANJQMKH2ah yqQ753jZzvweSeTGlX6KKqKO0XW7zEyBd5Ei5FnFxuX7YqDIBIzuu0dM1nbO1o5IJov9 5nGQL8vUUeSqyYknKhh0rexuV2aHNpgqgytgt6D1ouHEw2GDqe1jWT5IYAgVlvv0z1d8 OucQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747316128; x=1747920928; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CtvBBE4lYcv74+ivoM7qVOvxBm5IPUDZF94M62uE0Ws=; b=OwNvy27x8L9Sh/prNkophgB2uMo7r17z+VrAbj4e8toknt/0K6u9a3mZ4+U6BwmRLx nPdvQ5095pECFDio7UpVcTGyg5jNe023RCcqg4tMbBYJwRBUdbkNS1PrjFjUVVpghedp RveYDmRGaAWohQkA0f88Nyx+O2hoylug9Ov+xybA4lMOEib5ZlTXEemL0CXZ0c6bauFx MjEYEwlfoEUXPMVUlwhP9l+RZFsa3h5uxQyYNWGBne2Qj2yoxKAdmGhjgG1JPkfwJA4l 8xflNUmIoemv/x+7/mocrCZNamhA9h6oLH0g3xXWTTdYorDwFHfaIVXhOTZZMZdpweub BcSQ== X-Forwarded-Encrypted: i=1; AJvYcCUuc6MwIamiMYOYOjU66GnHlcYSaUEIeycTV9Vh3l83/lTdf6QVJsz4LOqzJO8lbd2JFIazbANlWlk=@vger.kernel.org, AJvYcCXGAqH6Ru0QVMM88ryI6ufGg3MmvQvqF/kXoULyaOgwBX0DzOppeoxX3MFYSjhGPy3FImjMVy7UJHDMXl1T@vger.kernel.org X-Gm-Message-State: AOJu0Ywuc2cB7iDo7FVvAI7PjcIBXYD5iUHuxEbfwFulW1eH5dRBdaLJ W7m/4tzLUW7m/Zr9kbNpW2wmNEfjWeKzNIcoYJ/6nxituMhU1M01 X-Gm-Gg: ASbGncvvw47JCEllwcrlgkhcRIeBPjw58tYxH+MbSq3T4xmnn0fOTvHTXp2B6RhZxK/ CyG7hDWLYSLGJYEjmiX+Cj8fMo26mx3kjVU7BQKQFaV0wA55iPl/HSgeTPQ/yi4gA4b3zlcdqlj ZqqFYRG8l8d10ch/DubzRt7XlLQgp6EIQ48kIo9Nm2Yab7de9/Epagp7UpkP9q3w5EbHhMzpdD8 i7N2F3VV9Z7Qkm9zxQ8kVc/VHwqfOwrpHxgGydgE9pi2MjpZxJ9dgZrdd3COR9m4G7WnTGHiUTR sg+gov+dJF+OxKAO1jWAl0x09UrYQsKK7ls+rrDIBpA48RH6DQ== X-Google-Smtp-Source: AGHT+IGpjYwWV/atpzk9s+akSVbxFw4jbJE0V5Wxe+VGDRYZR+hyAhZAfK6FVTg+z4k/TOeXDtcybw== X-Received: by 2002:a05:622a:1f9a:b0:48a:582a:64de with SMTP id d75a77b69052e-49495c61e14mr104644551cf.7.1747316128395; Thu, 15 May 2025 06:35:28 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:72::]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-4945248964dsm92002391cf.21.2025.05.15.06.35.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 06:35:28 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH 5/6] selftests: prctl: introduce tests for PR_THP_POLICY_DEFAULT_HUGE Date: Thu, 15 May 2025 14:33:34 +0100 Message-ID: <20250515133519.2779639-6-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250515133519.2779639-1-usamaarif642@gmail.com> References: <20250515133519.2779639-1-usamaarif642@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The test is limited to 2M PMD THPs. It does not modify the system settings in order to not disturb other process running in the system. It runs if the PMD size is 2M, if the 2M policy is set to inherit and if the system global THP policy is set to "madvise", so that the change in behaviour due to PR_THP_POLICY_DEFAULT_HUGE can be seen. This tests if: - the process can successfully set the policy - carry it over to the new process with fork - if hugepage is gotten both with and without madvise - the process can successfully reset the policy to PR_THP_POLICY_SYSTEM - if hugepage is gotten after the policy reset only with MADV_HUGEPAGE Signed-off-by: Usama Arif --- tools/testing/selftests/prctl/thp_policy.c | 74 +++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/prctl/thp_policy.c b/tools/testing/sel= ftests/prctl/thp_policy.c index e39872a6d429..65c87f99423e 100644 --- a/tools/testing/selftests/prctl/thp_policy.c +++ b/tools/testing/selftests/prctl/thp_policy.c @@ -203,6 +203,77 @@ static int test_global_always_process_nohuge(void) return -1; } =20 +/* Global policy is madvise, process is changed to HUGE (process becomes a= lways) */ +static int test_global_madvise_process_huge(void) +{ + int is_anonhuge =3D 0, res =3D 0, status =3D 0; + pid_t pid; + + if (prctl(PR_SET_THP_POLICY, PR_THP_POLICY_DEFAULT_HUGE, NULL, NULL, NULL= ) !=3D 0) { + perror("prctl failed to set process policy to always"); + return -1; + } + + /* Make sure prctl changes are carried across fork */ + pid =3D fork(); + if (pid < 0) { + perror("fork"); + exit(EXIT_FAILURE); + } + + res =3D prctl(PR_GET_THP_POLICY, NULL, NULL, NULL, NULL); + if (res !=3D PR_THP_POLICY_DEFAULT_HUGE) { + printf("prctl PR_GET_THP_POLICY returned %d pid %d\n", res, pid); + goto err_out; + } + + /* global =3D madvise, process =3D always, we should get HPs irrespective= of MADV_HUGEPAGE */ + is_anonhuge =3D test_mmap_thp(0); + if (!is_anonhuge) { + printf("PR_THP_POLICY_DEFAULT_HUGE set but didn't get hugepages\n"); + goto err_out; + } + + is_anonhuge =3D test_mmap_thp(1); + if (!is_anonhuge) { + printf("PR_THP_POLICY_DEFAULT_HUGE set but did't get hugepages\n"); + goto err_out; + } + + /* Reset to system policy */ + if (prctl(PR_SET_THP_POLICY, PR_THP_POLICY_SYSTEM, NULL, NULL, NULL) !=3D= 0) { + perror("prctl failed to set policy to system"); + goto err_out; + } + + is_anonhuge =3D test_mmap_thp(0); + if (is_anonhuge) { + printf("global policy is madvise\n"); + goto err_out; + } + + is_anonhuge =3D test_mmap_thp(1); + if (!is_anonhuge) { + printf("global policy is madvise\n"); + goto err_out; + } + + if (pid =3D=3D 0) { + exit(EXIT_SUCCESS); + } else { + wait(&status); + if (WIFEXITED(status)) + return 0; + else + return -1; + } +err_out: + if (pid =3D=3D 0) + exit(EXIT_FAILURE); + else + return -1; +} + int main(void) { if (sysfs_check()) @@ -210,5 +281,6 @@ int main(void) =20 if (system_thp_policy =3D=3D SYSTEM_POLICY_ALWAYS) return test_global_always_process_nohuge(); - + else + return test_global_madvise_process_huge(); } --=20 2.47.1 From nobody Fri Dec 19 22:04:08 2025 Received: from mail-qv1-f45.google.com (mail-qv1-f45.google.com [209.85.219.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DBF7F1B4242; Thu, 15 May 2025 13:35:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316132; cv=none; b=AVS5vVegMkSLhS0La+44yRgdeH8UuGKaqUsJdgSHGGY9Drh6L02ceuDYPT3tam2KbshABwk+QTa3S5XphLmlXepFmi2CNLH7xCSWHuhvDFehSeW+QJgMDGRQms0l7LnPZa/bnYVFjfEuiUaKXeVeC3rIy+mpldW2Caq3sA4MQmQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747316132; c=relaxed/simple; bh=hwVlnGZQYkECbvfB4rywfx6b8pemiTmtlgySiUS51ak=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UDqSpNlurfwfPdAfLWNZTr9jrz/axuBNJYyDO3nMHq9nRcQullbwZaU57l5MLn92xADIfvbRvklNArH1LD0KFJeF25+wzZULDnRNj7wkBy07subzKvBaoo6hnUwrmu5iOjI9dGGNgfirGMGmJWrZ6oBySqgeKJ2/DsqAtgFLH0c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QXq+qeeW; arc=none smtp.client-ip=209.85.219.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QXq+qeeW" Received: by mail-qv1-f45.google.com with SMTP id 6a1803df08f44-6f0cfbe2042so11500156d6.1; Thu, 15 May 2025 06:35:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747316130; x=1747920930; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gfI/h6yR5T+QGKNn50rKBkNsg03eRR3EOmEc3H6+img=; b=QXq+qeeWKEzFIl+RoO+7yrj84lNFsbctZTFn/NxkDP4HjUBsdSQjFHqwmQn7+ZozF5 560/HkqxSYfO9QGkwI6oFD9JXkVxoOZQd4fA7NIEBsbDPSPsX8kV7D335ndObIGN+8Xk JlmePpx86Hdx5un35sH4I4ZjBk9TOMUOrrTve0FwCVq7ktVNfDJaFPZkbHVwul5EOZxZ fciCjc8/7SEr+heg8xRu0HIbVUfFQyrEvbigFXesBh8Vmr0FT1nvwlRXlZhr1/q/nZiY ls1mAOGcVr62s8H+1zdD2kWD9ifThPovXvFV170IqyanKOMg5ECeIoL0BqsaT1UMpS+x 2GXA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747316130; x=1747920930; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gfI/h6yR5T+QGKNn50rKBkNsg03eRR3EOmEc3H6+img=; b=CVwoipJEq0B5mMZqcM11HJ67ZJCB5wPzg7HtMSoxZCMT7pHvrrb3uiStU1fSb7wkWi INB+aS/445+FiV6KrOKyu9hM38iLG3P7EfzHjmK9eMqvwzywoZ1KYTPE39KJ1YwSjXM+ HU5mtqe1JfPC57O3ZPObF+qk0/01kSKqMCArFDJcVe1ij4AFLUcTpiH7zqb7D7qKhkvk yiJ+QJhQn2NxxP+qldP0++ayL7ZclGL8ioMwQGA3rU9t2bK1HIl6wbaHm86jD8njFkQM KkwbA2u1NF3XFsS2jb6E7iA4nvt0F7IonrQl0Dlpa94im0vfcmNwrOb8y5dt+U0lEaYp UtdQ== X-Forwarded-Encrypted: i=1; AJvYcCUR3no5uyd0fFT5wPMgcfZ+i7ClwOtBewau2r0bLPL0Z74xfXlWXMzl/GpzHwZPf++ygPuQrLR92+o=@vger.kernel.org, AJvYcCVvs05QF2Ru31yTX8ifuxwxYUQPknwpUpOdpG8GXTkwYjQbA5wK97dtYh+LCuE3cab8wzqzgQIaS9zQWAKm@vger.kernel.org X-Gm-Message-State: AOJu0YyoTKT7+z9ftKV1RK3AwX47nS1QB04JRKX6yQTBq6USgu0nPvcz WArJKEmEKJvuHt6UeIWH8QJGlJ90fOJsl3BPaGWVer+BC4CY1W9M X-Gm-Gg: ASbGncsFuoCVs8S6Y1kLcg4iexntUNdkMBqKp3ycVoQbw+ThHIVk7iAhTeLUDNJtHUT hKzv6bc8G9+6ttM3lC8lp0ysqce5GULxnZMuqQEiWo06JoydlGmVYhuRdUEhd2w5LMNKCT4BywV zUHjY7RwBqTi7zAaBUDzV6A1ZXExhM8tzkJQuRL+fW+ppIzQzJVHNnK5F4U9yVreDhkHT3n3uyI j9qi4/jpD9uZPDIDqZ6LyuISwPA5GA1ydJ7Mr9Mtu5twP3AJONR7aEzny4TgZKgNWau/AHrAkm6 2+1202JfN44tiuEMd+oVqVdIunOoJ35cPi99laQ/txgR5V0cUA== X-Google-Smtp-Source: AGHT+IFhtYFW+nSu82qMrHlJwUBAof/mWqJdiShQs0Id8daZt5/yurPzdh8is1ilm1548tQsdICvuw== X-Received: by 2002:ad4:5c68:0:b0:6f5:372f:1c5b with SMTP id 6a1803df08f44-6f8a31cba87mr49659226d6.11.1747316129425; Thu, 15 May 2025 06:35:29 -0700 (PDT) Received: from localhost ([2a03:2880:20ff:41::]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6f6eb98e5f8sm75823886d6.45.2025.05.15.06.35.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 May 2025 06:35:29 -0700 (PDT) From: Usama Arif To: Andrew Morton , david@redhat.com, linux-mm@kvack.org Cc: hannes@cmpxchg.org, shakeel.butt@linux.dev, riel@surriel.com, ziy@nvidia.com, laoar.shao@gmail.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, kernel-team@meta.com, Usama Arif Subject: [PATCH 6/6] docs: transhuge: document process level THP controls Date: Thu, 15 May 2025 14:33:35 +0100 Message-ID: <20250515133519.2779639-7-usamaarif642@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250515133519.2779639-1-usamaarif642@gmail.com> References: <20250515133519.2779639-1-usamaarif642@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This includes the already existing PR_GET/SET_THP_DISABLE policy, as well as the newly introduced PR_GET/SET_THP_POLICY. Signed-off-by: Usama Arif --- Documentation/admin-guide/mm/transhuge.rst | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/Documentation/admin-guide/mm/transhuge.rst b/Documentation/adm= in-guide/mm/transhuge.rst index dff8d5985f0f..cf3092eb239a 100644 --- a/Documentation/admin-guide/mm/transhuge.rst +++ b/Documentation/admin-guide/mm/transhuge.rst @@ -218,6 +218,46 @@ to "always" or "madvise"), and it'll be automatically = shutdown when PMD-sized THP is disabled (when both the per-size anon control and the top-level control are "never") =20 +process THP controls +-------------------- + +Transparent Hugepage behaviour of a process can be modified/obtained by +using the prctl system call. The following operations are supported: + +PR_SET_THP_DISABLE + This will set the MMF_DISABLE_THP process flag which will result + in no hugepages being faulted in or collapsed by khugepaged, + irrespective of global THP controls. + +PR_GET_THP_DISABLE + This will return the MMF_DISABLE_THP process flag, which will be + set if the process has previously been set with PR_SET_THP_DISABLE. + +PR_SET_THP_POLICY + This is used to change the behaviour of existing and future VMAs. + It has support for the following policies: + + PR_THP_POLICY_DEFAULT_HUGE + This will set the MMF2_THP_VMA_DEFAULT_HUGE process flag which + changes the default of new VMAs to be VM_HUGEPAGE. The call + also modifies all existing VMAs that are not VM_NOHUGEPAGE + to be VM_HUGEPAGE. The policy is inherited during fork+exec. + + PR_THP_POLICY_DEFAULT_NOHUGE + This will set the MMF2_THP_VMA_DEFAULT_NOHUGE process flag which + changes the default of new VMAs to be VM_NOHUGEPAGE. The call + also modifies all existing VMAs that are not VM_HUGEPAGE + to be VM_NOHUGEPAGE. The policy is inherited during fork+exec. + + PR_THP_POLICY_DEFAULT_SYSTEM + This will clear both MMF2_THP_VMA_DEFAULT_HUGE and + MMF2_THP_VMA_DEFAULT_NOHUGE process flags. + +PR_SET_THP_POLICY + This will return the current THP policy of the process, i.e. + PR_THP_POLICY_DEFAULT_HUGE, PR_THP_POLICY_DEFAULT_NOHUGE or + PR_THP_POLICY_DEFAULT_SYSTEM. + Khugepaged controls ------------------- =20 --=20 2.47.1