Re: [PATCH 3/5] sched: Split out kernel/sched/numa_balancing.c from kernel/sched/fair.c

From: kernel test robot
Date: Sun Apr 07 2024 - 14:49:37 EST


Hi Ingo,

kernel test robot noticed the following build warnings:

[auto build test WARNING on tip/sched/core]
[also build test WARNING on next-20240405]
[cannot apply to linux/master linus/master peterz-queue/sched/core v6.9-rc2]
[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#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Ingo-Molnar/sched-Split-out-kernel-sched-syscalls-c-from-kernel-sched-core-c/20240407-164646
base: tip/sched/core
patch link: https://lore.kernel.org/r/20240407084319.1462211-4-mingo%40kernel.org
patch subject: [PATCH 3/5] sched: Split out kernel/sched/numa_balancing.c from kernel/sched/fair.c
config: x86_64-randconfig-121-20240408 (https://download.01.org/0day-ci/archive/20240408/202404080242.0PsxhOlk-lkp@xxxxxxxxx/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240408/202404080242.0PsxhOlk-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202404080242.0PsxhOlk-lkp@xxxxxxxxx/

sparse warnings: (new ones prefixed by >>)
>> kernel/sched/numa_balancing.c:1654:13: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *tsk @@ got struct task_struct [noderef] __rcu * @@
kernel/sched/numa_balancing.c:1654:13: sparse: expected struct task_struct *tsk
kernel/sched/numa_balancing.c:1654:13: sparse: got struct task_struct [noderef] __rcu *
kernel/sched/numa_balancing.c: note: in included file (through include/linux/mmzone.h, include/linux/memory-tiers.h):
include/linux/page-flags.h:242:46: sparse: sparse: self-comparison always evaluates to false
include/linux/page-flags.h:242:46: sparse: sparse: self-comparison always evaluates to false
kernel/sched/numa_balancing.c:1600:9: sparse: sparse: context imbalance in 'task_numa_placement' - different lock contexts for basic block

vim +1654 kernel/sched/numa_balancing.c

1619
1620 static void task_numa_group(struct task_struct *p, int cpupid, int flags,
1621 int *priv)
1622 {
1623 struct numa_group *grp, *my_grp;
1624 struct task_struct *tsk;
1625 bool join = false;
1626 int cpu = cpupid_to_cpu(cpupid);
1627 int i;
1628
1629 if (unlikely(!deref_curr_numa_group(p))) {
1630 unsigned int size = sizeof(struct numa_group) +
1631 NR_NUMA_HINT_FAULT_STATS *
1632 nr_node_ids * sizeof(unsigned long);
1633
1634 grp = kzalloc(size, GFP_KERNEL | __GFP_NOWARN);
1635 if (!grp)
1636 return;
1637
1638 refcount_set(&grp->refcount, 1);
1639 grp->active_nodes = 1;
1640 grp->max_faults_cpu = 0;
1641 spin_lock_init(&grp->lock);
1642 grp->gid = p->pid;
1643
1644 for (i = 0; i < NR_NUMA_HINT_FAULT_STATS * nr_node_ids; i++)
1645 grp->faults[i] = p->numa_faults[i];
1646
1647 grp->total_faults = p->total_numa_faults;
1648
1649 grp->nr_tasks++;
1650 rcu_assign_pointer(p->numa_group, grp);
1651 }
1652
1653 rcu_read_lock();
> 1654 tsk = READ_ONCE(cpu_rq(cpu)->curr);
1655
1656 if (!cpupid_match_pid(tsk, cpupid))
1657 goto no_join;
1658
1659 grp = rcu_dereference(tsk->numa_group);
1660 if (!grp)
1661 goto no_join;
1662
1663 my_grp = deref_curr_numa_group(p);
1664 if (grp == my_grp)
1665 goto no_join;
1666
1667 /*
1668 * Only join the other group if its bigger; if we're the bigger group,
1669 * the other task will join us.
1670 */
1671 if (my_grp->nr_tasks > grp->nr_tasks)
1672 goto no_join;
1673
1674 /*
1675 * Tie-break on the grp address.
1676 */
1677 if (my_grp->nr_tasks == grp->nr_tasks && my_grp > grp)
1678 goto no_join;
1679
1680 /* Always join threads in the same process. */
1681 if (tsk->mm == current->mm)
1682 join = true;
1683
1684 /* Simple filter to avoid false positives due to PID collisions */
1685 if (flags & TNF_SHARED)
1686 join = true;
1687
1688 /* Update priv based on whether false sharing was detected */
1689 *priv = !join;
1690
1691 if (join && !get_numa_group(grp))
1692 goto no_join;
1693
1694 rcu_read_unlock();
1695
1696 if (!join)
1697 return;
1698
1699 WARN_ON_ONCE(irqs_disabled());
1700 double_lock_irq(&my_grp->lock, &grp->lock);
1701
1702 for (i = 0; i < NR_NUMA_HINT_FAULT_STATS * nr_node_ids; i++) {
1703 my_grp->faults[i] -= p->numa_faults[i];
1704 grp->faults[i] += p->numa_faults[i];
1705 }
1706 my_grp->total_faults -= p->total_numa_faults;
1707 grp->total_faults += p->total_numa_faults;
1708
1709 my_grp->nr_tasks--;
1710 grp->nr_tasks++;
1711
1712 spin_unlock(&my_grp->lock);
1713 spin_unlock_irq(&grp->lock);
1714
1715 rcu_assign_pointer(p->numa_group, grp);
1716
1717 put_numa_group(my_grp);
1718 return;
1719
1720 no_join:
1721 rcu_read_unlock();
1722 return;
1723 }
1724

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki