Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b29473d6 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "cgroup/cpuset: Change cpuset_rwsem and hotplug lock order"

parents 7bad60ee cd091f5a
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -40,14 +40,14 @@ static inline bool cpusets_enabled(void)


static inline void cpuset_inc(void)
static inline void cpuset_inc(void)
{
{
	static_branch_inc(&cpusets_pre_enable_key);
	static_branch_inc_cpuslocked(&cpusets_pre_enable_key);
	static_branch_inc(&cpusets_enabled_key);
	static_branch_inc_cpuslocked(&cpusets_enabled_key);
}
}


static inline void cpuset_dec(void)
static inline void cpuset_dec(void)
{
{
	static_branch_dec(&cpusets_enabled_key);
	static_branch_dec_cpuslocked(&cpusets_enabled_key);
	static_branch_dec(&cpusets_pre_enable_key);
	static_branch_dec_cpuslocked(&cpusets_pre_enable_key);
}
}


extern int cpuset_init(void);
extern int cpuset_init(void);
+14 −4
Original line number Original line Diff line number Diff line
@@ -837,8 +837,8 @@ static void rebuild_sched_domains_locked(void)
	cpumask_var_t *doms;
	cpumask_var_t *doms;
	int ndoms;
	int ndoms;


	lockdep_assert_cpus_held();
	lockdep_assert_held(&cpuset_mutex);
	lockdep_assert_held(&cpuset_mutex);
	get_online_cpus();


	/*
	/*
	 * We have raced with CPU hotplug. Don't do anything to avoid
	 * We have raced with CPU hotplug. Don't do anything to avoid
@@ -846,15 +846,13 @@ static void rebuild_sched_domains_locked(void)
	 * Anyways, hotplug work item will rebuild sched domains.
	 * Anyways, hotplug work item will rebuild sched domains.
	 */
	 */
	if (!cpumask_equal(top_cpuset.effective_cpus, cpu_active_mask))
	if (!cpumask_equal(top_cpuset.effective_cpus, cpu_active_mask))
		goto out;
		return;


	/* Generate domain masks and attrs */
	/* Generate domain masks and attrs */
	ndoms = generate_sched_domains(&doms, &attr);
	ndoms = generate_sched_domains(&doms, &attr);


	/* Have scheduler rebuild the domains */
	/* Have scheduler rebuild the domains */
	partition_sched_domains(ndoms, doms, attr);
	partition_sched_domains(ndoms, doms, attr);
out:
	put_online_cpus();
}
}
#else /* !CONFIG_SMP */
#else /* !CONFIG_SMP */
static void rebuild_sched_domains_locked(void)
static void rebuild_sched_domains_locked(void)
@@ -864,9 +862,11 @@ static void rebuild_sched_domains_locked(void)


void rebuild_sched_domains(void)
void rebuild_sched_domains(void)
{
{
	get_online_cpus();
	mutex_lock(&cpuset_mutex);
	mutex_lock(&cpuset_mutex);
	rebuild_sched_domains_locked();
	rebuild_sched_domains_locked();
	mutex_unlock(&cpuset_mutex);
	mutex_unlock(&cpuset_mutex);
	put_online_cpus();
}
}


