GFP flag bits are starting to get scarce. There are upcoming features
that can tolerate being 64-bit only, which offers a simple way to escape
GFP bit scarcity: just make gfp_t 64 bits on 64 bit systems.
Update mm-internal printk formats to use %lx - external format strings
have already been decoupled from the size of gfp_t. Also
lib/test_lockup.c which uses the arg in a module_param_unsafe()
invocation where gfp_t doesn't work.
Some care needs to be taken here with code that converts between ALLOC_*
flags and GFP flags since the former are still unsigned int. The current
code is fine but just to be safe, add a BUILD_BUG_ON() for each GFP
flag that gets converted this way.
Signed-off-by: Brendan Jackman <jackmanb@google.com>
---
include/linux/types.h | 2 +-
lib/test_lockup.c | 2 +-
mm/oom_kill.c | 2 +-
mm/page_alloc.c | 5 ++++-
mm/page_owner.c | 4 ++--
mm/slab_common.c | 2 +-
mm/slub.c | 2 +-
mm/vmalloc.c | 2 +-
8 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/include/linux/types.h b/include/linux/types.h
index 7e71d260763c7..a8490c1381f99 100644
--- a/include/linux/types.h
+++ b/include/linux/types.h
@@ -160,7 +160,7 @@ typedef u64 dma_addr_t;
typedef u32 dma_addr_t;
#endif
-typedef unsigned int __bitwise gfp_t;
+typedef unsigned long __bitwise gfp_t;
typedef unsigned int __bitwise slab_flags_t;
typedef unsigned int __bitwise fmode_t;
diff --git a/lib/test_lockup.c b/lib/test_lockup.c
index c3fd87d6c2dd0..7adc03ac0b39d 100644
--- a/lib/test_lockup.c
+++ b/lib/test_lockup.c
@@ -130,7 +130,7 @@ module_param(alloc_pages_order, uint, 0400);
MODULE_PARM_DESC(alloc_pages_order, "page order to allocate");
static gfp_t alloc_pages_gfp = GFP_KERNEL;
-module_param_unsafe(alloc_pages_gfp, uint, 0400);
+module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
MODULE_PARM_DESC(alloc_pages_gfp, "allocate pages with this gfp_mask, default GFP_KERNEL");
static bool alloc_pages_atomic;
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 5c6c95c169ee8..272ecce090f75 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -458,7 +458,7 @@ static void dump_oom_victim(struct oom_control *oc, struct task_struct *victim)
static void dump_header(struct oom_control *oc)
{
- pr_warn("%s invoked oom-killer: gfp_mask=%#x(%pGg), order=%d, oom_score_adj=%d\n",
+ pr_warn("%s invoked oom-killer: gfp_mask=%#lx(%pGg), order=%d, oom_score_adj=%d\n",
current->comm, oc->gfp_mask, &oc->gfp_mask, oc->order,
current->signal->oom_score_adj);
if (!IS_ENABLED(CONFIG_COMPACTION) && oc->order)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 2d4b6f1a554ed..f0b9e8a950ee7 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -4036,7 +4036,7 @@ void warn_alloc(gfp_t gfp_mask, nodemask_t *nodemask, const char *fmt, ...)
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
- pr_warn("%s: %pV, mode:%#x(%pGg), nodemask=%*pbl",
+ pr_warn("%s: %pV, mode:%#lx(%pGg), nodemask=%*pbl",
current->comm, &vaf, gfp_mask, &gfp_mask,
nodemask_pr_args(nodemask));
va_end(args);
@@ -4504,6 +4504,9 @@ gfp_to_alloc_flags(gfp_t gfp_mask, unsigned int order)
*/
BUILD_BUG_ON(__GFP_HIGH != (__force gfp_t) ALLOC_MIN_RESERVE);
BUILD_BUG_ON(__GFP_KSWAPD_RECLAIM != (__force gfp_t) ALLOC_KSWAPD);
+ /* Alloc flags are unsigned int, gfp_t may be larger. */
+ BUILD_BUG_ON(___GFP_HIGH_BIT >= BITS_PER_TYPE(typeof(alloc_flags)));
+ BUILD_BUG_ON(___GFP_KSWAPD_RECLAIM_BIT >= BITS_PER_TYPE(typeof(alloc_flags)));
/*
* The caller may dip into page reserves a bit more if the caller
diff --git a/mm/page_owner.c b/mm/page_owner.c
index 8178e0be557f8..70afbdb945b1e 100644
--- a/mm/page_owner.c
+++ b/mm/page_owner.c
@@ -558,7 +558,7 @@ print_page_owner(char __user *buf, size_t count, unsigned long pfn,
return -ENOMEM;
ret = scnprintf(kbuf, count,
- "Page allocated via order %u, mask %#x(%pGg), pid %d, tgid %d (%s), ts %llu ns\n",
+ "Page allocated via order %u, mask %#lx(%pGg), pid %d, tgid %d (%s), ts %llu ns\n",
page_owner->order, page_owner->gfp_mask,
&page_owner->gfp_mask, page_owner->pid,
page_owner->tgid, page_owner->comm,
@@ -630,7 +630,7 @@ void __dump_page_owner(const struct page *page)
else
pr_alert("page_owner tracks the page as freed\n");
- pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#x(%pGg), pid %d, tgid %d (%s), ts %llu, free_ts %llu\n",
+ pr_alert("page last allocated via order %u, migratetype %s, gfp_mask %#lx(%pGg), pid %d, tgid %d (%s), ts %llu, free_ts %llu\n",
page_owner->order, migratetype_names[mt], gfp_mask, &gfp_mask,
page_owner->pid, page_owner->tgid, page_owner->comm,
page_owner->ts_nsec, page_owner->free_ts_nsec);
diff --git a/mm/slab_common.c b/mm/slab_common.c
index d5a70a831a2a5..548e0d0f9aab3 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -1028,7 +1028,7 @@ gfp_t kmalloc_fix_flags(gfp_t flags)
gfp_t invalid_mask = flags & GFP_SLAB_BUG_MASK;
flags &= ~GFP_SLAB_BUG_MASK;
- pr_warn("Unexpected gfp: %#x (%pGg). Fixing up to gfp: %#x (%pGg). Fix your code!\n",
+ pr_warn("Unexpected gfp: %#lx (%pGg). Fixing up to gfp: %#lx (%pGg). Fix your code!\n",
invalid_mask, &invalid_mask, flags, &flags);
dump_stack();
diff --git a/mm/slub.c b/mm/slub.c
index 2b2d33cc735cb..083f4e9de3ecb 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -4235,7 +4235,7 @@ slab_out_of_memory(struct kmem_cache *s, gfp_t gfpflags, int nid)
if ((gfpflags & __GFP_NOWARN) || !__ratelimit(&slub_oom_rs))
return;
- pr_warn("SLUB: Unable to allocate memory on CPU %u (of node %d) on node %d, gfp=%#x(%pGg)\n",
+ pr_warn("SLUB: Unable to allocate memory on CPU %u (of node %d) on node %d, gfp=%#lx(%pGg)\n",
cpu, cpu_to_node(cpu), nid, gfpflags, &gfpflags);
pr_warn(" cache: %s, object size: %u, buffer size: %u, default order: %u, min order: %u\n",
s->name, s->object_size, s->size, oo_order(s->oo),
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 61caa55a44027..e353e281fa95d 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -3949,7 +3949,7 @@ static gfp_t vmalloc_fix_flags(gfp_t flags)
gfp_t invalid_mask = flags & ~GFP_VMALLOC_SUPPORTED;
flags &= GFP_VMALLOC_SUPPORTED;
- WARN_ONCE(1, "Unexpected gfp: %#x (%pGg). Fixing up to gfp: %#x (%pGg). Fix your code!\n",
+ WARN_ONCE(1, "Unexpected gfp: %#lx (%pGg). Fixing up to gfp: %#lx (%pGg). Fix your code!\n",
invalid_mask, &invalid_mask, flags, &flags);
return flags;
}
--
2.51.2
Hi Brendan,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 8a30aeb0d1b4e4aaf7f7bae72f20f2ae75385ccb]
url: https://github.com/intel-lab-lkp/linux/commits/Brendan-Jackman/drm-managed-Use-special-gfp_t-format-specifier/20260322-145930
base: 8a30aeb0d1b4e4aaf7f7bae72f20f2ae75385ccb
patch link: https://lore.kernel.org/r/20260319-gfp64-v1-5-2c73b8d42b7f%40google.com
patch subject: [PATCH 5/5] mm: Change gfp_t to unsigned long
config: arm-randconfig-r131-20260322 (https://download.01.org/0day-ci/archive/20260323/202603230210.EgOkfYR4-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 15.2.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260323/202603230210.EgOkfYR4-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/202603230210.EgOkfYR4-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from include/asm-generic/bug.h:31,
from arch/arm/include/asm/bug.h:60,
from include/linux/bug.h:5,
from include/linux/instrumented.h:10,
from include/linux/atomic/atomic-instrumented.h:17,
from include/linux/atomic.h:82,
from include/asm-generic/bitops/lock.h:5,
from arch/arm/include/asm/bitops.h:245,
from include/linux/bitops.h:67,
from include/linux/kernel.h:23,
from include/linux/clk.h:13,
from drivers/usb/gadget/udc/atmel_usba_udc.c:7:
drivers/usb/gadget/udc/atmel_usba_udc.c: In function 'usba_ep_alloc_request':
>> include/linux/kern_levels.h:5:25: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'gfp_t' {aka 'long unsigned int'} [-Wformat=]
5 | #define KERN_SOH "\001" /* ASCII Start Of Header */
| ^~~~~~
include/linux/printk.h:134:25: note: in definition of macro 'no_printk'
134 | _printk(fmt, ##__VA_ARGS__); \
| ^~~
include/linux/kern_levels.h:15:25: note: in expansion of macro 'KERN_SOH'
15 | #define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
| ^~~~~~~~
include/linux/printk.h:641:19: note: in expansion of macro 'KERN_DEBUG'
641 | no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~
drivers/usb/gadget/udc/atmel_usba_udc.h:233:25: note: in expansion of macro 'pr_debug'
233 | pr_debug("udc: " fmt, ## __VA_ARGS__); \
| ^~~~~~~~
drivers/usb/gadget/udc/atmel_usba_udc.c:703:9: note: in expansion of macro 'DBG'
703 | DBG(DBG_GADGET, "ep_alloc_request: %p, 0x%x\n", _ep, gfp_flags);
| ^~~
--
In file included from include/asm-generic/bug.h:31,
from arch/arm/include/asm/bug.h:60,
from include/linux/bug.h:5,
from include/linux/instrumented.h:10,
from include/linux/atomic/atomic-instrumented.h:17,
from include/linux/atomic.h:82,
from include/asm-generic/bitops/lock.h:5,
from arch/arm/include/asm/bitops.h:245,
from include/linux/bitops.h:67,
from include/linux/kernel.h:23,
from include/linux/clk.h:13,
from atmel_usba_udc.c:7:
atmel_usba_udc.c: In function 'usba_ep_alloc_request':
>> include/linux/kern_levels.h:5:25: warning: format '%x' expects argument of type 'unsigned int', but argument 3 has type 'gfp_t' {aka 'long unsigned int'} [-Wformat=]
5 | #define KERN_SOH "\001" /* ASCII Start Of Header */
| ^~~~~~
include/linux/printk.h:134:25: note: in definition of macro 'no_printk'
134 | _printk(fmt, ##__VA_ARGS__); \
| ^~~
include/linux/kern_levels.h:15:25: note: in expansion of macro 'KERN_SOH'
15 | #define KERN_DEBUG KERN_SOH "7" /* debug-level messages */
| ^~~~~~~~
include/linux/printk.h:641:19: note: in expansion of macro 'KERN_DEBUG'
641 | no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~
atmel_usba_udc.h:233:25: note: in expansion of macro 'pr_debug'
233 | pr_debug("udc: " fmt, ## __VA_ARGS__); \
| ^~~~~~~~
atmel_usba_udc.c:703:9: note: in expansion of macro 'DBG'
703 | DBG(DBG_GADGET, "ep_alloc_request: %p, 0x%x\n", _ep, gfp_flags);
| ^~~
vim +5 include/linux/kern_levels.h
314ba3520e513a Joe Perches 2012-07-30 4
04d2c8c83d0e3a Joe Perches 2012-07-30 @5 #define KERN_SOH "\001" /* ASCII Start Of Header */
04d2c8c83d0e3a Joe Perches 2012-07-30 6 #define KERN_SOH_ASCII '\001'
04d2c8c83d0e3a Joe Perches 2012-07-30 7
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Brendan,
kernel test robot noticed the following build errors:
[auto build test ERROR on 8a30aeb0d1b4e4aaf7f7bae72f20f2ae75385ccb]
url: https://github.com/intel-lab-lkp/linux/commits/Brendan-Jackman/drm-managed-Use-special-gfp_t-format-specifier/20260322-145930
base: 8a30aeb0d1b4e4aaf7f7bae72f20f2ae75385ccb
patch link: https://lore.kernel.org/r/20260319-gfp64-v1-5-2c73b8d42b7f%40google.com
patch subject: [PATCH 5/5] mm: Change gfp_t to unsigned long
config: m68k-defconfig (https://download.01.org/0day-ci/archive/20260322/202603222339.TqgmWGnk-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260322/202603222339.TqgmWGnk-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/202603222339.TqgmWGnk-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/module.h:23,
from lib/test_lockup.c:8:
>> lib/test_lockup.c:133:47: error: expected ';' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:175:23: note: in definition of macro 'module_param_named_unsafe'
175 | param_check_##type(name, &(value)); \
| ^~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:175:32: error: expected ')' before ',' token
175 | param_check_##type(name, &(value)); \
| ^
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:176:39: error: 'param_ops_unsigned' undeclared here (not in a function); did you mean 'param_ops_uint'?
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:47: error: expected '}' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:305:11: note: to match this '{'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^
include/linux/moduleparam.h:192:9: note: in expansion of macro '__module_param_call'
192 | __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, \
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
--
In file included from include/linux/module.h:23,
from test_lockup.c:8:
test_lockup.c:133:47: error: expected ';' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:175:23: note: in definition of macro 'module_param_named_unsafe'
175 | param_check_##type(name, &(value)); \
| ^~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:175:32: error: expected ')' before ',' token
175 | param_check_##type(name, &(value)); \
| ^
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:176:39: error: 'param_ops_unsigned' undeclared here (not in a function); did you mean 'param_ops_uint'?
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
test_lockup.c:133:47: error: expected '}' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:305:11: note: to match this '{'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^
include/linux/moduleparam.h:192:9: note: in expansion of macro '__module_param_call'
192 | __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, \
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
vim +133 lib/test_lockup.c
6
7 #include <linux/kernel.h>
> 8 #include <linux/module.h>
9 #include <linux/delay.h>
10 #include <linux/sched.h>
11 #include <linux/sched/signal.h>
12 #include <linux/sched/clock.h>
13 #include <linux/cpu.h>
14 #include <linux/nmi.h>
15 #include <linux/mm.h>
16 #include <linux/uaccess.h>
17 #include <linux/file.h>
18
19 static unsigned int time_secs;
20 module_param(time_secs, uint, 0600);
21 MODULE_PARM_DESC(time_secs, "lockup time in seconds, default 0");
22
23 static unsigned int time_nsecs;
24 module_param(time_nsecs, uint, 0600);
25 MODULE_PARM_DESC(time_nsecs, "nanoseconds part of lockup time, default 0");
26
27 static unsigned int cooldown_secs;
28 module_param(cooldown_secs, uint, 0600);
29 MODULE_PARM_DESC(cooldown_secs, "cooldown time between iterations in seconds, default 0");
30
31 static unsigned int cooldown_nsecs;
32 module_param(cooldown_nsecs, uint, 0600);
33 MODULE_PARM_DESC(cooldown_nsecs, "nanoseconds part of cooldown, default 0");
34
35 static unsigned int iterations = 1;
36 module_param(iterations, uint, 0600);
37 MODULE_PARM_DESC(iterations, "lockup iterations, default 1");
38
39 static bool all_cpus;
40 module_param(all_cpus, bool, 0400);
41 MODULE_PARM_DESC(all_cpus, "trigger lockup at all cpus at once");
42
43 static int wait_state;
44 static char *state = "R";
45 module_param(state, charp, 0400);
46 MODULE_PARM_DESC(state, "wait in 'R' running (default), 'D' uninterruptible, 'K' killable, 'S' interruptible state");
47
48 static bool use_hrtimer;
49 module_param(use_hrtimer, bool, 0400);
50 MODULE_PARM_DESC(use_hrtimer, "use high-resolution timer for sleeping");
51
52 static bool iowait;
53 module_param(iowait, bool, 0400);
54 MODULE_PARM_DESC(iowait, "account sleep time as iowait");
55
56 static bool lock_read;
57 module_param(lock_read, bool, 0400);
58 MODULE_PARM_DESC(lock_read, "lock read-write locks for read");
59
60 static bool lock_single;
61 module_param(lock_single, bool, 0400);
62 MODULE_PARM_DESC(lock_single, "acquire locks only at one cpu");
63
64 static bool reacquire_locks;
65 module_param(reacquire_locks, bool, 0400);
66 MODULE_PARM_DESC(reacquire_locks, "release and reacquire locks/irq/preempt between iterations");
67
68 static bool touch_softlockup;
69 module_param(touch_softlockup, bool, 0600);
70 MODULE_PARM_DESC(touch_softlockup, "touch soft-lockup watchdog between iterations");
71
72 static bool touch_hardlockup;
73 module_param(touch_hardlockup, bool, 0600);
74 MODULE_PARM_DESC(touch_hardlockup, "touch hard-lockup watchdog between iterations");
75
76 static bool call_cond_resched;
77 module_param(call_cond_resched, bool, 0600);
78 MODULE_PARM_DESC(call_cond_resched, "call cond_resched() between iterations");
79
80 static bool measure_lock_wait;
81 module_param(measure_lock_wait, bool, 0400);
82 MODULE_PARM_DESC(measure_lock_wait, "measure lock wait time");
83
84 static unsigned long lock_wait_threshold = ULONG_MAX;
85 module_param(lock_wait_threshold, ulong, 0400);
86 MODULE_PARM_DESC(lock_wait_threshold, "print lock wait time longer than this in nanoseconds, default off");
87
88 static bool test_disable_irq;
89 module_param_named(disable_irq, test_disable_irq, bool, 0400);
90 MODULE_PARM_DESC(disable_irq, "disable interrupts: generate hard-lockups");
91
92 static bool disable_softirq;
93 module_param(disable_softirq, bool, 0400);
94 MODULE_PARM_DESC(disable_softirq, "disable bottom-half irq handlers");
95
96 static bool disable_preempt;
97 module_param(disable_preempt, bool, 0400);
98 MODULE_PARM_DESC(disable_preempt, "disable preemption: generate soft-lockups");
99
100 static bool lock_rcu;
101 module_param(lock_rcu, bool, 0400);
102 MODULE_PARM_DESC(lock_rcu, "grab rcu_read_lock: generate rcu stalls");
103
104 static bool lock_mmap_sem;
105 module_param(lock_mmap_sem, bool, 0400);
106 MODULE_PARM_DESC(lock_mmap_sem, "lock mm->mmap_lock: block procfs interfaces");
107
108 static unsigned long lock_rwsem_ptr;
109 module_param_unsafe(lock_rwsem_ptr, ulong, 0400);
110 MODULE_PARM_DESC(lock_rwsem_ptr, "lock rw_semaphore at address");
111
112 static unsigned long lock_mutex_ptr;
113 module_param_unsafe(lock_mutex_ptr, ulong, 0400);
114 MODULE_PARM_DESC(lock_mutex_ptr, "lock mutex at address");
115
116 static unsigned long lock_spinlock_ptr;
117 module_param_unsafe(lock_spinlock_ptr, ulong, 0400);
118 MODULE_PARM_DESC(lock_spinlock_ptr, "lock spinlock at address");
119
120 static unsigned long lock_rwlock_ptr;
121 module_param_unsafe(lock_rwlock_ptr, ulong, 0400);
122 MODULE_PARM_DESC(lock_rwlock_ptr, "lock rwlock at address");
123
124 static unsigned int alloc_pages_nr;
125 module_param_unsafe(alloc_pages_nr, uint, 0600);
126 MODULE_PARM_DESC(alloc_pages_nr, "allocate and free pages under locks");
127
128 static unsigned int alloc_pages_order;
129 module_param(alloc_pages_order, uint, 0400);
130 MODULE_PARM_DESC(alloc_pages_order, "page order to allocate");
131
132 static gfp_t alloc_pages_gfp = GFP_KERNEL;
> 133 module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
134 MODULE_PARM_DESC(alloc_pages_gfp, "allocate pages with this gfp_mask, default GFP_KERNEL");
135
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Brendan,
kernel test robot noticed the following build errors:
[auto build test ERROR on 8a30aeb0d1b4e4aaf7f7bae72f20f2ae75385ccb]
url: https://github.com/intel-lab-lkp/linux/commits/Brendan-Jackman/drm-managed-Use-special-gfp_t-format-specifier/20260322-145930
base: 8a30aeb0d1b4e4aaf7f7bae72f20f2ae75385ccb
patch link: https://lore.kernel.org/r/20260319-gfp64-v1-5-2c73b8d42b7f%40google.com
patch subject: [PATCH 5/5] mm: Change gfp_t to unsigned long
config: x86_64-rhel-9.4-kunit (https://download.01.org/0day-ci/archive/20260322/202603221419.9kAfrwc5-lkp@intel.com/config)
compiler: gcc-14 (Debian 14.2.0-19) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260322/202603221419.9kAfrwc5-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/202603221419.9kAfrwc5-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from include/linux/module.h:23,
from lib/test_lockup.c:8:
>> lib/test_lockup.c:133:47: error: expected ';' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:175:23: note: in definition of macro 'module_param_named_unsafe'
175 | param_check_##type(name, &(value)); \
| ^~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:175:32: error: expected ')' before ',' token
175 | param_check_##type(name, &(value)); \
| ^
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:176:39: error: 'param_ops_unsigned' undeclared here (not in a function); did you mean 'param_ops_uint'?
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:47: error: expected '}' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:305:11: note: to match this '{'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^
include/linux/moduleparam.h:192:9: note: in expansion of macro '__module_param_call'
192 | __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, \
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
lib/test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
--
In file included from include/linux/module.h:23,
from test_lockup.c:8:
test_lockup.c:133:47: error: expected ';' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:175:23: note: in definition of macro 'module_param_named_unsafe'
175 | param_check_##type(name, &(value)); \
| ^~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:175:32: error: expected ')' before ',' token
175 | param_check_##type(name, &(value)); \
| ^
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
>> include/linux/moduleparam.h:176:39: error: 'param_ops_unsigned' undeclared here (not in a function); did you mean 'param_ops_uint'?
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
test_lockup.c:133:47: error: expected '}' before 'long'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~
include/linux/moduleparam.h:305:46: note: in definition of macro '__module_param_call'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:305:11: note: to match this '{'
305 | = { __param_str_##name, THIS_MODULE, ops, \
| ^
include/linux/moduleparam.h:192:9: note: in expansion of macro '__module_param_call'
192 | __module_param_call(MODULE_PARAM_PREFIX, name, ops, arg, perm, -1, \
| ^~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:176:9: note: in expansion of macro 'module_param_cb_unsafe'
176 | module_param_cb_unsafe(name, ¶m_ops_##type, &value, perm); \
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/moduleparam.h:149:9: note: in expansion of macro 'module_param_named_unsafe'
149 | module_param_named_unsafe(name, name, type, perm)
| ^~~~~~~~~~~~~~~~~~~~~~~~~
test_lockup.c:133:1: note: in expansion of macro 'module_param_unsafe'
133 | module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
| ^~~~~~~~~~~~~~~~~~~
vim +133 lib/test_lockup.c
131
132 static gfp_t alloc_pages_gfp = GFP_KERNEL;
> 133 module_param_unsafe(alloc_pages_gfp, unsigned long, 0400);
134 MODULE_PARM_DESC(alloc_pages_gfp, "allocate pages with this gfp_mask, default GFP_KERNEL");
135
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.