Skip to content

Commit 68974e3

Browse files
committed
cpufreq: Split cpufreq_online()
In preparation for the introduction of cpufreq policy locking guards, move the part of cpufreq_online() that is carried out under the policy rwsem into a separate function called cpufreq_policy_online(). No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Reviewed-by: Mario Limonciello <mario.limonciello@amd.com> Acked-by: Sudeep Holla <sudeep.holla@arm.com> Tested-by: Sudeep Holla <sudeep.holla@arm.com> Link: https://patch.msgid.link/3354747.aeNJFYEL58@rjwysocki.net
1 parent 387b517 commit 68974e3

1 file changed

Lines changed: 54 additions & 41 deletions

File tree

drivers/cpufreq/cpufreq.c

Lines changed: 54 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1402,32 +1402,13 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy)
14021402
kfree(policy);
14031403
}
14041404

1405-
static int cpufreq_online(unsigned int cpu)
1405+
static int cpufreq_policy_online(struct cpufreq_policy *policy,
1406+
unsigned int cpu, bool new_policy)
14061407
{
1407-
struct cpufreq_policy *policy;
1408-
bool new_policy;
14091408
unsigned long flags;
14101409
unsigned int j;
14111410
int ret;
14121411

1413-
pr_debug("%s: bringing CPU%u online\n", __func__, cpu);
1414-
1415-
/* Check if this CPU already has a policy to manage it */
1416-
policy = per_cpu(cpufreq_cpu_data, cpu);
1417-
if (policy) {
1418-
WARN_ON(!cpumask_test_cpu(cpu, policy->related_cpus));
1419-
if (!policy_is_inactive(policy))
1420-
return cpufreq_add_policy_cpu(policy, cpu);
1421-
1422-
/* This is the only online CPU for the policy. Start over. */
1423-
new_policy = false;
1424-
} else {
1425-
new_policy = true;
1426-
policy = cpufreq_policy_alloc(cpu);
1427-
if (!policy)
1428-
return -ENOMEM;
1429-
}
1430-
14311412
down_write(&policy->rwsem);
14321413

14331414
policy->cpu = cpu;
@@ -1454,7 +1435,7 @@ static int cpufreq_online(unsigned int cpu)
14541435
if (ret) {
14551436
pr_debug("%s: %d: initialization failed\n", __func__,
14561437
__LINE__);
1457-
goto out_free_policy;
1438+
goto out_clear_policy;
14581439
}
14591440

14601441
/*
@@ -1605,8 +1586,59 @@ static int cpufreq_online(unsigned int cpu)
16051586
goto out_destroy_policy;
16061587
}
16071588

1589+
out_unlock:
16081590
up_write(&policy->rwsem);
16091591

1592+
return ret;
1593+
1594+
out_destroy_policy:
1595+
for_each_cpu(j, policy->real_cpus)
1596+
remove_cpu_dev_symlink(policy, j, get_cpu_device(j));
1597+
1598+
out_offline_policy:
1599+
if (cpufreq_driver->offline)
1600+
cpufreq_driver->offline(policy);
1601+
1602+
out_exit_policy:
1603+
if (cpufreq_driver->exit)
1604+
cpufreq_driver->exit(policy);
1605+
1606+
out_clear_policy:
1607+
cpumask_clear(policy->cpus);
1608+
1609+
goto out_unlock;
1610+
}
1611+
1612+
static int cpufreq_online(unsigned int cpu)
1613+
{
1614+
struct cpufreq_policy *policy;
1615+
bool new_policy;
1616+
int ret;
1617+
1618+
pr_debug("%s: bringing CPU%u online\n", __func__, cpu);
1619+
1620+
/* Check if this CPU already has a policy to manage it */
1621+
policy = per_cpu(cpufreq_cpu_data, cpu);
1622+
if (policy) {
1623+
WARN_ON(!cpumask_test_cpu(cpu, policy->related_cpus));
1624+
if (!policy_is_inactive(policy))
1625+
return cpufreq_add_policy_cpu(policy, cpu);
1626+
1627+
/* This is the only online CPU for the policy. Start over. */
1628+
new_policy = false;
1629+
} else {
1630+
new_policy = true;
1631+
policy = cpufreq_policy_alloc(cpu);
1632+
if (!policy)
1633+
return -ENOMEM;
1634+
}
1635+
1636+
ret = cpufreq_policy_online(policy, cpu, new_policy);
1637+
if (ret) {
1638+
cpufreq_policy_free(policy);
1639+
return ret;
1640+
}
1641+
16101642
kobject_uevent(&policy->kobj, KOBJ_ADD);
16111643

16121644
/* Callback for handling stuff after policy is ready */
@@ -1633,25 +1665,6 @@ static int cpufreq_online(unsigned int cpu)
16331665
pr_debug("initialization complete\n");
16341666

16351667
return 0;
1636-
1637-
out_destroy_policy:
1638-
for_each_cpu(j, policy->real_cpus)
1639-
remove_cpu_dev_symlink(policy, j, get_cpu_device(j));
1640-
1641-
out_offline_policy:
1642-
if (cpufreq_driver->offline)
1643-
cpufreq_driver->offline(policy);
1644-
1645-
out_exit_policy:
1646-
if (cpufreq_driver->exit)
1647-
cpufreq_driver->exit(policy);
1648-
1649-
out_free_policy:
1650-
cpumask_clear(policy->cpus);
1651-
up_write(&policy->rwsem);
1652-
1653-
cpufreq_policy_free(policy);
1654-
return ret;
16551668
}
16561669

16571670
/**

0 commit comments

Comments
 (0)