让blktrace输出trace_printk的内容 2018-01-20
有时需要在blktrace输出中插入一些打印. 由于blktrace是基于ftrace的, 故考虑转用ftrace来实现这个目的.
1. ftrace的过滤
# cat /sys/kernel/debug/tracing/events/block/block_rq_complete/format
name: block_rq_complete
ID: 828
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1;
field:dev_t dev; offset:8; size:4; signed:0;
field:sector_t sector; offset:16; size:8; signed:0;
field:unsigned int nr_sector; offset:24; size:4; signed:0;
field:int errors; offset:28; size:4; signed:1;
field:char rwbs[8]; offset:32; size:8; signed:1;
field:__data_loc char[] cmd; offset:40; size:4; signed:1;
print fmt: "%d,%d %s (%s) %llu + %u [%d]", ((unsigned int) ((REC->dev) >> 20)), ((unsigned int) ((REC->dev) & ((1U << 20) - 1))), REC->rwbs, __get_str(cmd), (unsigned long long)REC->sector, REC->nr_sector, REC->errors
x86-64下, crash通过bt -f找出函数参数 2018-01-20
1. 背景/引言
不同于x86, x86-64的前6个参数没有压栈, 而是通过寄存器传递. 这样, 似乎无法通过bt -f来获得参数. 本文给出一个例子, 说明x86-64在一些情况下, 依旧能够获得函数的参数.
前6个参数分别存放到rdi, rsi, rdx, rcx, r8d, r9d.
2. 例子
crash> bt
PID: 4392 TASK: ffff8801b7af0880 CPU: 0 COMMAND: "your_cmd"
#0 [ffff8801836b3af0] schedule at ffffffff8157cc1d
#1 [ffff8801836b3bc8] schedule_timeout at ffffffff8157dc75
#2 [ffff8801836b3c98] structone_mod_free at ffffffffa0771156 [your_kmod]
#3 [ffff8801836b3d08] free_structone at ffffffffa077146b [your_kmod]
...略...
#9 [ffff8801836b3eb8] kthread at ffffffff810ac69e
#10 [ffff8801836b3f48] kernel_thread at ffffffff8100c38a
这里想知道传递给structone_mod_free
的参数的具体值.
其原型是 void structone_mod_free(struct structone *structone)
让 source insight 识别出 非标准的函数实现 2018-01-12
1. 问题
drbd-8.4中有如下代码
BIO_ENDIO_TYPE drbd_request_endio BIO_ENDIO_ARGS(struct bio *bio, int error)
{
具体实现略
}
这里 drbd_request_endio
不会被source insight当成函数名.
2. 处理
source insight版本4.0
option- file type option -
左侧file type 选 c/c++ source file, 右侧 parsing, language...
弹出的对话框中,
左侧选 c/c++ language, 右侧点击 properties...
弹出的对话框中,
标签页 custom parsing
打钩 Enable expressions below for parsing
探测softlockup的原理 2017-06-10
本文以2.6.18内核来说明.
1. 检测
每间隔HZ, 会喂watchdog.
tick watchdog
| |
| wakup |
|- - - - - - - - - - - > |
|check | touch
| |
| |
| wakup |
|- - - - - - - - - - - > |
|check | touch
| |
| |
若watchdog线程迟迟没有被调度到, 则导致watchdog没有touch, 这样, tick 时钟会检查到该问题, 报 soft lockup .
为何中断handler中可以使用current 2017-05-13
本博文仅提出问题, 不给出答案. 祝玩得开心.
问题: 我们知道 当前task可以通过current来获得. ARM上, 其实现如下:
#define current (get_current())
#define get_current() (current_thread_info()->task)
static inline struct thread_info *current_thread_info(void)
{
register unsigned long sp asm ("sp");
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
}
对于ARM, 其sp是banked的, irq模式和SVC模式的sp不是同一个. 这样, 中断handler还能通过sp来获得当前task吗?
以下内容是本问题的提示.
为了避免干扰各位思考, 已设置背景色为黑色, 若要查看文字, 可通过按ctrl+a等方法查看.
中断handler在SVC模式下执行的.