2015-04-01 13:31:57

by Stefan Strogin

[permalink] [raw]
Subject: [PATCH] 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 <[email protected]>
---

Took out from the patch set "mm: cma: add some debug information for CMA" v4
(http://thread.gmane.org/gmane.linux.kernel.mm/129903) because of probable
uselessness of the rest of the patches.

Changes from the version from the patch set:
- Constify the struct page * parameter passed to the tracepoints.
- Pass both pfn and struct page * to the tracepoints to decrease unnecessary
pfn_to_page() and page_to_pfn() calls and avoid using them in TP_printk.
- Store and print pfn=-1UL instead of pfn=0, because 0th pfn can truly exist
on some architectures.

include/trace/events/cma.h | 63 ++++++++++++++++++++++++++++++++++++++++++++++
mm/cma.c | 5 ++++
2 files changed, 68 insertions(+)
create mode 100644 include/trace/events/cma.h

diff --git a/include/trace/events/cma.h b/include/trace/events/cma.h
new file mode 100644
index 0000000..e01b35d
--- /dev/null
+++ b/include/trace/events/cma.h
@@ -0,0 +1,63 @@
+#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),
+
+ 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)
+);
+
+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>
diff --git a/mm/cma.c b/mm/cma.c
index 47203fa..e9410b7c 100644
--- a/mm/cma.c
+++ b/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);
+
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;
}
--
2.1.0


2015-04-02 07:33:11

by Joonsoo Kim

[permalink] [raw]
Subject: Re: [PATCH] mm: cma: add trace events for CMA allocations and freeings

Hello,

On Wed, Apr 01, 2015 at 04:31:43PM +0300, Stefan Strogin wrote:
> 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 <[email protected]>
> ---
>
> Took out from the patch set "mm: cma: add some debug information for CMA" v4
> (http://thread.gmane.org/gmane.linux.kernel.mm/129903) because of probable
> uselessness of the rest of the patches.

I think that patch 5/5 in previous submission is handy and
simple to merge. Although we can calculate it by using bitmap,
it would be good to get that information(used size and maxchunk size)
directly.


> @@ -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);
> +

I think that tracing align is also useful.
Is there any reason not to include it?

Thanks.

2015-04-02 13:04:59

by Stefan Strogin

[permalink] [raw]
Subject: Re: [PATCH] mm: cma: add trace events for CMA allocations and freeings

Hello Joonsoo,

On 02/04/15 10:33, Joonsoo Kim wrote:
> Hello,
>
> On Wed, Apr 01, 2015 at 04:31:43PM +0300, Stefan Strogin wrote:
>> 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 <[email protected]>
>> ---
>>
>> Took out from the patch set "mm: cma: add some debug information for CMA" v4
>> (http://thread.gmane.org/gmane.linux.kernel.mm/129903) because of probable
>> uselessness of the rest of the patches.
>
> I think that patch 5/5 in previous submission is handy and
> simple to merge. Although we can calculate it by using bitmap,
> it would be good to get that information(used size and maxchunk size)
> directly.

Well, then I can send the patch 5/5 once more, this time singly.

>
>> @@ -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);
>> +
>
> I think that tracing align is also useful.
> Is there any reason not to include it?

In our case (DMA) alignment is easily calculated from the allocation
size and CONFIG_CMA_ALIGNMENT. But I think you're right, e.g. it may be
not so obvious on powerpc kvm? Anyway it won't be a shortcoming if we
trace 'align' too.

>
> Thanks.

Thank you for the reply.

2015-04-02 13:14:03

by Stefan Strogin

[permalink] [raw]
Subject: [PATCH] mm-cma-add-trace-events-for-cma-allocations-and-freeings-fix

Trace 'align' too in cma_alloc trace event.

Signed-off-by: Stefan Strogin <[email protected]>
---
include/trace/events/cma.h | 11 +++++++----
mm/cma.c | 2 +-
2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/include/trace/events/cma.h b/include/trace/events/cma.h
index e01b35d..d7cd961 100644
--- a/include/trace/events/cma.h
+++ b/include/trace/events/cma.h
@@ -10,26 +10,29 @@
TRACE_EVENT(cma_alloc,

TP_PROTO(unsigned long pfn, const struct page *page,
- unsigned int count),
+ unsigned int count, unsigned int align),

- TP_ARGS(pfn, page, count),
+ 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",
+ TP_printk("pfn=%lx page=%p count=%u align=%u",
__entry->pfn,
__entry->page,
- __entry->count)
+ __entry->count,
+ __entry->align)
);

TRACE_EVENT(cma_release,
diff --git a/mm/cma.c b/mm/cma.c
index e9410b7c..3a7a67b 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -416,7 +416,7 @@ 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);
+ trace_cma_alloc(page ? pfn : -1UL, page, count, align);

pr_debug("%s(): returned %p\n", __func__, page);
return page;
--
2.1.0