linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [linux-next:master 7919/9290] include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
@ 2026-01-23 20:29 kernel test robot
  2026-01-23 23:31 ` Ankur Arora
  0 siblings, 1 reply; 4+ messages in thread
From: kernel test robot @ 2026-01-23 20:29 UTC (permalink / raw)
  To: Ankur Arora
  Cc: oe-kbuild-all, Andrew Morton, Linux Memory Management List,
	Raghavendra K T

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head:   a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d
commit: 93552c9a3350fff06543da18e4c80d3e804191ca [7919/9290] mm: folio_zero_user: cache neighbouring pages
config: riscv-randconfig-002-20260124 (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/config)
compiler: riscv64-linux-gcc (GCC) 8.5.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-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
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601240453.QCjgGdJa-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from include/linux/mm.h:18,
                    from arch/riscv/include/asm/sections.h:9,
                    from include/linux/interrupt.h:22,
                    from include/linux/kernel_stat.h:8,
                    from mm/memory.c:42:
   mm/memory.c: In function 'folio_zero_user':
>> include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
     _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
                                         ^
   include/linux/range.h:46:11: note: in definition of macro 'DEFINE_RANGE'
      .end = (_end),   \
              ^~~~
   include/linux/compiler_types.h:619:2: note: in expansion of macro '__compiletime_assert'
     __compiletime_assert(condition, msg, prefix, suffix)
     ^~~~~~~~~~~~~~~~~~~~
   include/linux/compiler_types.h:631:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/minmax.h:188:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(statically_true(ulo > uhi),    \
     ^~~~~~~~~~~~~~~~
   include/linux/minmax.h:195:2: note: in expansion of macro '__clamp_once'
     __clamp_once(type, val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_))
     ^~~~~~~~~~~~
   include/linux/minmax.h:218:36: note: in expansion of macro '__careful_clamp'
    #define clamp_t(type, val, lo, hi) __careful_clamp(type, val, lo, hi)
                                       ^~~~~~~~~~~~~~~
   mm/memory.c:7296:8: note: in expansion of macro 'clamp_t'
           clamp_t(s64, fault_idx + radius, pg.start, pg.end));
           ^~~~~~~


vim +/__compiletime_assert_639 +631 include/linux/compiler_types.h

eb5c2d4b45e3d2 Will Deacon 2020-07-21  617  
eb5c2d4b45e3d2 Will Deacon 2020-07-21  618  #define _compiletime_assert(condition, msg, prefix, suffix) \
eb5c2d4b45e3d2 Will Deacon 2020-07-21  619  	__compiletime_assert(condition, msg, prefix, suffix)
eb5c2d4b45e3d2 Will Deacon 2020-07-21  620  
eb5c2d4b45e3d2 Will Deacon 2020-07-21  621  /**
eb5c2d4b45e3d2 Will Deacon 2020-07-21  622   * compiletime_assert - break build and emit msg if condition is false
eb5c2d4b45e3d2 Will Deacon 2020-07-21  623   * @condition: a compile-time constant condition to check
eb5c2d4b45e3d2 Will Deacon 2020-07-21  624   * @msg:       a message to emit if condition is false
eb5c2d4b45e3d2 Will Deacon 2020-07-21  625   *
eb5c2d4b45e3d2 Will Deacon 2020-07-21  626   * In tradition of POSIX assert, this macro will break the build if the
eb5c2d4b45e3d2 Will Deacon 2020-07-21  627   * supplied condition is *false*, emitting the supplied error message if the
eb5c2d4b45e3d2 Will Deacon 2020-07-21  628   * compiler has support to do so.
eb5c2d4b45e3d2 Will Deacon 2020-07-21  629   */
eb5c2d4b45e3d2 Will Deacon 2020-07-21  630  #define compiletime_assert(condition, msg) \
eb5c2d4b45e3d2 Will Deacon 2020-07-21 @631  	_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
eb5c2d4b45e3d2 Will Deacon 2020-07-21  632  

:::::: The code at line 631 was first introduced by commit
:::::: eb5c2d4b45e3d2d5d052ea6b8f1463976b1020d5 compiler.h: Move compiletime_assert() macros into compiler_types.h

:::::: TO: Will Deacon <will@kernel.org>
:::::: CC: Will Deacon <will@kernel.org>

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


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

* Re: [linux-next:master 7919/9290] include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
  2026-01-23 20:29 [linux-next:master 7919/9290] include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end kernel test robot
@ 2026-01-23 23:31 ` Ankur Arora
  2026-01-24  1:48   ` Andrew Morton
  0 siblings, 1 reply; 4+ messages in thread
From: Ankur Arora @ 2026-01-23 23:31 UTC (permalink / raw)
  To: kernel test robot
  Cc: Ankur Arora, oe-kbuild-all, Andrew Morton,
	Linux Memory Management List, Raghavendra K T


kernel test robot <lkp@intel.com> writes:

> tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> head:   a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d
> commit: 93552c9a3350fff06543da18e4c80d3e804191ca [7919/9290] mm: folio_zero_user: cache neighbouring pages
> config: riscv-randconfig-002-20260124 (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/config)
> compiler: riscv64-linux-gcc (GCC) 8.5.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/reproduce)

Oddly enough I'm unable to reproduce this with:
   ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- make O=build_dir/ W=1 mm/

> 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@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202601240453.QCjgGdJa-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
>    In file included from include/linux/mm.h:18,
>                     from arch/riscv/include/asm/sections.h:9,
>                     from include/linux/interrupt.h:22,
>                     from include/linux/kernel_stat.h:8,
>                     from mm/memory.c:42:
>    mm/memory.c: In function 'folio_zero_user':
>>> include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end

I'm a bit puzzled by this assert.

folio_zero_user():
   {
	const unsigned long base_addr = ALIGN_DOWN(addr_hint, folio_size(folio));
	const long fault_idx = (addr_hint - base_addr) / PAGE_SIZE;
	const struct range pg = DEFINE_RANGE(0, folio_nr_pages(folio) - 1);
	const int radius = FOLIO_ZERO_LOCALITY_RADIUS;
	struct range r[3];
	int i;

	/*
	 * Faulting page and its immediate neighbourhood. Will be cleared at the
	 * end to keep its cachelines hot.
	 */
	r[2] = DEFINE_RANGE(clamp_t(s64, fault_idx - radius, pg.start, pg.end),
			    clamp_t(s64, fault_idx + radius, pg.start, pg.end));

the cause of the failure is that the compiler decides that pg.start > pg.end in:
  clamp_t(s64, fault_idx + radius, pg.start, pg.end));

which come from:
	const struct range pg = DEFINE_RANGE(0, folio_nr_pages(folio) - 1);

Now pg.start > pg.end if, folio_nr_pages() == 1.

Which would need folio_test_large() to evaluate to false at compile time:
  static inline unsigned long folio_nr_pages(const struct folio *folio)
  {
	if (!folio_test_large(folio))
		return 1;
	return folio_large_nr_pages(folio);
  }

But folio_test_large() is only defined as a test_bit(), without a
compile time constant defintion.

Also, the configuration has HUGETLBFS (which anyway guards the
definition of folio_zero_user()):

     $ cat config |egrep 'HUGETLBFS|TRANSPARENT'
     CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
     CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
     # CONFIG_TRANSPARENT_HUGEPAGE is not set
     CONFIG_ARCH_SUPPORTS_HUGETLBFS=y
     CONFIG_HUGETLBFS=y

Ankur

>      _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
>                                          ^
>    include/linux/range.h:46:11: note: in definition of macro 'DEFINE_RANGE'
>       .end = (_end),   \
>               ^~~~
>    include/linux/compiler_types.h:619:2: note: in expansion of macro '__compiletime_assert'
>      __compiletime_assert(condition, msg, prefix, suffix)
>      ^~~~~~~~~~~~~~~~~~~~
>    include/linux/compiler_types.h:631:2: note: in expansion of macro '_compiletime_assert'
>      _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
>      ^~~~~~~~~~~~~~~~~~~
>    include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
>     #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
>                                         ^~~~~~~~~~~~~~~~~~
>    include/linux/minmax.h:188:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
>      BUILD_BUG_ON_MSG(statically_true(ulo > uhi),    \
>      ^~~~~~~~~~~~~~~~
>    include/linux/minmax.h:195:2: note: in expansion of macro '__clamp_once'
>      __clamp_once(type, val, lo, hi, __UNIQUE_ID(v_), __UNIQUE_ID(l_), __UNIQUE_ID(h_))
>      ^~~~~~~~~~~~
>    include/linux/minmax.h:218:36: note: in expansion of macro '__careful_clamp'
>     #define clamp_t(type, val, lo, hi) __careful_clamp(type, val, lo, hi)
>                                        ^~~~~~~~~~~~~~~
>    mm/memory.c:7296:8: note: in expansion of macro 'clamp_t'
>            clamp_t(s64, fault_idx + radius, pg.start, pg.end));
>            ^~~~~~~
>
>
> vim +/__compiletime_assert_639 +631 include/linux/compiler_types.h
>
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  617
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  618  #define _compiletime_assert(condition, msg, prefix, suffix) \
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  619  	__compiletime_assert(condition, msg, prefix, suffix)
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  620
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  621  /**
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  622   * compiletime_assert - break build and emit msg if condition is false
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  623   * @condition: a compile-time constant condition to check
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  624   * @msg:       a message to emit if condition is false
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  625   *
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  626   * In tradition of POSIX assert, this macro will break the build if the
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  627   * supplied condition is *false*, emitting the supplied error message if the
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  628   * compiler has support to do so.
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  629   */
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  630  #define compiletime_assert(condition, msg) \
> eb5c2d4b45e3d2 Will Deacon 2020-07-21 @631  	_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
> eb5c2d4b45e3d2 Will Deacon 2020-07-21  632
>
> :::::: The code at line 631 was first introduced by commit
> :::::: eb5c2d4b45e3d2d5d052ea6b8f1463976b1020d5 compiler.h: Move compiletime_assert() macros into compiler_types.h
>
> :::::: TO: Will Deacon <will@kernel.org>
> :::::: CC: Will Deacon <will@kernel.org>


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

* Re: [linux-next:master 7919/9290] include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
  2026-01-23 23:31 ` Ankur Arora
