微知Mellanox-OFED驱动中开启动态debug的几种方式funcfilemoduleformatp-p
【微知】Mellanox OFED驱动中开启动态debug的几种方式?func、file、module、format;+p、-p)
背景
Mellanox OFED提供了不同级别日志,本文记录mlx5_yyy_xxx相关的日志如何开启。
更多OFED提供的日志参考兄弟篇:
日志
根据兄弟篇文章分析,mlx5_yyy_xxx系列的日志都是使用了dev_xxx的内核日志,可以支持内核的动态debug功能。只要在OFED中看到mlx5_yyy_xxx(比如mlx5_yyy_dbg 或者info,比如mlx5_ib_dbg, mlx5_core_dbg),就可以用动态debug
开启的几种方式
以reg_mr为例子,查看mlx5_ib_reg_user_mr的流程的打印,可以根据下文看到mlx5_ib_reg_user_mr中有一个打印: mlx5_ib_dbg(dev, "start 0x%llx, iova 0x%llx, length 0x%llx, access_flags 0x%x\n", start, iova, length, access_flags);
如何动态开启这个打印呢?
有四种方式:
- 通过指定函数开启:func
- 通过指定函数所在文件开启:file
- 通过指定函数所在ko开启: module
- 通过print的字符串匹配开启: format
mlx动态debug
四种debug方式
开关方式
echo ‘… +p’ > /sys/kernel/debug/dynamic_debug/control
echo ‘… -p’ > /sys/kernel/debug/dynamic_debug/control
func
echo ‘func mlx5_ib_reg_user_mr +p’ > xxxcontrol
file
echo ‘file drivers/infiniband/hw/mlx5/mr.c +p’ > xxxcontrol
module
echo ‘module mlx5_ib +p’ > xxxcontrol
format
echo ‘format 引号start 0x%llx, virt_addr 0x%llx%引号 +p’ > xxxcontrol
内核机制如何支持几种方式开启
在/sys/kernel/debug/dynamic_debug/control
文件中,通过echo进去对应的类型,然后指定一个+p和-p就能开关
前面提到的四种方式如何不用查看代码就能查看呢?
可以先 cat /sys/kernel/debug/dynamic_debug/control | grep xxx
,比如要过滤mlx5_ib_reg_user_mr,可以用mlx5_ib_reg_user_mr过滤,或者部分过滤(如果不记得)reg_user_mr。
cat /sys/kernel/debug/dynamic_debug/control | grep mlx5_ib_reg_user_mr
可以看到两行,说明动态debug里面记录了两个,并且这些信息记录了所在文件、模块、函数名、format
#函数方式
echo "func mlx5_ib_reg_user_mr +p" > /sys/kernel/debug/dynamic_debug/control #开启
echo "func mlx5_ib_reg_user_mr -p" > /sys/kernel/debug/dynamic_debug/control #关闭
# 文件方式:注意怎么确定路径,就先grep然后copy
echo "file drivers/infiniband/hw/mlx5/mr.c +p" > /sys/kernel/debug/dynamic_debug/control #开启
echo "file drivers/infiniband/hw/mlx5/mr.c -p" > /sys/kernel/debug/dynamic_debug/control #开启
# ko方式
echo "module mlx5_ib +p" > /sys/kernel/debug/dynamic_debug/control #开启
echo "module mlx5_ib -p" > /sys/kernel/debug/dynamic_debug/control
# format方式, 注意将format中引号包含
echo 'format "start 0x%llx, virt_addr 0x%llx" +p' > /sys/kernel/debug/dynamic_debug/control #开启
echo 'format "start 0x%llx, virt_addr 0x%llx" -p' > /sys/kernel/debug/dynamic_debug/control
# 确认结果:
grep mlx5_ib_reg_user_mr /sys/kernel/debug/dynamic_debug/control
可以看到修改后函数开关是p了:
实战举例
开启:使用format方式:
echo 'format "start 0x%llx, virt_addr 0x%llx" +p' > /sys/kernel/debug/dynamic_debug/control #开启
常见问题
/sys/kernel/debug/dynamic_debug/control: Permission denied
需要用sudo或者root进行处理
综述
本文记录mlx5_yyy_xxx相关的日志如何开启。方便平时定位和分析问题。