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