@ 2026-01-24  1:48   ` Andrew Morton
  2026-01-24  8:11     ` Ankur Arora
  0 siblings, 1 reply; 4+ messages in thread
From: Andrew Morton @ 2026-01-24  1:48 UTC (permalink / raw)
  To: Ankur Arora
  Cc: kernel test robot, oe-kbuild-all, Linux Memory Management List,
	Raghavendra K T

On Fri, 23 Jan 2026 15:31:08 -0800 Ankur Arora <ankur.a.arora@oracle.com> wrote:

> 
> kernel test robot <lkp@intel.com> writes:
> 
> > tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
> > head:   a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d
> > commit: 93552c9a3350fff06543da18e4c80d3e804191ca [7919/9290] mm: folio_zero_user: cache neighbouring pages
> > config: riscv-randconfig-002-20260124 (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/config)
> > compiler: riscv64-linux-gcc (GCC) 8.5.0
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/reproduce)
> 
> Oddly enough I'm unable to reproduce this with:
>    ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- make O=build_dir/ W=1 mm/

I couldn't.  gcc-15.2.0.

> > 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@intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202601240453.QCjgGdJa-lkp@intel.com/
> >
> > All errors (new ones prefixed by >>):
> >
> >    In file included from include/linux/mm.h:18,
> >                     from arch/riscv/include/asm/sections.h:9,
> >                     from include/linux/interrupt.h:22,
> >                     from include/linux/kernel_stat.h:8,
> >                     from mm/memory.c:42:
> >    mm/memory.c: In function 'folio_zero_user':
> >>> include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
> 
> I'm a bit puzzled by this assert.
> 
> folio_zero_user():
>    {
> 	const unsigned long base_addr = ALIGN_DOWN(addr_hint, folio_size(folio));
> 	const long fault_idx = (addr_hint - base_addr) / PAGE_SIZE;
> 	const struct range pg = DEFINE_RANGE(0, folio_nr_pages(folio) - 1);
> 	const int radius = FOLIO_ZERO_LOCALITY_RADIUS;
> 	struct range r[3];
> 	int i;
> 
> 	/*
> 	 * Faulting page and its immediate neighbourhood. Will be cleared at the
> 	 * end to keep its cachelines hot.
> 	 */
> 	r[2] = DEFINE_RANGE(clamp_t(s64, fault_idx - radius, pg.start, pg.end),
> 			    clamp_t(s64, fault_idx + radius, pg.start, pg.end));

This line expands to 2846 bytes of C.  The clamp()y functions are asking a lot
of the compiler - their development was drama-filled.

If we want to work around this (and I guess we should) then simply
open-coding these operations would be a good approach?


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

* Re: [linux-next:master 7919/9290] include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
  2026-01-24  1:48   ` Andrew Morton
@ 2026-01-24  8:11     ` Ankur Arora
  0 siblings, 0 replies; 4+ messages in thread
From: Ankur Arora @ 2026-01-24  8:11 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Ankur Arora, kernel test robot, oe-kbuild-all,
	Linux Memory Management List, Raghavendra K T


Andrew Morton <akpm@linux-foundation.org> writes:

> On Fri, 23 Jan 2026 15:31:08 -0800 Ankur Arora <ankur.a.arora@oracle.com> wrote:
>
>>
>> kernel test robot <lkp@intel.com> writes:
>>
>> > tree:   https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
>> > head:   a0c666c25aeefd16f4b088c6549a6fb6b65a8a1d
>> > commit: 93552c9a3350fff06543da18e4c80d3e804191ca [7919/9290] mm: folio_zero_user: cache neighbouring pages
>> > config: riscv-randconfig-002-20260124 (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/config)
>> > compiler: riscv64-linux-gcc (GCC) 8.5.0
>> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260124/202601240453.QCjgGdJa-lkp@intel.com/reproduce)
>>
>> Oddly enough I'm unable to reproduce this with:
>>    ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- make O=build_dir/ W=1 mm/
>
> I couldn't.  gcc-15.2.0.