static int update_cpus_allowed(struct cpuset *cs, struct task_struct *p,
static int update_cpus_allowed(struct cpuset *cs, struct task_struct *p,
@@ -1634,6 +1634,7 @@ static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft,
	cpuset_filetype_t type = cft->private;
	cpuset_filetype_t type = cft->private;
	int retval = 0;
	int retval = 0;


	get_online_cpus();
	mutex_lock(&cpuset_mutex);
	mutex_lock(&cpuset_mutex);
	if (!is_cpuset_online(cs)) {
	if (!is_cpuset_online(cs)) {
		retval = -ENODEV;
		retval = -ENODEV;
@@ -1671,6 +1672,7 @@ static int cpuset_write_u64(struct cgroup_subsys_state *css, struct cftype *cft,
	}
	}
out_unlock:
out_unlock:
	mutex_unlock(&cpuset_mutex);
	mutex_unlock(&cpuset_mutex);
	put_online_cpus();
	return retval;
	return retval;
}
}


@@ -1681,6 +1683,7 @@ static int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft,
	cpuset_filetype_t type = cft->private;
	cpuset_filetype_t type = cft->private;
	int retval = -ENODEV;
	int retval = -ENODEV;


	get_online_cpus();
	mutex_lock(&cpuset_mutex);
	mutex_lock(&cpuset_mutex);
	if (!is_cpuset_online(cs))
	if (!is_cpuset_online(cs))
		goto out_unlock;
		goto out_unlock;
@@ -1695,6 +1698,7 @@ static int cpuset_write_s64(struct cgroup_subsys_state *css, struct cftype *cft,
	}
	}
out_unlock:
out_unlock:
	mutex_unlock(&cpuset_mutex);
	mutex_unlock(&cpuset_mutex);
	put_online_cpus();
	return retval;
	return retval;
}
}


@@ -1733,6 +1737,7 @@ static ssize_t cpuset_write_resmask(struct kernfs_open_file *of,
	kernfs_break_active_protection(of->kn);
	kernfs_break_active_protection(of->kn);
	flush_work(&cpuset_hotplug_work);
	flush_work(&cpuset_hotplug_work);


	get_online_cpus();
	mutex_lock(&cpuset_mutex);
	mutex_lock(&cpuset_mutex);
	if (!is_cpuset_online(cs))
	if (!is_cpuset_online(cs))
		goto out_unlock;
		goto out_unlock;
@@ -1758,6 +1763,7 @@ static ssize_t cpuset_write_resmask(struct kernfs_open_file *of,
	free_trial_cpuset(trialcs);
	free_trial_cpuset(trialcs);
out_unlock:
out_unlock:
	mutex_unlock(&cpuset_mutex);
	mutex_unlock(&cpuset_mutex);
	put_online_cpus();
	kernfs_unbreak_active_protection(of->kn);
	kernfs_unbreak_active_protection(of->kn);
	css_put(&cs->css);
	css_put(&cs->css);
	flush_workqueue(cpuset_migrate_mm_wq);
	flush_workqueue(cpuset_migrate_mm_wq);
@@ -2007,6 +2013,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css)
	if (!parent)
	if (!parent)
		return 0;
		return 0;


	get_online_cpus();
	mutex_lock(&cpuset_mutex);
	mutex_lock(&cpuset_mutex);


	set_bit(CS_ONLINE, &cs->flags);
	set_bit(CS_ONLINE, &cs->flags);
@@ -2058,6 +2065,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css)
	spin_unlock_irq(&callback_lock);
	spin_unlock_irq(&callback_lock);
out_unlock:
out_unlock:
	mutex_unlock(&cpuset_mutex);
	mutex_unlock(&cpuset_mutex);
	put_online_cpus();
	return 0;
	return 0;
}
}


@@ -2071,6 +2079,7 @@ static void cpuset_css_offline(struct cgroup_subsys_state *css)
{
{
	struct cpuset *cs = css_cs(css);
	struct cpuset *cs = css_cs(css);


	get_online_cpus();
	mutex_lock(&cpuset_mutex);
	mutex_lock(&cpuset_mutex);


	if (is_sched_load_balance(cs))
	if (is_sched_load_balance(cs))
@@ -2080,6 +2089,7 @@ static void cpuset_css_offline(struct cgroup_subsys_state *css)
	clear_bit(CS_ONLINE, &cs->flags);
	clear_bit(CS_ONLINE, &cs->flags);


	mutex_unlock(&cpuset_mutex);
	mutex_unlock(&cpuset_mutex);
	put_online_cpus();
}
}


static void cpuset_css_free(struct cgroup_subsys_state *css)
static void cpuset_css_free(struct cgroup_subsys_state *css)