[tj-wq:for-7.3 11/19] kernel/workqueue.c:5682:57: sparse: sparse: incorrect type in initializer (different address spaces)

kernel test robot <[email protected]>
Newsgroups dev.linux.lists.oe-kbuild-all
Message-ID <[email protected]>
Hi Breno,

FYI, the error/warning was bisected to this commit, please ignore it if it's irrelevant.

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git for-7.3
head:   a5bde5d8fde8a8cb28e59a672d5ddc5b9c1e7656
commit: 79f23600bc7b13a35fd148131245c283d14604a8 [11/19] workqueue: factor out get_percpu_pool()
config: alpha-randconfig-r123-20260812 (https://download.01.org/0day-ci/archive/20260812/[email protected]/config)
compiler: alpha-linux-gcc (GCC) 9.5.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260812/[email protected]/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 <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

sparse warnings: (new ones prefixed by >>)
   kernel/workqueue.c:5676:21: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct pool_workqueue [noderef] __rcu *[noderef] __percpu *cpu_pwq @@     got struct pool_workqueue *[noderef] __percpu * @@
   kernel/workqueue.c:5676:21: sparse:     expected struct pool_workqueue [noderef] __rcu *[noderef] __percpu *cpu_pwq
   kernel/workqueue.c:5676:21: sparse:     got struct pool_workqueue *[noderef] __percpu *
>> kernel/workqueue.c:5682:57: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct pool_workqueue **pwq_p @@     got struct pool_workqueue [noderef] __rcu ** @@
   kernel/workqueue.c:5682:57: sparse:     expected struct pool_workqueue **pwq_p
   kernel/workqueue.c:5682:57: sparse:     got struct pool_workqueue [noderef] __rcu **
   kernel/workqueue.c:5719:54: sparse: sparse: incorrect type in initializer (different address spaces) @@     expected struct pool_workqueue *pwq @@     got struct pool_workqueue [noderef] __rcu * @@
   kernel/workqueue.c:5719:54: sparse:     expected struct pool_workqueue *pwq
   kernel/workqueue.c:5719:54: sparse:     got struct pool_workqueue [noderef] __rcu *
   kernel/workqueue.c:6304:13: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct pool_workqueue *pwq @@     got struct pool_workqueue [noderef] __rcu * @@
   kernel/workqueue.c:6304:13: sparse:     expected struct pool_workqueue *pwq
   kernel/workqueue.c:6304:13: sparse:     got struct pool_workqueue [noderef] __rcu *

vim +5682 kernel/workqueue.c

  5668	
  5669	static int alloc_and_link_pwqs(struct workqueue_struct *wq)
  5670	{
  5671		bool highpri = wq->flags & WQ_HIGHPRI;
  5672		int cpu, ret;
  5673	
  5674		lockdep_assert_held(&wq_pool_mutex);
  5675	
  5676		wq->cpu_pwq = alloc_percpu(struct pool_workqueue *);
  5677		if (!wq->cpu_pwq)
  5678			goto enomem;
  5679	
  5680		if (!(wq->flags & WQ_UNBOUND)) {
  5681			for_each_possible_cpu(cpu) {
> 5682				struct pool_workqueue **pwq_p = per_cpu_ptr(wq->cpu_pwq, cpu);
  5683				struct worker_pool *pool = get_percpu_pool(wq, cpu);
  5684	
  5685				*pwq_p = kmem_cache_alloc_node(pwq_cache, GFP_KERNEL,
  5686							       pool->node);
  5687				if (!*pwq_p)
  5688					goto enomem;
  5689	
  5690				init_pwq(*pwq_p, wq, pool);
  5691	
  5692				mutex_lock(&wq->mutex);
  5693				link_pwq(*pwq_p);
  5694				mutex_unlock(&wq->mutex);
  5695			}
  5696			return 0;
  5697		}
  5698	
  5699		if (wq->flags & __WQ_ORDERED) {
  5700			struct pool_workqueue *dfl_pwq;
  5701	
  5702			ret = apply_workqueue_attrs_locked(wq, ordered_wq_attrs[highpri]);
  5703			/* there should only be single pwq for ordering guarantee */
  5704			dfl_pwq = rcu_access_pointer(wq->dfl_pwq);
  5705			WARN(!ret && (wq->pwqs.next != &dfl_pwq->pwqs_node ||
  5706				      wq->pwqs.prev != &dfl_pwq->pwqs_node),
  5707			     "ordering guarantee broken for workqueue %s\n", wq->name);
  5708		} else {
  5709			ret = apply_workqueue_attrs_locked(wq, unbound_std_wq_attrs[highpri]);
  5710		}
  5711	
  5712		if (ret)
  5713			goto enomem;
  5714		return 0;
  5715	
  5716	enomem:
  5717		if (wq->cpu_pwq) {
  5718			for_each_possible_cpu(cpu) {
  5719				struct pool_workqueue *pwq = *per_cpu_ptr(wq->cpu_pwq, cpu);
  5720	
  5721				if (pwq) {
  5722					/*
  5723					 * Unlink pwq from wq->pwqs since link_pwq()
  5724					 * may have already added it. wq->mutex is not
  5725					 * needed as the wq has not been published yet.
  5726					 */
  5727					if (!list_empty(&pwq->pwqs_node))
  5728						list_del_rcu(&pwq->pwqs_node);
  5729					kmem_cache_free(pwq_cache, pwq);
  5730				}
  5731			}
  5732			free_percpu(wq->cpu_pwq);
  5733			wq->cpu_pwq = NULL;
  5734		}
  5735		return -ENOMEM;
  5736	}
  5737	

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.