linux 排查page的状态问题
最近遇到一个page的释放异常的问题,堆栈如下:
[ 1000.691858] BUG: Bad page state in process server.o pfn:309d22
[ 1000.691859] page:ffffea000c274880 count: mapcount: mapping:ffff880279688308 index:0x0
[ 1000.691860] page flags: 0x2fffff00020000(mappedtodisk)
[ 1000.691862] page dumped because: non-NULL mapping
[ 1000.691863] Modules linked in: stap_11fa48f04897d7244c07086623507d9_14185(OE) xfs libcrc32c tcp_diag inet_diag xt_CHECKSUM iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 tun ebtable_filter ebtables ip6table_filter ip6_tables iptable_filter bridge stp llc dm_mirror dm_region_hash dm_log dm_mod intel_powerclamp snd_hda_intel coretemp ppdev kvm_intel snd_hda_codec snd_hda_core iTCO_wdt gpio_ich iTCO_vendor_support snd_hwdep ioatdma snd_seq parport_pc kvm shpchp parport nfsd snd_seq_device snd_pcm pcspkr sg irqbypass ntb i2c_i801 snd_timer intel_ips snd lpc_ich soundcore auth_rpcgss nfs_acl lockd grace sunrpc ip_tables ext4 mbcache jbd2 sd_mod crc_t10dif crct10dif_generic crct10dif_common
[ 1000.691895] amdkfd amd_iommu_v2 radeon i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm drm ixgbe ahci libahci libata tg3 mdio crc32c_intel dca serio_raw ptp i2c_core pps_core fjes floppy [last unloaded: stap_be77ad5fa9d5c22c253e09b1d6390ba4__1921]
[ 1000.691908] CPU: PID: Comm: server.o Tainted: G B OE ------------ 3.10.+ #
[ 1000.691910] Hardware name: To be filled by O.E.M. To be filled by O.E.M./To be filled by O.E.M., BIOS 4.6. //
[ 1000.691911] ffffea000c274880 000000001df7af73 ffff88050ee37d08 ffffffff81688527
[ 1000.691913] ffff88050ee37d30 ffffffff81683751 ffffea000c274880
[ 1000.691915] 000fffff00000000 ffff88050ee37d78 ffffffff81188d6d fff00000fe000000
[ 1000.691918] Call Trace:
[ 1000.691920] [<ffffffff81688527>] dump_stack+0x19/0x1b
[ 1000.691922] [<ffffffff81683751>] bad_page.part.+0xdf/0xfc
[ 1000.691925] [<ffffffff81188d6d>] free_pages_prepare+0x16d/0x190
[ 1000.691927] [<ffffffff811897e4>] free_hot_cold_page+0x74/0x160
[ 1000.691930] [<ffffffff8118e6a3>] __put_single_page+0x23/0x30
[ 1000.691932] [<ffffffff8118e6f5>] put_page+0x45/0x60
[ 1000.691934] [<ffffffff8122cd25>] page_cache_pipe_buf_release+0x15/0x20
[ 1000.691937] [<ffffffff8122d7a4>] splice_direct_to_actor+0x134/0x200
[ 1000.691940] [<ffffffff8122d9f0>] ? do_splice_from+0xf0/0xf0
[ 1000.691942] [<ffffffff8122d8d2>] do_splice_direct+0x62/0x90
[ 1000.691944] [<ffffffff811fe7c8>] do_sendfile+0x1d8/0x3c0
[ 1000.691947] [<ffffffff811ffb2e>] SyS_sendfile64+0x5e/0xb0
[ 1000.691949] [<ffffffff81698b49>] system_call_fastpath+0x16/0x1b
[ 1000.691951] BUG: Bad page state in process server.o pfn:309d23
可以看出,page释放失败的原因是:non-NULL mapping,也就是释放的时候,page->mapping不为NULL,我们来看check函数:
static inline int free_pages_check(struct page *page)
{
char *bad_reason = NULL;
unsigned long bad_flags = ; if (unlikely(page_mapcount(page)))
bad_reason = "nonzero mapcount";
if (unlikely(page->mapping != NULL))-------------------page的mapping不为NULL,视为异常。
bad_reason = "non-NULL mapping";
if (unlikely(page_ref_count(page) != ))
bad_reason = "nonzero _count";
if (unlikely(page->flags & PAGE_FLAGS_CHECK_AT_FREE)) {
bad_reason = "PAGE_FLAGS_CHECK_AT_FREE flag(s) set";
bad_flags = PAGE_FLAGS_CHECK_AT_FREE;
}
if (unlikely(mem_cgroup_bad_page_check(page)))
bad_reason = "cgroup check failed";
if (unlikely(bad_reason)) {
bad_page(page, bad_reason, bad_flags);
return ;
}
page_cpupid_reset_last(page);
if (page->flags & PAGE_FLAGS_CHECK_AT_PREP)
page->flags &= ~PAGE_FLAGS_CHECK_AT_PREP;
return ;
}
按道理,如果是匿名页,释放的时候,page的mapping会被置为NULL,如下:
static bool free_pages_prepare(struct page *page, unsigned int order)
{
int i;
int bad = ; trace_mm_page_free(page, order);
kmemcheck_free_shadow(page, order); if (PageAnon(page))
page->mapping = NULL;
for (i = ; i < ( << order); i++)
bad += free_pages_check(page + i);
if (bad)
return false; if (!PageHighMem(page)) {
debug_check_no_locks_freed(page_address(page),PAGE_SIZE<<order);
debug_check_no_obj_freed(page_address(page),
PAGE_SIZE << order);
}
arch_free_page(page, order);
kernel_map_pages(page, << order, ); return true;
}
既然进入了bad的计数,说明page在释放的时候不是匿名页。我的代码中,page的mapping是指向file的address_space,所以mapping不为NULL。
问题的原因是因为,我自己做的内存池,在管理page的时候,有一个流程没有正常做计数,导致被异常释放的时候,指针还没清理。
linux 排查page的状态问题的更多相关文章
- #include <sys/epoll.h> epoll - I/O event notification facility 服务器端 epoll(7) - Linux manual page http://www.man7.org/linux/man-pages/man7/epoll.7.html
epoll使用详解(精髓) - Boblim - 博客园 https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html epoll使用详解(精髓) ...
- Linux iostat监测IO状态
Linux iostat监测IO状态 http://www.orczhou.com/index.php/2010/03/iostat-detail/
- mkbundle(1) - Linux man page
mkbundle(1) - Linux man page Name mkbundle, mkbundle2 - Creates a bundled executable. Synopsis mkbun ...
- Linux iostat监测IO状态(转)
Linux iostat监测IO状态 2010-03-1 | 13:13分类:Linux,技术细节 | 标签:Linux | 53,945 views Linux系统出现了性能问题,一般我 ...
- Linux中查看socket状态(转)
Linux中查看socket状态:cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 ...
- linux c 检测网络状态
转自:http://stackoverflow.com/questions/808560/how-to-detect-the-physical-connected-state-of-a-network ...
- fork(2) - Linux man page
fork(2): create child process - Linux man page https://linux.die.net/man/2/fork fork(2) - Linux man ...
- linux 6 查看防火墙状态及开启关闭命令
linux 6 查看防火墙状态及开启关闭命令 https://blog.csdn.net/lv_shijun/article/details/52453882 存在以下两种方式: 一.service方 ...
- netstat---显示Linux中网络系统的状态信息
netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况. 语法 netstat(选项) 选项 -a或--all:显示所有连线中的Socket: -A<网 ...
随机推荐
- [UE4]把枪打飞addImpulse
一.武器如果没有开启模拟物理,会漂浮在空中 二.武器开启模拟物理,运行游戏的时候就会掉到地上了.之所以要加“Delay”延迟,是因为创建武器在先(没有持有人),持有武器动作在后,加上“delay”延迟 ...
- [UE4]场景加载界面
就可以这样就可以了,当另外一个场景成功打开后,场景加载界面也会自动消失(因为这是加载界面是添加到当前场景). 加上delay是为了在小场景测试的时候可以方便看到加载场景,避免场景加载过快看不到,不加的 ...
- vue 父组件给子组件传值 Vue父组件给子组件传方法 Vue父组件把整个实例传给子组件
Home.vue <template> <!-- 所有的内容要被根节点包含起来 --> <div id="home"> <v-header ...
- 第11章 拾遗5:IPv6和IPv4共存技术(2)_ISATAP隧道技术
6.3 ISATAP隧道技术 (1)基本概念 ①在一个IPv4网络中主机与路由器之间创建一条ISATAP隧道,以便让该主机可以访问IPv6网络中的资源. ②条件:IPv4中的PC主机需要支持IPv4和 ...
- 不曾忘记的Vue.js
马上2017年就结束了,虽然我因为目前的项目用不上你vue,但是我不曾忘记你,在时间缝隙的某一刹那,我再次将你拾起. vue.js全家桶:vue+ vuex+axios+vue-router+webp ...
- cocos源码分析--绘制顺序LocalZOrder、GlobalZOrder、OrderOfArrival
使用规则 节点的渲染顺序跟节点的三个成员变量有关(_localZOrder._globalZOrder._orderOfArrival)分别对应三个设置函数setLocalZOrder.setGlob ...
- oracle执行update时卡死问题的解决办法
原因: 由于在PLSQL Developer执行update时没有commit,oracle将该条记录锁住了. 可以通过以下办法解决: 先查询锁定记录 Sql代码 SELECT s.sid, s.se ...
- 三、html样式、链接、表格
- this 基础使用方法
在Java中,this是调用类中变量和内部类的构造方法的关键词,在对象有同名变量时,可以指定类的变量. 例子1: package example_1; import java.lang.*; publ ...
- 关于thinkphp3.2中的U函数使用的是二级域名但是U函数生成的还是WWW开头的域名
关于thinkphp3.2中的U函数使用的是二级域名但是U函数生成的还是WWW开头的域名 查看代码是由于U函数中对开启 APP_SUB_DOMAIN_DEPLOY 子域名部署 加的额外设置 如果你使 ...