@@ -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