@@ -163,12 +163,8 @@ static void em_debug_remove_pd(struct device *dev) {}
163
163
164
164
static void em_release_table_kref (struct kref * kref )
165
165
{
166
- struct em_perf_table __rcu * table ;
167
-
168
166
/* It was the last owner of this table so we can free */
169
- table = container_of (kref , struct em_perf_table , kref );
170
-
171
- kfree_rcu (table , rcu );
167
+ kfree_rcu (container_of (kref , struct em_perf_table , kref ), rcu );
172
168
}
173
169
174
170
/**
@@ -177,7 +173,7 @@ static void em_release_table_kref(struct kref *kref)
177
173
*
178
174
* No return values.
179
175
*/
180
- void em_table_free (struct em_perf_table __rcu * table )
176
+ void em_table_free (struct em_perf_table * table )
181
177
{
182
178
kref_put (& table -> kref , em_release_table_kref );
183
179
}
@@ -190,9 +186,9 @@ void em_table_free(struct em_perf_table __rcu *table)
190
186
* has a user.
191
187
* Returns allocated table or NULL.
192
188
*/
193
- struct em_perf_table __rcu * em_table_alloc (struct em_perf_domain * pd )
189
+ struct em_perf_table * em_table_alloc (struct em_perf_domain * pd )
194
190
{
195
- struct em_perf_table __rcu * table ;
191
+ struct em_perf_table * table ;
196
192
int table_size ;
197
193
198
194
table_size = sizeof (struct em_perf_state ) * pd -> nr_perf_states ;
@@ -300,9 +296,9 @@ int em_dev_compute_costs(struct device *dev, struct em_perf_state *table,
300
296
* Return 0 on success or an error code on failure.
301
297
*/
302
298
int em_dev_update_perf_domain (struct device * dev ,
303
- struct em_perf_table __rcu * new_table )
299
+ struct em_perf_table * new_table )
304
300
{
305
- struct em_perf_table __rcu * old_table ;
301
+ struct em_perf_table * old_table ;
306
302
struct em_perf_domain * pd ;
307
303
308
304
if (!dev )
@@ -319,7 +315,8 @@ int em_dev_update_perf_domain(struct device *dev,
319
315
320
316
kref_get (& new_table -> kref );
321
317
322
- old_table = pd -> em_table ;
318
+ old_table = rcu_dereference_protected (pd -> em_table ,
319
+ lockdep_is_held (& em_pd_mutex ));
323
320
rcu_assign_pointer (pd -> em_table , new_table );
324
321
325
322
em_cpufreq_update_efficiencies (dev , new_table -> state );
@@ -392,7 +389,7 @@ static int em_create_pd(struct device *dev, int nr_states,
392
389
const cpumask_t * cpus ,
393
390
unsigned long flags )
394
391
{
395
- struct em_perf_table __rcu * em_table ;
392
+ struct em_perf_table * em_table ;
396
393
struct em_perf_domain * pd ;
397
394
struct device * cpu_dev ;
398
395
int cpu , ret , num_cpus ;
@@ -552,6 +549,7 @@ int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states,
552
549
const struct em_data_callback * cb ,
553
550
const cpumask_t * cpus , bool microwatts )
554
551
{
552
+ struct em_perf_table * em_table ;
555
553
unsigned long cap , prev_cap = 0 ;
556
554
unsigned long flags = 0 ;
557
555
int cpu , ret ;
@@ -624,7 +622,9 @@ int em_dev_register_perf_domain(struct device *dev, unsigned int nr_states,
624
622
dev -> em_pd -> min_perf_state = 0 ;
625
623
dev -> em_pd -> max_perf_state = nr_states - 1 ;
626
624
627
- em_cpufreq_update_efficiencies (dev , dev -> em_pd -> em_table -> state );
625
+ em_table = rcu_dereference_protected (dev -> em_pd -> em_table ,
626
+ lockdep_is_held (& em_pd_mutex ));
627
+ em_cpufreq_update_efficiencies (dev , em_table -> state );
628
628
629
629
em_debug_create_pd (dev );
630
630
dev_info (dev , "EM: created perf domain\n" );
@@ -661,17 +661,18 @@ void em_dev_unregister_perf_domain(struct device *dev)
661
661
mutex_lock (& em_pd_mutex );
662
662
em_debug_remove_pd (dev );
663
663
664
- em_table_free (dev -> em_pd -> em_table );
664
+ em_table_free (rcu_dereference_protected (dev -> em_pd -> em_table ,
665
+ lockdep_is_held (& em_pd_mutex )));
665
666
666
667
kfree (dev -> em_pd );
667
668
dev -> em_pd = NULL ;
668
669
mutex_unlock (& em_pd_mutex );
669
670
}
670
671
EXPORT_SYMBOL_GPL (em_dev_unregister_perf_domain );
671
672
672
- static struct em_perf_table __rcu * em_table_dup (struct em_perf_domain * pd )
673
+ static struct em_perf_table * em_table_dup (struct em_perf_domain * pd )
673
674
{
674
- struct em_perf_table __rcu * em_table ;
675
+ struct em_perf_table * em_table ;
675
676
struct em_perf_state * ps , * new_ps ;
676
677
int ps_size ;
677
678
@@ -693,7 +694,7 @@ static struct em_perf_table __rcu *em_table_dup(struct em_perf_domain *pd)
693
694
}
694
695
695
696
static int em_recalc_and_update (struct device * dev , struct em_perf_domain * pd ,
696
- struct em_perf_table __rcu * em_table )
697
+ struct em_perf_table * em_table )
697
698
{
698
699
int ret ;
699
700
@@ -723,7 +724,7 @@ static int em_recalc_and_update(struct device *dev, struct em_perf_domain *pd,
723
724
static void em_adjust_new_capacity (struct device * dev ,
724
725
struct em_perf_domain * pd )
725
726
{
726
- struct em_perf_table __rcu * em_table ;
727
+ struct em_perf_table * em_table ;
727
728
728
729
em_table = em_table_dup (pd );
729
730
if (!em_table ) {
@@ -814,7 +815,7 @@ static void em_update_workfn(struct work_struct *work)
814
815
*/
815
816
int em_dev_update_chip_binning (struct device * dev )
816
817
{
817
- struct em_perf_table __rcu * em_table ;
818
+ struct em_perf_table * em_table ;
818
819
struct em_perf_domain * pd ;
819
820
int i , ret ;
820
821
0 commit comments