File tree Expand file tree Collapse file tree 1 file changed +7
-9
lines changed Expand file tree Collapse file tree 1 file changed +7
-9
lines changed Original file line number Diff line number Diff line change @@ -335,23 +335,20 @@ static void free_sched_groups(struct sched_group *sg, int free_sgc)
335
335
if (free_sgc && atomic_dec_and_test (& sg -> sgc -> ref ))
336
336
kfree (sg -> sgc );
337
337
338
- kfree (sg );
338
+ if (atomic_dec_and_test (& sg -> ref ))
339
+ kfree (sg );
339
340
sg = tmp ;
340
341
} while (sg != first );
341
342
}
342
343
343
344
static void destroy_sched_domain (struct sched_domain * sd )
344
345
{
345
346
/*
346
- * If its an overlapping domain it has private groups, iterate and
347
- * nuke them all.
347
+ * A sched domain has many groups' reference, and an overlapping
348
+ * domain has private groups, iterate and nuke them all.
348
349
*/
349
- if (sd -> flags & SD_OVERLAP ) {
350
- free_sched_groups (sd -> groups , 1 );
351
- } else if (atomic_dec_and_test (& sd -> groups -> ref )) {
352
- kfree (sd -> groups -> sgc );
353
- kfree (sd -> groups );
354
- }
350
+ free_sched_groups (sd -> groups , 1 );
351
+
355
352
if (sd -> shared && atomic_dec_and_test (& sd -> shared -> ref ))
356
353
kfree (sd -> shared );
357
354
kfree (sd );
@@ -668,6 +665,7 @@ build_group_from_child_sched_domain(struct sched_domain *sd, int cpu)
668
665
else
669
666
cpumask_copy (sg_span , sched_domain_span (sd ));
670
667
668
+ atomic_inc (& sg -> ref );
671
669
return sg ;
672
670
}
673
671
You can’t perform that action at this time.
0 commit comments