I had gcc-12.1.1.

>> > 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@intel.com>
>> > | Closes: https://lore.kernel.org/oe-kbuild-all/202601240453.QCjgGdJa-lkp@intel.com/
>> >
>> > All errors (new ones prefixed by >>):
>> >
>> >    In file included from include/linux/mm.h:18,
>> >                     from arch/riscv/include/asm/sections.h:9,
>> >                     from include/linux/interrupt.h:22,
>> >                     from include/linux/kernel_stat.h:8,
>> >                     from mm/memory.c:42:
>> >    mm/memory.c: In function 'folio_zero_user':
>> >>> include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end
>>
>> I'm a bit puzzled by this assert.
>>
>> folio_zero_user():
>>    {
>> 	const unsigned long base_addr = ALIGN_DOWN(addr_hint, folio_size(folio));
>> 	const long fault_idx = (addr_hint - base_addr) / PAGE_SIZE;
>> 	const struct range pg = DEFINE_RANGE(0, folio_nr_pages(folio) - 1);
>> 	const int radius = FOLIO_ZERO_LOCALITY_RADIUS;
>> 	struct range r[3];
>> 	int i;
>>
>> 	/*
>> 	 * Faulting page and its immediate neighbourhood. Will be cleared at the
>> 	 * end to keep its cachelines hot.
>> 	 */
>> 	r[2] = DEFINE_RANGE(clamp_t(s64, fault_idx - radius, pg.start, pg.end),
>> 			    clamp_t(s64, fault_idx + radius, pg.start, pg.end));
>
> This line expands to 2846 bytes of C.  The clamp()y functions are asking a lot
> of the compiler - their development was drama-filled.
>
> If we want to work around this (and I guess we should) then simply
> open-coding these operations would be a good approach?

Yeah, let me work on that.

--
ankur


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

end of thread, other threads:[~2026-01-24  8:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-01-23 20:29 [linux-next:master 7919/9290] include/linux/compiler_types.h:631:38: error: call to '__compiletime_assert_639' declared with attribute error: clamp() low limit pg.start greater than high limit pg.end kernel test robot
2026-01-23 23:31 ` Ankur Arora
2026-01-24  1:48   ` Andrew Morton
2026-01-24  8:11     ` Ankur Arora

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