重置WARN_ONCE

简介: 重置WARN_ONCE

参考

当WARN_ONCE或者WARN_ON_ONCE被第一次触发时,会输出调用栈,后面就不会了。可以使用下面的命令重置,这样再次触发时,还可以输出一次调用栈:

echo 1 > /sys/kernel/debug/clear_warn_once

相关的实现在kernel\panic.c:

/* Support resetting WARN*_ONCE state */
static int clear_warn_once_set(void *data, u64 val)
{
  generic_bug_clear_once();
  memset(__start_once, 0, __end_once - __start_once);
  return 0;
}
DEFINE_DEBUGFS_ATTRIBUTE(clear_warn_once_fops, NULL, clear_warn_once_set,
       "%lld\n");

其中generic_bug_clear_once在lib\bug.c中:

static void clear_once_table(struct bug_entry *start, struct bug_entry *end)
{
  struct bug_entry *bug;
  for (bug = start; bug < end; bug++)
    bug->flags &= ~BUGFLAG_DONE;
}
void generic_bug_clear_once(void)
{
#ifdef CONFIG_MODULES
  struct module *mod;
  rcu_read_lock_sched();
  list_for_each_entry_rcu(mod, &module_bug_list, bug_list)
    clear_once_table(mod->bug_table,
         mod->bug_table + mod->num_bugs);
  rcu_read_unlock_sched();
#endif
  clear_once_table(__start___bug_table, __stop___bug_table);
}

在clear_warn_once_set中做了两件事:

  1. 调用generic_bug_clear_once把模块以及内核自己的所有的bug_entry->flags成员的BUGFLAG_DONE位清除
  2. 将内核的*(.data.once)段的内容清0

也就是说,WARN_ON_ONCE或者WARN_ONCE会利用上面两种数据段的内容来判断是否需要输出上下文信息,这个在后面的文章中再分析。

相关文章
|
Rust 数据可视化 安全
Rust性能分析工具概览:perf、flamegraph 与其他
Rust作为一种高性能、内存安全的编程语言,在构建大型系统和微服务时备受青睐。然而,优化Rust程序的性能需要有效的工具。本文将对Rust中常用的性能分析工具进行介绍,包括perf、flamegraph等,并探讨它们如何帮助开发者定位和解决性能瓶颈。
1412 1
|
存储 弹性计算 算法
倚天产品介绍|倚天ECS加速国密算法性能
倚天ECS是阿里云基于平头哥自研数据中心芯片倚天710推出arm架构实例,采用armv9架构,支持SM3/SM4指令,可以加速国密算法性能。本文基于OpenSSL 3.2和Tongsuo 实测对比了倚天ECS g8y实例和Intel g7 实例国密性能。为用户选择ECS提供参考。
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
NoSQL Shell 容器
Cgroup Freezer 【ChatGPT】
Cgroup Freezer 【ChatGPT】
|
网络协议 Linux 存储
深入理解Linux网络——TCP连接建立过程(三次握手源码详解)
一、相关实际问题 1. 为什么服务端程序都需要先listen一下 2. 半连接队列和全连接队列长度如何确定 3. “Cannot assign requested address”这个报错是怎么回事 4. 一个客户端端口可以同时用在两条连接上吗 5. 服务端半/全连接队列满了会怎么样 6. 新连接的soket内核对象是什么时候建立的 7. 建立一条TCP连接需要消耗多长时间 8. 服务器负载很正常,但是CPU被打到底了时怎么回事
|
Linux Android开发
Linux内核学习(五):linux kernel源码结构以及makefile分析
Linux内核学习(五):linux kernel源码结构以及makefile分析
936 0
|
存储 分布式计算 负载均衡
OPPO 开源高可用、高性能的 Spark Remote Shuffle Service
大数据计算的兴起,源于 Google 的 MapReduce 论文,MapReduce 的原理很简单,其流程核心则是 Map 和 Reduce 两阶段数据交换,也即 Shuffle。
821 0
OPPO 开源高可用、高性能的 Spark Remote Shuffle Service
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
591 0
|
Linux 开发工具 Android开发
cmdline(一):cmdline是什么?&&cmdline怎么添加?
cmdline(一):cmdline是什么?&&cmdline怎么添加?
844 0
十分钟了解阿里云数据库RDS
简介:阿里云关系型数据库(Relational Database Service,简称RDS)是一种稳定可靠、可弹性伸缩的在线数据库服务。基于阿里云分布式文件系统和SSD盘高性能存储,RDS支持MySQL、SQL Server、PostgreSQL、PPAS(Postgre Plus Advanced Server,高度兼容Oracle数据库)和MariaDB TX引擎,并且提供了容灾、备份、恢复、监控、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。
13141 0