mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 08:14:15 +08:00
6eca325674
We want to limit the use of page_mapcount() to the places where it is absolutely necessary. We already trace raw page->refcount, raw page->flags and raw page->mapping, and don't involve any folios. Let's also trace the raw mapcount value that does not consider the entire mapcount of large folios, and we don't add "1" to it. When dealing with typed folios, this makes a lot more sense. ... and it's for debugging purposes only either way. Link: https://lkml.kernel.org/r/20240409192301.907377-16-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Cc: Chris Zankel <chris@zankel.net> Cc: Hugh Dickins <hughd@google.com> Cc: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Miaohe Lin <linmiaohe@huawei.com> Cc: Muchun Song <muchun.song@linux.dev> Cc: Naoya Horiguchi <nao.horiguchi@gmail.com> Cc: Peter Xu <peterx@redhat.com> Cc: Richard Chang <richardycc@google.com> Cc: Rich Felker <dalias@libc.org> Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Yang Shi <shy828301@gmail.com> Cc: Yin Fengwei <fengwei.yin@intel.com> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: Zi Yan <ziy@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
136 lines
3.0 KiB
C
136 lines
3.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM page_ref
|
|
|
|
#if !defined(_TRACE_PAGE_REF_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_PAGE_REF_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/page_ref.h>
|
|
#include <linux/tracepoint.h>
|
|
#include <trace/events/mmflags.h>
|
|
|
|
DECLARE_EVENT_CLASS(page_ref_mod_template,
|
|
|
|
TP_PROTO(struct page *page, int v),
|
|
|
|
TP_ARGS(page, v),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned long, pfn)
|
|
__field(unsigned long, flags)
|
|
__field(int, count)
|
|
__field(int, mapcount)
|
|
__field(void *, mapping)
|
|
__field(int, mt)
|
|
__field(int, val)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->pfn = page_to_pfn(page);
|
|
__entry->flags = page->flags;
|
|
__entry->count = page_ref_count(page);
|
|
__entry->mapcount = atomic_read(&page->_mapcount);
|
|
__entry->mapping = page->mapping;
|
|
__entry->mt = get_pageblock_migratetype(page);
|
|
__entry->val = v;
|
|
),
|
|
|
|
TP_printk("pfn=0x%lx flags=%s count=%d mapcount=%d mapping=%p mt=%d val=%d",
|
|
__entry->pfn,
|
|
show_page_flags(__entry->flags & PAGEFLAGS_MASK),
|
|
__entry->count,
|
|
__entry->mapcount, __entry->mapping, __entry->mt,
|
|
__entry->val)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_template, page_ref_set,
|
|
|
|
TP_PROTO(struct page *page, int v),
|
|
|
|
TP_ARGS(page, v)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_template, page_ref_mod,
|
|
|
|
TP_PROTO(struct page *page, int v),
|
|
|
|
TP_ARGS(page, v)
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(page_ref_mod_and_test_template,
|
|
|
|
TP_PROTO(struct page *page, int v, int ret),
|
|
|
|
TP_ARGS(page, v, ret),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(unsigned long, pfn)
|
|
__field(unsigned long, flags)
|
|
__field(int, count)
|
|
__field(int, mapcount)
|
|
__field(void *, mapping)
|
|
__field(int, mt)
|
|
__field(int, val)
|
|
__field(int, ret)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->pfn = page_to_pfn(page);
|
|
__entry->flags = page->flags;
|
|
__entry->count = page_ref_count(page);
|
|
__entry->mapcount = atomic_read(&page->_mapcount);
|
|
__entry->mapping = page->mapping;
|
|
__entry->mt = get_pageblock_migratetype(page);
|
|
__entry->val = v;
|
|
__entry->ret = ret;
|
|
),
|
|
|
|
TP_printk("pfn=0x%lx flags=%s count=%d mapcount=%d mapping=%p mt=%d val=%d ret=%d",
|
|
__entry->pfn,
|
|
show_page_flags(__entry->flags & PAGEFLAGS_MASK),
|
|
__entry->count,
|
|
__entry->mapcount, __entry->mapping, __entry->mt,
|
|
__entry->val, __entry->ret)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_and_test_template, page_ref_mod_and_test,
|
|
|
|
TP_PROTO(struct page *page, int v, int ret),
|
|
|
|
TP_ARGS(page, v, ret)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_and_test_template, page_ref_mod_and_return,
|
|
|
|
TP_PROTO(struct page *page, int v, int ret),
|
|
|
|
TP_ARGS(page, v, ret)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_and_test_template, page_ref_mod_unless,
|
|
|
|
TP_PROTO(struct page *page, int v, int ret),
|
|
|
|
TP_ARGS(page, v, ret)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_and_test_template, page_ref_freeze,
|
|
|
|
TP_PROTO(struct page *page, int v, int ret),
|
|
|
|
TP_ARGS(page, v, ret)
|
|
);
|
|
|
|
DEFINE_EVENT(page_ref_mod_template, page_ref_unfreeze,
|
|
|
|
TP_PROTO(struct page *page, int v),
|
|
|
|
TP_ARGS(page, v)
|
|
);
|
|
|
|
#endif /* _TRACE_PAGE_COUNT_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|