Signed-off-by: Lorenzo Stoakes <ljs@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
- mm/hugetlb.c | 57 ++++++++++++++++++++++++++++++++++------------------
+ mm/hugetlb.c | 57 +++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 37 insertions(+), 20 deletions(-)
-diff --git a/mm/hugetlb.c b/mm/hugetlb.c
-index 0f0b9483df6328..75ab83bfec9379 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
-@@ -86,6 +86,9 @@ static int hugetlb_acct_memory(struct hstate *h, long delta);
+@@ -86,6 +86,9 @@ static int hugetlb_acct_memory(struct hs
static void hugetlb_vma_lock_free(struct vm_area_struct *vma);
static void hugetlb_vma_lock_alloc(struct vm_area_struct *vma);
static void __hugetlb_vma_unlock_write_free(struct vm_area_struct *vma);
static void hugetlb_unshare_pmds(struct vm_area_struct *vma,
unsigned long start, unsigned long end, bool take_locks);
static struct resv_map *vma_resv_map(struct vm_area_struct *vma);
-@@ -7225,6 +7228,31 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -7225,6 +7228,31 @@ out:
return pte;
}
/**
* huge_pmd_unshare - Unmap a pmd table if it is shared by multiple users
* @tlb: the current mmu_gather.
-@@ -7244,25 +7272,7 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -7244,25 +7272,7 @@ out:
int huge_pmd_unshare(struct mmu_gather *tlb, struct vm_area_struct *vma,
unsigned long addr, pte_t *ptep)
{
}
/*
-@@ -7296,6 +7306,13 @@ pte_t *huge_pmd_share(struct mm_struct *mm, struct vm_area_struct *vma,
+@@ -7296,6 +7306,13 @@ pte_t *huge_pmd_share(struct mm_struct *
return NULL;
}
int huge_pmd_unshare(struct mmu_gather *tlb, struct vm_area_struct *vma,
unsigned long addr, pte_t *ptep)
{
-@@ -7566,7 +7583,7 @@ static void hugetlb_unshare_pmds(struct vm_area_struct *vma,
+@@ -7555,7 +7572,7 @@ static void hugetlb_unshare_pmds(struct
if (!ptep)
continue;
ptl = huge_pte_lock(h, mm, ptep);
spin_unlock(ptl);
}
huge_pmd_unshare_flush(&tlb, vma);
---
-2.53.0
-
+++ /dev/null
-From 3f543974aae8ef708c658233a113e6a721d18d34 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 15 Jun 2026 13:37:30 -0400
-Subject: sched_ext: Don't warn on NULL cgrp_moving_from in
- scx_cgroup_move_task()
-
-From: Tejun Heo <tj@kernel.org>
-
-[ Upstream commit 02e545c4297a26dbbc41df81b831e7f605bcd306 ]
-
-A WARN fires when systemd's user manager writes "+cpu +memory +pids" to
-its own subtree_control while a sched_ext scheduler is loaded:
-
- WARNING: at kernel/sched/ext.c:3227 scx_cgroup_move_task+0xa8/0xb0
- scx_cgroup_move_task+0xa8/0xb0
- sched_move_task+0x134/0x290
- cpu_cgroup_attach+0x39/0x70
- cgroup_migrate_execute+0x37d/0x450
- cgroup_update_dfl_csses+0x1e3/0x270
- cgroup_subtree_control_write+0x3e7/0x440
-
-scx_cgroup_can_attach() arms cgrp_moving_from only when a task's cpu
-cgroup changes. It can still be NULL when scx_cgroup_move_task() runs,
-through this sequence:
-
- Step Result
- --------------------------------- ----------------------------------
- 1. cpu enabled on cgroup G cpu css = A
- 2. cpu toggled off then on for G A killed, B created (same cgroup)
- 3. an exiting task keeps A alive migration skips it, A now stale
- 4. +memory migrates G stale A vs current B pulls cpu in
- 5. cpu attach runs for all tasks hits a live, cpu-unchanged task
- 6. scx_cgroup_move_task() on it cgrp_moving_from NULL -> WARN
-
-The mismatch is that scx_cgroup_can_attach() keys on cgroup identity
-while migration drives the move on css identity, so a NULL cgrp_moving_from
-here is a legitimate css-only migration, not a missing prep.
-
-The call is already gated on cgrp_moving_from, so just drop the warning.
-ops.cgroup_prep_move() and ops.cgroup_move() stay paired.
-
-Fixes: 819513666966 ("sched_ext: Add cgroup support")
-Cc: stable@vger.kernel.org # v6.12+
-Reported-by: Matt Fleming <mfleming@cloudflare.com>
-Closes: https://lore.kernel.org/all/20260601124156.2205704-1-mfleming@cloudflare.com/
-Signed-off-by: Tejun Heo <tj@kernel.org>
-Reviewed-by: Andrea Righi <arighi@nvidia.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- kernel/sched/ext.c | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
-diff --git a/kernel/sched/ext.c b/kernel/sched/ext.c
-index 01dc2a613868fc..428cde37130dfc 100644
---- a/kernel/sched/ext.c
-+++ b/kernel/sched/ext.c
-@@ -4069,10 +4069,13 @@ void scx_cgroup_move_task(struct task_struct *p)
- return;
-
- /*
-- * @p must have ops.cgroup_prep_move() called on it and thus
-- * cgrp_moving_from set.
-+ * scx_cgroup_can_attach() sets cgrp_moving_from only when the task's
-+ * cgroup changes. Migration keys off css rather than cgroup identity,
-+ * so it can hand an unchanged-cgroup task here with cgrp_moving_from
-+ * NULL. Nothing to report to the BPF scheduler then, so skip it and
-+ * keep prep_move and move paired.
- */
-- if (SCX_HAS_OP(cgroup_move) && !WARN_ON_ONCE(!p->scx.cgrp_moving_from))
-+ if (SCX_HAS_OP(cgroup_move) && p->scx.cgrp_moving_from)
- SCX_CALL_OP_TASK(SCX_KF_UNLOCKED, cgroup_move, p,
- p->scx.cgrp_moving_from, tg_cgrp(task_group(p)));
- p->scx.cgrp_moving_from = NULL;
---
-2.53.0
-