免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2056 | 回复: 1

[内存管理] 求教trace_mm_page_free()函数在哪里定义实现的? [复制链接]

论坛徽章:
16
天秤座
日期:2014-08-17 11:27:4215-16赛季CBA联赛之青岛
日期:2017-02-27 17:06:3015-16赛季CBA联赛之广夏
日期:2017-02-08 13:34:58白银圣斗士
日期:2015-11-30 20:57:05冥斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-27 23:56:51神斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10青铜圣斗士
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-25 14:19:53黄金圣斗士
日期:2015-11-24 10:43:13
发表于 2015-03-05 00:12 |显示全部楼层
最近在看伙伴算法的实现,遇到了个问题,在算法里面间或出现trace_mm_page_free()函数,找了很久都没找到这个函数在哪里实现的,
我估摸应该是个宏定义然后转换过来的。但是一直没找到,盼高人指点一下,小弟感激不尽...

static bool free_pages_prepare(struct page *page, unsigned int order)
{
        int i;
        int bad = 0;

        trace_mm_page_free(page, order);
        kmemcheck_free_shadow(page, order);

        if (PageAnon(page))
                page->mapping = NULL;
        for (i = 0; i < (1 << order); i++)
                bad += free_pages_check(page + i);
        if (bad)
                return false;

        if (!PageHighMem(page)) {
                debug_check_no_locks_freed(page_address(page),
                                           PAGE_SIZE << order);
                debug_check_no_obj_freed(page_address(page),
                                           PAGE_SIZE << order);
        }
        arch_free_page(page, order);
        kernel_map_pages(page, 1 << order, 0);

        return true;
}

论坛徽章:
16
天秤座
日期:2014-08-17 11:27:4215-16赛季CBA联赛之青岛
日期:2017-02-27 17:06:3015-16赛季CBA联赛之广夏
日期:2017-02-08 13:34:58白银圣斗士
日期:2015-11-30 20:57:05冥斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-27 23:56:51神斗士
日期:2015-12-01 09:49:10嗜杀者
日期:2015-12-01 09:49:10青铜圣斗士
日期:2015-12-01 09:49:10白银圣斗士
日期:2015-11-25 14:19:53黄金圣斗士
日期:2015-11-24 10:43:13
发表于 2015-03-05 01:29 |显示全部楼层
我突然感觉我是来骗积分的,不好意思,我找到了。。。

就以下几个宏定义实现的:

【file:/include/trace/event/kmem.h】
TRACE_EVENT(mm_page_free,

        TP_PROTO(struct page *page, unsigned int order),

        TP_ARGS(page, order),

        TP_STRUCT__entry(
                __field(        struct page *,        page                )
                __field(        unsigned int,        order                )
        ),

        TP_fast_assign(
                __entry->page                = page;
                __entry->order                = order;
        ),

        TP_printk("page=%p pfn=%lu order=%d",
                        __entry->page,
                        page_to_pfn(__entry->page),
                        __entry->order)
);


【file:/include/linux/tracepoint.h】
#define TRACE_EVENT(name, proto, args, struct, assign, print)        \
        DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))



【file:/include/linux/tracepoint.h】
#define DECLARE_TRACE(name, proto, args)                                \
                __DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), 1,        \
                                PARAMS(void *__data, proto),                \
                                PARAMS(__data, args))


【file:/include/linux/tracepoint.h】
#define __DECLARE_TRACE(name, proto, args, cond, data_proto, data_args) \
        extern struct tracepoint __tracepoint_##name;                        \
        static inline void trace_##name(proto)                                \
        {                                                                \
                if (static_key_false(&__tracepoint_##name.key))                \
                        __DO_TRACE(&__tracepoint_##name,                \
                                TP_PROTO(data_proto),                        \
                                TP_ARGS(data_args),                        \
                                TP_CONDITION(cond),,);                        \
        }                                                                \
        __DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args),                \
                PARAMS(cond), PARAMS(data_proto), PARAMS(data_args))        \
        static inline int                                                \
        register_trace_##name(void (*probe)(data_proto), void *data)        \
        {                                                                \
                return tracepoint_probe_register(#name, (void *)probe,        \
                                                 data);                        \
        }                                                                \
        static inline int                                                \
        unregister_trace_##name(void (*probe)(data_proto), void *data)        \
        {                                                                \
                return tracepoint_probe_unregister(#name, (void *)probe, \
                                                   data);                \
        }                                                                \
        static inline void                                                \
        check_trace_callback_type_##name(void (*cb)(data_proto))        \
        {                                                                \
        }


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP