mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 08:02:07 +00:00
sched/topology: Check SDF_SHARED_CHILD in highest_flag_domain()
Do not assume that all the children of a scheduling domain have a given flag. Check whether it has the SDF_SHARED_CHILD meta flag. Suggested-by: Ionela Voinescu <ionela.voinescu@arm.com> Signed-off-by: Ricardo Neri <ricardo.neri-calderon@linux.intel.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20230406203148.19182-9-ricardo.neri-calderon@linux.intel.com
This commit is contained in:
parent
c9ca07886a
commit
40b4d3dc32
@ -1772,6 +1772,13 @@ queue_balance_callback(struct rq *rq,
|
||||
for (__sd = rcu_dereference_check_sched_domain(cpu_rq(cpu)->sd); \
|
||||
__sd; __sd = __sd->parent)
|
||||
|
||||
/* A mask of all the SD flags that have the SDF_SHARED_CHILD metaflag */
|
||||
#define SD_FLAG(name, mflags) (name * !!((mflags) & SDF_SHARED_CHILD)) |
|
||||
static const unsigned int SD_SHARED_CHILD_MASK =
|
||||
#include <linux/sched/sd_flags.h>
|
||||
0;
|
||||
#undef SD_FLAG
|
||||
|
||||
/**
|
||||
* highest_flag_domain - Return highest sched_domain containing flag.
|
||||
* @cpu: The CPU whose highest level of sched domain is to
|
||||
@ -1779,16 +1786,25 @@ queue_balance_callback(struct rq *rq,
|
||||
* @flag: The flag to check for the highest sched_domain
|
||||
* for the given CPU.
|
||||
*
|
||||
* Returns the highest sched_domain of a CPU which contains the given flag.
|
||||
* Returns the highest sched_domain of a CPU which contains @flag. If @flag has
|
||||
* the SDF_SHARED_CHILD metaflag, all the children domains also have @flag.
|
||||
*/
|
||||
static inline struct sched_domain *highest_flag_domain(int cpu, int flag)
|
||||
{
|
||||
struct sched_domain *sd, *hsd = NULL;
|
||||
|
||||
for_each_domain(cpu, sd) {
|
||||
if (!(sd->flags & flag))
|
||||
if (sd->flags & flag) {
|
||||
hsd = sd;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Stop the search if @flag is known to be shared at lower
|
||||
* levels. It will not be found further up.
|
||||
*/
|
||||
if (flag & SD_SHARED_CHILD_MASK)
|
||||
break;
|
||||
hsd = sd;
|
||||
}
|
||||
|
||||
return hsd;
|
||||
|
Loading…
Reference in New Issue
Block a user