CC: [email protected]
In-Reply-To: <[email protected]>
References: <[email protected]>
TO: Huang Ying <[email protected]>

Hi Huang,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on tip/sched/core]
[also build test WARNING on linux/master linus/master v5.17-rc3 next-20220208]
[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/Huang-Ying/NUMA-balancing-fix-NUMA-topology-for-systems-with-CPU-less-nodes/20220208-212402
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
c8eaf6ac76f40f6c59fc7d056e2e08c4a57ea9c7
:::::: branch date: 7 hours ago
:::::: commit date: 7 hours ago
config: arm64-randconfig-s031-20220208 
(https://download.01.org/0day-ci/archive/20220209/[email protected]/config)
compiler: aarch64-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/ed82092e509333870d756fc8e53d816885922fc4
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review 
Huang-Ying/NUMA-balancing-fix-NUMA-topology-for-systems-with-CPU-less-nodes/20220208-212402
        git checkout ed82092e509333870d756fc8e53d816885922fc4
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross C=1 
CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=arm64 
SHELL=/bin/bash kernel/sched/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


sparse warnings: (new ones prefixed by >>)
   kernel/sched/topology.c:461:19: sparse: sparse: incorrect type in argument 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 [noderef] 
__rcu *pd
   kernel/sched/topology.c:623:49: sparse: sparse: incorrect type in 
initializer (different address spaces) @@     expected struct sched_domain 
*parent @@     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 
[noderef] __rcu *parent
   kernel/sched/topology.c:694:50: sparse: sparse: incorrect type in 
initializer (different address spaces) @@     expected struct sched_domain 
*parent @@     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 
[noderef] __rcu *parent
   kernel/sched/topology.c:701:55: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain [noderef] __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 
*[assigned] tmp
   kernel/sched/topology.c:711:29: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *[assigned] 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 
[noderef] __rcu *parent
   kernel/sched/topology.c:716:20: sparse: sparse: incorrect type in assignment 
(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 
[noderef] __rcu *parent
   kernel/sched/topology.c:737:13: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *[assigned] 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 
[noderef] __rcu *sd
   kernel/sched/topology.c:899:70: sparse: sparse: incorrect type in argument 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 
[noderef] __rcu *child
   kernel/sched/topology.c:928:59: sparse: sparse: incorrect type in argument 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 
[noderef] __rcu *child
   kernel/sched/topology.c:974:57: sparse: sparse: incorrect type in argument 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 
[noderef] __rcu *child
   kernel/sched/topology.c:976:25: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *sibling @@     
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 
[noderef] __rcu *child
   kernel/sched/topology.c:984:55: sparse: sparse: incorrect type in argument 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 
[noderef] __rcu *child
   kernel/sched/topology.c:986:25: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *sibling @@     
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 
[noderef] __rcu *child
   kernel/sched/topology.c:1056:62: sparse: sparse: incorrect type in argument 
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_domain *sd
   kernel/sched/topology.c:1056:62: sparse:     got struct sched_domain 
[noderef] __rcu *child
   kernel/sched/topology.c:1160:40: sparse: sparse: incorrect type in 
initializer (different address spaces) @@     expected struct sched_domain 
*child @@     got struct sched_domain [noderef] __rcu *child @@
   kernel/sched/topology.c:1160:40: sparse:     expected struct sched_domain 
*child
   kernel/sched/topology.c:1160:40: sparse:     got struct sched_domain 
[noderef] __rcu *child
   kernel/sched/topology.c:1569:43: sparse: sparse: incorrect type in 
initializer (different address spaces) @@     expected struct sched_domain 
[noderef] __rcu *child @@     got struct sched_domain *child @@
   kernel/sched/topology.c:1569:43: sparse:     expected struct sched_domain 
[noderef] __rcu *child
   kernel/sched/topology.c:1569:43: sparse:     got struct sched_domain *child
   kernel/sched/topology.c:1707:21: sparse: sparse: incompatible types in 
comparison expression (different address spaces):
>> kernel/sched/topology.c:1707:21: sparse:    int [noderef] __rcu *
>> kernel/sched/topology.c:1707:21: sparse:    int *
   kernel/sched/topology.c:1833:9: sparse: sparse: incompatible types in 
comparison expression (different address spaces):
   kernel/sched/topology.c:1833:9: sparse:    int [noderef] __rcu *
   kernel/sched/topology.c:1833:9: sparse:    int *
   kernel/sched/topology.c:1888:9: sparse: sparse: incompatible types in 
comparison expression (different address spaces):
>> kernel/sched/topology.c:1888:9: sparse:    struct cpumask **[noderef] __rcu *
>> kernel/sched/topology.c:1888:9: sparse:    struct cpumask ***
   kernel/sched/topology.c:1946:9: sparse: sparse: incompatible types in 
comparison expression (different address spaces):
   kernel/sched/topology.c:1946:9: sparse:    int [noderef] __rcu *
   kernel/sched/topology.c:1946:9: sparse:    int *
   kernel/sched/topology.c:1948:9: sparse: sparse: incompatible types in 
comparison expression (different address spaces):
   kernel/sched/topology.c:1948:9: sparse:    struct cpumask **[noderef] __rcu *
   kernel/sched/topology.c:1948:9: sparse:    struct cpumask ***
   kernel/sched/topology.c:2032:17: sparse: sparse: incompatible types in 
comparison expression (different address spaces):
   kernel/sched/topology.c:2032:17: sparse:    struct cpumask **[noderef] __rcu 
*
   kernel/sched/topology.c:2032:17: sparse:    struct cpumask ***
   kernel/sched/topology.c:2166:31: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct sched_domain 
[noderef] __rcu *parent @@     got struct sched_domain *sd @@
   kernel/sched/topology.c:2166:31: sparse:     expected struct sched_domain 
[noderef] __rcu *parent
   kernel/sched/topology.c:2166:31: sparse:     got struct sched_domain *sd
   kernel/sched/topology.c:2269:57: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct sched_domain 
*[assigned] sd @@     got struct sched_domain [noderef] __rcu *parent @@
   kernel/sched/topology.c:2269:57: sparse:     expected struct sched_domain 
*[assigned] sd
   kernel/sched/topology.c:2269:57: sparse:     got struct sched_domain 
[noderef] __rcu *parent
   kernel/sched/topology.c:2286:57: sparse: sparse: incorrect type in 
assignment (different address spaces) @@     expected struct sched_domain 
*[assigned] sd @@     got struct sched_domain [noderef] __rcu *parent @@
   kernel/sched/topology.c:2286:57: sparse:     expected struct sched_domain 
*[assigned] sd
   kernel/sched/topology.c:2286:57: sparse:     got struct sched_domain 
[noderef] __rcu *parent
   kernel/sched/topology.c: note: in included file:
   kernel/sched/sched.h:1745:9: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *[assigned] sd 
@@     got struct sched_domain [noderef] __rcu *parent @@
   kernel/sched/sched.h:1745:9: sparse:     expected struct sched_domain 
*[assigned] sd
   kernel/sched/sched.h:1745:9: sparse:     got struct sched_domain [noderef] 
__rcu *parent
   kernel/sched/sched.h:1758:9: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *[assigned] sd 
@@     got struct sched_domain [noderef] __rcu *parent @@
   kernel/sched/sched.h:1758:9: sparse:     expected struct sched_domain 
*[assigned] sd
   kernel/sched/sched.h:1758:9: sparse:     got struct sched_domain [noderef] 
__rcu *parent
   kernel/sched/sched.h:1745:9: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *[assigned] sd 
@@     got struct sched_domain [noderef] __rcu *parent @@
   kernel/sched/sched.h:1745:9: sparse:     expected struct sched_domain 
*[assigned] sd
   kernel/sched/sched.h:1745:9: sparse:     got struct sched_domain [noderef] 
__rcu *parent
   kernel/sched/sched.h:1758:9: sparse: sparse: incorrect type in assignment 
(different address spaces) @@     expected struct sched_domain *[assigned] sd 
@@     got struct sched_domain [noderef] __rcu *parent @@
   kernel/sched/sched.h:1758:9: sparse:     expected struct sched_domain 
*[assigned] sd
   kernel/sched/sched.h:1758:9: sparse:     got struct sched_domain [noderef] 
__rcu *parent
   kernel/sched/topology.c:929:31: sparse: sparse: dereference of noderef 
expression
   kernel/sched/topology.c:1590:19: sparse: sparse: dereference of noderef 
expression

vim +1707 kernel/sched/topology.c

f2cb13609d5397 Ingo Molnar           2017-02-01  1697  
f2cb13609d5397 Ingo Molnar           2017-02-01  1698  bool 
find_numa_distance(int distance)
f2cb13609d5397 Ingo Molnar           2017-02-01  1699  {
ed82092e509333 Huang Ying            2022-02-08  1700   bool found = false;
ed82092e509333 Huang Ying            2022-02-08  1701   int i, *distances;
f2cb13609d5397 Ingo Molnar           2017-02-01  1702  
f2cb13609d5397 Ingo Molnar           2017-02-01  1703   if (distance == 
node_distance(0, 0))
f2cb13609d5397 Ingo Molnar           2017-02-01  1704           return true;
f2cb13609d5397 Ingo Molnar           2017-02-01  1705  
ed82092e509333 Huang Ying            2022-02-08  1706   rcu_read_lock();
ed82092e509333 Huang Ying            2022-02-08 @1707   distances = 
rcu_dereference(sched_domains_numa_distance);
ed82092e509333 Huang Ying            2022-02-08  1708   if (!distances)
ed82092e509333 Huang Ying            2022-02-08  1709           goto unlock;
f2cb13609d5397 Ingo Molnar           2017-02-01  1710   for (i = 0; i < 
sched_domains_numa_levels; i++) {
ed82092e509333 Huang Ying            2022-02-08  1711           if 
(distances[i] == distance) {
ed82092e509333 Huang Ying            2022-02-08  1712                   found = 
true;
ed82092e509333 Huang Ying            2022-02-08  1713                   break;
f2cb13609d5397 Ingo Molnar           2017-02-01  1714           }
ed82092e509333 Huang Ying            2022-02-08  1715   }
ed82092e509333 Huang Ying            2022-02-08  1716  unlock:
ed82092e509333 Huang Ying            2022-02-08  1717   rcu_read_unlock();
f2cb13609d5397 Ingo Molnar           2017-02-01  1718  
ed82092e509333 Huang Ying            2022-02-08  1719   return found;
f2cb13609d5397 Ingo Molnar           2017-02-01  1720  }
f2cb13609d5397 Ingo Molnar           2017-02-01  1721  
ed82092e509333 Huang Ying            2022-02-08  1722  #define 
for_each_cpu_node_but(n, nbut)           \
ed82092e509333 Huang Ying            2022-02-08  1723   for_each_node_state(n, 
N_CPU)           \
ed82092e509333 Huang Ying            2022-02-08  1724           if (n == nbut)  
                \
ed82092e509333 Huang Ying            2022-02-08  1725                   
continue;               \
ed82092e509333 Huang Ying            2022-02-08  1726           else
ed82092e509333 Huang Ying            2022-02-08  1727  
f2cb13609d5397 Ingo Molnar           2017-02-01  1728  /*
f2cb13609d5397 Ingo Molnar           2017-02-01  1729   * A system can have 
three types of NUMA topology:
f2cb13609d5397 Ingo Molnar           2017-02-01  1730   * NUMA_DIRECT: all 
nodes are directly connected, or not a NUMA system
f2cb13609d5397 Ingo Molnar           2017-02-01  1731   * NUMA_GLUELESS_MESH: 
some nodes reachable through intermediary nodes
f2cb13609d5397 Ingo Molnar           2017-02-01  1732   * NUMA_BACKPLANE: nodes 
can reach other nodes through a backplane
f2cb13609d5397 Ingo Molnar           2017-02-01  1733   *
f2cb13609d5397 Ingo Molnar           2017-02-01  1734   * The difference 
between a glueless mesh topology and a backplane
f2cb13609d5397 Ingo Molnar           2017-02-01  1735   * topology lies in 
whether communication between not directly
f2cb13609d5397 Ingo Molnar           2017-02-01  1736   * connected nodes goes 
through intermediary nodes (where programs
f2cb13609d5397 Ingo Molnar           2017-02-01  1737   * could run), or 
through backplane controllers. This affects
f2cb13609d5397 Ingo Molnar           2017-02-01  1738   * placement of programs.
f2cb13609d5397 Ingo Molnar           2017-02-01  1739   *
f2cb13609d5397 Ingo Molnar           2017-02-01  1740   * The type of topology 
can be discerned with the following tests:
f2cb13609d5397 Ingo Molnar           2017-02-01  1741   * - If the maximum 
distance between any nodes is 1 hop, the system
f2cb13609d5397 Ingo Molnar           2017-02-01  1742   *   is directly 
connected.
f2cb13609d5397 Ingo Molnar           2017-02-01  1743   * - If for two nodes A 
and B, located N > 1 hops away from each other,
f2cb13609d5397 Ingo Molnar           2017-02-01  1744   *   there is an 
intermediary node C, which is < N hops away from both
f2cb13609d5397 Ingo Molnar           2017-02-01  1745   *   nodes A and B, the 
system is a glueless mesh.
f2cb13609d5397 Ingo Molnar           2017-02-01  1746   */
ed82092e509333 Huang Ying            2022-02-08  1747  static void 
init_numa_topology_type(int offline_node)
f2cb13609d5397 Ingo Molnar           2017-02-01  1748  {
f2cb13609d5397 Ingo Molnar           2017-02-01  1749   int a, b, c, n;
f2cb13609d5397 Ingo Molnar           2017-02-01  1750  
f2cb13609d5397 Ingo Molnar           2017-02-01  1751   n = 
sched_max_numa_distance;
f2cb13609d5397 Ingo Molnar           2017-02-01  1752  
e5e96fafd9028b Srikar Dronamraju     2018-08-10  1753   if 
(sched_domains_numa_levels <= 2) {
f2cb13609d5397 Ingo Molnar           2017-02-01  1754           
sched_numa_topology_type = NUMA_DIRECT;
f2cb13609d5397 Ingo Molnar           2017-02-01  1755           return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1756   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1757  
ed82092e509333 Huang Ying            2022-02-08  1758   
for_each_cpu_node_but(a, offline_node) {
ed82092e509333 Huang Ying            2022-02-08  1759           
for_each_cpu_node_but(b, offline_node) {
f2cb13609d5397 Ingo Molnar           2017-02-01  1760                   /* Find 
two nodes furthest removed from each other. */
f2cb13609d5397 Ingo Molnar           2017-02-01  1761                   if 
(node_distance(a, b) < n)
f2cb13609d5397 Ingo Molnar           2017-02-01  1762                           
continue;
f2cb13609d5397 Ingo Molnar           2017-02-01  1763  
f2cb13609d5397 Ingo Molnar           2017-02-01  1764                   /* Is 
there an intermediary node between a and b? */
ed82092e509333 Huang Ying            2022-02-08  1765                   
for_each_cpu_node_but(c, offline_node) {
f2cb13609d5397 Ingo Molnar           2017-02-01  1766                           
if (node_distance(a, c) < n &&
f2cb13609d5397 Ingo Molnar           2017-02-01  1767                           
    node_distance(b, c) < n) {
f2cb13609d5397 Ingo Molnar           2017-02-01  1768                           
        sched_numa_topology_type =
f2cb13609d5397 Ingo Molnar           2017-02-01  1769                           
                        NUMA_GLUELESS_MESH;
f2cb13609d5397 Ingo Molnar           2017-02-01  1770                           
        return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1771                           
}
f2cb13609d5397 Ingo Molnar           2017-02-01  1772                   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1773  
f2cb13609d5397 Ingo Molnar           2017-02-01  1774                   
sched_numa_topology_type = NUMA_BACKPLANE;
f2cb13609d5397 Ingo Molnar           2017-02-01  1775                   return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1776           }
f2cb13609d5397 Ingo Molnar           2017-02-01  1777   }
ed82092e509333 Huang Ying            2022-02-08  1778  
ed82092e509333 Huang Ying            2022-02-08  1779   pr_err("Failed to find 
a NUMA topology type, defaulting to DIRECT\n");
ed82092e509333 Huang Ying            2022-02-08  1780   
sched_numa_topology_type = NUMA_DIRECT;
f2cb13609d5397 Ingo Molnar           2017-02-01  1781  }
f2cb13609d5397 Ingo Molnar           2017-02-01  1782  
620a6dc40754dc Valentin Schneider    2021-01-22  1783  
620a6dc40754dc Valentin Schneider    2021-01-22  1784  #define 
NR_DISTANCE_VALUES (1 << DISTANCE_BITS)
620a6dc40754dc Valentin Schneider    2021-01-22  1785  
ed82092e509333 Huang Ying            2022-02-08  1786  void sched_init_numa(int 
offline_node)
f2cb13609d5397 Ingo Molnar           2017-02-01  1787  {
f2cb13609d5397 Ingo Molnar           2017-02-01  1788   struct 
sched_domain_topology_level *tl;
620a6dc40754dc Valentin Schneider    2021-01-22  1789   unsigned long 
*distance_map;
620a6dc40754dc Valentin Schneider    2021-01-22  1790   int nr_levels = 0;
620a6dc40754dc Valentin Schneider    2021-01-22  1791   int i, j;
ed82092e509333 Huang Ying            2022-02-08  1792   int *distances;
ed82092e509333 Huang Ying            2022-02-08  1793   struct cpumask ***masks;
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1794  
f2cb13609d5397 Ingo Molnar           2017-02-01  1795   /*
f2cb13609d5397 Ingo Molnar           2017-02-01  1796    * O(nr_nodes^2) 
deduplicating selection sort -- in order to find the
f2cb13609d5397 Ingo Molnar           2017-02-01  1797    * unique distances in 
the node_distance() table.
f2cb13609d5397 Ingo Molnar           2017-02-01  1798    */
620a6dc40754dc Valentin Schneider    2021-01-22  1799   distance_map = 
bitmap_alloc(NR_DISTANCE_VALUES, GFP_KERNEL);
620a6dc40754dc Valentin Schneider    2021-01-22  1800   if (!distance_map)
620a6dc40754dc Valentin Schneider    2021-01-22  1801           return;
620a6dc40754dc Valentin Schneider    2021-01-22  1802  
620a6dc40754dc Valentin Schneider    2021-01-22  1803   
bitmap_zero(distance_map, NR_DISTANCE_VALUES);
ed82092e509333 Huang Ying            2022-02-08  1804   
for_each_cpu_node_but(i, offline_node) {
ed82092e509333 Huang Ying            2022-02-08  1805           
for_each_cpu_node_but(j, offline_node) {
620a6dc40754dc Valentin Schneider    2021-01-22  1806                   int 
distance = node_distance(i, j);
f2cb13609d5397 Ingo Molnar           2017-02-01  1807  
620a6dc40754dc Valentin Schneider    2021-01-22  1808                   if 
(distance < LOCAL_DISTANCE || distance >= NR_DISTANCE_VALUES) {
620a6dc40754dc Valentin Schneider    2021-01-22  1809                           
sched_numa_warn("Invalid distance value range");
ed82092e509333 Huang Ying            2022-02-08  1810                           
bitmap_free(distance_map);
620a6dc40754dc Valentin Schneider    2021-01-22  1811                           
return;
620a6dc40754dc Valentin Schneider    2021-01-22  1812                   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1813  
620a6dc40754dc Valentin Schneider    2021-01-22  1814                   
bitmap_set(distance_map, distance, 1);
620a6dc40754dc Valentin Schneider    2021-01-22  1815           }
620a6dc40754dc Valentin Schneider    2021-01-22  1816   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1817   /*
620a6dc40754dc Valentin Schneider    2021-01-22  1818    * We can now figure 
out how many unique distance values there are and
620a6dc40754dc Valentin Schneider    2021-01-22  1819    * allocate memory 
accordingly.
f2cb13609d5397 Ingo Molnar           2017-02-01  1820    */
620a6dc40754dc Valentin Schneider    2021-01-22  1821   nr_levels = 
bitmap_weight(distance_map, NR_DISTANCE_VALUES);
f2cb13609d5397 Ingo Molnar           2017-02-01  1822  
ed82092e509333 Huang Ying            2022-02-08  1823   distances = 
kcalloc(nr_levels, sizeof(int), GFP_KERNEL);
ed82092e509333 Huang Ying            2022-02-08  1824   if (!distances) {
620a6dc40754dc Valentin Schneider    2021-01-22  1825           
bitmap_free(distance_map);
620a6dc40754dc Valentin Schneider    2021-01-22  1826           return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1827   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1828  
620a6dc40754dc Valentin Schneider    2021-01-22  1829   for (i = 0, j = 0; i < 
nr_levels; i++, j++) {
620a6dc40754dc Valentin Schneider    2021-01-22  1830           j = 
find_next_bit(distance_map, NR_DISTANCE_VALUES, j);
ed82092e509333 Huang Ying            2022-02-08  1831           distances[i] = 
j;
f2cb13609d5397 Ingo Molnar           2017-02-01  1832   }
ed82092e509333 Huang Ying            2022-02-08  1833   
rcu_assign_pointer(sched_domains_numa_distance, distances);
f2cb13609d5397 Ingo Molnar           2017-02-01  1834  
620a6dc40754dc Valentin Schneider    2021-01-22  1835   
bitmap_free(distance_map);
620a6dc40754dc Valentin Schneider    2021-01-22  1836  
f2cb13609d5397 Ingo Molnar           2017-02-01  1837   /*
620a6dc40754dc Valentin Schneider    2021-01-22  1838    * 'nr_levels' contains 
the number of unique distances
f2cb13609d5397 Ingo Molnar           2017-02-01  1839    *
f2cb13609d5397 Ingo Molnar           2017-02-01  1840    * The 
sched_domains_numa_distance[] array includes the actual distance
f2cb13609d5397 Ingo Molnar           2017-02-01  1841    * numbers.
f2cb13609d5397 Ingo Molnar           2017-02-01  1842    */
f2cb13609d5397 Ingo Molnar           2017-02-01  1843  
f2cb13609d5397 Ingo Molnar           2017-02-01  1844   /*
f2cb13609d5397 Ingo Molnar           2017-02-01  1845    * Here, we should 
temporarily reset sched_domains_numa_levels to 0.
f2cb13609d5397 Ingo Molnar           2017-02-01  1846    * If it fails to 
allocate memory for array sched_domains_numa_masks[][],
620a6dc40754dc Valentin Schneider    2021-01-22  1847    * the array will 
contain less then 'nr_levels' members. This could be
f2cb13609d5397 Ingo Molnar           2017-02-01  1848    * dangerous when we 
use it to iterate array sched_domains_numa_masks[][]
f2cb13609d5397 Ingo Molnar           2017-02-01  1849    * in other functions.
f2cb13609d5397 Ingo Molnar           2017-02-01  1850    *
620a6dc40754dc Valentin Schneider    2021-01-22  1851    * We reset it to 
'nr_levels' at the end of this function.
f2cb13609d5397 Ingo Molnar           2017-02-01  1852    */
f2cb13609d5397 Ingo Molnar           2017-02-01  1853   
sched_domains_numa_levels = 0;
f2cb13609d5397 Ingo Molnar           2017-02-01  1854  
ed82092e509333 Huang Ying            2022-02-08  1855   masks = 
kzalloc(sizeof(void *) * nr_levels, GFP_KERNEL);
ed82092e509333 Huang Ying            2022-02-08  1856   if (!masks)
f2cb13609d5397 Ingo Molnar           2017-02-01  1857           return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1858  
f2cb13609d5397 Ingo Molnar           2017-02-01  1859   /*
f2cb13609d5397 Ingo Molnar           2017-02-01  1860    * Now for each level, 
construct a mask per node which contains all
f2cb13609d5397 Ingo Molnar           2017-02-01  1861    * CPUs of nodes that 
are that many hops away from us.
f2cb13609d5397 Ingo Molnar           2017-02-01  1862    */
620a6dc40754dc Valentin Schneider    2021-01-22  1863   for (i = 0; i < 
nr_levels; i++) {
ed82092e509333 Huang Ying            2022-02-08  1864           masks[i] = 
kzalloc(nr_node_ids * sizeof(void *), GFP_KERNEL);
ed82092e509333 Huang Ying            2022-02-08  1865           if (!masks[i])
f2cb13609d5397 Ingo Molnar           2017-02-01  1866                   return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1867  
ed82092e509333 Huang Ying            2022-02-08  1868           
for_each_cpu_node_but(j, offline_node) {
f2cb13609d5397 Ingo Molnar           2017-02-01  1869                   struct 
cpumask *mask = kzalloc(cpumask_size(), GFP_KERNEL);
620a6dc40754dc Valentin Schneider    2021-01-22  1870                   int k;
620a6dc40754dc Valentin Schneider    2021-01-22  1871  
f2cb13609d5397 Ingo Molnar           2017-02-01  1872                   if 
(!mask)
f2cb13609d5397 Ingo Molnar           2017-02-01  1873                           
return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1874  
ed82092e509333 Huang Ying            2022-02-08  1875                   
masks[i][j] = mask;
0083242c93759d Valentin Schneider    2021-08-18  1876  
ed82092e509333 Huang Ying            2022-02-08  1877                   
for_each_cpu_node_but(k, offline_node) {
620a6dc40754dc Valentin Schneider    2021-01-22  1878                           
if (sched_debug() && (node_distance(j, k) != node_distance(k, j)))
620a6dc40754dc Valentin Schneider    2021-01-22  1879                           
        sched_numa_warn("Node-distance not symmetric");
620a6dc40754dc Valentin Schneider    2021-01-22  1880  
f2cb13609d5397 Ingo Molnar           2017-02-01  1881                           
if (node_distance(j, k) > sched_domains_numa_distance[i])
f2cb13609d5397 Ingo Molnar           2017-02-01  1882                           
        continue;
f2cb13609d5397 Ingo Molnar           2017-02-01  1883  
f2cb13609d5397 Ingo Molnar           2017-02-01  1884                           
cpumask_or(mask, mask, cpumask_of_node(k));
f2cb13609d5397 Ingo Molnar           2017-02-01  1885                   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1886           }
f2cb13609d5397 Ingo Molnar           2017-02-01  1887   }
ed82092e509333 Huang Ying            2022-02-08 @1888   
rcu_assign_pointer(sched_domains_numa_masks, masks);
f2cb13609d5397 Ingo Molnar           2017-02-01  1889  
f2cb13609d5397 Ingo Molnar           2017-02-01  1890   /* Compute default 
topology size */
f2cb13609d5397 Ingo Molnar           2017-02-01  1891   for (i = 0; 
sched_domain_topology[i].mask; i++);
f2cb13609d5397 Ingo Molnar           2017-02-01  1892  
71e5f6644fb2f3 Dietmar Eggemann      2021-02-01  1893   tl = kzalloc((i + 
nr_levels + 1) *
f2cb13609d5397 Ingo Molnar           2017-02-01  1894                   
sizeof(struct sched_domain_topology_level), GFP_KERNEL);
f2cb13609d5397 Ingo Molnar           2017-02-01  1895   if (!tl)
f2cb13609d5397 Ingo Molnar           2017-02-01  1896           return;
f2cb13609d5397 Ingo Molnar           2017-02-01  1897  
f2cb13609d5397 Ingo Molnar           2017-02-01  1898   /*
f2cb13609d5397 Ingo Molnar           2017-02-01  1899    * Copy the default 
topology bits..
f2cb13609d5397 Ingo Molnar           2017-02-01  1900    */
f2cb13609d5397 Ingo Molnar           2017-02-01  1901   for (i = 0; 
sched_domain_topology[i].mask; i++)
f2cb13609d5397 Ingo Molnar           2017-02-01  1902           tl[i] = 
sched_domain_topology[i];
f2cb13609d5397 Ingo Molnar           2017-02-01  1903  
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1904   /*
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1905    * Add the NUMA 
identity distance, aka single NODE.
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1906    */
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1907   tl[i++] = (struct 
sched_domain_topology_level){
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1908           .mask = 
sd_numa_mask,
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1909           .numa_level = 0,
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1910           
SD_INIT_NAME(NODE)
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1911   };
051f3ca02e4643 Suravee Suthikulpanit 2017-09-07  1912  
f2cb13609d5397 Ingo Molnar           2017-02-01  1913   /*
f2cb13609d5397 Ingo Molnar           2017-02-01  1914    * .. and append 'j' 
levels of NUMA goodness.
f2cb13609d5397 Ingo Molnar           2017-02-01  1915    */
620a6dc40754dc Valentin Schneider    2021-01-22  1916   for (j = 1; j < 
nr_levels; i++, j++) {
f2cb13609d5397 Ingo Molnar           2017-02-01  1917           tl[i] = (struct 
sched_domain_topology_level){
f2cb13609d5397 Ingo Molnar           2017-02-01  1918                   .mask = 
sd_numa_mask,
f2cb13609d5397 Ingo Molnar           2017-02-01  1919                   
.sd_flags = cpu_numa_flags,
f2cb13609d5397 Ingo Molnar           2017-02-01  1920                   .flags 
= SDTL_OVERLAP,
f2cb13609d5397 Ingo Molnar           2017-02-01  1921                   
.numa_level = j,
f2cb13609d5397 Ingo Molnar           2017-02-01  1922                   
SD_INIT_NAME(NUMA)
f2cb13609d5397 Ingo Molnar           2017-02-01  1923           };
f2cb13609d5397 Ingo Molnar           2017-02-01  1924   }
f2cb13609d5397 Ingo Molnar           2017-02-01  1925  
ed82092e509333 Huang Ying            2022-02-08  1926   
sched_domain_topology_saved = sched_domain_topology;
f2cb13609d5397 Ingo Molnar           2017-02-01  1927   sched_domain_topology = 
tl;
f2cb13609d5397 Ingo Molnar           2017-02-01  1928  
620a6dc40754dc Valentin Schneider    2021-01-22  1929   
sched_domains_numa_levels = nr_levels;
620a6dc40754dc Valentin Schneider    2021-01-22  1930   sched_max_numa_distance 
= sched_domains_numa_distance[nr_levels - 1];
f2cb13609d5397 Ingo Molnar           2017-02-01  1931  
ed82092e509333 Huang Ying            2022-02-08  1932   
init_numa_topology_type(offline_node);
0083242c93759d Valentin Schneider    2021-08-18  1933  }
0083242c93759d Valentin Schneider    2021-08-18  1934  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]
_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to