让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模式下执行的.