From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============4713143183219427736==" MIME-Version: 1.0 From: kernel test robot To: kbuild-all@lists.01.org Subject: Re: [PATCH 2/2] sched/fair: Adjust the allowed NUMA imbalance when SD_NUMA spans multiple LLCs Date: Fri, 04 Feb 2022 09:30:18 +0800 Message-ID: <202202040638.UP73q8Dl-lkp@intel.com> In-Reply-To: <20220203144652.12540-3-mgorman@techsingularity.net> List-Id: --===============4713143183219427736== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Mel, I love your patch! Perhaps something to improve: [auto build test WARNING on tip/sched/core] [also build test WARNING on tip/master linux/master linus/master v5.17-rc2 = next-20220203] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Mel-Gorman/Adjust-NUMA-imb= alance-for-multiple-LLCs/20220203-225129 base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git ec24445= 30612a886b406e2830d7f314d1a07d4bb config: parisc-randconfig-s031-20220131 (https://download.01.org/0day-ci/ar= chive/20220204/202202040638.UP73q8Dl-lkp(a)intel.com/config) compiler: hppa-linux-gcc (GCC) 11.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/= make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.4-dirty # https://github.com/0day-ci/linux/commit/81a6d8d3e9199b22ab27ea3ad= e91a0b0c18d0811 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Mel-Gorman/Adjust-NUMA-imbalance-f= or-multiple-LLCs/20220203-225129 git checkout 81a6d8d3e9199b22ab27ea3ade91a0b0c18d0811 # save the config file to linux build tree mkdir build_dir COMPILER_INSTALL_PATH=3D$HOME/0day COMPILER=3Dgcc-11.2.0 make.cross= C=3D1 CF=3D'-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=3Dbuild_dir ARCH=3Dp= arisc SHELL=3D/bin/bash kernel/sched/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot sparse warnings: (new ones prefixed by >>) kernel/sched/topology.c:461:19: sparse: sparse: incorrect type in argume= nt 1 (different address spaces) @@ expected struct perf_domain *pd @@ = got struct perf_domain [noderef] __rcu *pd @@ kernel/sched/topology.c:461:19: sparse: expected struct perf_domain = *pd kernel/sched/topology.c:461:19: sparse: got struct perf_domain [node= ref] __rcu *pd kernel/sched/topology.c:623:49: sparse: sparse: incorrect type in initia= lizer (different address spaces) @@ expected struct sched_domain *paren= t @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:623:49: sparse: expected struct sched_domain= *parent kernel/sched/topology.c:623:49: sparse: got struct sched_domain [nod= eref] __rcu *parent kernel/sched/topology.c:694:50: sparse: sparse: incorrect type in initia= lizer (different address spaces) @@ expected struct sched_domain *paren= t @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:694:50: sparse: expected struct sched_domain= *parent kernel/sched/topology.c:694:50: sparse: got struct sched_domain [nod= eref] __rcu *parent kernel/sched/topology.c:701:55: sparse: sparse: incorrect type in assign= ment (different address spaces) @@ expected struct sched_domain [nodere= f] __rcu *[noderef] __rcu child @@ got struct sched_domain *[assigned] = tmp @@ kernel/sched/topology.c:701:55: sparse: expected struct sched_domain= [noderef] __rcu *[noderef] __rcu child kernel/sched/topology.c:701:55: sparse: got struct sched_domain *[as= signed] tmp kernel/sched/topology.c:711:29: sparse: sparse: incorrect type in assign= ment (different address spaces) @@ expected struct sched_domain *[assig= ned] tmp @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:711:29: sparse: expected struct sched_domain= *[assigned] tmp kernel/sched/topology.c:711:29: sparse: got struct sched_domain [nod= eref] __rcu *parent kernel/sched/topology.c:716:20: sparse: sparse: incorrect type in assign= ment (different address spaces) @@ expected struct sched_domain *sd @@ = got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:716:20: sparse: expected struct sched_domain= *sd kernel/sched/topology.c:716:20: sparse: got struct sched_domain [nod= eref] __rcu *parent kernel/sched/topology.c:737:13: sparse: sparse: incorrect type in assign= ment (different address spaces) @@ expected struct sched_domain *[assig= ned] tmp @@ got struct sched_domain [noderef] __rcu *sd @@ kernel/sched/topology.c:737:13: sparse: expected struct sched_domain= *[assigned] tmp kernel/sched/topology.c:737:13: sparse: got struct sched_domain [nod= eref] __rcu *sd kernel/sched/topology.c:899:70: sparse: sparse: incorrect type in argume= nt 1 (different address spaces) @@ expected struct sched_domain *sd @@ = got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:899:70: sparse: expected struct sched_domain= *sd kernel/sched/topology.c:899:70: sparse: got struct sched_domain [nod= eref] __rcu *child kernel/sched/topology.c:928:59: sparse: sparse: incorrect type in argume= nt 1 (different address spaces) @@ expected struct sched_domain *sd @@ = got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:928:59: sparse: expected struct sched_domain= *sd kernel/sched/topology.c:928:59: sparse: got struct sched_domain [nod= eref] __rcu *child kernel/sched/topology.c:974:57: sparse: sparse: incorrect type in argume= nt 1 (different address spaces) @@ expected struct sched_domain *sd @@ = got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:974:57: sparse: expected struct sched_domain= *sd kernel/sched/topology.c:974:57: sparse: got struct sched_domain [nod= eref] __rcu *child kernel/sched/topology.c:976:25: sparse: sparse: incorrect type in assign= ment (different address spaces) @@ expected struct sched_domain *siblin= g @@ got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:976:25: sparse: expected struct sched_domain= *sibling kernel/sched/topology.c:976:25: sparse: got struct sched_domain [nod= eref] __rcu *child kernel/sched/topology.c:984:55: sparse: sparse: incorrect type in argume= nt 1 (different address spaces) @@ expected struct sched_domain *sd @@ = got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:984:55: sparse: expected struct sched_domain= *sd kernel/sched/topology.c:984:55: sparse: got struct sched_domain [nod= eref] __rcu *child kernel/sched/topology.c:986:25: sparse: sparse: incorrect type in assign= ment (different address spaces) @@ expected struct sched_domain *siblin= g @@ got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:986:25: sparse: expected struct sched_domain= *sibling kernel/sched/topology.c:986:25: sparse: got struct sched_domain [nod= eref] __rcu *child kernel/sched/topology.c:1056:62: sparse: sparse: incorrect type in argum= ent 1 (different address spaces) @@ expected struct sched_domain *sd @@= got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:1056:62: sparse: expected struct sched_domai= n *sd kernel/sched/topology.c:1056:62: sparse: got struct sched_domain [no= deref] __rcu *child kernel/sched/topology.c:1160:40: sparse: sparse: incorrect type in initi= alizer (different address spaces) @@ expected struct sched_domain *chil= d @@ got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:1160:40: sparse: expected struct sched_domai= n *child kernel/sched/topology.c:1160:40: sparse: got struct sched_domain [no= deref] __rcu *child kernel/sched/topology.c:1571:43: sparse: sparse: incorrect type in initi= alizer (different address spaces) @@ expected struct sched_domain [node= ref] __rcu *child @@ got struct sched_domain *child @@ kernel/sched/topology.c:1571:43: sparse: expected struct sched_domai= n [noderef] __rcu *child kernel/sched/topology.c:1571:43: sparse: got struct sched_domain *ch= ild kernel/sched/topology.c:2130:31: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain [noder= ef] __rcu *parent @@ got struct sched_domain *sd @@ kernel/sched/topology.c:2130:31: sparse: expected struct sched_domai= n [noderef] __rcu *parent kernel/sched/topology.c:2130:31: sparse: got struct sched_domain *sd kernel/sched/topology.c:2233:57: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain *[assi= gned] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:2233:57: sparse: expected struct sched_domai= n *[assigned] sd kernel/sched/topology.c:2233:57: sparse: got struct sched_domain [no= deref] __rcu *parent kernel/sched/topology.c:2254:56: sparse: sparse: incorrect type in initi= alizer (different address spaces) @@ expected struct sched_domain *chil= d @@ got struct sched_domain [noderef] __rcu *child @@ kernel/sched/topology.c:2254:56: sparse: expected struct sched_domai= n *child kernel/sched/topology.c:2254:56: sparse: got struct sched_domain [no= deref] __rcu *child >> kernel/sched/topology.c:2284:39: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain *top_p= @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:2284:39: sparse: expected struct sched_domai= n *top_p kernel/sched/topology.c:2284:39: sparse: got struct sched_domain [no= deref] __rcu *parent >> kernel/sched/topology.c:2286:45: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain *[assi= gned] top @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:2286:45: sparse: expected struct sched_domai= n *[assigned] top kernel/sched/topology.c:2286:45: sparse: got struct sched_domain [no= deref] __rcu *parent kernel/sched/topology.c:2287:47: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain *top_p= @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:2287:47: sparse: expected struct sched_domai= n *top_p kernel/sched/topology.c:2287:47: sparse: got struct sched_domain [no= deref] __rcu *parent kernel/sched/topology.c:2253:57: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain *[assi= gned] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:2253:57: sparse: expected struct sched_domai= n *[assigned] sd kernel/sched/topology.c:2253:57: sparse: got struct sched_domain [no= deref] __rcu *parent kernel/sched/topology.c:2303:57: sparse: sparse: incorrect type in assig= nment (different address spaces) @@ expected struct sched_domain *[assi= gned] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/topology.c:2303:57: sparse: expected struct sched_domai= n *[assigned] sd kernel/sched/topology.c:2303:57: sparse: got struct sched_domain [no= deref] __rcu *parent kernel/sched/topology.c: note: in included file: kernel/sched/sched.h:1744:9: sparse: sparse: incorrect type in assignmen= t (different address spaces) @@ expected struct sched_domain *[assigned= ] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/sched.h:1744:9: sparse: expected struct sched_domain *[= assigned] sd kernel/sched/sched.h:1744:9: sparse: got struct sched_domain [nodere= f] __rcu *parent kernel/sched/sched.h:1757:9: sparse: sparse: incorrect type in assignmen= t (different address spaces) @@ expected struct sched_domain *[assigned= ] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/sched.h:1757:9: sparse: expected struct sched_domain *[= assigned] sd kernel/sched/sched.h:1757:9: sparse: got struct sched_domain [nodere= f] __rcu *parent kernel/sched/sched.h:1744:9: sparse: sparse: incorrect type in assignmen= t (different address spaces) @@ expected struct sched_domain *[assigned= ] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/sched.h:1744:9: sparse: expected struct sched_domain *[= assigned] sd kernel/sched/sched.h:1744:9: sparse: got struct sched_domain [nodere= f] __rcu *parent kernel/sched/sched.h:1757:9: sparse: sparse: incorrect type in assignmen= t (different address spaces) @@ expected struct sched_domain *[assigned= ] sd @@ got struct sched_domain [noderef] __rcu *parent @@ kernel/sched/sched.h:1757:9: sparse: expected struct sched_domain *[= assigned] sd kernel/sched/sched.h:1757:9: sparse: got struct sched_domain [nodere= f] __rcu *parent kernel/sched/topology.c:929:31: sparse: sparse: dereference of noderef e= xpression kernel/sched/topology.c:1592:19: sparse: sparse: dereference of noderef = expression vim +2284 kernel/sched/topology.c 2186 = 2187 /* 2188 * Build sched domains for a given set of CPUs and attach the sched = domains 2189 * to the individual CPUs 2190 */ 2191 static int 2192 build_sched_domains(const struct cpumask *cpu_map, struct sched_doma= in_attr *attr) 2193 { 2194 enum s_alloc alloc_state =3D sa_none; 2195 struct sched_domain *sd; 2196 struct s_data d; 2197 struct rq *rq =3D NULL; 2198 int i, ret =3D -ENOMEM; 2199 bool has_asym =3D false; 2200 = 2201 if (WARN_ON(cpumask_empty(cpu_map))) 2202 goto error; 2203 = 2204 alloc_state =3D __visit_domain_allocation_hell(&d, cpu_map); 2205 if (alloc_state !=3D sa_rootdomain) 2206 goto error; 2207 = 2208 /* Set up domains for CPUs specified by the cpu_map: */ 2209 for_each_cpu(i, cpu_map) { 2210 struct sched_domain_topology_level *tl; 2211 = 2212 sd =3D NULL; 2213 for_each_sd_topology(tl) { 2214 = 2215 if (WARN_ON(!topology_span_sane(tl, cpu_map, i))) 2216 goto error; 2217 = 2218 sd =3D build_sched_domain(tl, cpu_map, attr, sd, i); 2219 = 2220 has_asym |=3D sd->flags & SD_ASYM_CPUCAPACITY; 2221 = 2222 if (tl =3D=3D sched_domain_topology) 2223 *per_cpu_ptr(d.sd, i) =3D sd; 2224 if (tl->flags & SDTL_OVERLAP) 2225 sd->flags |=3D SD_OVERLAP; 2226 if (cpumask_equal(cpu_map, sched_domain_span(sd))) 2227 break; 2228 } 2229 } 2230 = 2231 /* Build the groups for the domains */ 2232 for_each_cpu(i, cpu_map) { 2233 for (sd =3D *per_cpu_ptr(d.sd, i); sd; sd =3D sd->parent) { 2234 sd->span_weight =3D cpumask_weight(sched_domain_span(sd)); 2235 if (sd->flags & SD_OVERLAP) { 2236 if (build_overlap_sched_groups(sd, i)) 2237 goto error; 2238 } else { 2239 if (build_sched_groups(sd, i)) 2240 goto error; 2241 } 2242 } 2243 } 2244 = 2245 /* 2246 * Calculate an allowed NUMA imbalance such that LLCs do not get 2247 * imbalanced. 2248 */ 2249 for_each_cpu(i, cpu_map) { 2250 unsigned int imb =3D 0; 2251 unsigned int imb_span =3D 1; 2252 = 2253 for (sd =3D *per_cpu_ptr(d.sd, i); sd; sd =3D sd->parent) { 2254 struct sched_domain *child =3D sd->child; 2255 = 2256 if (!(sd->flags & SD_SHARE_PKG_RESOURCES) && child && 2257 (child->flags & SD_SHARE_PKG_RESOURCES)) { 2258 struct sched_domain *top, *top_p; 2259 unsigned int nr_llcs; 2260 = 2261 /* 2262 * For a single LLC per node, allow an 2263 * imbalance up to 25% of the node. This is an 2264 * arbitrary cutoff based on SMT-2 to balance 2265 * between memory bandwidth and avoiding 2266 * premature sharing of HT resources and SMT-4 2267 * or SMT-8 *may* benefit from a different 2268 * cutoff. 2269 * 2270 * For multiple LLCs, allow an imbalance 2271 * until multiple tasks would share an LLC 2272 * on one node while LLCs on another node 2273 * remain idle. 2274 */ 2275 nr_llcs =3D sd->span_weight / child->span_weight; 2276 if (nr_llcs =3D=3D 1) 2277 imb =3D sd->span_weight >> 2; 2278 else 2279 imb =3D nr_llcs; 2280 sd->imb_numa_nr =3D imb; 2281 = 2282 /* Set span based on the first NUMA domain. */ 2283 top =3D sd; > 2284 top_p =3D top->parent; 2285 while (top_p && !(top_p->flags & SD_NUMA)) { > 2286 top =3D top->parent; 2287 top_p =3D top->parent; 2288 } 2289 imb_span =3D top_p ? top_p->span_weight : sd->span_weight; 2290 } else { 2291 int factor =3D max(1U, (sd->span_weight / imb_span)); 2292 = 2293 sd->imb_numa_nr =3D imb * factor; 2294 } 2295 } 2296 } 2297 = 2298 /* Calculate CPU capacity for physical packages and nodes */ 2299 for (i =3D nr_cpumask_bits-1; i >=3D 0; i--) { 2300 if (!cpumask_test_cpu(i, cpu_map)) 2301 continue; 2302 = 2303 for (sd =3D *per_cpu_ptr(d.sd, i); sd; sd =3D sd->parent) { 2304 claim_allocations(i, sd); 2305 init_sched_groups_capacity(i, sd); 2306 } 2307 } 2308 = 2309 /* Attach the domains */ 2310 rcu_read_lock(); 2311 for_each_cpu(i, cpu_map) { 2312 rq =3D cpu_rq(i); 2313 sd =3D *per_cpu_ptr(d.sd, i); 2314 = 2315 /* Use READ_ONCE()/WRITE_ONCE() to avoid load/store tearing: */ 2316 if (rq->cpu_capacity_orig > READ_ONCE(d.rd->max_cpu_capacity)) 2317 WRITE_ONCE(d.rd->max_cpu_capacity, rq->cpu_capacity_orig); 2318 = 2319 cpu_attach_domain(sd, d.rd, i); 2320 } 2321 rcu_read_unlock(); 2322 = 2323 if (has_asym) 2324 static_branch_inc_cpuslocked(&sched_asym_cpucapacity); 2325 = 2326 if (rq && sched_debug_verbose) { 2327 pr_info("root domain span: %*pbl (max cpu_capacity =3D %lu)\n", 2328 cpumask_pr_args(cpu_map), rq->rd->max_cpu_capacity); 2329 } 2330 = 2331 ret =3D 0; 2332 error: 2333 __free_domain_allocs(&d, alloc_state, cpu_map); 2334 = 2335 return ret; 2336 } 2337 = --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org --===============4713143183219427736==--