From: kernel test robot <lkp@intel.com>
To: Barry Song <song.bao.hua@hisilicon.com>,
valentin.schneider@arm.com, vincent.guittot@linaro.org,
mgorman@suse.de, mingo@kernel.org, peterz@infradead.org,
dietmar.eggemann@arm.com, morten.rasmussen@arm.com,
linux-kernel@vger.kernel.org
Cc: kbuild-all@lists.01.org, linuxarm@openeuler.org, xuwei5@huawei.com
Subject: Re: [PATCH] sched/topology: fix the issue groups don't span domain->span for NUMA diameter > 2
Date: Mon, 1 Feb 2021 13:36:45 +0800 [thread overview]
Message-ID: <202102011345.IjdbaD7X-lkp@intel.com> (raw)
In-Reply-To: <20210201033830.15040-1-song.bao.hua@hisilicon.com>
[-- Attachment #1: Type: text/plain, Size: 18022 bytes --]
Hi Barry,
I love your patch! Perhaps something to improve:
[auto build test WARNING on tip/sched/core]
[also build test WARNING on next-20210125]
[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/Barry-Song/sched-topology-fix-the-issue-groups-don-t-span-domain-span-for-NUMA-diameter-2/20210201-114807
base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 7a976f77bb962ce9486e09eb839aa135619b54f3
config: i386-randconfig-s001-20210201 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-215-g0fb77bb6-dirty
# https://github.com/0day-ci/linux/commit/a8f7eae6bc5ac37efd8cbe15e0a388127619f1b0
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Barry-Song/sched-topology-fix-the-issue-groups-don-t-span-domain-span-for-NUMA-diameter-2/20210201-114807
git checkout a8f7eae6bc5ac37efd8cbe15e0a388127619f1b0
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
"sparse warnings: (new ones prefixed by >>)"
kernel/sched/topology.c:106:56: 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:106:56: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:106:56: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:125:60: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:125:60: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:125:60: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:148: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:148:20: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:148:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:431:13: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct perf_domain *[assigned] tmp @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:431:13: sparse: expected struct perf_domain *[assigned] tmp
kernel/sched/topology.c:431:13: sparse: got struct perf_domain [noderef] __rcu *pd
kernel/sched/topology.c:440:13: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct perf_domain *[assigned] tmp @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:440:13: sparse: expected struct perf_domain *[assigned] tmp
kernel/sched/topology.c:440:13: sparse: got struct perf_domain [noderef] __rcu *pd
kernel/sched/topology.c:461:19: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct perf_domain *[assigned] pd @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:461:19: sparse: expected struct perf_domain *[assigned] 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:695: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:695:50: sparse: expected struct sched_domain *parent
kernel/sched/topology.c:695:50: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:702: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:702:55: sparse: expected struct sched_domain [noderef] __rcu *[noderef] __rcu child
kernel/sched/topology.c:702:55: sparse: got struct sched_domain *[assigned] tmp
kernel/sched/topology.c:712: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:712:29: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:712:29: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:717: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:717:20: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:717:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:723:33: 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:723:33: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:723:33: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:729: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:729:13: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:729:13: sparse: got struct sched_domain [noderef] __rcu *sd
kernel/sched/topology.c:891:66: 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:891:66: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:891:66: sparse: got struct sched_domain [noderef] __rcu *child
>> kernel/sched/topology.c:893:33: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sibling @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:893:33: sparse: expected struct sched_domain *[assigned] sibling
kernel/sched/topology.c:893:33: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:896: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:896:70: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:896:70: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:925: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:925:59: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:925:59: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1033:65: 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:1033:65: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:1033:65: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1035:33: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sibling @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1035:33: sparse: expected struct sched_domain *[assigned] sibling
kernel/sched/topology.c:1035:33: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1140: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:1140:40: sparse: expected struct sched_domain *child
kernel/sched/topology.c:1140:40: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1441: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:1441:43: sparse: expected struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1441:43: sparse: got struct sched_domain *child
kernel/sched/topology.c:1926: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:1926:31: sparse: expected struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:1926:31: sparse: got struct sched_domain *sd
kernel/sched/topology.c:2094: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:2094:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2094:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:2111: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:2111:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2111:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:59:25: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:64:25: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c: note: in included file:
kernel/sched/sched.h:1455: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:1455:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1455:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1468: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:1468:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1468:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1455: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:1455:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1455:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1468: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:1468:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1468:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:1456:19: sparse: sparse: dereference of noderef expression
vim +893 kernel/sched/topology.c
762
763
764 /*
765 * NUMA topology (first read the regular topology blurb below)
766 *
767 * Given a node-distance table, for example:
768 *
769 * node 0 1 2 3
770 * 0: 10 20 30 20
771 * 1: 20 10 20 30
772 * 2: 30 20 10 20
773 * 3: 20 30 20 10
774 *
775 * which represents a 4 node ring topology like:
776 *
777 * 0 ----- 1
778 * | |
779 * | |
780 * | |
781 * 3 ----- 2
782 *
783 * We want to construct domains and groups to represent this. The way we go
784 * about doing this is to build the domains on 'hops'. For each NUMA level we
785 * construct the mask of all nodes reachable in @level hops.
786 *
787 * For the above NUMA topology that gives 3 levels:
788 *
789 * NUMA-2 0-3 0-3 0-3 0-3
790 * groups: {0-1,3},{1-3} {0-2},{0,2-3} {1-3},{0-1,3} {0,2-3},{0-2}
791 *
792 * NUMA-1 0-1,3 0-2 1-3 0,2-3
793 * groups: {0},{1},{3} {0},{1},{2} {1},{2},{3} {0},{2},{3}
794 *
795 * NUMA-0 0 1 2 3
796 *
797 *
798 * As can be seen; things don't nicely line up as with the regular topology.
799 * When we iterate a domain in child domain chunks some nodes can be
800 * represented multiple times -- hence the "overlap" naming for this part of
801 * the topology.
802 *
803 * In order to minimize this overlap, we only build enough groups to cover the
804 * domain. For instance Node-0 NUMA-2 would only get groups: 0-1,3 and 1-3.
805 *
806 * Because:
807 *
808 * - the first group of each domain is its child domain; this
809 * gets us the first 0-1,3
810 * - the only uncovered node is 2, who's child domain is 1-3.
811 *
812 * However, because of the overlap, computing a unique CPU for each group is
813 * more complicated. Consider for instance the groups of NODE-1 NUMA-2, both
814 * groups include the CPUs of Node-0, while those CPUs would not in fact ever
815 * end up at those groups (they would end up in group: 0-1,3).
816 *
817 * To correct this we have to introduce the group balance mask. This mask
818 * will contain those CPUs in the group that can reach this group given the
819 * (child) domain tree.
820 *
821 * With this we can once again compute balance_cpu and sched_group_capacity
822 * relations.
823 *
824 * XXX include words on how balance_cpu is unique and therefore can be
825 * used for sched_group_capacity links.
826 *
827 *
828 * Another 'interesting' topology is:
829 *
830 * node 0 1 2 3
831 * 0: 10 20 20 30
832 * 1: 20 10 20 20
833 * 2: 20 20 10 20
834 * 3: 30 20 20 10
835 *
836 * Which looks a little like:
837 *
838 * 0 ----- 1
839 * | / |
840 * | / |
841 * | / |
842 * 2 ----- 3
843 *
844 * This topology is asymmetric, nodes 1,2 are fully connected, but nodes 0,3
845 * are not.
846 *
847 * This leads to a few particularly weird cases where the sched_domain's are
848 * not of the same number for each CPU. Consider:
849 *
850 * NUMA-2 0-3 0-3
851 * groups: {0-2},{1-3} {1-3},{0-2}
852 *
853 * NUMA-1 0-2 0-3 0-3 1-3
854 *
855 * NUMA-0 0 1 2 3
856 *
857 */
858
859
860 /*
861 * Build the balance mask; it contains only those CPUs that can arrive at this
862 * group and should be considered to continue balancing.
863 *
864 * We do this during the group creation pass, therefore the group information
865 * isn't complete yet, however since each group represents a (child) domain we
866 * can fully construct this using the sched_domain bits (which are already
867 * complete).
868 */
869 static void
870 build_balance_mask(struct sched_domain *sd, struct sched_group *sg, struct cpumask *mask)
871 {
872 const struct cpumask *sg_span = sched_group_span(sg);
873 struct sd_data *sdd = sd->private;
874 struct sched_domain *sibling;
875 int i;
876
877 cpumask_clear(mask);
878
879 for_each_cpu(i, sg_span) {
880 sibling = *per_cpu_ptr(sdd->sd, i);
881
882 /*
883 * Can happen in the asymmetric case, where these siblings are
884 * unused. The mask will not be empty because those CPUs that
885 * do have the top domain _should_ span the domain.
886 */
887 if (!sibling->child)
888 continue;
889
890 while (sibling->child &&
891 !cpumask_subset(sched_domain_span(sibling->child),
892 sched_domain_span(sd)))
> 893 sibling = sibling->child;
894
895 /* If we would not end up here, we can't continue from here */
896 if (!cpumask_equal(sg_span, sched_domain_span(sibling->child)))
897 continue;
898
899 cpumask_set_cpu(i, mask);
900 }
901
902 /* We must not have empty masks here */
903 WARN_ON_ONCE(cpumask_empty(mask));
904 }
905
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 28559 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH] sched/topology: fix the issue groups don't span domain->span for NUMA diameter > 2
Date: Mon, 01 Feb 2021 13:36:45 +0800 [thread overview]
Message-ID: <202102011345.IjdbaD7X-lkp@intel.com> (raw)
In-Reply-To: <20210201033830.15040-1-song.bao.hua@hisilicon.com>
[-- Attachment #1: Type: text/plain, Size: 18292 bytes --]
Hi Barry,
I love your patch! Perhaps something to improve:
[auto build test WARNING on tip/sched/core]
[also build test WARNING on next-20210125]
[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/Barry-Song/sched-topology-fix-the-issue-groups-don-t-span-domain-span-for-NUMA-diameter-2/20210201-114807
base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 7a976f77bb962ce9486e09eb839aa135619b54f3
config: i386-randconfig-s001-20210201 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-215-g0fb77bb6-dirty
# https://github.com/0day-ci/linux/commit/a8f7eae6bc5ac37efd8cbe15e0a388127619f1b0
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Barry-Song/sched-topology-fix-the-issue-groups-don-t-span-domain-span-for-NUMA-diameter-2/20210201-114807
git checkout a8f7eae6bc5ac37efd8cbe15e0a388127619f1b0
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
"sparse warnings: (new ones prefixed by >>)"
kernel/sched/topology.c:106:56: 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:106:56: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:106:56: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:125:60: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_domain *sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/topology.c:125:60: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:125:60: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:148: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:148:20: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:148:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:431:13: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct perf_domain *[assigned] tmp @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:431:13: sparse: expected struct perf_domain *[assigned] tmp
kernel/sched/topology.c:431:13: sparse: got struct perf_domain [noderef] __rcu *pd
kernel/sched/topology.c:440:13: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct perf_domain *[assigned] tmp @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:440:13: sparse: expected struct perf_domain *[assigned] tmp
kernel/sched/topology.c:440:13: sparse: got struct perf_domain [noderef] __rcu *pd
kernel/sched/topology.c:461:19: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct perf_domain *[assigned] pd @@ got struct perf_domain [noderef] __rcu *pd @@
kernel/sched/topology.c:461:19: sparse: expected struct perf_domain *[assigned] 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:695: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:695:50: sparse: expected struct sched_domain *parent
kernel/sched/topology.c:695:50: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:702: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:702:55: sparse: expected struct sched_domain [noderef] __rcu *[noderef] __rcu child
kernel/sched/topology.c:702:55: sparse: got struct sched_domain *[assigned] tmp
kernel/sched/topology.c:712: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:712:29: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:712:29: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:717: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:717:20: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:717:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:723:33: 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:723:33: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:723:33: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:729: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:729:13: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/topology.c:729:13: sparse: got struct sched_domain [noderef] __rcu *sd
kernel/sched/topology.c:891:66: 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:891:66: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:891:66: sparse: got struct sched_domain [noderef] __rcu *child
>> kernel/sched/topology.c:893:33: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sibling @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:893:33: sparse: expected struct sched_domain *[assigned] sibling
kernel/sched/topology.c:893:33: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:896: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:896:70: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:896:70: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:925: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:925:59: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:925:59: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1033:65: 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:1033:65: sparse: expected struct sched_domain *sd
kernel/sched/topology.c:1033:65: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1035:33: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sibling @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/topology.c:1035:33: sparse: expected struct sched_domain *[assigned] sibling
kernel/sched/topology.c:1035:33: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1140: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:1140:40: sparse: expected struct sched_domain *child
kernel/sched/topology.c:1140:40: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1441: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:1441:43: sparse: expected struct sched_domain [noderef] __rcu *child
kernel/sched/topology.c:1441:43: sparse: got struct sched_domain *child
kernel/sched/topology.c:1926: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:1926:31: sparse: expected struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:1926:31: sparse: got struct sched_domain *sd
kernel/sched/topology.c:2094: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:2094:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2094:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:2111: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:2111:57: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/topology.c:2111:57: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:59:25: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c:64:25: sparse: sparse: dereference of noderef expression
kernel/sched/topology.c: note: in included file:
kernel/sched/sched.h:1455: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:1455:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1455:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1468: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:1468:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1468:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1455: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:1455:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1455:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/sched.h:1468: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:1468:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/sched.h:1468:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/topology.c:1456:19: sparse: sparse: dereference of noderef expression
vim +893 kernel/sched/topology.c
762
763
764 /*
765 * NUMA topology (first read the regular topology blurb below)
766 *
767 * Given a node-distance table, for example:
768 *
769 * node 0 1 2 3
770 * 0: 10 20 30 20
771 * 1: 20 10 20 30
772 * 2: 30 20 10 20
773 * 3: 20 30 20 10
774 *
775 * which represents a 4 node ring topology like:
776 *
777 * 0 ----- 1
778 * | |
779 * | |
780 * | |
781 * 3 ----- 2
782 *
783 * We want to construct domains and groups to represent this. The way we go
784 * about doing this is to build the domains on 'hops'. For each NUMA level we
785 * construct the mask of all nodes reachable in @level hops.
786 *
787 * For the above NUMA topology that gives 3 levels:
788 *
789 * NUMA-2 0-3 0-3 0-3 0-3
790 * groups: {0-1,3},{1-3} {0-2},{0,2-3} {1-3},{0-1,3} {0,2-3},{0-2}
791 *
792 * NUMA-1 0-1,3 0-2 1-3 0,2-3
793 * groups: {0},{1},{3} {0},{1},{2} {1},{2},{3} {0},{2},{3}
794 *
795 * NUMA-0 0 1 2 3
796 *
797 *
798 * As can be seen; things don't nicely line up as with the regular topology.
799 * When we iterate a domain in child domain chunks some nodes can be
800 * represented multiple times -- hence the "overlap" naming for this part of
801 * the topology.
802 *
803 * In order to minimize this overlap, we only build enough groups to cover the
804 * domain. For instance Node-0 NUMA-2 would only get groups: 0-1,3 and 1-3.
805 *
806 * Because:
807 *
808 * - the first group of each domain is its child domain; this
809 * gets us the first 0-1,3
810 * - the only uncovered node is 2, who's child domain is 1-3.
811 *
812 * However, because of the overlap, computing a unique CPU for each group is
813 * more complicated. Consider for instance the groups of NODE-1 NUMA-2, both
814 * groups include the CPUs of Node-0, while those CPUs would not in fact ever
815 * end up at those groups (they would end up in group: 0-1,3).
816 *
817 * To correct this we have to introduce the group balance mask. This mask
818 * will contain those CPUs in the group that can reach this group given the
819 * (child) domain tree.
820 *
821 * With this we can once again compute balance_cpu and sched_group_capacity
822 * relations.
823 *
824 * XXX include words on how balance_cpu is unique and therefore can be
825 * used for sched_group_capacity links.
826 *
827 *
828 * Another 'interesting' topology is:
829 *
830 * node 0 1 2 3
831 * 0: 10 20 20 30
832 * 1: 20 10 20 20
833 * 2: 20 20 10 20
834 * 3: 30 20 20 10
835 *
836 * Which looks a little like:
837 *
838 * 0 ----- 1
839 * | / |
840 * | / |
841 * | / |
842 * 2 ----- 3
843 *
844 * This topology is asymmetric, nodes 1,2 are fully connected, but nodes 0,3
845 * are not.
846 *
847 * This leads to a few particularly weird cases where the sched_domain's are
848 * not of the same number for each CPU. Consider:
849 *
850 * NUMA-2 0-3 0-3
851 * groups: {0-2},{1-3} {1-3},{0-2}
852 *
853 * NUMA-1 0-2 0-3 0-3 1-3
854 *
855 * NUMA-0 0 1 2 3
856 *
857 */
858
859
860 /*
861 * Build the balance mask; it contains only those CPUs that can arrive at this
862 * group and should be considered to continue balancing.
863 *
864 * We do this during the group creation pass, therefore the group information
865 * isn't complete yet, however since each group represents a (child) domain we
866 * can fully construct this using the sched_domain bits (which are already
867 * complete).
868 */
869 static void
870 build_balance_mask(struct sched_domain *sd, struct sched_group *sg, struct cpumask *mask)
871 {
872 const struct cpumask *sg_span = sched_group_span(sg);
873 struct sd_data *sdd = sd->private;
874 struct sched_domain *sibling;
875 int i;
876
877 cpumask_clear(mask);
878
879 for_each_cpu(i, sg_span) {
880 sibling = *per_cpu_ptr(sdd->sd, i);
881
882 /*
883 * Can happen in the asymmetric case, where these siblings are
884 * unused. The mask will not be empty because those CPUs that
885 * do have the top domain _should_ span the domain.
886 */
887 if (!sibling->child)
888 continue;
889
890 while (sibling->child &&
891 !cpumask_subset(sched_domain_span(sibling->child),
892 sched_domain_span(sd)))
> 893 sibling = sibling->child;
894
895 /* If we would not end up here, we can't continue from here */
896 if (!cpumask_equal(sg_span, sched_domain_span(sibling->child)))
897 continue;
898
899 cpumask_set_cpu(i, mask);
900 }
901
902 /* We must not have empty masks here */
903 WARN_ON_ONCE(cpumask_empty(mask));
904 }
905
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 28559 bytes --]
next prev parent reply other threads:[~2021-02-01 5:44 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-01 3:38 [PATCH] sched/topology: fix the issue groups don't span domain->span for NUMA diameter > 2 Barry Song
2021-02-01 5:36 ` kernel test robot [this message]
2021-02-01 5:36 ` kernel test robot
2021-02-01 18:11 ` Valentin Schneider
2021-02-01 21:49 ` Song Bao Hua (Barry Song)
2021-02-02 15:17 ` Valentin Schneider
2021-02-02 16:48 ` Valentin Schneider
2021-02-03 10:23 ` Song Bao Hua (Barry Song)
2021-02-03 11:42 ` Valentin Schneider
2021-02-03 10:27 ` Song Bao Hua (Barry Song)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202102011345.IjdbaD7X-lkp@intel.com \
--to=lkp@intel.com \
--cc=dietmar.eggemann@arm.com \
--cc=kbuild-all@lists.01.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxarm@openeuler.org \
--cc=mgorman@suse.de \
--cc=mingo@kernel.org \
--cc=morten.rasmussen@arm.com \
--cc=peterz@infradead.org \
--cc=song.bao.hua@hisilicon.com \
--cc=valentin.schneider@arm.com \
--cc=vincent.guittot@linaro.org \
--cc=xuwei5@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.