diff --git a/drivers/gpu/ion/ion_iommu_heap.c b/drivers/gpu/ion/ion_iommu_heap.c index 53d853d7825..bc9bddd837a 100644 --- a/drivers/gpu/ion/ion_iommu_heap.c +++ b/drivers/gpu/ion/ion_iommu_heap.c @@ -27,6 +27,7 @@ #include #include #include +#include struct ion_iommu_heap { struct ion_heap heap; @@ -83,9 +84,13 @@ static struct page_info *alloc_largest_available(unsigned long size, } else { gfp |= GFP_KERNEL; } + trace_alloc_pages_iommu_start(gfp, orders[i]); page = alloc_pages(gfp, orders[i]); - if (!page) + trace_alloc_pages_iommu_end(gfp, orders[i]); + if (!page) { + trace_alloc_pages_iommu_fail(gfp, orders[i]); continue; + } info = kmalloc(sizeof(struct page_info), GFP_KERNEL); info->page = page; diff --git a/drivers/gpu/ion/ion_system_heap.c b/drivers/gpu/ion/ion_system_heap.c index 02f6d937459..4e9f55c791c 100644 --- a/drivers/gpu/ion/ion_system_heap.c +++ b/drivers/gpu/ion/ion_system_heap.c @@ -31,6 +31,7 @@ #include #include #include +#include static atomic_t system_heap_allocated; static atomic_t system_contig_heap_allocated; @@ -85,9 +86,13 @@ static struct page *alloc_buffer_page(struct ion_system_heap *heap, if (order > 4) gfp_flags = high_order_gfp_flags; + trace_alloc_pages_sys_start(gfp_flags, order); page = alloc_pages(gfp_flags, order); - if (!page) + trace_alloc_pages_sys_end(gfp_flags, order); + if (!page) { + trace_alloc_pages_sys_fail(gfp_flags, order); return 0; + } sg_init_table(&sg, 1); sg_set_page(&sg, page, PAGE_SIZE << order, 0); dma_sync_sg_for_device(NULL, &sg, 1, DMA_BIDIRECTIONAL); diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index a1da44f95f2..e76e8225706 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h @@ -495,6 +495,70 @@ DEFINE_EVENT(migrate_pages, migrate_pages_end, TP_ARGS(mode) ); +DECLARE_EVENT_CLASS(ion_alloc_pages, + + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order), + + TP_STRUCT__entry( + __field(gfp_t, gfp_flags) + __field(unsigned int, order) + ), + + TP_fast_assign( + __entry->gfp_flags = gfp_flags; + __entry->order = order; + ), + + TP_printk("gfp_flags=%s order=%d", + show_gfp_flags(__entry->gfp_flags), + __entry->order) + ); + +DEFINE_EVENT(ion_alloc_pages, alloc_pages_iommu_start, + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order) + ); + +DEFINE_EVENT(ion_alloc_pages, alloc_pages_iommu_end, + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order) + ); + +DEFINE_EVENT(ion_alloc_pages, alloc_pages_iommu_fail, + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order) + ); + +DEFINE_EVENT(ion_alloc_pages, alloc_pages_sys_start, + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order) + ); + +DEFINE_EVENT(ion_alloc_pages, alloc_pages_sys_end, + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order) + ); + +DEFINE_EVENT(ion_alloc_pages, alloc_pages_sys_fail, + TP_PROTO(gfp_t gfp_flags, + unsigned int order), + + TP_ARGS(gfp_flags, order) + ); + #endif /* _TRACE_KMEM_H */ /* This part must be outside protection */