@@ -88,6 +88,73 @@ void show_ipi_list(struct seq_file *p, int prec)
88
88
}
89
89
}
90
90
91
+ static inline void set_cpu_core_map (int cpu )
92
+ {
93
+ int i ;
94
+
95
+ cpumask_set_cpu (cpu , & cpu_core_setup_map );
96
+
97
+ for_each_cpu (i , & cpu_core_setup_map ) {
98
+ if (cpu_data [cpu ].package == cpu_data [i ].package ) {
99
+ cpumask_set_cpu (i , & cpu_core_map [cpu ]);
100
+ cpumask_set_cpu (cpu , & cpu_core_map [i ]);
101
+ }
102
+ }
103
+ }
104
+
105
+ static inline void set_cpu_sibling_map (int cpu )
106
+ {
107
+ int i ;
108
+
109
+ cpumask_set_cpu (cpu , & cpu_sibling_setup_map );
110
+
111
+ for_each_cpu (i , & cpu_sibling_setup_map ) {
112
+ if (cpus_are_siblings (cpu , i )) {
113
+ cpumask_set_cpu (i , & cpu_sibling_map [cpu ]);
114
+ cpumask_set_cpu (cpu , & cpu_sibling_map [i ]);
115
+ }
116
+ }
117
+ }
118
+
119
+ static inline void clear_cpu_sibling_map (int cpu )
120
+ {
121
+ int i ;
122
+
123
+ for_each_cpu (i , & cpu_sibling_setup_map ) {
124
+ if (cpus_are_siblings (cpu , i )) {
125
+ cpumask_clear_cpu (i , & cpu_sibling_map [cpu ]);
126
+ cpumask_clear_cpu (cpu , & cpu_sibling_map [i ]);
127
+ }
128
+ }
129
+
130
+ cpumask_clear_cpu (cpu , & cpu_sibling_setup_map );
131
+ }
132
+
133
+ /*
134
+ * Calculate a new cpu_foreign_map mask whenever a
135
+ * new cpu appears or disappears.
136
+ */
137
+ void calculate_cpu_foreign_map (void )
138
+ {
139
+ int i , k , core_present ;
140
+ cpumask_t temp_foreign_map ;
141
+
142
+ /* Re-calculate the mask */
143
+ cpumask_clear (& temp_foreign_map );
144
+ for_each_online_cpu (i ) {
145
+ core_present = 0 ;
146
+ for_each_cpu (k , & temp_foreign_map )
147
+ if (cpus_are_siblings (i , k ))
148
+ core_present = 1 ;
149
+ if (!core_present )
150
+ cpumask_set_cpu (i , & temp_foreign_map );
151
+ }
152
+
153
+ for_each_online_cpu (i )
154
+ cpumask_andnot (& cpu_foreign_map [i ],
155
+ & temp_foreign_map , & cpu_sibling_map [i ]);
156
+ }
157
+
91
158
/* Send mailbox buffer via Mail_Send */
92
159
static void csr_mail_send (uint64_t data , int cpu , int mailbox )
93
160
{
@@ -303,6 +370,7 @@ int loongson_cpu_disable(void)
303
370
numa_remove_cpu (cpu );
304
371
#endif
305
372
set_cpu_online (cpu , false);
373
+ clear_cpu_sibling_map (cpu );
306
374
calculate_cpu_foreign_map ();
307
375
local_irq_save (flags );
308
376
irq_migrate_all_off_this_cpu ();
@@ -380,59 +448,6 @@ static int __init ipi_pm_init(void)
380
448
core_initcall (ipi_pm_init );
381
449
#endif
382
450
383
- static inline void set_cpu_sibling_map (int cpu )
384
- {
385
- int i ;
386
-
387
- cpumask_set_cpu (cpu , & cpu_sibling_setup_map );
388
-
389
- for_each_cpu (i , & cpu_sibling_setup_map ) {
390
- if (cpus_are_siblings (cpu , i )) {
391
- cpumask_set_cpu (i , & cpu_sibling_map [cpu ]);
392
- cpumask_set_cpu (cpu , & cpu_sibling_map [i ]);
393
- }
394
- }
395
- }
396
-
397
- static inline void set_cpu_core_map (int cpu )
398
- {
399
- int i ;
400
-
401
- cpumask_set_cpu (cpu , & cpu_core_setup_map );
402
-
403
- for_each_cpu (i , & cpu_core_setup_map ) {
404
- if (cpu_data [cpu ].package == cpu_data [i ].package ) {
405
- cpumask_set_cpu (i , & cpu_core_map [cpu ]);
406
- cpumask_set_cpu (cpu , & cpu_core_map [i ]);
407
- }
408
- }
409
- }
410
-
411
- /*
412
- * Calculate a new cpu_foreign_map mask whenever a
413
- * new cpu appears or disappears.
414
- */
415
- void calculate_cpu_foreign_map (void )
416
- {
417
- int i , k , core_present ;
418
- cpumask_t temp_foreign_map ;
419
-
420
- /* Re-calculate the mask */
421
- cpumask_clear (& temp_foreign_map );
422
- for_each_online_cpu (i ) {
423
- core_present = 0 ;
424
- for_each_cpu (k , & temp_foreign_map )
425
- if (cpus_are_siblings (i , k ))
426
- core_present = 1 ;
427
- if (!core_present )
428
- cpumask_set_cpu (i , & temp_foreign_map );
429
- }
430
-
431
- for_each_online_cpu (i )
432
- cpumask_andnot (& cpu_foreign_map [i ],
433
- & temp_foreign_map , & cpu_sibling_map [i ]);
434
- }
435
-
436
451
/* Preload SMP state for boot cpu */
437
452
void smp_prepare_boot_cpu (void )
438
453
{
0 commit comments