in ddebug_zpool_put() dont zs_unmap the callsite, if it is enabled for printing. This will eliminate possibly repeated un-maps then re-maps of enabled and invoked pr-debug callsites, and will promptly retire all other uses. Unfortunately this causes mysterious problems: (needs more editing down) [jimc@frodo build-v2]$ gdb -x cmds vmlinux GNU gdb (GDB) Fedora 9.1-5.fc32 ... Reading symbols from vmlinux... 0x000000000000fff0 in exception_stacks () Hardware assisted breakpoint 1 at 0xffffffff82c2de50: file ../lib/dynamic_debug.c, line 1164. Breakpoint 1, ddebug_zpool_init () at ../lib/dynamic_debug.c:1164 1164 dd_callsite_zpool = zs_create_pool("dyndbg_callsites"); at ../include/linux/compiler.h:352 --Type <RET> for more, q to quit, c to continue without paging-- Num Type Disp Enb Address What 1 hw breakpoint keep y 0xffffffff82c2de50 in ddebug_zpool_init at ../lib/dynamic_debug.c:1164 breakpoint already hit 1 time (gdb) l 1159 static void __init ddebug_zpool_init(void) 1160 { 1161 struct _ddebug *iter; 1162 1163 /* tbd- no corresponding destroy */ 1164 dd_callsite_zpool = zs_create_pool("dyndbg_callsites"); 1165 if (!dd_callsite_zpool) { 1166 pr_err("create pool failed\n"); 1167 return; 1168 } (gdb) l 1169 1170 /* add-module normally does this, but not in time for builtins */ 1171 for (iter = __start___dyndbg; iter < __stop___dyndbg; iter++) 1172 ddebug_zpool_add(iter); 1173 1174 v2pr_info("total pages: %lu compaction: %lu\n", 1175 zs_get_total_pages(dd_callsite_zpool), 1176 zs_compact(dd_callsite_zpool)); 1177 } 1178 late_initcall(ddebug_zpool_init); (gdb) b 1174 Breakpoint 2 at 0xffffffff82c2de9b: file ../lib/dynamic_debug.c, line 1174. (gdb) c Continuing. Breakpoint 2, ddebug_zpool_init () at ../lib/dynamic_debug.c:1174 1174 v2pr_info("total pages: %lu compaction: %lu\n", (gdb) n do_one_initcall (fn=0xffffffff82c2de50 <ddebug_zpool_init>) at ../init/main.c:1200 1200 do_trace_initcall_finish(fn, ret); (gdb) 1204 if (preempt_count() != count) { (gdb) 26 return raw_cpu_read_4(__preempt_count) & ~PREEMPT_NEED_RESCHED; (gdb) 1208 if (irqs_disabled()) { (gdb) 164 return !(flags & X86_EFLAGS_IF); (gdb) 1212 WARN(msgbuf[0], "initcall %pS returned with %s\n", fn, msgbuf); (gdb) do_initcall_level (command_line=<optimized out>, level=<optimized out>) at ../init/main.c:1271 (gdb) info break Num Type Disp Enb Address What 1 hw breakpoint keep y 0xffffffff82c2de50 in ddebug_zpool_init at ../lib/dynamic_debug.c:1164 breakpoint already hit 1 time 2 breakpoint keep y 0xffffffff82c2de9b in ddebug_zpool_init at ../lib/dynamic_debug.c:1174 breakpoint already hit 1 time (gdb) bt (gdb) up 1288 do_initcall_level(level, command_line); (gdb) up 1308 do_initcalls(); (gdb) return Can not force return from an inlined function. (gdb) b Breakpoint 3 at 0xffffffff82bfe1c6: file ../include/linux/compiler.h, line 352. (gdb) c Continuing. Breakpoint 3, offset_to_ptr (off=<optimized out>) at ../include/linux/compiler.h:352 352 return (void *)((unsigned long)off + *off); (gdb) n do_initcall_level (command_line=<optimized out>, level=<optimized out>) at ../init/main.c:1271 1271 for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) (gdb) Breakpoint 3, offset_to_ptr (off=<optimized out>) at ../include/linux/compiler.h:352 352 return (void *)((unsigned long)off + *off); (gdb) do_initcall_level (command_line=<optimized out>, level=<optimized out>) at ../init/main.c:1271 1271 for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) (gdb) Breakpoint 3, offset_to_ptr (off=<optimized out>) at ../include/linux/compiler.h:352 352 return (void *)((unsigned long)off + *off); (gdb) do_initcall_level (command_line=<optimized out>, level=<optimized out>) at ../init/main.c:1271 1271 for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) (gdb) do_initcalls () at ../init/main.c:1285 1285 for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) { (gdb) 1291 kfree(command_line); (gdb) kernel_init_freeable () at ../init/main.c:1507 1507 console_on_rootfs(); (gdb) 1514 if (!ramdisk_execute_command) (gdb) 1515 ramdisk_execute_command = "/init"; (gdb) 1517 if (ksys_access((const char __user *) (gdb) 1519 ramdisk_execute_command = NULL; (gdb) 1520 prepare_namespace(); (gdb) 1532 integrity_load_keys(); (gdb) kernel_init (unused=<optimized out>) at ../init/main.c:1401 1401 async_synchronize_full(); (gdb) 1403 free_initmem(); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1404 mark_readonly(); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1410 pti_finalize(); (gdb) bt (gdb) info break Num Type Disp Enb Address What 1 hw breakpoint keep y 0xffffffff82c2de50 in ddebug_zpool_init at ../lib/dynamic_debug.c:1164 breakpoint already hit 1 time 2 breakpoint keep y 0xffffffff82c2de9b in ddebug_zpool_init at ../lib/dynamic_debug.c:1174 breakpoint already hit 1 time 3 breakpoint keep y 0xffffffff82bfe1c6 ../include/linux/compiler.h:352 breakpoint already hit 7 times (gdb) info break 3 Num Type Disp Enb Address What 3 breakpoint keep y 0xffffffff82bfe1c6 ../include/linux/compiler.h:352 breakpoint already hit 7 times (gdb) n Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1412 system_state = SYSTEM_RUNNING; (gdb) n Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1413 numa_default_policy(); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1415 rcu_end_inkernel_boot(); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1417 do_sysctl_args(); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1419 if (ramdisk_execute_command) { (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1433 if (execute_command) { (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1434 ret = run_init_process(execute_command); (gdb) l 1429 * 1430 * The Bourne shell can be used instead of init if we are 1431 * trying to recover a really broken machine. 1432 */ 1433 if (execute_command) { 1434 ret = run_init_process(execute_command); 1435 if (!ret) 1436 return 0; 1437 panic("Requested init %s failed (error %d).", 1438 execute_command, ret); (gdb) s Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. run_init_process (init_filename=0xffff888007fd6525 "/bin/sh") at ../init/main.c:1324 1324 argv_init[0] = init_filename; (gdb) n Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1325 pr_info("Run %s as init process\n", init_filename); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1326 pr_debug(" with arguments:\n"); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1327 for (p = argv_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1328 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1327 for (p = argv_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1328 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1327 for (p = argv_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1328 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1327 for (p = argv_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1329 pr_debug(" with environment:\n"); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1330 for (p = envp_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1331 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1330 for (p = envp_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1331 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1330 for (p = envp_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1331 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1330 for (p = envp_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1331 pr_debug(" %s\n", *p); (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1330 for (p = envp_init; *p; p++) (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1332 return do_execve(getname_kernel(init_filename), (gdb) Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. kernel_init (unused=<optimized out>) at ../init/main.c:1435 1435 if (!ret) (gdb) n Cannot remove breakpoints because program is no longer writable. Further execution is probably impossible. 1437 panic("Requested init %s failed (error %d).", (gdb) Signed-off-by: Jim Cromie <jim.cromie@xxxxxxxxx> --- lib/dynamic_debug.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c index 102f47b2a439..9c51f24a9c66 100644 --- a/lib/dynamic_debug.c +++ b/lib/dynamic_debug.c @@ -174,7 +174,9 @@ static void ddebug_callsite_put(struct _ddebug *dp) /* no site to unmap, or no means to restore */ return; - /* always unmap for now. if !pr-debug was too hard */ + if (dp->flags & _DPRINTK_FLAGS_PRINT) + return; /* keep maps of enabled pr_debugs */ + zs_unmap_object(dd_callsite_zpool, dp->zhandle); dp->site = NULL; } -- 2.26.2 _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies