mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	sched/topology: Introduce SD metaflag for flags needing > 1 groups
In preparation of cleaning up the sd_degenerate*() functions, mark flags used in sd_degenerate() with the new SDF_NEEDS_GROUPS flag. With this, build a compile-time mask of those SD flags. Note that sd_parent_degenerate() uses an extra flag in its mask, SD_PREFER_SIBLING, which remains singled out for now. Suggested-by: Peter Zijlstra <peterz@infradead.org> Signed-off-by: Valentin Schneider <valentin.schneider@arm.com> Signed-off-by: Ingo Molnar <mingo@kernel.org> Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: https://lore.kernel.org/r/20200817113003.20802-8-valentin.schneider@arm.com
This commit is contained in:
		
							parent
							
								
									5b9f8ff7b3
								
							
						
					
					
						commit
						4ee4ea443a
					
				
					 2 changed files with 35 additions and 11 deletions
				
			
		|  | @ -8,7 +8,7 @@ | |||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * Expected flag uses | ||||
|  * Hierarchical metaflags | ||||
|  * | ||||
|  * SHARED_CHILD: These flags are meant to be set from the base domain upwards. | ||||
|  * If a domain has this flag set, all of its children should have it set. This | ||||
|  | @ -29,29 +29,42 @@ | |||
|  * certain level (e.g. domain starts spanning CPUs outside of the base CPU's | ||||
|  * socket). | ||||
|  */ | ||||
| #define SDF_SHARED_CHILD 0x1 | ||||
| #define SDF_SHARED_PARENT 0x2 | ||||
| #define SDF_SHARED_CHILD       0x1 | ||||
| #define SDF_SHARED_PARENT      0x2 | ||||
| 
 | ||||
| /*
 | ||||
|  * Behavioural metaflags | ||||
|  * | ||||
|  * NEEDS_GROUPS: These flags are only relevant if the domain they are set on has | ||||
|  * more than one group. This is usually for balancing flags (load balancing | ||||
|  * involves equalizing a metric between groups), or for flags describing some | ||||
|  * shared resource (which would be shared between groups). | ||||
|  */ | ||||
| #define SDF_NEEDS_GROUPS       0x4 | ||||
| 
 | ||||
| /*
 | ||||
|  * Balance when about to become idle | ||||
|  * | ||||
|  * SHARED_CHILD: Set from the base domain up to cpuset.sched_relax_domain_level. | ||||
|  * NEEDS_GROUPS: Load balancing flag. | ||||
|  */ | ||||
| SD_FLAG(SD_BALANCE_NEWIDLE, SDF_SHARED_CHILD) | ||||
| SD_FLAG(SD_BALANCE_NEWIDLE, SDF_SHARED_CHILD | SDF_NEEDS_GROUPS) | ||||
| 
 | ||||
| /*
 | ||||
|  * Balance on exec | ||||
|  * | ||||
|  * SHARED_CHILD: Set from the base domain up to the NUMA reclaim level. | ||||
|  * NEEDS_GROUPS: Load balancing flag. | ||||
|  */ | ||||
| SD_FLAG(SD_BALANCE_EXEC, SDF_SHARED_CHILD) | ||||
| SD_FLAG(SD_BALANCE_EXEC, SDF_SHARED_CHILD | SDF_NEEDS_GROUPS) | ||||
| 
 | ||||
| /*
 | ||||
|  * Balance on fork, clone | ||||
|  * | ||||
|  * SHARED_CHILD: Set from the base domain up to the NUMA reclaim level. | ||||
|  * NEEDS_GROUPS: Load balancing flag. | ||||
|  */ | ||||
| SD_FLAG(SD_BALANCE_FORK, SDF_SHARED_CHILD) | ||||
| SD_FLAG(SD_BALANCE_FORK, SDF_SHARED_CHILD | SDF_NEEDS_GROUPS) | ||||
| 
 | ||||
| /*
 | ||||
|  * Balance on wakeup | ||||
|  | @ -69,24 +82,28 @@ SD_FLAG(SD_WAKE_AFFINE, SDF_SHARED_CHILD) | |||
| 
 | ||||
| /*
 | ||||
|  * Domain members have different CPU capacities | ||||
|  * | ||||
|  * NEEDS_GROUPS: Per-CPU capacity is asymmetric between groups. | ||||
|  */ | ||||
| SD_FLAG(SD_ASYM_CPUCAPACITY, 0) | ||||
| SD_FLAG(SD_ASYM_CPUCAPACITY, SDF_NEEDS_GROUPS) | ||||
| 
 | ||||
| /*
 | ||||
|  * Domain members share CPU capacity (i.e. SMT) | ||||
|  * | ||||
|  * SHARED_CHILD: Set from the base domain up until spanned CPUs no longer share | ||||
|  * CPU capacity. | ||||
|  *               CPU capacity. | ||||
|  * NEEDS_GROUPS: Capacity is shared between groups. | ||||
|  */ | ||||
| SD_FLAG(SD_SHARE_CPUCAPACITY, SDF_SHARED_CHILD) | ||||
| SD_FLAG(SD_SHARE_CPUCAPACITY, SDF_SHARED_CHILD | SDF_NEEDS_GROUPS) | ||||
| 
 | ||||
| /*
 | ||||
|  * Domain members share CPU package resources (i.e. caches) | ||||
|  * | ||||
|  * SHARED_CHILD: Set from the base domain up until spanned CPUs no longer share | ||||
|  * the same cache(s). | ||||
|  *               the same cache(s). | ||||
|  * NEEDS_GROUPS: Caches are shared between groups. | ||||
|  */ | ||||
| SD_FLAG(SD_SHARE_PKG_RESOURCES, SDF_SHARED_CHILD) | ||||
| SD_FLAG(SD_SHARE_PKG_RESOURCES, SDF_SHARED_CHILD | SDF_NEEDS_GROUPS) | ||||
| 
 | ||||
| /*
 | ||||
|  * Only a single load balancing instance | ||||
|  |  | |||
|  | @ -25,6 +25,13 @@ enum { | |||
| }; | ||||
| #undef SD_FLAG | ||||
| 
 | ||||
| /* Generate a mask of SD flags with the SDF_NEEDS_GROUPS metaflag */ | ||||
| #define SD_FLAG(name, mflags) (name * !!((mflags) & SDF_NEEDS_GROUPS)) | | ||||
| static const unsigned int SD_DEGENERATE_GROUPS_MASK = | ||||
| #include <linux/sched/sd_flags.h> | ||||
| 0; | ||||
| #undef SD_FLAG | ||||
| 
 | ||||
| #ifdef CONFIG_SCHED_DEBUG | ||||
| #define SD_FLAG(_name, mflags) [__##_name] = { .meta_flags = mflags, .name = #_name }, | ||||
| static const struct { | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Valentin Schneider
						Valentin Schneider