mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* crypto/scompress.c:92:11: warning: writing variable 'src' requires holding spinlock 'scratch.lock' exclusively
@ 2026-10-18 11:43 kernel test robot
  2026-10-18 21:00 ` Marco Elver
  0 siblings, 1 reply; 2+ messages in thread
From: kernel test robot @ 2026-10-18 11:43 UTC (permalink / raw)
  To: Marco Elver; +Cc: llvm, oe-kbuild-all, linux-kernel, Peter Zijlstra

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head:   32c52ec87d6245ee2d12ed5dd509e40062939b50
commit: dc36d55d4e7259ff0f91a154744125ccc2228171 crypto: Enable context analysis
date:   10 months ago
config: s390-randconfig-2000-20261018 (https://download.01.org/0day-ci/archive/20261018/202610181335.o2l6GmyB-lkp@intel.com/config)
compiler: clang version 24.0.0git (https://github.com/llvm/llvm-project 8a679464f19c426ef76aad9f4587b703dd3e584d)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20261018/202610181335.o2l6GmyB-lkp@intel.com/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
| Fixes: dc36d55d4e72 ("crypto: Enable context analysis")
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202610181335.o2l6GmyB-lkp@intel.com/

All warnings (new ones prefixed by >>):

>> crypto/scompress.c:92:11: warning: writing variable 'src' requires holding spinlock 'scratch.lock' exclusively [-Wthread-safety-precise]
      92 |         scratch->src = page_address(page);
         |                  ^
   crypto/scompress.c:92:11: note: found near match 'scratch->lock'
>> crypto/scompress.c:240:28: warning: reading variable 'src' requires holding spinlock '_scomp_lock_scratch().lock' [-Wthread-safety-precise]
     240 |                 const u8 *src = scratch->src;
         |                                          ^
   crypto/scompress.c:240:28: note: found near match '_scomp_lock_scratch().lock'
   crypto/scompress.c:242:31: warning: reading variable 'src' requires holding spinlock '_scomp_lock_scratch().lock' [-Wthread-safety-precise]
     242 |                 memcpy_from_sglist(scratch->src, req->src, 0, slen);
         |                                             ^
   crypto/scompress.c:242:31: note: found near match '_scomp_lock_scratch().lock'
   3 warnings generated.


vim +92 crypto/scompress.c

1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21   82  
c47e1f4142a3823 Herbert Xu                2025-03-17   83  static int scomp_alloc_scratch(struct scomp_scratch *scratch, int cpu)
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21   84  {
c47e1f4142a3823 Herbert Xu                2025-03-17   85  	int node = cpu_to_node(cpu);
2d3553ecb4e316a Herbert Xu                2025-03-15   86  	struct page *page;
71052dcf4be70be Sebastian Andrzej Siewior 2019-03-29   87  
c47e1f4142a3823 Herbert Xu                2025-03-17   88  	page = alloc_pages_node(node, GFP_KERNEL, 0);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19   89  	if (!page)
c47e1f4142a3823 Herbert Xu                2025-03-17   90  		return -ENOMEM;
c47e1f4142a3823 Herbert Xu                2025-03-17   91  	spin_lock_bh(&scratch->lock);
c47e1f4142a3823 Herbert Xu                2025-03-17  @92  	scratch->src = page_address(page);
c47e1f4142a3823 Herbert Xu                2025-03-17   93  	spin_unlock_bh(&scratch->lock);
71052dcf4be70be Sebastian Andrzej Siewior 2019-03-29   94  	return 0;
c47e1f4142a3823 Herbert Xu                2025-03-17   95  }
c47e1f4142a3823 Herbert Xu                2025-03-17   96  
c47e1f4142a3823 Herbert Xu                2025-03-17   97  static void scomp_scratch_workfn(struct work_struct *work)
c47e1f4142a3823 Herbert Xu                2025-03-17   98  {
c47e1f4142a3823 Herbert Xu                2025-03-17   99  	int cpu;
c47e1f4142a3823 Herbert Xu                2025-03-17  100  
c47e1f4142a3823 Herbert Xu                2025-03-17  101  	for_each_cpu(cpu, &scomp_scratch_want) {
c47e1f4142a3823 Herbert Xu                2025-03-17  102  		struct scomp_scratch *scratch;
c47e1f4142a3823 Herbert Xu                2025-03-17  103  
c47e1f4142a3823 Herbert Xu                2025-03-17  104  		scratch = per_cpu_ptr(&scomp_scratch, cpu);
dc36d55d4e7259f Marco Elver               2025-12-19  105  		if (context_unsafe(scratch->src))
c47e1f4142a3823 Herbert Xu                2025-03-17  106  			continue;
c47e1f4142a3823 Herbert Xu                2025-03-17  107  		if (scomp_alloc_scratch(scratch, cpu))
c47e1f4142a3823 Herbert Xu                2025-03-17  108  			break;
c47e1f4142a3823 Herbert Xu                2025-03-17  109  
c47e1f4142a3823 Herbert Xu                2025-03-17  110  		cpumask_clear_cpu(cpu, &scomp_scratch_want);
c47e1f4142a3823 Herbert Xu                2025-03-17  111  	}
c47e1f4142a3823 Herbert Xu                2025-03-17  112  }
c47e1f4142a3823 Herbert Xu                2025-03-17  113  
c47e1f4142a3823 Herbert Xu                2025-03-17  114  static int crypto_scomp_alloc_scratches(void)
dc36d55d4e7259f Marco Elver               2025-12-19  115  	__context_unsafe(/* allocates @scratch */)
c47e1f4142a3823 Herbert Xu                2025-03-17  116  {
c47e1f4142a3823 Herbert Xu                2025-03-17  117  	unsigned int i = cpumask_first(cpu_possible_mask);
c47e1f4142a3823 Herbert Xu                2025-03-17  118  	struct scomp_scratch *scratch;
c47e1f4142a3823 Herbert Xu                2025-03-17  119  
c47e1f4142a3823 Herbert Xu                2025-03-17  120  	scratch = per_cpu_ptr(&scomp_scratch, i);
c47e1f4142a3823 Herbert Xu                2025-03-17  121  	return scomp_alloc_scratch(scratch, i);
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  122  }
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  123  
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  124  static int crypto_scomp_init_tfm(struct crypto_tfm *tfm)
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  125  {
3d72ad46a23ae42 Herbert Xu                2025-03-09  126  	struct scomp_alg *alg = crypto_scomp_alg(__crypto_scomp_tfm(tfm));
71052dcf4be70be Sebastian Andrzej Siewior 2019-03-29  127  	int ret = 0;
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  128  
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  129  	mutex_lock(&scomp_lock);
42d9f6c774790d2 Herbert Xu                2025-03-19  130  	ret = crypto_acomp_alloc_streams(&alg->streams);
3d72ad46a23ae42 Herbert Xu                2025-03-09  131  	if (ret)
3d72ad46a23ae42 Herbert Xu                2025-03-09  132  		goto unlock;
a32f1923c6d6e9e Sabrina Dubroca           2025-04-24  133  	if (!scomp_scratch_users++) {
71052dcf4be70be Sebastian Andrzej Siewior 2019-03-29  134  		ret = crypto_scomp_alloc_scratches();
ddd0a42671c0d97 Herbert Xu                2025-03-15  135  		if (ret)
a32f1923c6d6e9e Sabrina Dubroca           2025-04-24  136  			scomp_scratch_users--;
ddd0a42671c0d97 Herbert Xu                2025-03-15  137  	}
3d72ad46a23ae42 Herbert Xu                2025-03-09  138  unlock:
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  139  	mutex_unlock(&scomp_lock);
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  140  
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  141  	return ret;
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  142  }
6a8487a1f29fa28 Ard Biesheuvel            2017-07-21  143  
dc36d55d4e7259f Marco Elver               2025-12-19  144  #define scomp_lock_scratch(...) __acquire_ret(_scomp_lock_scratch(__VA_ARGS__), &__ret->lock)
dc36d55d4e7259f Marco Elver               2025-12-19  145  static struct scomp_scratch *_scomp_lock_scratch(void) __acquires_ret
c47e1f4142a3823 Herbert Xu                2025-03-17  146  {
c47e1f4142a3823 Herbert Xu                2025-03-17  147  	int cpu = raw_smp_processor_id();
c47e1f4142a3823 Herbert Xu                2025-03-17  148  	struct scomp_scratch *scratch;
c47e1f4142a3823 Herbert Xu                2025-03-17  149  
c47e1f4142a3823 Herbert Xu                2025-03-17  150  	scratch = per_cpu_ptr(&scomp_scratch, cpu);
42d9f6c774790d2 Herbert Xu                2025-03-19  151  	spin_lock(&scratch->lock);
c47e1f4142a3823 Herbert Xu                2025-03-17  152  	if (likely(scratch->src))
c47e1f4142a3823 Herbert Xu                2025-03-17  153  		return scratch;
c47e1f4142a3823 Herbert Xu                2025-03-17  154  	spin_unlock(&scratch->lock);
c47e1f4142a3823 Herbert Xu                2025-03-17  155  
c47e1f4142a3823 Herbert Xu                2025-03-17  156  	cpumask_set_cpu(cpu, &scomp_scratch_want);
c47e1f4142a3823 Herbert Xu                2025-03-17  157  	schedule_work(&scomp_scratch_work);
c47e1f4142a3823 Herbert Xu                2025-03-17  158  
c47e1f4142a3823 Herbert Xu                2025-03-17  159  	scratch = per_cpu_ptr(&scomp_scratch, cpumask_first(cpu_possible_mask));
c47e1f4142a3823 Herbert Xu                2025-03-17  160  	spin_lock(&scratch->lock);
c47e1f4142a3823 Herbert Xu                2025-03-17  161  	return scratch;
c47e1f4142a3823 Herbert Xu                2025-03-17  162  }
c47e1f4142a3823 Herbert Xu                2025-03-17  163  
42d9f6c774790d2 Herbert Xu                2025-03-19  164  static inline void scomp_unlock_scratch(struct scomp_scratch *scratch)
dc36d55d4e7259f Marco Elver               2025-12-19  165  	__releases(&scratch->lock)
c47e1f4142a3823 Herbert Xu                2025-03-17  166  {
42d9f6c774790d2 Herbert Xu                2025-03-19  167  	spin_unlock(&scratch->lock);
c47e1f4142a3823 Herbert Xu                2025-03-17  168  }
c47e1f4142a3823 Herbert Xu                2025-03-17  169  
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  170  static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir)
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  171  {
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  172  	struct crypto_acomp *tfm = crypto_acomp_reqtfm(req);
2d3553ecb4e316a Herbert Xu                2025-03-15  173  	struct crypto_scomp **tfm_ctx = acomp_tfm_ctx(tfm);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  174  	bool src_isvirt = acomp_request_src_isvirt(req);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  175  	bool dst_isvirt = acomp_request_dst_isvirt(req);
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  176  	struct crypto_scomp *scomp = *tfm_ctx;
2d3553ecb4e316a Herbert Xu                2025-03-15  177  	unsigned int slen = req->slen;
2d3553ecb4e316a Herbert Xu                2025-03-15  178  	unsigned int dlen = req->dlen;
2d3553ecb4e316a Herbert Xu                2025-03-15  179  	struct page *spage, *dpage;
2d3553ecb4e316a Herbert Xu                2025-03-15  180  	unsigned int n;
2c1808e5fe5afda Herbert Xu                2025-03-15  181  	const u8 *src;
8a6771cda3f48a4 Herbert Xu                2025-03-15  182  	size_t soff;
8a6771cda3f48a4 Herbert Xu                2025-03-15  183  	size_t doff;
2c1808e5fe5afda Herbert Xu                2025-03-15  184  	u8 *dst;
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  185  	int ret;
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  186  
2d3553ecb4e316a Herbert Xu                2025-03-15  187  	if (!req->src || !slen)
71052dcf4be70be Sebastian Andrzej Siewior 2019-03-29  188  		return -EINVAL;
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  189  
2d3553ecb4e316a Herbert Xu                2025-03-15  190  	if (!req->dst || !dlen)
71052dcf4be70be Sebastian Andrzej Siewior 2019-03-29  191  		return -EINVAL;
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  192  
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  193  	if (dst_isvirt)
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  194  		dst = req->dvirt;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  195  	else {
5f3437e9c89eec7 Herbert Xu                2025-04-07  196  		if (dlen <= req->dst->length) {
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  197  			dpage = sg_page(req->dst);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  198  			doff = req->dst->offset;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  199  		} else
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  200  			return -ENOSYS;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  201  
ce00897b94bc5c6 David Hildenbrand         2025-09-01  202  		dpage += doff / PAGE_SIZE;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  203  		doff = offset_in_page(doff);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  204  
e3f08b262573187 Herbert Xu                2025-04-23  205  		n = (dlen - 1) / PAGE_SIZE;
e3f08b262573187 Herbert Xu                2025-04-23  206  		n += (offset_in_page(dlen - 1) + doff) / PAGE_SIZE;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  207  		if (PageHighMem(dpage + n) &&
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  208  		    size_add(doff, dlen) > PAGE_SIZE)
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  209  			return -ENOSYS;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  210  		dst = kmap_local_page(dpage) + doff;
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  211  	}
c47e1f4142a3823 Herbert Xu                2025-03-17  212  
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  213  	if (src_isvirt)
2c1808e5fe5afda Herbert Xu                2025-03-15  214  		src = req->svirt;
2c1808e5fe5afda Herbert Xu                2025-03-15  215  	else {
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  216  		src = NULL;
8a6771cda3f48a4 Herbert Xu                2025-03-15  217  		do {
5f3437e9c89eec7 Herbert Xu                2025-04-07  218  			if (slen <= req->src->length) {
8a6771cda3f48a4 Herbert Xu                2025-03-15  219  				spage = sg_page(req->src);
2d3553ecb4e316a Herbert Xu                2025-03-15  220  				soff = req->src->offset;
8a6771cda3f48a4 Herbert Xu                2025-03-15  221  			} else
8a6771cda3f48a4 Herbert Xu                2025-03-15  222  				break;
8a6771cda3f48a4 Herbert Xu                2025-03-15  223  
ce00897b94bc5c6 David Hildenbrand         2025-09-01  224  			spage = spage + soff / PAGE_SIZE;
2d3553ecb4e316a Herbert Xu                2025-03-15  225  			soff = offset_in_page(soff);
744e1885922a994 Chengming Zhou            2023-12-27  226  
002ba346e3d76bb Herbert Xu                2025-04-21  227  			n = (slen - 1) / PAGE_SIZE;
002ba346e3d76bb Herbert Xu                2025-04-21  228  			n += (offset_in_page(slen - 1) + soff) / PAGE_SIZE;
ce00897b94bc5c6 David Hildenbrand         2025-09-01  229  			if (PageHighMem(spage + n) &&
8a6771cda3f48a4 Herbert Xu                2025-03-15  230  			    size_add(soff, slen) > PAGE_SIZE)
8a6771cda3f48a4 Herbert Xu                2025-03-15  231  				break;
2d3553ecb4e316a Herbert Xu                2025-03-15  232  			src = kmap_local_page(spage) + soff;
8a6771cda3f48a4 Herbert Xu                2025-03-15  233  		} while (0);
2c1808e5fe5afda Herbert Xu                2025-03-15  234  	}
77292bb8ca69c80 Barry Song                2024-03-02  235  
dc36d55d4e7259f Marco Elver               2025-12-19  236  	struct crypto_acomp_stream *stream = crypto_acomp_lock_stream_bh(&crypto_scomp_alg(scomp)->streams);
8a6771cda3f48a4 Herbert Xu                2025-03-15  237  
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  238  	if (!src_isvirt && !src) {
dc36d55d4e7259f Marco Elver               2025-12-19  239  		struct scomp_scratch *scratch = scomp_lock_scratch();
dc36d55d4e7259f Marco Elver               2025-12-19 @240  		const u8 *src = scratch->src;
2d3553ecb4e316a Herbert Xu                2025-03-15  241  
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  242  		memcpy_from_sglist(scratch->src, req->src, 0, slen);
2d3553ecb4e316a Herbert Xu                2025-03-15  243  
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  244  		if (dir)
2d3553ecb4e316a Herbert Xu                2025-03-15  245  			ret = crypto_scomp_compress(scomp, src, slen,
2d3553ecb4e316a Herbert Xu                2025-03-15  246  						    dst, &dlen, stream->ctx);
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  247  		else
2d3553ecb4e316a Herbert Xu                2025-03-15  248  			ret = crypto_scomp_decompress(scomp, src, slen,
2d3553ecb4e316a Herbert Xu                2025-03-15  249  						      dst, &dlen, stream->ctx);
2d3553ecb4e316a Herbert Xu                2025-03-15  250  
42d9f6c774790d2 Herbert Xu                2025-03-19  251  		scomp_unlock_scratch(scratch);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  252  	} else if (dir)
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  253  		ret = crypto_scomp_compress(scomp, src, slen,
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  254  					    dst, &dlen, stream->ctx);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  255  	else
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  256  		ret = crypto_scomp_decompress(scomp, src, slen,
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  257  					      dst, &dlen, stream->ctx);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  258  
42d9f6c774790d2 Herbert Xu                2025-03-19  259  	crypto_acomp_unlock_stream_bh(stream);
2d3553ecb4e316a Herbert Xu                2025-03-15  260  
2d3553ecb4e316a Herbert Xu                2025-03-15  261  	req->dlen = dlen;
77292bb8ca69c80 Barry Song                2024-03-02  262  
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  263  	if (!src_isvirt && src)
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  264  		kunmap_local(src);
a7b1d0c5f1ca05c Herbert Xu                2025-03-19  265  	if (!dst_isvirt) {
2d3553ecb4e316a Herbert Xu                2025-03-15  266  		kunmap_local(dst);
2d3553ecb4e316a Herbert Xu                2025-03-15  267  		dlen += doff;
2d3553ecb4e316a Herbert Xu                2025-03-15  268  		for (;;) {
2d3553ecb4e316a Herbert Xu                2025-03-15  269  			flush_dcache_page(dpage);
2d3553ecb4e316a Herbert Xu                2025-03-15  270  			if (dlen <= PAGE_SIZE)
2d3553ecb4e316a Herbert Xu                2025-03-15  271  				break;
2d3553ecb4e316a Herbert Xu                2025-03-15  272  			dlen -= PAGE_SIZE;
ce00897b94bc5c6 David Hildenbrand         2025-09-01  273  			dpage++;
77292bb8ca69c80 Barry Song                2024-03-02  274  		}
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  275  	}
2d3553ecb4e316a Herbert Xu                2025-03-15  276  
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  277  	return ret;
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  278  }
1ab53a77b772bf7 Giovanni Cabiddu          2016-10-21  279  

:::::: The code at line 92 was first introduced by commit
:::::: c47e1f4142a3823b6e963e14db295a8a733804b5 crypto: scomp - Allocate per-cpu buffer on first use of each CPU

:::::: TO: Herbert Xu <herbert@gondor.apana.org.au>
:::::: CC: Herbert Xu <herbert@gondor.apana.org.au>

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-10-18 21:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-18 11:43 crypto/scompress.c:92:11: warning: writing variable 'src' requires holding spinlock 'scratch.lock' exclusively kernel test robot
2026-10-18 21:00 ` Marco Elver

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®