mm: cma: add trace events for CMA allocations and freeings
Add trace events for cma_alloc() and cma_release(). The cma_alloc tracepoint is used both for successful and failed allocations, in case of allocation failure pfn=-1UL is stored and printed. Signed-off-by: Stefan Strogin <stefan.strogin@gmail.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Michal Nazarewicz <mpn@google.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Cc: Thierry Reding <treding@nvidia.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
cdd7875e0c
commit
99e8ea6cd2
2 changed files with 71 additions and 0 deletions
66
include/trace/events/cma.h
Normal file
66
include/trace/events/cma.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM cma
|
||||
|
||||
#if !defined(_TRACE_CMA_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_CMA_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
TRACE_EVENT(cma_alloc,
|
||||
|
||||
TP_PROTO(unsigned long pfn, const struct page *page,
|
||||
unsigned int count, unsigned int align),
|
||||
|
||||
TP_ARGS(pfn, page, count, align),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, pfn)
|
||||
__field(const struct page *, page)
|
||||
__field(unsigned int, count)
|
||||
__field(unsigned int, align)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->pfn = pfn;
|
||||
__entry->page = page;
|
||||
__entry->count = count;
|
||||
__entry->align = align;
|
||||
),
|
||||
|
||||
TP_printk("pfn=%lx page=%p count=%u align=%u",
|
||||
__entry->pfn,
|
||||
__entry->page,
|
||||
__entry->count,
|
||||
__entry->align)
|
||||
);
|
||||
|
||||
TRACE_EVENT(cma_release,
|
||||
|
||||
TP_PROTO(unsigned long pfn, const struct page *page,
|
||||
unsigned int count),
|
||||
|
||||
TP_ARGS(pfn, page, count),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, pfn)
|
||||
__field(const struct page *, page)
|
||||
__field(unsigned int, count)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->pfn = pfn;
|
||||
__entry->page = page;
|
||||
__entry->count = count;
|
||||
),
|
||||
|
||||
TP_printk("pfn=%lx page=%p count=%u",
|
||||
__entry->pfn,
|
||||
__entry->page,
|
||||
__entry->count)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_CMA_H */
|
||||
|
||||
/* This part must be outside protection */
|
||||
#include <trace/define_trace.h>
|
5
mm/cma.c
5
mm/cma.c
|
@ -23,6 +23,7 @@
|
|||
# define DEBUG
|
||||
#endif
|
||||
#endif
|
||||
#define CREATE_TRACE_POINTS
|
||||
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -34,6 +35,7 @@
|
|||
#include <linux/cma.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/io.h>
|
||||
#include <trace/events/cma.h>
|
||||
|
||||
#include "cma.h"
|
||||
|
||||
|
@ -414,6 +416,8 @@ struct page *cma_alloc(struct cma *cma, unsigned int count, unsigned int align)
|
|||
start = bitmap_no + mask + 1;
|
||||
}
|
||||
|
||||
trace_cma_alloc(page ? pfn : -1UL, page, count, align);
|
||||
|
||||
pr_debug("%s(): returned %p\n", __func__, page);
|
||||
return page;
|
||||
}
|
||||
|
@ -446,6 +450,7 @@ bool cma_release(struct cma *cma, const struct page *pages, unsigned int count)
|
|||
|
||||
free_contig_range(pfn, count);
|
||||
cma_clear_bitmap(cma, pfn, count);
|
||||
trace_cma_release(pfn, pages, count);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue