目录

微知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
https://i-blog.csdnimg.cn/direct/fbdaa6dc3aae4c9e92eda2ca12b965aa.png

开启的几种方式

以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);
https://i-blog.csdnimg.cn/direct/906bbb6588ba4a5396e7e29e03bca88e.png

如何动态开启这个打印呢?

有四种方式:

  • 通过指定函数开启: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
https://i-blog.csdnimg.cn/direct/392b8d80e2db4b278f2a4f0ffe6aaf4b.png

#函数方式
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了:
https://i-blog.csdnimg.cn/direct/f0ad0baef1c840b8a1f1f34a321bb5c5.png

实战举例

开启:使用format方式:

echo 'format "start 0x%llx, virt_addr 0x%llx" +p' > /sys/kernel/debug/dynamic_debug/control #开启

https://i-blog.csdnimg.cn/direct/f0ad0baef1c840b8a1f1f34a321bb5c5.png

常见问题

/sys/kernel/debug/dynamic_debug/control: Permission denied
需要用sudo或者root进行处理

综述

本文记录mlx5_yyy_xxx相关的日志如何开启。方便平时定位和分析问题。