122851890Sopenharmony_cidiff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
222851890Sopenharmony_ciindex 209e6567c..d47c0212e 100644
322851890Sopenharmony_ci--- a/kernel/bpf/syscall.c
422851890Sopenharmony_ci+++ b/kernel/bpf/syscall.c
522851890Sopenharmony_ci@@ -128,21 +128,6 @@ static struct bpf_map *find_and_alloc_map(union bpf_attr *attr)
622851890Sopenharmony_ci 	return map;
722851890Sopenharmony_ci }
822851890Sopenharmony_ci 
922851890Sopenharmony_ci-static void bpf_map_write_active_inc(struct bpf_map *map)
1022851890Sopenharmony_ci-{
1122851890Sopenharmony_ci-	atomic64_inc(&map->writecnt);
1222851890Sopenharmony_ci-}
1322851890Sopenharmony_ci-
1422851890Sopenharmony_ci-static void bpf_map_write_active_dec(struct bpf_map *map)
1522851890Sopenharmony_ci-{
1622851890Sopenharmony_ci-	atomic64_dec(&map->writecnt);
1722851890Sopenharmony_ci-}
1822851890Sopenharmony_ci-
1922851890Sopenharmony_ci-bool bpf_map_write_active(const struct bpf_map *map)
2022851890Sopenharmony_ci-{
2122851890Sopenharmony_ci-	return atomic64_read(&map->writecnt) != 0;
2222851890Sopenharmony_ci-}
2322851890Sopenharmony_ci-
2422851890Sopenharmony_ci static u32 bpf_map_value_size(struct bpf_map *map)
2522851890Sopenharmony_ci {
2622851890Sopenharmony_ci 	if (map->map_type == BPF_MAP_TYPE_PERCPU_HASH ||
2722851890Sopenharmony_ci@@ -604,8 +589,11 @@ static void bpf_map_mmap_open(struct vm_area_struct *vma)
2822851890Sopenharmony_ci {
2922851890Sopenharmony_ci 	struct bpf_map *map = vma->vm_file->private_data;
3022851890Sopenharmony_ci 
3122851890Sopenharmony_ci-	if (vma->vm_flags & VM_MAYWRITE)
3222851890Sopenharmony_ci-		bpf_map_write_active_inc(map);
3322851890Sopenharmony_ci+	if (vma->vm_flags & VM_MAYWRITE) {
3422851890Sopenharmony_ci+		mutex_lock(&map->freeze_mutex);
3522851890Sopenharmony_ci+		map->writecnt++;
3622851890Sopenharmony_ci+		mutex_unlock(&map->freeze_mutex);
3722851890Sopenharmony_ci+	}
3822851890Sopenharmony_ci }
3922851890Sopenharmony_ci 
4022851890Sopenharmony_ci /* called for all unmapped memory region (including initial) */
4122851890Sopenharmony_ci@@ -613,8 +601,11 @@ static void bpf_map_mmap_close(struct vm_area_struct *vma)
4222851890Sopenharmony_ci {
4322851890Sopenharmony_ci 	struct bpf_map *map = vma->vm_file->private_data;
4422851890Sopenharmony_ci 
4522851890Sopenharmony_ci-	if (vma->vm_flags & VM_MAYWRITE)
4622851890Sopenharmony_ci-		bpf_map_write_active_dec(map);
4722851890Sopenharmony_ci+	if (vma->vm_flags & VM_MAYWRITE) {
4822851890Sopenharmony_ci+		mutex_lock(&map->freeze_mutex);
4922851890Sopenharmony_ci+		map->writecnt--;
5022851890Sopenharmony_ci+		mutex_unlock(&map->freeze_mutex);
5122851890Sopenharmony_ci+	}
5222851890Sopenharmony_ci }
5322851890Sopenharmony_ci 
5422851890Sopenharmony_ci static const struct vm_operations_struct bpf_map_default_vmops = {
5522851890Sopenharmony_ci@@ -664,7 +655,7 @@ static int bpf_map_mmap(struct file *filp, struct vm_area_struct *vma)
5622851890Sopenharmony_ci 		goto out;
5722851890Sopenharmony_ci 
5822851890Sopenharmony_ci 	if (vma->vm_flags & VM_MAYWRITE)
5922851890Sopenharmony_ci-		bpf_map_write_active_inc(map);
6022851890Sopenharmony_ci+		map->writecnt++;
6122851890Sopenharmony_ci out:
6222851890Sopenharmony_ci 	mutex_unlock(&map->freeze_mutex);
6322851890Sopenharmony_ci 	return err;
6422851890Sopenharmony_ci@@ -1096,7 +1087,6 @@ static int map_update_elem(union bpf_attr *attr)
6522851890Sopenharmony_ci 	map = __bpf_map_get(f);
6622851890Sopenharmony_ci 	if (IS_ERR(map))
6722851890Sopenharmony_ci 		return PTR_ERR(map);
6822851890Sopenharmony_ci-	bpf_map_write_active_inc(map);
6922851890Sopenharmony_ci 	if (!(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
7022851890Sopenharmony_ci 		err = -EPERM;
7122851890Sopenharmony_ci 		goto err_put;
7222851890Sopenharmony_ci@@ -1138,7 +1128,6 @@ static int map_update_elem(union bpf_attr *attr)
7322851890Sopenharmony_ci free_key:
7422851890Sopenharmony_ci 	kfree(key);
7522851890Sopenharmony_ci err_put:
7622851890Sopenharmony_ci-	bpf_map_write_active_dec(map);
7722851890Sopenharmony_ci 	fdput(f);
7822851890Sopenharmony_ci 	return err;
7922851890Sopenharmony_ci }
8022851890Sopenharmony_ci@@ -1161,7 +1150,6 @@ static int map_delete_elem(union bpf_attr *attr)
8122851890Sopenharmony_ci 	map = __bpf_map_get(f);
8222851890Sopenharmony_ci 	if (IS_ERR(map))
8322851890Sopenharmony_ci 		return PTR_ERR(map);
8422851890Sopenharmony_ci-	bpf_map_write_active_inc(map);
8522851890Sopenharmony_ci 	if (!(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
8622851890Sopenharmony_ci 		err = -EPERM;
8722851890Sopenharmony_ci 		goto err_put;
8822851890Sopenharmony_ci@@ -1192,7 +1180,6 @@ static int map_delete_elem(union bpf_attr *attr)
8922851890Sopenharmony_ci out:
9022851890Sopenharmony_ci 	kfree(key);
9122851890Sopenharmony_ci err_put:
9222851890Sopenharmony_ci-	bpf_map_write_active_dec(map);
9322851890Sopenharmony_ci 	fdput(f);
9422851890Sopenharmony_ci 	return err;
9522851890Sopenharmony_ci }
9622851890Sopenharmony_ci@@ -1497,7 +1484,6 @@ static int map_lookup_and_delete_elem(union bpf_attr *attr)
9722851890Sopenharmony_ci 	map = __bpf_map_get(f);
9822851890Sopenharmony_ci 	if (IS_ERR(map))
9922851890Sopenharmony_ci 		return PTR_ERR(map);
10022851890Sopenharmony_ci-	bpf_map_write_active_inc(map);
10122851890Sopenharmony_ci 	if (!(map_get_sys_perms(map, f) & FMODE_CAN_READ) ||
10222851890Sopenharmony_ci 	    !(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
10322851890Sopenharmony_ci 		err = -EPERM;
10422851890Sopenharmony_ci@@ -1539,7 +1525,6 @@ static int map_lookup_and_delete_elem(union bpf_attr *attr)
10522851890Sopenharmony_ci free_key:
10622851890Sopenharmony_ci 	kfree(key);
10722851890Sopenharmony_ci err_put:
10822851890Sopenharmony_ci-	bpf_map_write_active_dec(map);
10922851890Sopenharmony_ci 	fdput(f);
11022851890Sopenharmony_ci 	return err;
11122851890Sopenharmony_ci }
11222851890Sopenharmony_ci@@ -1566,7 +1551,8 @@ static int map_freeze(const union bpf_attr *attr)
11322851890Sopenharmony_ci 	}
11422851890Sopenharmony_ci 
11522851890Sopenharmony_ci 	mutex_lock(&map->freeze_mutex);
11622851890Sopenharmony_ci-	if (bpf_map_write_active(map)) {
11722851890Sopenharmony_ci+
11822851890Sopenharmony_ci+	if (map->writecnt) {
11922851890Sopenharmony_ci 		err = -EBUSY;
12022851890Sopenharmony_ci 		goto err_put;
12122851890Sopenharmony_ci 	}
12222851890Sopenharmony_ci@@ -3991,9 +3977,6 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
12322851890Sopenharmony_ci 			    union bpf_attr __user *uattr,
12422851890Sopenharmony_ci 			    int cmd)
12522851890Sopenharmony_ci {
12622851890Sopenharmony_ci-	bool has_read  = cmd == BPF_MAP_LOOKUP_BATCH ||
12722851890Sopenharmony_ci-			 cmd == BPF_MAP_LOOKUP_AND_DELETE_BATCH;
12822851890Sopenharmony_ci-	bool has_write = cmd != BPF_MAP_LOOKUP_BATCH;
12922851890Sopenharmony_ci 	struct bpf_map *map;
13022851890Sopenharmony_ci 	int err, ufd;
13122851890Sopenharmony_ci 	struct fd f;
13222851890Sopenharmony_ci@@ -4006,13 +3989,16 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
13322851890Sopenharmony_ci 	map = __bpf_map_get(f);
13422851890Sopenharmony_ci 	if (IS_ERR(map))
13522851890Sopenharmony_ci 		return PTR_ERR(map);
13622851890Sopenharmony_ci-	if (has_write)
13722851890Sopenharmony_ci-		bpf_map_write_active_inc(map);
13822851890Sopenharmony_ci-	if (has_read && !(map_get_sys_perms(map, f) & FMODE_CAN_READ)) {
13922851890Sopenharmony_ci+
14022851890Sopenharmony_ci+	if ((cmd == BPF_MAP_LOOKUP_BATCH ||
14122851890Sopenharmony_ci+	     cmd == BPF_MAP_LOOKUP_AND_DELETE_BATCH) &&
14222851890Sopenharmony_ci+	    !(map_get_sys_perms(map, f) & FMODE_CAN_READ)) {
14322851890Sopenharmony_ci 		err = -EPERM;
14422851890Sopenharmony_ci 		goto err_put;
14522851890Sopenharmony_ci 	}
14622851890Sopenharmony_ci-	if (has_write && !(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
14722851890Sopenharmony_ci+
14822851890Sopenharmony_ci+	if (cmd != BPF_MAP_LOOKUP_BATCH &&
14922851890Sopenharmony_ci+	    !(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
15022851890Sopenharmony_ci 		err = -EPERM;
15122851890Sopenharmony_ci 		goto err_put;
15222851890Sopenharmony_ci 	}
15322851890Sopenharmony_ci@@ -4025,9 +4011,8 @@ static int bpf_map_do_batch(const union bpf_attr *attr,
15422851890Sopenharmony_ci 		BPF_DO_BATCH(map->ops->map_update_batch);
15522851890Sopenharmony_ci 	else
15622851890Sopenharmony_ci 		BPF_DO_BATCH(map->ops->map_delete_batch);
15722851890Sopenharmony_ci+
15822851890Sopenharmony_ci err_put:
15922851890Sopenharmony_ci-	if (has_write)
16022851890Sopenharmony_ci-		bpf_map_write_active_dec(map);
16122851890Sopenharmony_ci 	fdput(f);
16222851890Sopenharmony_ci 	return err;
16322851890Sopenharmony_ci }
16422851890Sopenharmony_cidiff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
16522851890Sopenharmony_ciindex 8de769745..3e854b91f 100644
16622851890Sopenharmony_ci--- a/kernel/bpf/verifier.c
16722851890Sopenharmony_ci+++ b/kernel/bpf/verifier.c
16822851890Sopenharmony_ci@@ -3492,22 +3492,7 @@ static void coerce_reg_to_size(struct bpf_reg_state *reg, int size)
16922851890Sopenharmony_ci 
17022851890Sopenharmony_ci static bool bpf_map_is_rdonly(const struct bpf_map *map)
17122851890Sopenharmony_ci {
17222851890Sopenharmony_ci-	/* A map is considered read-only if the following condition are true:
17322851890Sopenharmony_ci-	 *
17422851890Sopenharmony_ci-	 * 1) BPF program side cannot change any of the map content. The
17522851890Sopenharmony_ci-	 *    BPF_F_RDONLY_PROG flag is throughout the lifetime of a map
17622851890Sopenharmony_ci-	 *    and was set at map creation time.
17722851890Sopenharmony_ci-	 * 2) The map value(s) have been initialized from user space by a
17822851890Sopenharmony_ci-	 *    loader and then "frozen", such that no new map update/delete
17922851890Sopenharmony_ci-	 *    operations from syscall side are possible for the rest of
18022851890Sopenharmony_ci-	 *    the map's lifetime from that point onwards.
18122851890Sopenharmony_ci-	 * 3) Any parallel/pending map update/delete operations from syscall
18222851890Sopenharmony_ci-	 *    side have been completed. Only after that point, it's safe to
18322851890Sopenharmony_ci-	 *    assume that map value(s) are immutable.
18422851890Sopenharmony_ci-	 */
18522851890Sopenharmony_ci-	return (map->map_flags & BPF_F_RDONLY_PROG) &&
18622851890Sopenharmony_ci-	       READ_ONCE(map->frozen) &&
18722851890Sopenharmony_ci-	       !bpf_map_write_active(map);
18822851890Sopenharmony_ci+	return (map->map_flags & BPF_F_RDONLY_PROG) && map->frozen;
18922851890Sopenharmony_ci }
19022851890Sopenharmony_ci 
19122851890Sopenharmony_ci static int bpf_map_direct_read(struct bpf_map *map, int off, int size, u64 *val)
19222851890Sopenharmony_cidiff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
19322851890Sopenharmony_ciindex d9f8a464b..cddc908bc 100644
19422851890Sopenharmony_ci--- a/kernel/cgroup/cgroup-v1.c
19522851890Sopenharmony_ci+++ b/kernel/cgroup/cgroup-v1.c
19622851890Sopenharmony_ci@@ -518,7 +518,8 @@ static ssize_t __cgroup1_procs_write(struct kernfs_open_file *of,
19722851890Sopenharmony_ci 	if (!uid_eq(cred->euid, GLOBAL_ROOT_UID) &&
19822851890Sopenharmony_ci #endif
19922851890Sopenharmony_ci 	    !uid_eq(cred->euid, tcred->uid) &&
20022851890Sopenharmony_ci-	    !uid_eq(cred->euid, tcred->suid))
20122851890Sopenharmony_ci+	    !uid_eq(cred->euid, tcred->suid) &&
20222851890Sopenharmony_ci+	    !ns_capable(tcred->user_ns, CAP_SYS_NICE))
20322851890Sopenharmony_ci 		ret = -EACCES;
20422851890Sopenharmony_ci 	put_cred(tcred);
20522851890Sopenharmony_ci 	if (ret)
20622851890Sopenharmony_cidiff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
20722851890Sopenharmony_ciindex 3173fe473..f4d318733 100644
20822851890Sopenharmony_ci--- a/kernel/cgroup/cpuset.c
20922851890Sopenharmony_ci+++ b/kernel/cgroup/cpuset.c
21022851890Sopenharmony_ci@@ -335,6 +335,8 @@ static struct cpuset top_cpuset = {
21122851890Sopenharmony_ci  * guidelines for accessing subsystem state in kernel/cgroup.c
21222851890Sopenharmony_ci  */
21322851890Sopenharmony_ci 
21422851890Sopenharmony_ci+static DEFINE_MUTEX(cpuset_mutex);
21522851890Sopenharmony_ci+
21622851890Sopenharmony_ci DEFINE_STATIC_PERCPU_RWSEM(cpuset_rwsem);
21722851890Sopenharmony_ci 
21822851890Sopenharmony_ci void cpuset_read_lock(void)
21922851890Sopenharmony_ci@@ -352,9 +354,9 @@ static DEFINE_SPINLOCK(callback_lock);
22022851890Sopenharmony_ci static struct workqueue_struct *cpuset_migrate_mm_wq;
22122851890Sopenharmony_ci 
22222851890Sopenharmony_ci /*
22322851890Sopenharmony_ci- * CPU / memory hotplug is handled asynchronously.
22422851890Sopenharmony_ci+ * CPU / memory hotplug is handled asynchronously
22522851890Sopenharmony_ci+ * for hotplug, synchronously for resume_cpus
22622851890Sopenharmony_ci  */
22722851890Sopenharmony_ci-static void cpuset_hotplug_workfn(struct work_struct *work);
22822851890Sopenharmony_ci static DECLARE_WORK(cpuset_hotplug_work, cpuset_hotplug_workfn);
22922851890Sopenharmony_ci 
23022851890Sopenharmony_ci static DECLARE_WAIT_QUEUE_HEAD(cpuset_attach_wq);
23122851890Sopenharmony_ci@@ -374,18 +376,29 @@ static inline bool is_in_v2_mode(void)
23222851890Sopenharmony_ci }
23322851890Sopenharmony_ci 
23422851890Sopenharmony_ci /*
23522851890Sopenharmony_ci- * Return in pmask the portion of a cpusets's cpus_allowed that
23622851890Sopenharmony_ci- * are online.  If none are online, walk up the cpuset hierarchy
23722851890Sopenharmony_ci- * until we find one that does have some online cpus.
23822851890Sopenharmony_ci+ * Return in pmask the portion of a task's cpusets's cpus_allowed that
23922851890Sopenharmony_ci+ * are online and are capable of running the task.  If none are found,
24022851890Sopenharmony_ci+ * walk up the cpuset hierarchy until we find one that does have some
24122851890Sopenharmony_ci+ * appropriate cpus.
24222851890Sopenharmony_ci  *
24322851890Sopenharmony_ci  * One way or another, we guarantee to return some non-empty subset
24422851890Sopenharmony_ci- * of cpu_online_mask.
24522851890Sopenharmony_ci+ * of cpu_active_mask.
24622851890Sopenharmony_ci  *
24722851890Sopenharmony_ci  * Call with callback_lock or cpuset_mutex held.
24822851890Sopenharmony_ci  */
24922851890Sopenharmony_ci-static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)
25022851890Sopenharmony_ci+static void guarantee_online_cpus(struct task_struct *tsk,
25122851890Sopenharmony_ci+				  struct cpumask *pmask)
25222851890Sopenharmony_ci {
25322851890Sopenharmony_ci-	while (!cpumask_intersects(cs->effective_cpus, cpu_online_mask)) {
25422851890Sopenharmony_ci+	const struct cpumask *possible_mask = task_cpu_possible_mask(tsk);
25522851890Sopenharmony_ci+	struct cpuset *cs;
25622851890Sopenharmony_ci+
25722851890Sopenharmony_ci+	if (WARN_ON(!cpumask_and(pmask, possible_mask, cpu_active_mask)))
25822851890Sopenharmony_ci+		cpumask_copy(pmask, cpu_active_mask);
25922851890Sopenharmony_ci+
26022851890Sopenharmony_ci+	rcu_read_lock();
26122851890Sopenharmony_ci+	cs = task_cs(tsk);
26222851890Sopenharmony_ci+
26322851890Sopenharmony_ci+	while (!cpumask_intersects(cs->effective_cpus, pmask)) {
26422851890Sopenharmony_ci 		cs = parent_cs(cs);
26522851890Sopenharmony_ci 		if (unlikely(!cs)) {
26622851890Sopenharmony_ci 			/*
26722851890Sopenharmony_ci@@ -395,11 +408,13 @@ static void guarantee_online_cpus(struct cpuset *cs, struct cpumask *pmask)
26822851890Sopenharmony_ci 			 * cpuset's effective_cpus is on its way to be
26922851890Sopenharmony_ci 			 * identical to cpu_online_mask.
27022851890Sopenharmony_ci 			 */
27122851890Sopenharmony_ci-			cpumask_copy(pmask, cpu_online_mask);
27222851890Sopenharmony_ci-			return;
27322851890Sopenharmony_ci+			goto out_unlock;
27422851890Sopenharmony_ci 		}
27522851890Sopenharmony_ci 	}
27622851890Sopenharmony_ci-	cpumask_and(pmask, cs->effective_cpus, cpu_online_mask);
27722851890Sopenharmony_ci+	cpumask_and(pmask, pmask, cs->effective_cpus);
27822851890Sopenharmony_ci+
27922851890Sopenharmony_ci+out_unlock:
28022851890Sopenharmony_ci+	rcu_read_unlock();
28122851890Sopenharmony_ci }
28222851890Sopenharmony_ci 
28322851890Sopenharmony_ci /*
28422851890Sopenharmony_ci@@ -490,6 +505,9 @@ static inline int alloc_cpumasks(struct cpuset *cs, struct tmpmasks *tmp)
28522851890Sopenharmony_ci 	if (cs && !zalloc_cpumask_var(pmask4, GFP_KERNEL))
28622851890Sopenharmony_ci 		goto free_three;
28722851890Sopenharmony_ci 
28822851890Sopenharmony_ci+	if (cs && !zalloc_cpumask_var(&cs->cpus_requested, GFP_KERNEL))
28922851890Sopenharmony_ci+		goto free_three;
29022851890Sopenharmony_ci+
29122851890Sopenharmony_ci 	return 0;
29222851890Sopenharmony_ci 
29322851890Sopenharmony_ci free_three:
29422851890Sopenharmony_ci@@ -940,7 +958,7 @@ static void rebuild_root_domains(void)
29522851890Sopenharmony_ci 	struct cpuset *cs = NULL;
29622851890Sopenharmony_ci 	struct cgroup_subsys_state *pos_css;
29722851890Sopenharmony_ci 
29822851890Sopenharmony_ci-	percpu_rwsem_assert_held(&cpuset_rwsem);
29922851890Sopenharmony_ci+	lockdep_assert_held(&cpuset_mutex);
30022851890Sopenharmony_ci 	lockdep_assert_cpus_held();
30122851890Sopenharmony_ci 	lockdep_assert_held(&sched_domains_mutex);
30222851890Sopenharmony_ci 
30322851890Sopenharmony_ci@@ -1000,8 +1018,7 @@ static void rebuild_sched_domains_locked(void)
30422851890Sopenharmony_ci 	struct cpuset *cs;
30522851890Sopenharmony_ci 	int ndoms;
30622851890Sopenharmony_ci 
30722851890Sopenharmony_ci-	lockdep_assert_cpus_held();
30822851890Sopenharmony_ci-	percpu_rwsem_assert_held(&cpuset_rwsem);
30922851890Sopenharmony_ci+	lockdep_assert_held(&cpuset_mutex);
31022851890Sopenharmony_ci 
31122851890Sopenharmony_ci 	/*
31222851890Sopenharmony_ci 	 * If we have raced with CPU hotplug, return early to avoid
31322851890Sopenharmony_ci@@ -1052,12 +1069,18 @@ static void rebuild_sched_domains_locked(void)
31422851890Sopenharmony_ci void rebuild_sched_domains(void)
31522851890Sopenharmony_ci {
31622851890Sopenharmony_ci 	get_online_cpus();
31722851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
31822851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
31922851890Sopenharmony_ci 	rebuild_sched_domains_locked();
32022851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
32122851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
32222851890Sopenharmony_ci 	put_online_cpus();
32322851890Sopenharmony_ci }
32422851890Sopenharmony_ci 
32522851890Sopenharmony_ci+static int update_cpus_allowed(struct cpuset *cs, struct task_struct *p,
32622851890Sopenharmony_ci+				const struct cpumask *new_mask)
32722851890Sopenharmony_ci+{
32822851890Sopenharmony_ci+	return set_cpus_allowed_ptr(p, new_mask);
32922851890Sopenharmony_ci+}
33022851890Sopenharmony_ci+
33122851890Sopenharmony_ci /**
33222851890Sopenharmony_ci  * update_tasks_cpumask - Update the cpumasks of tasks in the cpuset.
33322851890Sopenharmony_ci  * @cs: the cpuset in which each task's cpus_allowed mask needs to be changed
33422851890Sopenharmony_ci@@ -1080,7 +1103,7 @@ static void update_tasks_cpumask(struct cpuset *cs)
33522851890Sopenharmony_ci 		if (top_cs && (task->flags & PF_KTHREAD) &&
33622851890Sopenharmony_ci 		    kthread_is_per_cpu(task))
33722851890Sopenharmony_ci 			continue;
33822851890Sopenharmony_ci-		set_cpus_allowed_ptr(task, cs->effective_cpus);
33922851890Sopenharmony_ci+		update_cpus_allowed(cs, task, cs->effective_cpus);
34022851890Sopenharmony_ci 	}
34122851890Sopenharmony_ci 	css_task_iter_end(&it);
34222851890Sopenharmony_ci }
34322851890Sopenharmony_ci@@ -1105,8 +1128,7 @@ static void compute_effective_cpumask(struct cpumask *new_cpus,
34422851890Sopenharmony_ci 		cpumask_and(new_cpus, new_cpus, cs->cpus_requested);
34522851890Sopenharmony_ci 		cpumask_and(new_cpus, new_cpus, cpu_active_mask);
34622851890Sopenharmony_ci 	} else {
34722851890Sopenharmony_ci-		cpumask_and(new_cpus, cs->cpus_requested,
34822851890Sopenharmony_ci-			    parent->effective_cpus);
34922851890Sopenharmony_ci+		cpumask_and(new_cpus, cs->cpus_requested, parent_cs(cs)->effective_cpus);
35022851890Sopenharmony_ci 	}
35122851890Sopenharmony_ci }
35222851890Sopenharmony_ci 
35322851890Sopenharmony_ci@@ -1171,7 +1193,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd,
35422851890Sopenharmony_ci 	int new_prs;
35522851890Sopenharmony_ci 	bool part_error = false;	/* Partition error? */
35622851890Sopenharmony_ci 
35722851890Sopenharmony_ci-	percpu_rwsem_assert_held(&cpuset_rwsem);
35822851890Sopenharmony_ci+	lockdep_assert_held(&cpuset_mutex);
35922851890Sopenharmony_ci 
36022851890Sopenharmony_ci 	/*
36122851890Sopenharmony_ci 	 * The parent must be a partition root.
36222851890Sopenharmony_ci@@ -2171,7 +2193,7 @@ static int cpuset_can_attach(struct cgroup_taskset *tset)
36322851890Sopenharmony_ci 	cpuset_attach_old_cs = task_cs(cgroup_taskset_first(tset, &css));
36422851890Sopenharmony_ci 	cs = css_cs(css);
36522851890Sopenharmony_ci 
36622851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
36722851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
36822851890Sopenharmony_ci 
36922851890Sopenharmony_ci 	/* allow moving tasks into an empty cpuset if on default hierarchy */
37022851890Sopenharmony_ci 	ret = -ENOSPC;
37122851890Sopenharmony_ci@@ -2195,7 +2217,7 @@ static int cpuset_can_attach(struct cgroup_taskset *tset)
37222851890Sopenharmony_ci 	cs->attach_in_progress++;
37322851890Sopenharmony_ci 	ret = 0;
37422851890Sopenharmony_ci out_unlock:
37522851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
37622851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
37722851890Sopenharmony_ci 	return ret;
37822851890Sopenharmony_ci }
37922851890Sopenharmony_ci 
38022851890Sopenharmony_ci@@ -2205,9 +2227,9 @@ static void cpuset_cancel_attach(struct cgroup_taskset *tset)
38122851890Sopenharmony_ci 
38222851890Sopenharmony_ci 	cgroup_taskset_first(tset, &css);
38322851890Sopenharmony_ci 
38422851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
38522851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
38622851890Sopenharmony_ci 	css_cs(css)->attach_in_progress--;
38722851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
38822851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
38922851890Sopenharmony_ci }
39022851890Sopenharmony_ci 
39122851890Sopenharmony_ci /*
39222851890Sopenharmony_ci@@ -2231,22 +2253,20 @@ static void cpuset_attach(struct cgroup_taskset *tset)
39322851890Sopenharmony_ci 	cs = css_cs(css);
39422851890Sopenharmony_ci 
39522851890Sopenharmony_ci 	lockdep_assert_cpus_held();	/* see cgroup_attach_lock() */
39622851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
39722851890Sopenharmony_ci-
39822851890Sopenharmony_ci-	/* prepare for attach */
39922851890Sopenharmony_ci-	if (cs == &top_cpuset)
40022851890Sopenharmony_ci-		cpumask_copy(cpus_attach, cpu_possible_mask);
40122851890Sopenharmony_ci-	else
40222851890Sopenharmony_ci-		guarantee_online_cpus(cs, cpus_attach);
40322851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
40422851890Sopenharmony_ci 
40522851890Sopenharmony_ci 	guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
40622851890Sopenharmony_ci 
40722851890Sopenharmony_ci 	cgroup_taskset_for_each(task, css, tset) {
40822851890Sopenharmony_ci+		if (cs != &top_cpuset)
40922851890Sopenharmony_ci+			guarantee_online_cpus(task, cpus_attach);
41022851890Sopenharmony_ci+		else
41122851890Sopenharmony_ci+			cpumask_copy(cpus_attach, task_cpu_possible_mask(task));
41222851890Sopenharmony_ci 		/*
41322851890Sopenharmony_ci 		 * can_attach beforehand should guarantee that this doesn't
41422851890Sopenharmony_ci 		 * fail.  TODO: have a better way to handle failure here
41522851890Sopenharmony_ci 		 */
41622851890Sopenharmony_ci-		WARN_ON_ONCE(set_cpus_allowed_ptr(task, cpus_attach));
41722851890Sopenharmony_ci+		WARN_ON_ONCE(update_cpus_allowed(cs, task, cpus_attach));
41822851890Sopenharmony_ci 
41922851890Sopenharmony_ci 		cpuset_change_task_nodemask(task, &cpuset_attach_nodemask_to);
42022851890Sopenharmony_ci 		cpuset_update_task_spread_flag(cs, task);
42122851890Sopenharmony_ci@@ -2285,7 +2305,7 @@ static void cpuset_attach(struct cgroup_taskset *tset)
42222851890Sopenharmony_ci 	if (!cs->attach_in_progress)
42322851890Sopenharmony_ci 		wake_up(&cpuset_attach_wq);
42422851890Sopenharmony_ci 
42522851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
42622851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
42722851890Sopenharmony_ci }
42822851890Sopenharmony_ci 
42922851890Sopenharmony_ci /* The various types of files and directories in a cpuset file system */
43022851890Sopenharmony_ci@@ -2317,7 +2337,7 @@ static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft,
43122851890Sopenharmony_ci 	int retval = 0;
43222851890Sopenharmony_ci 
43322851890Sopenharmony_ci 	get_online_cpus();
43422851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
43522851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
43622851890Sopenharmony_ci 	if (!is_cpuset_online(cs)) {
43722851890Sopenharmony_ci 		retval = -ENODEV;
43822851890Sopenharmony_ci 		goto out_unlock;
43922851890Sopenharmony_ci@@ -2353,7 +2373,7 @@ static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft,
44022851890Sopenharmony_ci 		break;
44122851890Sopenharmony_ci 	}
44222851890Sopenharmony_ci out_unlock:
44322851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
44422851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
44522851890Sopenharmony_ci 	put_online_cpus();
44622851890Sopenharmony_ci 	return retval;
44722851890Sopenharmony_ci }
44822851890Sopenharmony_ci@@ -2366,7 +2386,7 @@ static int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft,
44922851890Sopenharmony_ci 	int retval = -ENODEV;
45022851890Sopenharmony_ci 
45122851890Sopenharmony_ci 	get_online_cpus();
45222851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
45322851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
45422851890Sopenharmony_ci 	if (!is_cpuset_online(cs))
45522851890Sopenharmony_ci 		goto out_unlock;
45622851890Sopenharmony_ci 
45722851890Sopenharmony_ci@@ -2379,7 +2399,7 @@ static int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft,
45822851890Sopenharmony_ci 		break;
45922851890Sopenharmony_ci 	}
46022851890Sopenharmony_ci out_unlock:
46122851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
46222851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
46322851890Sopenharmony_ci 	put_online_cpus();
46422851890Sopenharmony_ci 	return retval;
46522851890Sopenharmony_ci }
46622851890Sopenharmony_ci@@ -2420,7 +2440,7 @@ static ssize_t cpuset_write_resmask(struct kernfs_open_file *of,
46722851890Sopenharmony_ci 	flush_work(&cpuset_hotplug_work);
46822851890Sopenharmony_ci 
46922851890Sopenharmony_ci 	get_online_cpus();
47022851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
47122851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
47222851890Sopenharmony_ci 	if (!is_cpuset_online(cs))
47322851890Sopenharmony_ci 		goto out_unlock;
47422851890Sopenharmony_ci 
47522851890Sopenharmony_ci@@ -2444,7 +2464,7 @@ static ssize_t cpuset_write_resmask(struct kernfs_open_file *of,
47622851890Sopenharmony_ci 
47722851890Sopenharmony_ci 	free_cpuset(trialcs);
47822851890Sopenharmony_ci out_unlock:
47922851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
48022851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
48122851890Sopenharmony_ci 	put_online_cpus();
48222851890Sopenharmony_ci 	kernfs_unbreak_active_protection(of->kn);
48322851890Sopenharmony_ci 	css_put(&cs->css);
48422851890Sopenharmony_ci@@ -2577,13 +2597,13 @@ static ssize_t sched_partition_write(struct kernfs_open_file *of, char *buf,
48522851890Sopenharmony_ci 
48622851890Sopenharmony_ci 	css_get(&cs->css);
48722851890Sopenharmony_ci 	get_online_cpus();
48822851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
48922851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
49022851890Sopenharmony_ci 	if (!is_cpuset_online(cs))
49122851890Sopenharmony_ci 		goto out_unlock;
49222851890Sopenharmony_ci 
49322851890Sopenharmony_ci 	retval = update_prstate(cs, val);
49422851890Sopenharmony_ci out_unlock:
49522851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
49622851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
49722851890Sopenharmony_ci 	put_online_cpus();
49822851890Sopenharmony_ci 	css_put(&cs->css);
49922851890Sopenharmony_ci 	return retval ?: nbytes;
50022851890Sopenharmony_ci@@ -2791,7 +2811,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css)
50122851890Sopenharmony_ci 		return 0;
50222851890Sopenharmony_ci 
50322851890Sopenharmony_ci 	get_online_cpus();
50422851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
50522851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
50622851890Sopenharmony_ci 
50722851890Sopenharmony_ci 	set_bit(CS_ONLINE, &cs->flags);
50822851890Sopenharmony_ci 	if (is_spread_page(parent))
50922851890Sopenharmony_ci@@ -2843,7 +2863,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css)
51022851890Sopenharmony_ci 	cpumask_copy(cs->effective_cpus, parent->cpus_allowed);
51122851890Sopenharmony_ci 	spin_unlock_irq(&callback_lock);
51222851890Sopenharmony_ci out_unlock:
51322851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
51422851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
51522851890Sopenharmony_ci 	put_online_cpus();
51622851890Sopenharmony_ci 	return 0;
51722851890Sopenharmony_ci }
51822851890Sopenharmony_ci@@ -2864,7 +2884,7 @@ static void cpuset_css_offline(struct cgroup_subsys_state *css)
51922851890Sopenharmony_ci 	struct cpuset *cs = css_cs(css);
52022851890Sopenharmony_ci 
52122851890Sopenharmony_ci 	get_online_cpus();
52222851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
52322851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
52422851890Sopenharmony_ci 
52522851890Sopenharmony_ci 	if (is_partition_root(cs))
52622851890Sopenharmony_ci 		update_prstate(cs, 0);
52722851890Sopenharmony_ci@@ -2883,7 +2903,7 @@ static void cpuset_css_offline(struct cgroup_subsys_state *css)
52822851890Sopenharmony_ci 	cpuset_dec();
52922851890Sopenharmony_ci 	clear_bit(CS_ONLINE, &cs->flags);
53022851890Sopenharmony_ci 
53122851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
53222851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
53322851890Sopenharmony_ci 	put_online_cpus();
53422851890Sopenharmony_ci }
53522851890Sopenharmony_ci 
53622851890Sopenharmony_ci@@ -2896,7 +2916,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css)
53722851890Sopenharmony_ci 
53822851890Sopenharmony_ci static void cpuset_bind(struct cgroup_subsys_state *root_css)
53922851890Sopenharmony_ci {
54022851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
54122851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
54222851890Sopenharmony_ci 	spin_lock_irq(&callback_lock);
54322851890Sopenharmony_ci 
54422851890Sopenharmony_ci 	if (is_in_v2_mode()) {
54522851890Sopenharmony_ci@@ -2909,7 +2929,7 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css)
54622851890Sopenharmony_ci 	}
54722851890Sopenharmony_ci 
54822851890Sopenharmony_ci 	spin_unlock_irq(&callback_lock);
54922851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
55022851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
55122851890Sopenharmony_ci }
55222851890Sopenharmony_ci 
55322851890Sopenharmony_ci /*
55422851890Sopenharmony_ci@@ -2919,10 +2939,10 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css)
55522851890Sopenharmony_ci  */
55622851890Sopenharmony_ci static void cpuset_fork(struct task_struct *task)
55722851890Sopenharmony_ci {
55822851890Sopenharmony_ci+	int inherit_cpus = 0;
55922851890Sopenharmony_ci 	if (task_css_is_root(task, cpuset_cgrp_id))
56022851890Sopenharmony_ci 		return;
56122851890Sopenharmony_ci 
56222851890Sopenharmony_ci-	set_cpus_allowed_ptr(task, current->cpus_ptr);
56322851890Sopenharmony_ci 	task->mems_allowed = current->mems_allowed;
56422851890Sopenharmony_ci }
56522851890Sopenharmony_ci 
56622851890Sopenharmony_ci@@ -2951,7 +2971,6 @@ struct cgroup_subsys cpuset_cgrp_subsys = {
56722851890Sopenharmony_ci 
56822851890Sopenharmony_ci int __init cpuset_init(void)
56922851890Sopenharmony_ci {
57022851890Sopenharmony_ci-	BUG_ON(percpu_init_rwsem(&cpuset_rwsem));
57122851890Sopenharmony_ci 
57222851890Sopenharmony_ci 	BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_allowed, GFP_KERNEL));
57322851890Sopenharmony_ci 	BUG_ON(!alloc_cpumask_var(&top_cpuset.cpus_requested, GFP_KERNEL));
57422851890Sopenharmony_ci@@ -3026,7 +3045,7 @@ hotplug_update_tasks_legacy(struct cpuset *cs,
57522851890Sopenharmony_ci 	is_empty = cpumask_empty(cs->cpus_allowed) ||
57622851890Sopenharmony_ci 		   nodes_empty(cs->mems_allowed);
57722851890Sopenharmony_ci 
57822851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
57922851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
58022851890Sopenharmony_ci 
58122851890Sopenharmony_ci 	/*
58222851890Sopenharmony_ci 	 * Move tasks to the nearest ancestor with execution resources,
58322851890Sopenharmony_ci@@ -3036,7 +3055,7 @@ hotplug_update_tasks_legacy(struct cpuset *cs,
58422851890Sopenharmony_ci 	if (is_empty)
58522851890Sopenharmony_ci 		remove_tasks_in_empty_cpuset(cs);
58622851890Sopenharmony_ci 
58722851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
58822851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
58922851890Sopenharmony_ci }
59022851890Sopenharmony_ci 
59122851890Sopenharmony_ci static void
59222851890Sopenharmony_ci@@ -3086,14 +3105,14 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
59322851890Sopenharmony_ci retry:
59422851890Sopenharmony_ci 	wait_event(cpuset_attach_wq, cs->attach_in_progress == 0);
59522851890Sopenharmony_ci 
59622851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
59722851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
59822851890Sopenharmony_ci 
59922851890Sopenharmony_ci 	/*
60022851890Sopenharmony_ci 	 * We have raced with task attaching. We wait until attaching
60122851890Sopenharmony_ci 	 * is finished, so we won't attach a task to an empty cpuset.
60222851890Sopenharmony_ci 	 */
60322851890Sopenharmony_ci 	if (cs->attach_in_progress) {
60422851890Sopenharmony_ci-		percpu_up_write(&cpuset_rwsem);
60522851890Sopenharmony_ci+		mutex_unlock(&cpuset_mutex);
60622851890Sopenharmony_ci 		goto retry;
60722851890Sopenharmony_ci 	}
60822851890Sopenharmony_ci 
60922851890Sopenharmony_ci@@ -3165,7 +3184,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
61022851890Sopenharmony_ci 		hotplug_update_tasks_legacy(cs, &new_cpus, &new_mems,
61122851890Sopenharmony_ci 					    cpus_updated, mems_updated);
61222851890Sopenharmony_ci 
61322851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
61422851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
61522851890Sopenharmony_ci }
61622851890Sopenharmony_ci 
61722851890Sopenharmony_ci /**
61822851890Sopenharmony_ci@@ -3184,7 +3203,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
61922851890Sopenharmony_ci  * Note that CPU offlining during suspend is ignored.  We don't modify
62022851890Sopenharmony_ci  * cpusets across suspend/resume cycles at all.
62122851890Sopenharmony_ci  */
62222851890Sopenharmony_ci-static void cpuset_hotplug_workfn(struct work_struct *work)
62322851890Sopenharmony_ci+void cpuset_hotplug_workfn(struct work_struct *work)
62422851890Sopenharmony_ci {
62522851890Sopenharmony_ci 	static cpumask_t new_cpus;
62622851890Sopenharmony_ci 	static nodemask_t new_mems;
62722851890Sopenharmony_ci@@ -3195,7 +3214,7 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
62822851890Sopenharmony_ci 	if (on_dfl && !alloc_cpumasks(NULL, &tmp))
62922851890Sopenharmony_ci 		ptmp = &tmp;
63022851890Sopenharmony_ci 
63122851890Sopenharmony_ci-	percpu_down_write(&cpuset_rwsem);
63222851890Sopenharmony_ci+	mutex_lock(&cpuset_mutex);
63322851890Sopenharmony_ci 
63422851890Sopenharmony_ci 	/* fetch the available cpus/mems and find out which changed how */
63522851890Sopenharmony_ci 	cpumask_copy(&new_cpus, cpu_active_mask);
63622851890Sopenharmony_ci@@ -3252,7 +3271,7 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
63722851890Sopenharmony_ci 		update_tasks_nodemask(&top_cpuset);
63822851890Sopenharmony_ci 	}
63922851890Sopenharmony_ci 
64022851890Sopenharmony_ci-	percpu_up_write(&cpuset_rwsem);
64122851890Sopenharmony_ci+	mutex_unlock(&cpuset_mutex);
64222851890Sopenharmony_ci 
64322851890Sopenharmony_ci 	/* if cpus or mems changed, we need to propagate to descendants */
64422851890Sopenharmony_ci 	if (cpus_updated || mems_updated) {
64522851890Sopenharmony_ci@@ -3296,6 +3315,7 @@ void cpuset_wait_for_hotplug(void)
64622851890Sopenharmony_ci {
64722851890Sopenharmony_ci 	flush_work(&cpuset_hotplug_work);
64822851890Sopenharmony_ci }
64922851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(cpuset_wait_for_hotplug);
65022851890Sopenharmony_ci 
65122851890Sopenharmony_ci /*
65222851890Sopenharmony_ci  * Keep top_cpuset.mems_allowed tracking node_states[N_MEMORY].
65322851890Sopenharmony_ci@@ -3354,11 +3374,11 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
65422851890Sopenharmony_ci 
65522851890Sopenharmony_ci 	spin_lock_irqsave(&callback_lock, flags);
65622851890Sopenharmony_ci 	rcu_read_lock();
65722851890Sopenharmony_ci-	guarantee_online_cpus(task_cs(tsk), pmask);
65822851890Sopenharmony_ci+	guarantee_online_cpus(tsk, pmask);
65922851890Sopenharmony_ci 	rcu_read_unlock();
66022851890Sopenharmony_ci 	spin_unlock_irqrestore(&callback_lock, flags);
66122851890Sopenharmony_ci }
66222851890Sopenharmony_ci-
66322851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(cpuset_cpus_allowed);
66422851890Sopenharmony_ci /**
66522851890Sopenharmony_ci  * cpuset_cpus_allowed_fallback - final fallback before complete catastrophe.
66622851890Sopenharmony_ci  * @tsk: pointer to task_struct with which the scheduler is struggling
66722851890Sopenharmony_ci@@ -3373,9 +3393,17 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask)
66822851890Sopenharmony_ci 
66922851890Sopenharmony_ci void cpuset_cpus_allowed_fallback(struct task_struct *tsk)
67022851890Sopenharmony_ci {
67122851890Sopenharmony_ci+	const struct cpumask *possible_mask = task_cpu_possible_mask(tsk);
67222851890Sopenharmony_ci+	const struct cpumask *cs_mask;
67322851890Sopenharmony_ci+
67422851890Sopenharmony_ci 	rcu_read_lock();
67522851890Sopenharmony_ci-	do_set_cpus_allowed(tsk, is_in_v2_mode() ?
67622851890Sopenharmony_ci-		task_cs(tsk)->cpus_allowed : cpu_possible_mask);
67722851890Sopenharmony_ci+	cs_mask = task_cs(tsk)->cpus_allowed;
67822851890Sopenharmony_ci+
67922851890Sopenharmony_ci+	if (!is_in_v2_mode() || !cpumask_subset(cs_mask, possible_mask))
68022851890Sopenharmony_ci+		goto unlock; /* select_fallback_rq will try harder */
68122851890Sopenharmony_ci+
68222851890Sopenharmony_ci+	do_set_cpus_allowed(tsk, cs_mask);
68322851890Sopenharmony_ci+unlock:
68422851890Sopenharmony_ci 	rcu_read_unlock();
68522851890Sopenharmony_ci 
68622851890Sopenharmony_ci 	/*
68722851890Sopenharmony_ci
68822851890Sopenharmony_cidiff --git a/kernel/cgroup/legacy_freezer.c b/kernel/cgroup/legacy_freezer.c
68922851890Sopenharmony_ciindex 08236798d..081d026f1 100644
69022851890Sopenharmony_ci--- a/kernel/cgroup/legacy_freezer.c
69122851890Sopenharmony_ci+++ b/kernel/cgroup/legacy_freezer.c
69222851890Sopenharmony_ci@@ -479,3 +479,4 @@ struct cgroup_subsys freezer_cgrp_subsys = {
69322851890Sopenharmony_ci 	.fork		= freezer_fork,
69422851890Sopenharmony_ci 	.legacy_cftypes	= files,
69522851890Sopenharmony_ci };
69622851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(freezer_cgrp_subsys);
69722851890Sopenharmony_cidiff --git a/kernel/cpu.c b/kernel/cpu.c
69822851890Sopenharmony_ciindex 4b27158d3..b076ccd1b 100644
69922851890Sopenharmony_ci--- a/kernel/cpu.c
70022851890Sopenharmony_ci+++ b/kernel/cpu.c
70122851890Sopenharmony_ci@@ -39,6 +39,8 @@
70222851890Sopenharmony_ci #define CREATE_TRACE_POINTS
70322851890Sopenharmony_ci #include <trace/events/cpuhp.h>
70422851890Sopenharmony_ci 
70522851890Sopenharmony_ci+#undef CREATE_TRACE_POINTS
70622851890Sopenharmony_ci+
70722851890Sopenharmony_ci #include "smpboot.h"
70822851890Sopenharmony_ci 
70922851890Sopenharmony_ci /**
71022851890Sopenharmony_ci@@ -274,11 +276,13 @@ void cpu_maps_update_begin(void)
71122851890Sopenharmony_ci {
71222851890Sopenharmony_ci 	mutex_lock(&cpu_add_remove_lock);
71322851890Sopenharmony_ci }
71422851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(cpu_maps_update_begin);
71522851890Sopenharmony_ci 
71622851890Sopenharmony_ci void cpu_maps_update_done(void)
71722851890Sopenharmony_ci {
71822851890Sopenharmony_ci 	mutex_unlock(&cpu_add_remove_lock);
71922851890Sopenharmony_ci }
72022851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(cpu_maps_update_done);
72122851890Sopenharmony_ci 
72222851890Sopenharmony_ci /*
72322851890Sopenharmony_ci  * If set, cpu_up and cpu_down will return -EBUSY and do nothing.
72422851890Sopenharmony_ci@@ -1053,7 +1057,7 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen,
72522851890Sopenharmony_ci 	struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
72622851890Sopenharmony_ci 	int prev_state, ret = 0;
72722851890Sopenharmony_ci 
72822851890Sopenharmony_ci-	if (num_online_cpus() == 1)
72922851890Sopenharmony_ci+	if (num_active_cpus() == 1 && cpu_active(cpu))
73022851890Sopenharmony_ci 		return -EBUSY;
73122851890Sopenharmony_ci 
73222851890Sopenharmony_ci 	if (!cpu_present(cpu))
73322851890Sopenharmony_cidiff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c
73422851890Sopenharmony_ciindex e2999a070..79cb6d063 100644
73522851890Sopenharmony_ci--- a/kernel/irq/generic-chip.c
73622851890Sopenharmony_ci+++ b/kernel/irq/generic-chip.c
73722851890Sopenharmony_ci@@ -200,6 +200,7 @@ int irq_gc_set_wake(struct irq_data *d, unsigned int on)
73822851890Sopenharmony_ci 	irq_gc_unlock(gc);
73922851890Sopenharmony_ci 	return 0;
74022851890Sopenharmony_ci }
74122851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(irq_gc_set_wake);
74222851890Sopenharmony_ci 
74322851890Sopenharmony_ci static u32 irq_readl_be(void __iomem *addr)
74422851890Sopenharmony_ci {
74522851890Sopenharmony_cidiff --git a/kernel/power/Makefile b/kernel/power/Makefile
74622851890Sopenharmony_ciindex 5899260a8..466eaa74f 100644
74722851890Sopenharmony_ci--- a/kernel/power/Makefile
74822851890Sopenharmony_ci+++ b/kernel/power/Makefile
74922851890Sopenharmony_ci@@ -1,5 +1,17 @@
75022851890Sopenharmony_ci # SPDX-License-Identifier: GPL-2.0
75122851890Sopenharmony_ci 
75222851890Sopenharmony_ci+CURRENT_DIR := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST)))))
75322851890Sopenharmony_ci+
75422851890Sopenharmony_ci+ifeq ($(PRODUCT_PATH),)
75522851890Sopenharmony_ci+$(error PRODUCT_PATH is not set)
75622851890Sopenharmony_ci+endif
75722851890Sopenharmony_ci+
75822851890Sopenharmony_ci+WEAKUP_DIR := ../../../../../../$(PRODUCT_PATH)/kernel_core/kernel/power
75922851890Sopenharmony_ci+ifeq ($(wildcard $(CURRENT_DIR)/$(WEAKUP_DIR)),)
76022851890Sopenharmony_ci+HCS_ABS_DIR := $(abspath $(CURRENT_DIR)/$(WEAKUP_DIR))
76122851890Sopenharmony_ci+$(error miss in $(HCS_ABS_DIR) for standrad system)
76222851890Sopenharmony_ci+endif
76322851890Sopenharmony_ci+
76422851890Sopenharmony_ci ccflags-$(CONFIG_PM_DEBUG)	:= -DDEBUG
76522851890Sopenharmony_ci 
76622851890Sopenharmony_ci KASAN_SANITIZE_snapshot.o	:= n
76722851890Sopenharmony_ci@@ -17,4 +29,5 @@ obj-$(CONFIG_PM_WAKELOCKS)	+= wakelock.o
76822851890Sopenharmony_ci 
76922851890Sopenharmony_ci obj-$(CONFIG_MAGIC_SYSRQ)	+= poweroff.o
77022851890Sopenharmony_ci 
77122851890Sopenharmony_ci+obj-$(CONFIG_SUSPEND)		+= $(WEAKUP_DIR)/
77222851890Sopenharmony_ci obj-$(CONFIG_ENERGY_MODEL)	+= energy_model.o
77322851890Sopenharmony_cidiff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c
77422851890Sopenharmony_ciindex 119b929dc..41430128d 100644
77522851890Sopenharmony_ci--- a/kernel/power/energy_model.c
77622851890Sopenharmony_ci+++ b/kernel/power/energy_model.c
77722851890Sopenharmony_ci@@ -52,6 +52,17 @@ static int em_debug_cpus_show(struct seq_file *s, void *unused)
77822851890Sopenharmony_ci }
77922851890Sopenharmony_ci DEFINE_SHOW_ATTRIBUTE(em_debug_cpus);
78022851890Sopenharmony_ci 
78122851890Sopenharmony_ci+static int em_debug_units_show(struct seq_file *s, void *unused)
78222851890Sopenharmony_ci+{
78322851890Sopenharmony_ci+	struct em_perf_domain *pd = s->private;
78422851890Sopenharmony_ci+	char *units = pd->milliwatts ? "milliWatts" : "bogoWatts";
78522851890Sopenharmony_ci+
78622851890Sopenharmony_ci+	seq_printf(s, "%s\n", units);
78722851890Sopenharmony_ci+
78822851890Sopenharmony_ci+	return 0;
78922851890Sopenharmony_ci+}
79022851890Sopenharmony_ci+DEFINE_SHOW_ATTRIBUTE(em_debug_units);
79122851890Sopenharmony_ci+
79222851890Sopenharmony_ci static void em_debug_create_pd(struct device *dev)
79322851890Sopenharmony_ci {
79422851890Sopenharmony_ci 	struct dentry *d;
79522851890Sopenharmony_ci@@ -64,6 +75,8 @@ static void em_debug_create_pd(struct device *dev)
79622851890Sopenharmony_ci 		debugfs_create_file("cpus", 0444, d, dev->em_pd->cpus,
79722851890Sopenharmony_ci 				    &em_debug_cpus_fops);
79822851890Sopenharmony_ci 
79922851890Sopenharmony_ci+	debugfs_create_file("units", 0444, d, dev->em_pd, &em_debug_units_fops);
80022851890Sopenharmony_ci+
80122851890Sopenharmony_ci 	/* Create a sub-directory for each performance state */
80222851890Sopenharmony_ci 	for (i = 0; i < dev->em_pd->nr_perf_states; i++)
80322851890Sopenharmony_ci 		em_debug_create_ps(&dev->em_pd->table[i], d);
80422851890Sopenharmony_ci@@ -245,17 +258,24 @@ EXPORT_SYMBOL_GPL(em_cpu_get);
80522851890Sopenharmony_ci  * @cpus	: Pointer to cpumask_t, which in case of a CPU device is
80622851890Sopenharmony_ci  *		obligatory. It can be taken from i.e. 'policy->cpus'. For other
80722851890Sopenharmony_ci  *		type of devices this should be set to NULL.
80822851890Sopenharmony_ci+ * @milliwatts	: Flag indicating that the power values are in milliWatts or
80922851890Sopenharmony_ci+ *		in some other scale. It must be set properly.
81022851890Sopenharmony_ci  *
81122851890Sopenharmony_ci  * Create Energy Model tables for a performance domain using the callbacks
81222851890Sopenharmony_ci  * defined in cb.
81322851890Sopenharmony_ci  *
81422851890Sopenharmony_ci+ * The @milliwatts is important to set with correct value. Some kernel
81522851890Sopenharmony_ci+ * sub-systems might rely on this flag and check if all devices in the EM are
81622851890Sopenharmony_ci+ * using the same scale.
81722851890Sopenharmony_ci+ *
81822851890Sopenharmony_ci  * If multiple clients register the same performance domain, all but the first
81922851890Sopenharmony_ci  * registration will be ignored.
82022851890Sopenharmony_ci  *
82122851890Sopenharmony_ci  * Return 0 on success
82222851890Sopenharmony_ci  */
82322851890Sopenharmony_ci int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states,
82422851890Sopenharmony_ci-				struct em_data_callback *cb, cpumask_t *cpus)
82522851890Sopenharmony_ci+				struct em_data_callback *cb, cpumask_t *cpus,
82622851890Sopenharmony_ci+				bool milliwatts)
82722851890Sopenharmony_ci {
82822851890Sopenharmony_ci 	unsigned long cap, prev_cap = 0;
82922851890Sopenharmony_ci 	int cpu, ret;
83022851890Sopenharmony_ci@@ -308,6 +328,8 @@ int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states,
83122851890Sopenharmony_ci 	if (ret)
83222851890Sopenharmony_ci 		goto unlock;
83322851890Sopenharmony_ci 
83422851890Sopenharmony_ci+	dev->em_pd->milliwatts = milliwatts;
83522851890Sopenharmony_ci+
83622851890Sopenharmony_ci 	em_debug_create_pd(dev);
83722851890Sopenharmony_ci 	dev_info(dev, "EM: created perf domain\n");
83822851890Sopenharmony_ci 
83922851890Sopenharmony_cidiff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
84022851890Sopenharmony_ciindex bf640fd61..b13fe337f 100644
84122851890Sopenharmony_ci--- a/kernel/power/hibernate.c
84222851890Sopenharmony_ci+++ b/kernel/power/hibernate.c
84322851890Sopenharmony_ci@@ -326,7 +326,7 @@ static int create_image(int platform_mode)
84422851890Sopenharmony_ci 
84522851890Sopenharmony_ci 	if (!in_suspend) {
84622851890Sopenharmony_ci 		events_check_enabled = false;
84722851890Sopenharmony_ci-		clear_free_pages();
84822851890Sopenharmony_ci+		clear_or_poison_free_pages();
84922851890Sopenharmony_ci 	}
85022851890Sopenharmony_ci 
85122851890Sopenharmony_ci 	platform_leave(platform_mode);
85222851890Sopenharmony_cidiff --git a/kernel/power/power.h b/kernel/power/power.h
85322851890Sopenharmony_ciindex 24f12d534..778bf431e 100644
85422851890Sopenharmony_ci--- a/kernel/power/power.h
85522851890Sopenharmony_ci+++ b/kernel/power/power.h
85622851890Sopenharmony_ci@@ -106,7 +106,7 @@ extern int create_basic_memory_bitmaps(void);
85722851890Sopenharmony_ci extern void free_basic_memory_bitmaps(void);
85822851890Sopenharmony_ci extern int hibernate_preallocate_memory(void);
85922851890Sopenharmony_ci 
86022851890Sopenharmony_ci-extern void clear_free_pages(void);
86122851890Sopenharmony_ci+extern void clear_or_poison_free_pages(void);
86222851890Sopenharmony_ci 
86322851890Sopenharmony_ci /**
86422851890Sopenharmony_ci  *	Auxiliary structure used for reading the snapshot image data and
86522851890Sopenharmony_cidiff --git a/kernel/power/process.c b/kernel/power/process.c
86622851890Sopenharmony_ciindex 45b054b7b..cc0623080 100644
86722851890Sopenharmony_ci--- a/kernel/power/process.c
86822851890Sopenharmony_ci+++ b/kernel/power/process.c
86922851890Sopenharmony_ci@@ -85,18 +85,21 @@ static int try_to_freeze_tasks(bool user_only)
87022851890Sopenharmony_ci 	elapsed = ktime_sub(end, start);
87122851890Sopenharmony_ci 	elapsed_msecs = ktime_to_ms(elapsed);
87222851890Sopenharmony_ci 
87322851890Sopenharmony_ci-	if (todo) {
87422851890Sopenharmony_ci+	if (wakeup) {
87522851890Sopenharmony_ci 		pr_cont("\n");
87622851890Sopenharmony_ci-		pr_err("Freezing of tasks %s after %d.%03d seconds "
87722851890Sopenharmony_ci-		       "(%d tasks refusing to freeze, wq_busy=%d):\n",
87822851890Sopenharmony_ci-		       wakeup ? "aborted" : "failed",
87922851890Sopenharmony_ci+		pr_err("Freezing of tasks aborted after %d.%03d seconds",
88022851890Sopenharmony_ci+		       elapsed_msecs / 1000, elapsed_msecs % 1000);
88122851890Sopenharmony_ci+	} else if (todo) {
88222851890Sopenharmony_ci+		pr_cont("\n");
88322851890Sopenharmony_ci+		pr_err("Freezing of tasks failed after %d.%03d seconds"
88422851890Sopenharmony_ci+		       " (%d tasks refusing to freeze, wq_busy=%d):\n",
88522851890Sopenharmony_ci 		       elapsed_msecs / 1000, elapsed_msecs % 1000,
88622851890Sopenharmony_ci 		       todo - wq_busy, wq_busy);
88722851890Sopenharmony_ci 
88822851890Sopenharmony_ci 		if (wq_busy)
88922851890Sopenharmony_ci 			show_workqueue_state();
89022851890Sopenharmony_ci 
89122851890Sopenharmony_ci-		if (!wakeup || pm_debug_messages_on) {
89222851890Sopenharmony_ci+		if (pm_debug_messages_on) {
89322851890Sopenharmony_ci 			read_lock(&tasklist_lock);
89422851890Sopenharmony_ci 			for_each_process_thread(g, p) {
89522851890Sopenharmony_ci 				if (p != current && !freezer_should_skip(p)
89622851890Sopenharmony_cidiff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
89722851890Sopenharmony_ciindex 46b1804c1..a3491b29c 100644
89822851890Sopenharmony_ci--- a/kernel/power/snapshot.c
89922851890Sopenharmony_ci+++ b/kernel/power/snapshot.c
90022851890Sopenharmony_ci@@ -1144,7 +1144,15 @@ void free_basic_memory_bitmaps(void)
90122851890Sopenharmony_ci 	pr_debug("Basic memory bitmaps freed\n");
90222851890Sopenharmony_ci }
90322851890Sopenharmony_ci 
90422851890Sopenharmony_ci-void clear_free_pages(void)
90522851890Sopenharmony_ci+static void clear_or_poison_free_page(struct page *page)
90622851890Sopenharmony_ci+{
90722851890Sopenharmony_ci+	if (page_poisoning_enabled_static())
90822851890Sopenharmony_ci+		__kernel_poison_pages(page, 1);
90922851890Sopenharmony_ci+	else if (want_init_on_free())
91022851890Sopenharmony_ci+		clear_highpage(page);
91122851890Sopenharmony_ci+}
91222851890Sopenharmony_ci+
91322851890Sopenharmony_ci+void clear_or_poison_free_pages(void)
91422851890Sopenharmony_ci {
91522851890Sopenharmony_ci 	struct memory_bitmap *bm = free_pages_map;
91622851890Sopenharmony_ci 	unsigned long pfn;
91722851890Sopenharmony_ci@@ -1152,12 +1160,12 @@ void clear_free_pages(void)
91822851890Sopenharmony_ci 	if (WARN_ON(!(free_pages_map)))
91922851890Sopenharmony_ci 		return;
92022851890Sopenharmony_ci 
92122851890Sopenharmony_ci-	if (IS_ENABLED(CONFIG_PAGE_POISONING_ZERO) || want_init_on_free()) {
92222851890Sopenharmony_ci+	if (page_poisoning_enabled() || want_init_on_free()) {
92322851890Sopenharmony_ci 		memory_bm_position_reset(bm);
92422851890Sopenharmony_ci 		pfn = memory_bm_next_pfn(bm);
92522851890Sopenharmony_ci 		while (pfn != BM_END_OF_MAP) {
92622851890Sopenharmony_ci 			if (pfn_valid(pfn))
92722851890Sopenharmony_ci-				clear_highpage(pfn_to_page(pfn));
92822851890Sopenharmony_ci+				clear_or_poison_free_page(pfn_to_page(pfn));
92922851890Sopenharmony_ci 
93022851890Sopenharmony_ci 			pfn = memory_bm_next_pfn(bm);
93122851890Sopenharmony_ci 		}
93222851890Sopenharmony_cidiff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
93322851890Sopenharmony_ciindex 32391acc8..545958377 100644
93422851890Sopenharmony_ci--- a/kernel/power/suspend.c
93522851890Sopenharmony_ci+++ b/kernel/power/suspend.c
93622851890Sopenharmony_ci@@ -30,6 +30,7 @@
93722851890Sopenharmony_ci #include <trace/events/power.h>
93822851890Sopenharmony_ci #include <linux/compiler.h>
93922851890Sopenharmony_ci #include <linux/moduleparam.h>
94022851890Sopenharmony_ci+#include <linux/wakeup_reason.h>
94122851890Sopenharmony_ci 
94222851890Sopenharmony_ci #include "power.h"
94322851890Sopenharmony_ci 
94422851890Sopenharmony_ci@@ -138,6 +139,7 @@ static void s2idle_loop(void)
94522851890Sopenharmony_ci 			break;
94622851890Sopenharmony_ci 		}
94722851890Sopenharmony_ci 
94822851890Sopenharmony_ci+		clear_wakeup_reasons();
94922851890Sopenharmony_ci 		s2idle_enter();
95022851890Sopenharmony_ci 	}
95122851890Sopenharmony_ci 
95222851890Sopenharmony_ci@@ -357,6 +359,7 @@ static int suspend_prepare(suspend_state_t state)
95322851890Sopenharmony_ci 	if (!error)
95422851890Sopenharmony_ci 		return 0;
95522851890Sopenharmony_ci 
95622851890Sopenharmony_ci+	log_suspend_abort_reason("One or more tasks refusing to freeze");
95722851890Sopenharmony_ci 	suspend_stats.failed_freeze++;
95822851890Sopenharmony_ci 	dpm_save_failed_step(SUSPEND_FREEZE);
95922851890Sopenharmony_ci 	pm_notifier_call_chain(PM_POST_SUSPEND);
96022851890Sopenharmony_ci@@ -386,7 +389,7 @@ void __weak arch_suspend_enable_irqs(void)
96122851890Sopenharmony_ci  */
96222851890Sopenharmony_ci static int suspend_enter(suspend_state_t state, bool *wakeup)
96322851890Sopenharmony_ci {
96422851890Sopenharmony_ci-	int error;
96522851890Sopenharmony_ci+	int error, last_dev;
96622851890Sopenharmony_ci 
96722851890Sopenharmony_ci 	error = platform_suspend_prepare(state);
96822851890Sopenharmony_ci 	if (error)
96922851890Sopenharmony_ci@@ -394,7 +397,11 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
97022851890Sopenharmony_ci 
97122851890Sopenharmony_ci 	error = dpm_suspend_late(PMSG_SUSPEND);
97222851890Sopenharmony_ci 	if (error) {
97322851890Sopenharmony_ci+		last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
97422851890Sopenharmony_ci+		last_dev %= REC_FAILED_NUM;
97522851890Sopenharmony_ci 		pr_err("late suspend of devices failed\n");
97622851890Sopenharmony_ci+		log_suspend_abort_reason("late suspend of %s device failed",
97722851890Sopenharmony_ci+					 suspend_stats.failed_devs[last_dev]);
97822851890Sopenharmony_ci 		goto Platform_finish;
97922851890Sopenharmony_ci 	}
98022851890Sopenharmony_ci 	error = platform_suspend_prepare_late(state);
98122851890Sopenharmony_ci@@ -403,7 +410,11 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
98222851890Sopenharmony_ci 
98322851890Sopenharmony_ci 	error = dpm_suspend_noirq(PMSG_SUSPEND);
98422851890Sopenharmony_ci 	if (error) {
98522851890Sopenharmony_ci+		last_dev = suspend_stats.last_failed_dev + REC_FAILED_NUM - 1;
98622851890Sopenharmony_ci+		last_dev %= REC_FAILED_NUM;
98722851890Sopenharmony_ci 		pr_err("noirq suspend of devices failed\n");
98822851890Sopenharmony_ci+		log_suspend_abort_reason("noirq suspend of %s device failed",
98922851890Sopenharmony_ci+					 suspend_stats.failed_devs[last_dev]);
99022851890Sopenharmony_ci 		goto Platform_early_resume;
99122851890Sopenharmony_ci 	}
99222851890Sopenharmony_ci 	error = platform_suspend_prepare_noirq(state);
99322851890Sopenharmony_ci@@ -419,8 +430,10 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
99422851890Sopenharmony_ci 	}
99522851890Sopenharmony_ci 
99622851890Sopenharmony_ci 	error = suspend_disable_secondary_cpus();
99722851890Sopenharmony_ci-	if (error || suspend_test(TEST_CPUS))
99822851890Sopenharmony_ci+	if (error || suspend_test(TEST_CPUS)) {
99922851890Sopenharmony_ci+		log_suspend_abort_reason("Disabling non-boot cpus failed");
100022851890Sopenharmony_ci 		goto Enable_cpus;
100122851890Sopenharmony_ci+	}
100222851890Sopenharmony_ci 
100322851890Sopenharmony_ci 	arch_suspend_disable_irqs();
100422851890Sopenharmony_ci 	BUG_ON(!irqs_disabled());
100522851890Sopenharmony_ci@@ -491,6 +504,8 @@ int suspend_devices_and_enter(suspend_state_t state)
100622851890Sopenharmony_ci 	error = dpm_suspend_start(PMSG_SUSPEND);
100722851890Sopenharmony_ci 	if (error) {
100822851890Sopenharmony_ci 		pr_err("Some devices failed to suspend, or early wake event detected\n");
100922851890Sopenharmony_ci+		log_suspend_abort_reason(
101022851890Sopenharmony_ci+				"Some devices failed to suspend, or early wake event detected");
101122851890Sopenharmony_ci 		goto Recover_platform;
101222851890Sopenharmony_ci 	}
101322851890Sopenharmony_ci 	suspend_test_finish("suspend devices");
101422851890Sopenharmony_cidiff --git a/kernel/reboot.c b/kernel/reboot.c
101522851890Sopenharmony_ciindex af6f23d8b..bce629531 100644
101622851890Sopenharmony_ci--- a/kernel/reboot.c
101722851890Sopenharmony_ci+++ b/kernel/reboot.c
101822851890Sopenharmony_ci@@ -215,6 +215,27 @@ void do_kernel_restart(char *cmd)
101922851890Sopenharmony_ci 	atomic_notifier_call_chain(&restart_handler_list, reboot_mode, cmd);
102022851890Sopenharmony_ci }
102122851890Sopenharmony_ci 
102222851890Sopenharmony_ci+#ifdef CONFIG_NO_GKI
102322851890Sopenharmony_ci+static ATOMIC_NOTIFIER_HEAD(pre_restart_handler_list);
102422851890Sopenharmony_ci+
102522851890Sopenharmony_ci+int register_pre_restart_handler(struct notifier_block *nb)
102622851890Sopenharmony_ci+{
102722851890Sopenharmony_ci+	return atomic_notifier_chain_register(&pre_restart_handler_list, nb);
102822851890Sopenharmony_ci+}
102922851890Sopenharmony_ci+EXPORT_SYMBOL(register_pre_restart_handler);
103022851890Sopenharmony_ci+
103122851890Sopenharmony_ci+int unregister_pre_restart_handler(struct notifier_block *nb)
103222851890Sopenharmony_ci+{
103322851890Sopenharmony_ci+	return atomic_notifier_chain_unregister(&pre_restart_handler_list, nb);
103422851890Sopenharmony_ci+}
103522851890Sopenharmony_ci+EXPORT_SYMBOL(unregister_pre_restart_handler);
103622851890Sopenharmony_ci+
103722851890Sopenharmony_ci+void do_kernel_pre_restart(char *cmd)
103822851890Sopenharmony_ci+{
103922851890Sopenharmony_ci+	atomic_notifier_call_chain(&pre_restart_handler_list, reboot_mode, cmd);
104022851890Sopenharmony_ci+}
104122851890Sopenharmony_ci+#endif
104222851890Sopenharmony_ci+
104322851890Sopenharmony_ci void migrate_to_reboot_cpu(void)
104422851890Sopenharmony_ci {
104522851890Sopenharmony_ci 	/* The boot cpu is always logical cpu 0 */
104622851890Sopenharmony_cidiff --git a/kernel/sched/core.c b/kernel/sched/core.c
104722851890Sopenharmony_ciindex e2f00be4b..750da3e7c 100644
104822851890Sopenharmony_ci--- a/kernel/sched/core.c
104922851890Sopenharmony_ci+++ b/kernel/sched/core.c
105022851890Sopenharmony_ci@@ -47,6 +47,13 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(sched_overutilized_tp);
105122851890Sopenharmony_ci EXPORT_TRACEPOINT_SYMBOL_GPL(sched_util_est_cfs_tp);
105222851890Sopenharmony_ci EXPORT_TRACEPOINT_SYMBOL_GPL(sched_util_est_se_tp);
105322851890Sopenharmony_ci EXPORT_TRACEPOINT_SYMBOL_GPL(sched_update_nr_running_tp);
105422851890Sopenharmony_ci+EXPORT_TRACEPOINT_SYMBOL_GPL(sched_waking);
105522851890Sopenharmony_ci+#ifdef CONFIG_SCHEDSTATS
105622851890Sopenharmony_ci+EXPORT_TRACEPOINT_SYMBOL_GPL(sched_stat_sleep);
105722851890Sopenharmony_ci+EXPORT_TRACEPOINT_SYMBOL_GPL(sched_stat_wait);
105822851890Sopenharmony_ci+EXPORT_TRACEPOINT_SYMBOL_GPL(sched_stat_iowait);
105922851890Sopenharmony_ci+EXPORT_TRACEPOINT_SYMBOL_GPL(sched_stat_blocked);
106022851890Sopenharmony_ci+#endif
106122851890Sopenharmony_ci 
106222851890Sopenharmony_ci DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues);
106322851890Sopenharmony_ci 
106422851890Sopenharmony_ci@@ -660,7 +667,7 @@ int get_nohz_timer_target(void)
106522851890Sopenharmony_ci 	int i, cpu = smp_processor_id(), default_cpu = -1;
106622851890Sopenharmony_ci 	struct sched_domain *sd;
106722851890Sopenharmony_ci 
106822851890Sopenharmony_ci-	if (housekeeping_cpu(cpu, HK_FLAG_TIMER)) {
106922851890Sopenharmony_ci+	if (housekeeping_cpu(cpu, HK_FLAG_TIMER) && cpu_active(cpu)) {
107022851890Sopenharmony_ci 		if (!idle_cpu(cpu))
107122851890Sopenharmony_ci 			return cpu;
107222851890Sopenharmony_ci 		default_cpu = cpu;
107322851890Sopenharmony_ci@@ -680,8 +687,25 @@ int get_nohz_timer_target(void)
107422851890Sopenharmony_ci 		}
107522851890Sopenharmony_ci 	}
107622851890Sopenharmony_ci 
107722851890Sopenharmony_ci-	if (default_cpu == -1)
107822851890Sopenharmony_ci-		default_cpu = housekeeping_any_cpu(HK_FLAG_TIMER);
107922851890Sopenharmony_ci+	if (default_cpu == -1) {
108022851890Sopenharmony_ci+		for_each_cpu_and(i, cpu_active_mask,
108122851890Sopenharmony_ci+				 housekeeping_cpumask(HK_FLAG_TIMER)) {
108222851890Sopenharmony_ci+			if (cpu == i)
108322851890Sopenharmony_ci+				continue;
108422851890Sopenharmony_ci+
108522851890Sopenharmony_ci+			if (!idle_cpu(i)) {
108622851890Sopenharmony_ci+				cpu = i;
108722851890Sopenharmony_ci+				goto unlock;
108822851890Sopenharmony_ci+			}
108922851890Sopenharmony_ci+		}
109022851890Sopenharmony_ci+
109122851890Sopenharmony_ci+		/* no active, not-idle, housekpeeing CPU found. */
109222851890Sopenharmony_ci+		default_cpu = cpumask_any(cpu_active_mask);
109322851890Sopenharmony_ci+
109422851890Sopenharmony_ci+		if (unlikely(default_cpu >= nr_cpu_ids))
109522851890Sopenharmony_ci+			goto unlock;
109622851890Sopenharmony_ci+	}
109722851890Sopenharmony_ci+
109822851890Sopenharmony_ci 	cpu = default_cpu;
109922851890Sopenharmony_ci unlock:
110022851890Sopenharmony_ci 	rcu_read_unlock();
110122851890Sopenharmony_ci@@ -1770,7 +1794,10 @@ static inline bool is_cpu_allowed(struct task_struct *p, int cpu)
110222851890Sopenharmony_ci 	if (is_per_cpu_kthread(p))
110322851890Sopenharmony_ci 		return cpu_online(cpu);
110422851890Sopenharmony_ci 
110522851890Sopenharmony_ci-	return cpu_active(cpu);
110622851890Sopenharmony_ci+	if (!cpu_active(cpu))
110722851890Sopenharmony_ci+		return false;
110822851890Sopenharmony_ci+
110922851890Sopenharmony_ci+	return cpumask_test_cpu(cpu, task_cpu_possible_mask(p));
111022851890Sopenharmony_ci }
111122851890Sopenharmony_ci 
111222851890Sopenharmony_ci /*
111322851890Sopenharmony_ci@@ -2433,10 +2460,9 @@ static int select_fallback_rq(int cpu, struct task_struct *p)
111422851890Sopenharmony_ci 			}
111522851890Sopenharmony_ci 			fallthrough;
111622851890Sopenharmony_ci 		case possible:
111722851890Sopenharmony_ci-			do_set_cpus_allowed(p, cpu_possible_mask);
111822851890Sopenharmony_ci+			do_set_cpus_allowed(p, task_cpu_possible_mask(p));
111922851890Sopenharmony_ci 			state = fail;
112022851890Sopenharmony_ci 			break;
112122851890Sopenharmony_ci-
112222851890Sopenharmony_ci 		case fail:
112322851890Sopenharmony_ci #ifdef CONFIG_CPU_ISOLATION_OPT
112422851890Sopenharmony_ci 			allow_iso = true;
112522851890Sopenharmony_ci@@ -2627,6 +2653,9 @@ ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags,
112622851890Sopenharmony_ci {
112722851890Sopenharmony_ci 	int en_flags = ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK;
112822851890Sopenharmony_ci 
112922851890Sopenharmony_ci+	if (wake_flags & WF_SYNC)
113022851890Sopenharmony_ci+		en_flags |= ENQUEUE_WAKEUP_SYNC;
113122851890Sopenharmony_ci+
113222851890Sopenharmony_ci 	lockdep_assert_held(&rq->lock);
113322851890Sopenharmony_ci 
113422851890Sopenharmony_ci 	if (p->sched_contributes_to_load)
113522851890Sopenharmony_ci@@ -3019,6 +3048,19 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
113622851890Sopenharmony_ci 	if (!(p->state & state))
113722851890Sopenharmony_ci 		goto unlock;
113822851890Sopenharmony_ci 
113922851890Sopenharmony_ci+#ifdef CONFIG_FREEZER
114022851890Sopenharmony_ci+	/*
114122851890Sopenharmony_ci+	 * If we're going to wake up a thread which may be frozen, then
114222851890Sopenharmony_ci+	 * we can only do so if we have an active CPU which is capable of
114322851890Sopenharmony_ci+	 * running it. This may not be the case when resuming from suspend,
114422851890Sopenharmony_ci+	 * as the secondary CPUs may not yet be back online. See __thaw_task()
114522851890Sopenharmony_ci+	 * for the actual wakeup.
114622851890Sopenharmony_ci+	 */
114722851890Sopenharmony_ci+	if (unlikely(frozen_or_skipped(p)) &&
114822851890Sopenharmony_ci+	    !cpumask_intersects(cpu_active_mask, task_cpu_possible_mask(p)))
114922851890Sopenharmony_ci+		goto unlock;
115022851890Sopenharmony_ci+#endif
115122851890Sopenharmony_ci+
115222851890Sopenharmony_ci 	trace_sched_waking(p);
115322851890Sopenharmony_ci 
115422851890Sopenharmony_ci 	/* We're going to change ->state: */
115522851890Sopenharmony_ci@@ -5004,7 +5046,7 @@ asmlinkage __visible void __sched preempt_schedule_irq(void)
115622851890Sopenharmony_ci int default_wake_function(wait_queue_entry_t *curr, unsigned mode, int wake_flags,
115722851890Sopenharmony_ci 			  void *key)
115822851890Sopenharmony_ci {
115922851890Sopenharmony_ci-	WARN_ON_ONCE(IS_ENABLED(CONFIG_SCHED_DEBUG) && wake_flags & ~WF_SYNC);
116022851890Sopenharmony_ci+	WARN_ON_ONCE(IS_ENABLED(CONFIG_SCHED_DEBUG) && wake_flags & ~(WF_SYNC));
116122851890Sopenharmony_ci 	return try_to_wake_up(curr->private, mode, wake_flags);
116222851890Sopenharmony_ci }
116322851890Sopenharmony_ci EXPORT_SYMBOL(default_wake_function);
116422851890Sopenharmony_ci@@ -5713,16 +5755,19 @@ int sched_setscheduler(struct task_struct *p, int policy,
116522851890Sopenharmony_ci {
116622851890Sopenharmony_ci 	return _sched_setscheduler(p, policy, param, true);
116722851890Sopenharmony_ci }
116822851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(sched_setscheduler);
116922851890Sopenharmony_ci 
117022851890Sopenharmony_ci int sched_setattr(struct task_struct *p, const struct sched_attr *attr)
117122851890Sopenharmony_ci {
117222851890Sopenharmony_ci 	return __sched_setscheduler(p, attr, true, true);
117322851890Sopenharmony_ci }
117422851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(sched_setattr);
117522851890Sopenharmony_ci 
117622851890Sopenharmony_ci int sched_setattr_nocheck(struct task_struct *p, const struct sched_attr *attr)
117722851890Sopenharmony_ci {
117822851890Sopenharmony_ci 	return __sched_setscheduler(p, attr, false, true);
117922851890Sopenharmony_ci }
118022851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(sched_setattr_nocheck);
118122851890Sopenharmony_ci 
118222851890Sopenharmony_ci /**
118322851890Sopenharmony_ci  * sched_setscheduler_nocheck - change the scheduling policy and/or RT priority of a thread from kernelspace.
118422851890Sopenharmony_ci@@ -5742,6 +5787,7 @@ int sched_setscheduler_nocheck(struct task_struct *p, int policy,
118522851890Sopenharmony_ci {
118622851890Sopenharmony_ci 	return _sched_setscheduler(p, policy, param, false);
118722851890Sopenharmony_ci }
118822851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(sched_setscheduler_nocheck);
118922851890Sopenharmony_ci 
119022851890Sopenharmony_ci /*
119122851890Sopenharmony_ci  * SCHED_FIFO is a broken scheduler model; that is, it is fundamentally
119222851890Sopenharmony_ci@@ -7044,6 +7090,11 @@ void migrate_tasks(struct rq *dead_rq, struct rq_flags *rf,
119322851890Sopenharmony_ci 	 */
119422851890Sopenharmony_ci 	update_rq_clock(rq);
119522851890Sopenharmony_ci 
119622851890Sopenharmony_ci+#ifdef CONFIG_SCHED_DEBUG
119722851890Sopenharmony_ci+	/* note the clock update in orf */
119822851890Sopenharmony_ci+	orf.clock_update_flags |= RQCF_UPDATED;
119922851890Sopenharmony_ci+#endif
120022851890Sopenharmony_ci+
120122851890Sopenharmony_ci 	for (;;) {
120222851890Sopenharmony_ci 		/*
120322851890Sopenharmony_ci 		 * There's this thread running, bail when that's the only
120422851890Sopenharmony_cidiff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
120522851890Sopenharmony_ciindex 81e43a56d..4df7f4e68 100644
120622851890Sopenharmony_ci--- a/kernel/sched/fair.c
120722851890Sopenharmony_ci+++ b/kernel/sched/fair.c
120822851890Sopenharmony_ci@@ -86,6 +86,7 @@ enum sched_tunable_scaling sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_L
120922851890Sopenharmony_ci  * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds)
121022851890Sopenharmony_ci  */
121122851890Sopenharmony_ci unsigned int sysctl_sched_min_granularity			= 750000ULL;
121222851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(sysctl_sched_min_granularity);
121322851890Sopenharmony_ci static unsigned int normalized_sysctl_sched_min_granularity	= 750000ULL;
121422851890Sopenharmony_ci 
121522851890Sopenharmony_ci /*
121622851890Sopenharmony_ci@@ -10686,9 +10687,20 @@ void nohz_balance_enter_idle(int cpu)
121722851890Sopenharmony_ci 
121822851890Sopenharmony_ci 	SCHED_WARN_ON(cpu != smp_processor_id());
121922851890Sopenharmony_ci 
122022851890Sopenharmony_ci-	/* If this CPU is going down, then nothing needs to be done: */
122122851890Sopenharmony_ci-	if (!cpu_active(cpu))
122222851890Sopenharmony_ci+	if (!cpu_active(cpu)) {
122322851890Sopenharmony_ci+		/*
122422851890Sopenharmony_ci+		 * A CPU can be paused while it is idle with it's tick
122522851890Sopenharmony_ci+		 * stopped. nohz_balance_exit_idle() should be called
122622851890Sopenharmony_ci+		 * from the local CPU, so it can't be called during
122722851890Sopenharmony_ci+		 * pause. This results in paused CPU participating in
122822851890Sopenharmony_ci+		 * the nohz idle balance, which should be avoided.
122922851890Sopenharmony_ci+		 *
123022851890Sopenharmony_ci+		 * When the paused CPU exits idle and enters again,
123122851890Sopenharmony_ci+		 * exempt the paused CPU from nohz_balance_exit_idle.
123222851890Sopenharmony_ci+		 */
123322851890Sopenharmony_ci+		nohz_balance_exit_idle(rq);
123422851890Sopenharmony_ci 		return;
123522851890Sopenharmony_ci+	}
123622851890Sopenharmony_ci 
123722851890Sopenharmony_ci 	/* Spare idle load balancing on CPUs that don't want to be disturbed: */
123822851890Sopenharmony_ci 	if (!housekeeping_cpu(cpu, HK_FLAG_SCHED))
123922851890Sopenharmony_cidiff --git a/kernel/sched/idle.c b/kernel/sched/idle.c
124022851890Sopenharmony_ciindex 2593a733c..69afd8d1e 100644
124122851890Sopenharmony_ci--- a/kernel/sched/idle.c
124222851890Sopenharmony_ci+++ b/kernel/sched/idle.c
124322851890Sopenharmony_ci@@ -450,6 +450,7 @@ dequeue_task_idle(struct rq *rq, struct task_struct *p, int flags)
124422851890Sopenharmony_ci {
124522851890Sopenharmony_ci 	raw_spin_unlock_irq(&rq->lock);
124622851890Sopenharmony_ci 	printk(KERN_ERR "bad: scheduling from the idle thread!\n");
124722851890Sopenharmony_ci+
124822851890Sopenharmony_ci 	dump_stack();
124922851890Sopenharmony_ci 	raw_spin_lock_irq(&rq->lock);
125022851890Sopenharmony_ci }
125122851890Sopenharmony_cidiff --git a/kernel/sched/loadavg.c b/kernel/sched/loadavg.c
125222851890Sopenharmony_ciindex d2a655643..b5837e277 100644
125322851890Sopenharmony_ci--- a/kernel/sched/loadavg.c
125422851890Sopenharmony_ci+++ b/kernel/sched/loadavg.c
125522851890Sopenharmony_ci@@ -75,6 +75,7 @@ void get_avenrun(unsigned long *loads, unsigned long offset, int shift)
125622851890Sopenharmony_ci 	loads[1] = (avenrun[1] + offset) << shift;
125722851890Sopenharmony_ci 	loads[2] = (avenrun[2] + offset) << shift;
125822851890Sopenharmony_ci }
125922851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(get_avenrun);
126022851890Sopenharmony_ci 
126122851890Sopenharmony_ci long calc_load_fold_active(struct rq *this_rq, long adjust)
126222851890Sopenharmony_ci {
126322851890Sopenharmony_cidiff --git a/kernel/sched/pelt.c b/kernel/sched/pelt.c
126422851890Sopenharmony_ciindex 2c613e1cf..e2890b677 100644
126522851890Sopenharmony_ci--- a/kernel/sched/pelt.c
126622851890Sopenharmony_ci+++ b/kernel/sched/pelt.c
126722851890Sopenharmony_ci@@ -28,6 +28,42 @@
126822851890Sopenharmony_ci #include "sched.h"
126922851890Sopenharmony_ci #include "pelt.h"
127022851890Sopenharmony_ci 
127122851890Sopenharmony_ci+int pelt_load_avg_period = PELT32_LOAD_AVG_PERIOD;
127222851890Sopenharmony_ci+int pelt_load_avg_max = PELT32_LOAD_AVG_MAX;
127322851890Sopenharmony_ci+const u32 *pelt_runnable_avg_yN_inv = pelt32_runnable_avg_yN_inv;
127422851890Sopenharmony_ci+
127522851890Sopenharmony_ci+static int __init set_pelt(char *str)
127622851890Sopenharmony_ci+{
127722851890Sopenharmony_ci+	int rc, num;
127822851890Sopenharmony_ci+
127922851890Sopenharmony_ci+	rc = kstrtoint(str, 0, &num);
128022851890Sopenharmony_ci+	if (rc) {
128122851890Sopenharmony_ci+		pr_err("%s: kstrtoint failed. rc=%d\n", __func__, rc);
128222851890Sopenharmony_ci+		return 0;
128322851890Sopenharmony_ci+	}
128422851890Sopenharmony_ci+
128522851890Sopenharmony_ci+	switch (num) {
128622851890Sopenharmony_ci+	case PELT8_LOAD_AVG_PERIOD:
128722851890Sopenharmony_ci+		pelt_load_avg_period = PELT8_LOAD_AVG_PERIOD;
128822851890Sopenharmony_ci+		pelt_load_avg_max = PELT8_LOAD_AVG_MAX;
128922851890Sopenharmony_ci+		pelt_runnable_avg_yN_inv = pelt8_runnable_avg_yN_inv;
129022851890Sopenharmony_ci+		pr_info("PELT half life is set to %dms\n", num);
129122851890Sopenharmony_ci+		break;
129222851890Sopenharmony_ci+	case PELT32_LOAD_AVG_PERIOD:
129322851890Sopenharmony_ci+		pelt_load_avg_period = PELT32_LOAD_AVG_PERIOD;
129422851890Sopenharmony_ci+		pelt_load_avg_max = PELT32_LOAD_AVG_MAX;
129522851890Sopenharmony_ci+		pelt_runnable_avg_yN_inv = pelt32_runnable_avg_yN_inv;
129622851890Sopenharmony_ci+		pr_info("PELT half life is set to %dms\n", num);
129722851890Sopenharmony_ci+		break;
129822851890Sopenharmony_ci+	default:
129922851890Sopenharmony_ci+		pr_err("Default PELT half life is 32ms\n");
130022851890Sopenharmony_ci+	}
130122851890Sopenharmony_ci+
130222851890Sopenharmony_ci+	return 0;
130322851890Sopenharmony_ci+}
130422851890Sopenharmony_ci+
130522851890Sopenharmony_ci+early_param("pelt", set_pelt);
130622851890Sopenharmony_ci+
130722851890Sopenharmony_ci /*
130822851890Sopenharmony_ci  * Approximate:
130922851890Sopenharmony_ci  *   val * y^n,    where y^32 ~= 0.5 (~1 scheduling period)
131022851890Sopenharmony_ci@@ -54,7 +90,7 @@ static u64 decay_load(u64 val, u64 n)
131122851890Sopenharmony_ci 		local_n %= LOAD_AVG_PERIOD;
131222851890Sopenharmony_ci 	}
131322851890Sopenharmony_ci 
131422851890Sopenharmony_ci-	val = mul_u64_u32_shr(val, runnable_avg_yN_inv[local_n], 32);
131522851890Sopenharmony_ci+	val = mul_u64_u32_shr(val, pelt_runnable_avg_yN_inv[local_n], 32);
131622851890Sopenharmony_ci 	return val;
131722851890Sopenharmony_ci }
131822851890Sopenharmony_ci 
131922851890Sopenharmony_cidiff --git a/kernel/sched/psi.c b/kernel/sched/psi.c
132022851890Sopenharmony_ciindex b7f38f3ad..b0e6c438f 100644
132122851890Sopenharmony_ci--- a/kernel/sched/psi.c
132222851890Sopenharmony_ci+++ b/kernel/sched/psi.c
132322851890Sopenharmony_ci@@ -550,7 +550,7 @@ static u64 update_triggers(struct psi_group *group, u64 now)
132422851890Sopenharmony_ci 	return now + group->poll_min_period;
132522851890Sopenharmony_ci }
132622851890Sopenharmony_ci 
132722851890Sopenharmony_ci-/* Schedule polling if it's not already scheduled. */
132822851890Sopenharmony_ci+/* Schedule polling if it's not already scheduled or forced. */
132922851890Sopenharmony_ci static void psi_schedule_poll_work(struct psi_group *group, unsigned long delay)
133022851890Sopenharmony_ci {
133122851890Sopenharmony_ci 	struct task_struct *task;
133222851890Sopenharmony_cidiff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
133322851890Sopenharmony_ciindex d5c00fa02..689cc1a63 100644
133422851890Sopenharmony_ci--- a/kernel/sched/rt.c
133522851890Sopenharmony_ci+++ b/kernel/sched/rt.c
133622851890Sopenharmony_ci@@ -1393,6 +1393,27 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags)
133722851890Sopenharmony_ci 	enqueue_top_rt_rq(&rq->rt);
133822851890Sopenharmony_ci }
133922851890Sopenharmony_ci 
134022851890Sopenharmony_ci+#ifdef CONFIG_SMP
134122851890Sopenharmony_ci+static inline bool should_honor_rt_sync(struct rq *rq, struct task_struct *p,
134222851890Sopenharmony_ci+					bool sync)
134322851890Sopenharmony_ci+{
134422851890Sopenharmony_ci+	/*
134522851890Sopenharmony_ci+	 * If the waker is CFS, then an RT sync wakeup would preempt the waker
134622851890Sopenharmony_ci+	 * and force it to run for a likely small time after the RT wakee is
134722851890Sopenharmony_ci+	 * done. So, only honor RT sync wakeups from RT wakers.
134822851890Sopenharmony_ci+	 */
134922851890Sopenharmony_ci+	return sync && task_has_rt_policy(rq->curr) &&
135022851890Sopenharmony_ci+		p->prio <= rq->rt.highest_prio.next &&
135122851890Sopenharmony_ci+		rq->rt.rt_nr_running <= 2;
135222851890Sopenharmony_ci+}
135322851890Sopenharmony_ci+#else
135422851890Sopenharmony_ci+static inline bool should_honor_rt_sync(struct rq *rq, struct task_struct *p,
135522851890Sopenharmony_ci+					bool sync)
135622851890Sopenharmony_ci+{
135722851890Sopenharmony_ci+	return 0;
135822851890Sopenharmony_ci+}
135922851890Sopenharmony_ci+#endif
136022851890Sopenharmony_ci+
136122851890Sopenharmony_ci /*
136222851890Sopenharmony_ci  * Adding/removing a task to/from a priority array:
136322851890Sopenharmony_ci  */
136422851890Sopenharmony_ci@@ -1400,6 +1421,7 @@ static void
136522851890Sopenharmony_ci enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags)
136622851890Sopenharmony_ci {
136722851890Sopenharmony_ci 	struct sched_rt_entity *rt_se = &p->rt;
136822851890Sopenharmony_ci+	bool sync = !!(flags & ENQUEUE_WAKEUP_SYNC);
136922851890Sopenharmony_ci 
137022851890Sopenharmony_ci 	if (flags & ENQUEUE_WAKEUP)
137122851890Sopenharmony_ci 		rt_se->timeout = 0;
137222851890Sopenharmony_ci@@ -1407,7 +1429,8 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags)
137322851890Sopenharmony_ci 	enqueue_rt_entity(rt_se, flags);
137422851890Sopenharmony_ci 	walt_inc_cumulative_runnable_avg(rq, p);
137522851890Sopenharmony_ci 
137622851890Sopenharmony_ci-	if (!task_current(rq, p) && p->nr_cpus_allowed > 1)
137722851890Sopenharmony_ci+	if (!task_current(rq, p) && p->nr_cpus_allowed > 1 &&
137822851890Sopenharmony_ci+	    !should_honor_rt_sync(rq, p, sync))
137922851890Sopenharmony_ci 		enqueue_pushable_task(rq, p);
138022851890Sopenharmony_ci }
138122851890Sopenharmony_ci 
138222851890Sopenharmony_ci@@ -1464,7 +1487,10 @@ select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags)
138322851890Sopenharmony_ci {
138422851890Sopenharmony_ci 	struct task_struct *curr;
138522851890Sopenharmony_ci 	struct rq *rq;
138622851890Sopenharmony_ci+	struct rq *this_cpu_rq;
138722851890Sopenharmony_ci 	bool test;
138822851890Sopenharmony_ci+	bool sync = !!(flags & WF_SYNC);
138922851890Sopenharmony_ci+	int this_cpu;
139022851890Sopenharmony_ci 
139122851890Sopenharmony_ci 	/* For anything but wake ups, just return the task_cpu */
139222851890Sopenharmony_ci 	if (sd_flag != SD_BALANCE_WAKE && sd_flag != SD_BALANCE_FORK)
139322851890Sopenharmony_ci@@ -1474,6 +1500,8 @@ select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags)
139422851890Sopenharmony_ci 
139522851890Sopenharmony_ci 	rcu_read_lock();
139622851890Sopenharmony_ci 	curr = READ_ONCE(rq->curr); /* unlocked access */
139722851890Sopenharmony_ci+	this_cpu = smp_processor_id();
139822851890Sopenharmony_ci+	this_cpu_rq = cpu_rq(this_cpu);
139922851890Sopenharmony_ci 
140022851890Sopenharmony_ci 	/*
140122851890Sopenharmony_ci 	 * If the current task on @p's runqueue is an RT task, then
140222851890Sopenharmony_ci@@ -1508,6 +1536,15 @@ select_task_rq_rt(struct task_struct *p, int cpu, int sd_flag, int flags)
140322851890Sopenharmony_ci 	test |= sysctl_sched_enable_rt_cas;
140422851890Sopenharmony_ci #endif
140522851890Sopenharmony_ci 
140622851890Sopenharmony_ci+	/*
140722851890Sopenharmony_ci+	 * Respect the sync flag as long as the task can run on this CPU.
140822851890Sopenharmony_ci+	 */
140922851890Sopenharmony_ci+	if (should_honor_rt_sync(this_cpu_rq, p, sync) &&
141022851890Sopenharmony_ci+	    cpumask_test_cpu(this_cpu, p->cpus_ptr)) {
141122851890Sopenharmony_ci+		cpu = this_cpu;
141222851890Sopenharmony_ci+		goto out_unlock;
141322851890Sopenharmony_ci+	}
141422851890Sopenharmony_ci+
141522851890Sopenharmony_ci 	if (test || !rt_task_fits_capacity(p, cpu)) {
141622851890Sopenharmony_ci 		int target = find_lowest_rq(p);
141722851890Sopenharmony_ci 
141822851890Sopenharmony_cidiff --git a/kernel/sched/sched-pelt.h b/kernel/sched/sched-pelt.h
141922851890Sopenharmony_ciindex c529706be..92a6875bc 100644
142022851890Sopenharmony_ci--- a/kernel/sched/sched-pelt.h
142122851890Sopenharmony_ci+++ b/kernel/sched/sched-pelt.h
142222851890Sopenharmony_ci@@ -1,7 +1,7 @@
142322851890Sopenharmony_ci /* SPDX-License-Identifier: GPL-2.0 */
142422851890Sopenharmony_ci /* Generated by Documentation/scheduler/sched-pelt; do not modify. */
142522851890Sopenharmony_ci 
142622851890Sopenharmony_ci-static const u32 runnable_avg_yN_inv[] __maybe_unused = {
142722851890Sopenharmony_ci+static const u32 pelt32_runnable_avg_yN_inv[] __maybe_unused = {
142822851890Sopenharmony_ci 	0xffffffff, 0xfa83b2da, 0xf5257d14, 0xefe4b99a, 0xeac0c6e6, 0xe5b906e6,
142922851890Sopenharmony_ci 	0xe0ccdeeb, 0xdbfbb796, 0xd744fcc9, 0xd2a81d91, 0xce248c14, 0xc9b9bd85,
143022851890Sopenharmony_ci 	0xc5672a10, 0xc12c4cc9, 0xbd08a39e, 0xb8fbaf46, 0xb504f333, 0xb123f581,
143122851890Sopenharmony_ci@@ -10,5 +10,20 @@ static const u32 runnable_avg_yN_inv[] __maybe_unused = {
143222851890Sopenharmony_ci 	0x85aac367, 0x82cd8698,
143322851890Sopenharmony_ci };
143422851890Sopenharmony_ci 
143522851890Sopenharmony_ci-#define LOAD_AVG_PERIOD 32
143622851890Sopenharmony_ci-#define LOAD_AVG_MAX 47742
143722851890Sopenharmony_ci+#define PELT32_LOAD_AVG_PERIOD 32
143822851890Sopenharmony_ci+#define PELT32_LOAD_AVG_MAX 47742
143922851890Sopenharmony_ci+
144022851890Sopenharmony_ci+static const u32 pelt8_runnable_avg_yN_inv[] __maybe_unused = {
144122851890Sopenharmony_ci+	0xffffffff, 0xeac0c6e6, 0xd744fcc9, 0xc5672a10,
144222851890Sopenharmony_ci+	0xb504f333, 0xa5fed6a9, 0x9837f050, 0x8b95c1e3,
144322851890Sopenharmony_ci+};
144422851890Sopenharmony_ci+
144522851890Sopenharmony_ci+#define PELT8_LOAD_AVG_PERIOD 8
144622851890Sopenharmony_ci+#define PELT8_LOAD_AVG_MAX 12336
144722851890Sopenharmony_ci+
144822851890Sopenharmony_ci+extern const u32 *pelt_runnable_avg_yN_inv;
144922851890Sopenharmony_ci+extern int pelt_load_avg_period;
145022851890Sopenharmony_ci+extern int pelt_load_avg_max;
145122851890Sopenharmony_ci+
145222851890Sopenharmony_ci+#define LOAD_AVG_PERIOD pelt_load_avg_period
145322851890Sopenharmony_ci+#define LOAD_AVG_MAX pelt_load_avg_max
145422851890Sopenharmony_cidiff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
145522851890Sopenharmony_ciindex 592c8653c..7c02fed0a 100644
145622851890Sopenharmony_ci--- a/kernel/sched/sched.h
145722851890Sopenharmony_ci+++ b/kernel/sched/sched.h
145822851890Sopenharmony_ci@@ -1913,6 +1913,8 @@ extern const int		sched_latency_to_weight[40];
145922851890Sopenharmony_ci #define ENQUEUE_MIGRATED	0x00
146022851890Sopenharmony_ci #endif
146122851890Sopenharmony_ci 
146222851890Sopenharmony_ci+#define ENQUEUE_WAKEUP_SYNC	0x80
146322851890Sopenharmony_ci+
146422851890Sopenharmony_ci #define RETRY_TASK		((void *)-1UL)
146522851890Sopenharmony_ci 
146622851890Sopenharmony_ci struct sched_class {
146722851890Sopenharmony_cidiff --git a/kernel/sched/topology.c b/kernel/sched/topology.c
146822851890Sopenharmony_ciindex 9191e5daa..58d840c62 100644
146922851890Sopenharmony_ci--- a/kernel/sched/topology.c
147022851890Sopenharmony_ci+++ b/kernel/sched/topology.c
147122851890Sopenharmony_ci@@ -5,6 +5,9 @@
147222851890Sopenharmony_ci #include "sched.h"
147322851890Sopenharmony_ci 
147422851890Sopenharmony_ci DEFINE_MUTEX(sched_domains_mutex);
147522851890Sopenharmony_ci+#ifdef CONFIG_LOCKDEP
147622851890Sopenharmony_ci+EXPORT_SYMBOL_GPL(sched_domains_mutex);
147722851890Sopenharmony_ci+#endif
147822851890Sopenharmony_ci 
147922851890Sopenharmony_ci /* Protected by sched_domains_mutex: */
148022851890Sopenharmony_ci static cpumask_var_t sched_domains_tmpmask;
148122851890Sopenharmony_cidiff --git a/kernel/sched/wait.c b/kernel/sched/wait.c
148222851890Sopenharmony_ciindex a55642aa3..6911bbca0 100644
148322851890Sopenharmony_ci--- a/kernel/sched/wait.c
148422851890Sopenharmony_ci+++ b/kernel/sched/wait.c
148522851890Sopenharmony_ci@@ -396,7 +396,8 @@ void finish_wait(struct wait_queue_head *wq_head, struct wait_queue_entry *wq_en
148622851890Sopenharmony_ci }
148722851890Sopenharmony_ci EXPORT_SYMBOL(finish_wait);
148822851890Sopenharmony_ci 
148922851890Sopenharmony_ci-int autoremove_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key)
149022851890Sopenharmony_ci+__sched int autoremove_wake_function(struct wait_queue_entry *wq_entry, unsigned int mode,
149122851890Sopenharmony_ci+				     int sync, void *key)
149222851890Sopenharmony_ci {
149322851890Sopenharmony_ci 	int ret = default_wake_function(wq_entry, mode, sync, key);
149422851890Sopenharmony_ci 
149522851890Sopenharmony_ci@@ -432,7 +433,7 @@ static inline bool is_kthread_should_stop(void)
149622851890Sopenharmony_ci  * }						smp_mb(); // C
149722851890Sopenharmony_ci  * remove_wait_queue(&wq_head, &wait);		wq_entry->flags |= WQ_FLAG_WOKEN;
149822851890Sopenharmony_ci  */
149922851890Sopenharmony_ci-long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout)
150022851890Sopenharmony_ci+__sched long wait_woken(struct wait_queue_entry *wq_entry, unsigned int mode, long timeout)
150122851890Sopenharmony_ci {
150222851890Sopenharmony_ci 	/*
150322851890Sopenharmony_ci 	 * The below executes an smp_mb(), which matches with the full barrier
150422851890Sopenharmony_ci@@ -457,7 +458,8 @@ long wait_woken(struct wait_queue_entry *wq_entry, unsigned mode, long timeout)
150522851890Sopenharmony_ci }
150622851890Sopenharmony_ci EXPORT_SYMBOL(wait_woken);
150722851890Sopenharmony_ci 
150822851890Sopenharmony_ci-int woken_wake_function(struct wait_queue_entry *wq_entry, unsigned mode, int sync, void *key)
150922851890Sopenharmony_ci+__sched int woken_wake_function(struct wait_queue_entry *wq_entry, unsigned int mode,
151022851890Sopenharmony_ci+				int sync, void *key)
151122851890Sopenharmony_ci {
151222851890Sopenharmony_ci 	/* Pairs with the smp_store_mb() in wait_woken(). */
151322851890Sopenharmony_ci 	smp_mb(); /* C */
151422851890Sopenharmony_cidiff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
151522851890Sopenharmony_ciindex 3e6740207..033fa94f3 100644
151622851890Sopenharmony_ci--- a/kernel/stop_machine.c
151722851890Sopenharmony_ci+++ b/kernel/stop_machine.c
151822851890Sopenharmony_ci@@ -27,6 +27,7 @@
151922851890Sopenharmony_ci  * Structure to determine completion condition and record errors.  May
152022851890Sopenharmony_ci  * be shared by works on different cpus.
152122851890Sopenharmony_ci  */
152222851890Sopenharmony_ci+
152322851890Sopenharmony_ci struct cpu_stop_done {
152422851890Sopenharmony_ci 	atomic_t		nr_todo;	/* nr left to execute */
152522851890Sopenharmony_ci 	int			ret;		/* collected return value */
1526