通过创建内核例程来打印/ proc / slabinfo

时间:2015-03-24 14:50:10

标签: c linux linux-kernel

+  尝试通过遵循一些PDF和在线资源来学习/修补Linux内核。 我想使用kmalloc_caches []打印缓存分配,打印cat / proc / slabinfo

时出现的类似信息

到目前为止,我已经了解到我在内核版本3.3上实现了s_show(在/mm/slub.c中的第5421行) 我理解大部分函数和在其中进行的任何函数调用。但令我困惑的是传递给它的论据。因为,当我搜索调用s_show()的地方时,这就是我找到的:

 static const struct seq_operations slabinfo_op = {
     .start = s_start,
     .next = s_next,
     .stop = s_stop,
     .show = s_show,
 };

现在,我对这里发生的事情有所了解,但我仍然没有得到论据的来源。

s_show()函数:

static int s_show(struct seq_file *m, void *p)
{
    unsigned long nr_partials = 0;
    unsigned long nr_slabs = 0;
    unsigned long nr_inuse = 0;
    unsigned long nr_objs = 0;
    unsigned long nr_free = 0;
    struct kmem_cache *s;
    int node;

    s = list_entry(p, struct kmem_cache, list);

    for_each_online_node(node) {
        struct kmem_cache_node *n = get_node(s, node);

        if (!n)
            continue;

        nr_partials += n->nr_partial;
        nr_slabs += atomic_long_read(&n->nr_slabs);
        nr_objs += atomic_long_read(&n->total_objects);
        nr_free += count_partial(n, count_free);
    }

    nr_inuse = nr_objs - nr_free;

    seq_printf(m, "%-17s %6lu %6lu %6u %4u %4d", s->name, nr_inuse,
           nr_objs, s->size, oo_objects(s->oo),
           (1 << oo_order(s->oo)));
    seq_printf(m, " : tunables %4u %4u %4u", 0, 0, 0);
    seq_printf(m, " : slabdata %6lu %6lu %6lu", nr_slabs, nr_slabs,
           0UL);
    seq_putc(m, '\n');
    return 0;
}

1 个答案:

答案 0 :(得分:2)

seq_file参数实际上是您要输出要打印的数据的文件。它是自动构建的。

然而,有趣的是p参数。要了解它的来源,请参阅以下代码:

static void *s_start(struct seq_file *m, loff_t *pos)
{
        loff_t n = *pos;

        mutex_lock(&cache_chain_mutex);
        if (!n)
                print_slabinfo_header(m);

        return seq_list_start(&cache_chain, *pos);
}

static void *s_next(struct seq_file *m, void *p, loff_t *pos)
{
        return seq_list_next(p, &cache_chain, pos);
}

static void s_stop(struct seq_file *m, void *p)
{
        mutex_unlock(&cache_chain_mutex);
}

s_starts_next函数返回作为p参数给出的内容。您可能需要阅读seq_list_startseq_list_next的代码。