* [RFC PATCH 0/3] add ttm trace event support
@ 2021-01-28 7:13 Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 1/3] drm/ttm: add ttm bo " Kevin Wang
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Kevin Wang @ 2021-01-28 7:13 UTC (permalink / raw)
To: dri-devel, amd-gfx; +Cc: ray.huang, christian.koenig, Kevin Wang
the kernel ftrace can better help analyze the kernel running status.
add some trace events to support TTM.
add trace events list:
ttm:ttm_bo_add_mem_to_lru
ttm:ttm_bo_del_from_lru
ttm:ttm_bo_move_mem
ttm:ttm_bo_wait
ttm:ttm_bo_evict
ttm:ttm_bo_swapout
ttm:ttm_bo_device_init
ttm:ttm_bo_device_release
ttm:ttm_bo_init_reserved
ttm:ttm_bo_validate
ttm:ttm_bo_release
ttm:ttm_bo_mmap
ttm:ttm_bo_vm_fault
ttm:ttm_bo_vm_access
ttm:ttm_shrink
ttm:ttm_mem_global_reserve
ttm:ttm_mem_global_free
Kevin Wang (3):
drm/ttm: add ttm bo trace event support
drm/ttm: add ttm vm bo trace event support
drm/ttm: add ttm mem trace event support
drivers/gpu/drm/ttm/ttm_bo.c | 23 ++
drivers/gpu/drm/ttm/ttm_bo_vm.c | 12 +-
drivers/gpu/drm/ttm/ttm_memory.c | 7 +
drivers/gpu/drm/ttm/ttm_module.c | 3 +
drivers/gpu/drm/ttm/ttm_trace.h | 469 +++++++++++++++++++++++++++++++
5 files changed, 512 insertions(+), 2 deletions(-)
create mode 100644 drivers/gpu/drm/ttm/ttm_trace.h
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* [RFC PATCH 1/3] drm/ttm: add ttm bo trace event support
2021-01-28 7:13 [RFC PATCH 0/3] add ttm trace event support Kevin Wang
@ 2021-01-28 7:13 ` Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 2/3] drm/ttm: add ttm vm " Kevin Wang
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Kevin Wang @ 2021-01-28 7:13 UTC (permalink / raw)
To: dri-devel, amd-gfx; +Cc: ray.huang, christian.koenig, Kevin Wang
add ttm bo related trace event support
trace events:
ttm:ttm_bo_add_mem_to_lru
ttm:ttm_bo_del_from_lru
ttm:ttm_bo_move_mem
ttm:ttm_bo_wait
ttm:ttm_bo_evict
ttm:ttm_bo_swapout
ttm:ttm_bo_device_init
ttm:ttm_bo_device_release
ttm:ttm_bo_init_reserved
ttm:ttm_bo_validate
ttm:ttm_bo_release
Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
---
drivers/gpu/drm/ttm/ttm_bo.c | 23 +++
drivers/gpu/drm/ttm/ttm_module.c | 3 +
drivers/gpu/drm/ttm/ttm_trace.h | 321 +++++++++++++++++++++++++++++++
3 files changed, 347 insertions(+)
create mode 100644 drivers/gpu/drm/ttm/ttm_trace.h
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index e3931e515906..074afd05aaa8 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -43,6 +43,8 @@
#include <linux/atomic.h>
#include <linux/dma-resv.h>
+#include "ttm_trace.h"
+
static void ttm_bo_global_kobj_release(struct kobject *kobj);
/**
@@ -143,6 +145,8 @@ static void ttm_bo_add_mem_to_lru(struct ttm_buffer_object *bo,
if (mem->placement & TTM_PL_FLAG_NO_EVICT)
return;
+ trace_ttm_bo_add_mem_to_lru(bo, mem);
+
man = ttm_manager_type(bdev, mem->mem_type);
list_add_tail(&bo->lru, &man->lru[bo->priority]);
@@ -167,6 +171,8 @@ static void ttm_bo_del_from_lru(struct ttm_buffer_object *bo)
notify = true;
}
+ trace_ttm_bo_del_from_lru(bo, notify);
+
if (notify && bdev->driver->del_from_lru_notify)
bdev->driver->del_from_lru_notify(bo);
}
@@ -299,6 +305,8 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,
}
}
+ trace_ttm_bo_move_mem(bo, mem, evict);
+
if (bdev->driver->move_notify)
bdev->driver->move_notify(bo, evict, mem);
@@ -542,6 +550,8 @@ static void ttm_bo_release(struct kref *kref)
size_t acc_size = bo->acc_size;
int ret;
+ trace_ttm_bo_release(bo);
+
if (!bo->deleted) {
ret = ttm_bo_individualize_resv(bo);
if (ret) {
@@ -668,6 +678,8 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo,
ttm_resource_free(bo, &evict_mem);
goto out;
}
+
+ trace_ttm_bo_evict(bo, &evict_mem);
bo->evicted = true;
out:
return ret;
@@ -1151,6 +1163,8 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
dma_resv_assert_held(bo->base.resv);
+ trace_ttm_bo_validate(bo);
+
/*
* Remove the backing store if no placement is given.
*/
@@ -1263,6 +1277,8 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev,
}
atomic_inc(&ttm_bo_glob.bo_count);
+ trace_ttm_bo_init_reserved(bo, size);
+
/*
* For ttm_bo_type_device buffers, allocate
* address space from the device.
@@ -1487,6 +1503,8 @@ int ttm_bo_device_release(struct ttm_bo_device *bdev)
if (!ret)
ttm_bo_global_release();
+ trace_ttm_bo_device_release(bdev);
+
return ret;
}
EXPORT_SYMBOL(ttm_bo_device_release);
@@ -1537,6 +1555,8 @@ int ttm_bo_device_init(struct ttm_bo_device *bdev,
list_add_tail(&bdev->device_list, &glob->device_list);
mutex_unlock(&ttm_global_mutex);
+ trace_ttm_bo_device_init(bdev);
+
return 0;
}
EXPORT_SYMBOL(ttm_bo_device_init);
@@ -1580,6 +1600,8 @@ int ttm_bo_wait(struct ttm_buffer_object *bo,
timeout = dma_resv_wait_timeout_rcu(bo->base.resv, true,
interruptible, timeout);
+
+ trace_ttm_bo_wait(bo, interruptible, timeout);
if (timeout < 0)
return timeout;
@@ -1670,6 +1692,7 @@ int ttm_bo_swapout(struct ttm_bo_global *glob, struct ttm_operation_ctx *ctx)
* anyone tries to access a ttm page.
*/
+ trace_ttm_bo_swapout(bo, i);
if (bo->bdev->driver->swap_notify)
bo->bdev->driver->swap_notify(bo);
diff --git a/drivers/gpu/drm/ttm/ttm_module.c b/drivers/gpu/drm/ttm/ttm_module.c
index 6ff40c041d79..8b70e8aebecb 100644
--- a/drivers/gpu/drm/ttm/ttm_module.c
+++ b/drivers/gpu/drm/ttm/ttm_module.c
@@ -35,6 +35,9 @@
#include <drm/ttm/ttm_module.h>
#include <drm/drm_sysfs.h>
+#define CREATE_TRACE_POINTS
+#include "ttm_trace.h"
+
static DECLARE_WAIT_QUEUE_HEAD(exit_q);
static atomic_t device_released;
diff --git a/drivers/gpu/drm/ttm/ttm_trace.h b/drivers/gpu/drm/ttm/ttm_trace.h
new file mode 100644
index 000000000000..7c5e55725e8e
--- /dev/null
+++ b/drivers/gpu/drm/ttm/ttm_trace.h
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2021 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: Kevin Wang
+ */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM ttm
+
+#if !defined(_TRACE_TTM_H_) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_TTM_H_
+
+#include <drm/ttm/ttm_bo_api.h>
+#include <drm/ttm/ttm_bo_driver.h>
+#include <drm/ttm/ttm_placement.h>
+#include <drm/ttm/ttm_module.h>
+#include <drm/ttm/ttm_page_alloc.h>
+#include <linux/types.h>
+#include <linux/tracepoint.h>
+
+#define TTM_PLACEMENT_FLAGS_TRACE \
+ { TTM_PL_FLAG_SYSTEM, "SYSTEM" },\
+ { TTM_PL_FLAG_TT, "TT" },\
+ { TTM_PL_FLAG_VRAM, "VRAM" },\
+ { TTM_PL_FLAG_PRIV, "PRIV" },\
+ { TTM_PL_FLAG_CACHED, "CACHED" },\
+ { TTM_PL_FLAG_UNCACHED, "UNCACHED" },\
+ { TTM_PL_FLAG_WC, "WC" },\
+ { TTM_PL_FLAG_CONTIGUOUS, "CONTIGUOUS" },\
+ { TTM_PL_FLAG_NO_EVICT, "NO_EVICT" },\
+ { TTM_PL_FLAG_TOPDOWN, "TOPDOWN" }
+
+#define __show_ttm_pl_flags(flags, mask) \
+ (flags & mask) ? __print_flags(flags, "|", \
+ TTM_PLACEMENT_FLAGS_TRACE \
+ ) : "none"
+
+#define show_ttm_pl_flags(flags) \
+ __show_ttm_pl_flags(flags, ~0UL)
+
+#define show_ttm_pl_mem_flags(flags) \
+ __show_ttm_pl_flags(flags, TTM_PL_MASK_MEM)
+
+
+TRACE_EVENT(ttm_bo_add_mem_to_lru,
+ TP_PROTO(struct ttm_buffer_object *bo, struct ttm_resource *res),
+ TP_ARGS(bo, res),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(unsigned long, size)
+ __field(uint32_t, placement)
+ __field(enum ttm_bo_type, bo_type)
+ __field(uint32_t, mem_type)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->bo_type = bo->type;
+ __entry->size = bo->mem.size;
+ __entry->placement = res->placement;
+ __entry->mem_type = res->mem_type;
+ ),
+
+ TP_printk("bo:%p, size=%lx, bo_type=%d, mtype=%d, placement=%s(%x)",
+ __entry->bo, __entry->size, __entry->bo_type, __entry->mem_type,
+ show_ttm_pl_flags(__entry->placement), __entry->placement)
+);
+
+TRACE_EVENT(ttm_bo_del_from_lru,
+ TP_PROTO(struct ttm_buffer_object *bo, bool notify),
+ TP_ARGS(bo, notify),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(unsigned long, size)
+ __field(uint32_t, placement)
+ __field(enum ttm_bo_type, bo_type)
+ __field(uint32_t, mem_type)
+ __field(bool, notify)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->bo_type = bo->type;
+ __entry->size = bo->mem.size;
+ __entry->placement = bo->mem.placement;
+ __entry->mem_type = bo->mem.mem_type;
+ __entry->notify = notify;
+ ),
+
+ TP_printk("bo:%p, size=%lx, bo_type=%d, mtype=%d, placement=%s(%x), notify=%s",
+ __entry->bo, __entry->size, __entry->bo_type, __entry->mem_type,
+ show_ttm_pl_flags(__entry->placement), __entry->placement,
+ __entry->notify ? "true" : "false")
+);
+
+TRACE_EVENT(ttm_bo_move_mem,
+ TP_PROTO(struct ttm_buffer_object *bo, struct ttm_resource *res, bool evict),
+ TP_ARGS(bo, res, evict),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(unsigned long, start)
+ __field(unsigned long, size)
+ __field(uint32_t, old_placement)
+ __field(uint32_t, new_placement)
+ __field(uint32_t, old_mem_type)
+ __field(uint32_t, new_mem_type)
+ __field(bool, evict)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->start = res->start;
+ __entry->size = res->size;
+ __entry->old_placement = bo->mem.placement;
+ __entry->new_placement = res->placement;
+ __entry->old_mem_type = bo->mem.mem_type;
+ __entry->new_mem_type = res->mem_type;
+ __entry->evict = evict;
+ ),
+
+ TP_printk("bo:%p, start=%lx, size=%lx, mtype: %d -> %d, placement: %s(%x) -> %s(%x), evict=%s",
+ __entry->bo, __entry->start, __entry->size,
+ __entry->old_mem_type, __entry->new_mem_type,
+ show_ttm_pl_flags(__entry->old_placement), __entry->old_placement,
+ show_ttm_pl_flags(__entry->new_placement), __entry->new_placement,
+ __entry->evict ? "true" : "false")
+);
+
+TRACE_EVENT(ttm_bo_wait,
+ TP_PROTO(struct ttm_buffer_object *bo, bool interruptible, long timeout),
+ TP_ARGS(bo, interruptible, timeout),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(bool, interruptible)
+ __field(long, timeout)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->interruptible = interruptible;
+ __entry->timeout = timeout;
+ ),
+
+ TP_printk("bo:%p, interruptible=%s, timeout=%ld", __entry->bo,
+ __entry->interruptible ? "true" : "false", __entry->timeout)
+);
+
+TRACE_EVENT(ttm_bo_evict,
+ TP_PROTO(struct ttm_buffer_object *bo, struct ttm_resource *res),
+ TP_ARGS(bo, res),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(enum ttm_bo_type, bo_type)
+ __field(unsigned long, size)
+ __field(uint32_t, old_placement)
+ __field(uint32_t, new_placement)
+ __field(uint32_t, old_mem_type)
+ __field(uint32_t, new_mem_type)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->bo_type = bo->type;
+ __entry->size = res->size;
+ __entry->old_placement = bo->mem.placement;
+ __entry->new_placement = res->placement;
+ __entry->old_mem_type = bo->mem.mem_type;
+ __entry->new_mem_type = res->mem_type;
+ ),
+
+ TP_printk("bo:%p, size=%lx, bo_type=%d, mtype: %d -> %d, placement: %s(%x) -> %s(%x)",
+ __entry->bo, __entry->size, __entry->bo_type,
+ __entry->old_mem_type, __entry->new_mem_type,
+ show_ttm_pl_flags(__entry->old_placement), __entry->old_placement,
+ show_ttm_pl_flags(__entry->new_placement), __entry->new_placement)
+
+);
+
+TRACE_EVENT(ttm_bo_swapout,
+ TP_PROTO(struct ttm_buffer_object *bo, int priority),
+ TP_ARGS(bo, priority),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(enum ttm_bo_type, bo_type)
+ __field(unsigned long, size)
+ __field(uint32_t, placement)
+ __field(uint32_t, mem_type)
+ __field(int, priority)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->priority = priority;
+ __entry->bo_type = bo->type;
+ __entry->size = bo->mem.size;
+ __entry->placement = bo->mem.placement;
+ __entry->mem_type = bo->mem.mem_type;
+ ),
+
+ TP_printk("bo:%p, size=%lx, bo_type=%d, mtype=%d, placement=%s(%x), prio=%d",
+ __entry->bo, __entry->size, __entry->bo_type, __entry->mem_type,
+ show_ttm_pl_flags(__entry->placement), __entry->placement,
+ __entry->priority)
+);
+
+TRACE_EVENT(ttm_bo_device_init,
+ TP_PROTO(struct ttm_bo_device *bdev),
+ TP_ARGS(bdev),
+ TP_STRUCT__entry(
+ __field(struct ttm_bo_device *, bdev)
+ __field(struct ttm_bo_driver *, driver)
+ __field(bool, need_dma32)
+ ),
+
+ TP_fast_assign(
+ __entry->bdev = bdev;
+ __entry->driver = bdev->driver;
+ __entry->need_dma32 = bdev->need_dma32;
+ ),
+
+ TP_printk("bdev:%p, driver=%p, need_dma32=%s", __entry->bdev, __entry->driver,
+ __entry->need_dma32 ? "true" : "false")
+);
+
+TRACE_EVENT(ttm_bo_device_release,
+ TP_PROTO(struct ttm_bo_device *bdev),
+ TP_ARGS(bdev),
+ TP_STRUCT__entry(
+ __field(struct ttm_bo_device *, bdev)
+ ),
+
+ TP_fast_assign(
+ __entry->bdev = bdev;
+ ),
+
+ TP_printk("bdev:%p", __entry->bdev)
+);
+
+TRACE_EVENT(ttm_bo_init_reserved,
+ TP_PROTO(struct ttm_buffer_object *bo, unsigned long size),
+ TP_ARGS(bo, size),
+ TP_STRUCT__entry(
+ __field(struct ttm_bo_device *, bdev)
+ __field(struct ttm_buffer_object *, bo)
+ __field(enum ttm_bo_type, bo_type)
+ __field(uint32_t, page_alignment)
+ __field(uint32_t, placement)
+ __field(unsigned long, size)
+ __field(size_t, acc_size)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->bdev = bo->bdev;
+ __entry->bo_type = bo->type;
+ __entry->placement = bo->mem.placement;
+ __entry->page_alignment = bo->mem.page_alignment;
+ __entry->size = size;
+ __entry->acc_size = bo->acc_size;
+ ),
+
+ TP_printk("bo:%p, bdev=%p, bo_type=%d, %s(%x) size=%lx, accsize=%lx, alignment=%d",
+ __entry->bo, __entry->bdev, __entry->bo_type,
+ show_ttm_pl_flags(__entry->placement), __entry->placement,
+ __entry->size, __entry->acc_size, __entry->page_alignment)
+);
+
+TRACE_EVENT(ttm_bo_validate,
+ TP_PROTO(struct ttm_buffer_object *bo),
+ TP_ARGS(bo),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ ),
+
+ TP_printk("bo:%p", __entry->bo)
+);
+
+TRACE_EVENT(ttm_bo_release,
+ TP_PROTO(struct ttm_buffer_object *bo),
+ TP_ARGS(bo),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ ),
+
+ TP_printk("bo:%p", __entry->bo)
+);
+
+#endif
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/ttm
+#undef TRACE_INCLUDE_FILE
+#define TRACE_INCLUDE_FILE ttm_trace
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [RFC PATCH 2/3] drm/ttm: add ttm vm bo trace event support
2021-01-28 7:13 [RFC PATCH 0/3] add ttm trace event support Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 1/3] drm/ttm: add ttm bo " Kevin Wang
@ 2021-01-28 7:13 ` Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 3/3] drm/ttm: add ttm mem " Kevin Wang
2021-01-28 7:46 ` [RFC PATCH 0/3] add ttm " Christian König
3 siblings, 0 replies; 6+ messages in thread
From: Kevin Wang @ 2021-01-28 7:13 UTC (permalink / raw)
To: dri-devel, amd-gfx; +Cc: ray.huang, christian.koenig, Kevin Wang
add ttm bo VM related trace event support
trace events:
ttm:ttm_bo_mmap
ttm:ttm_bo_vm_fault
ttm:ttm_bo_vm_access
Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
---
drivers/gpu/drm/ttm/ttm_bo_vm.c | 12 ++++-
drivers/gpu/drm/ttm/ttm_trace.h | 78 +++++++++++++++++++++++++++++++++
2 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
index 01693e8f24b7..aece2024c1fd 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
@@ -42,6 +42,8 @@
#include <linux/uaccess.h>
#include <linux/mem_encrypt.h>
+#include "ttm_trace.h"
+
static vm_fault_t ttm_bo_vm_fault_idle(struct ttm_buffer_object *bo,
struct vm_fault *vmf)
{
@@ -429,15 +431,17 @@ vm_fault_t ttm_bo_vm_fault(struct vm_fault *vmf)
ret = ttm_bo_vm_reserve(bo, vmf);
if (ret)
- return ret;
+ goto out;
prot = vma->vm_page_prot;
ret = ttm_bo_vm_fault_reserved(vmf, prot, TTM_BO_VM_NUM_PREFAULT, 1);
if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
- return ret;
+ goto out;
dma_resv_unlock(bo->base.resv);
+out:
+ trace_ttm_bo_vm_fault(bo, vmf, ret);
return ret;
}
EXPORT_SYMBOL(ttm_bo_vm_fault);
@@ -516,6 +520,8 @@ int ttm_bo_vm_access(struct vm_area_struct *vma, unsigned long addr,
if (ret)
return ret;
+ trace_ttm_bo_vm_access(bo, !!write, offset, len);
+
switch (bo->mem.mem_type) {
case TTM_PL_SYSTEM:
if (unlikely(bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) {
@@ -618,6 +624,7 @@ int ttm_bo_mmap(struct file *filp, struct vm_area_struct *vma,
goto out_unref;
ttm_bo_mmap_vma_setup(bo, vma);
+ trace_ttm_bo_mmap(bo, vma);
return 0;
out_unref:
ttm_bo_put(bo);
@@ -629,6 +636,7 @@ int ttm_bo_mmap_obj(struct vm_area_struct *vma, struct ttm_buffer_object *bo)
{
ttm_bo_get(bo);
ttm_bo_mmap_vma_setup(bo, vma);
+ trace_ttm_bo_mmap(bo, vma);
return 0;
}
EXPORT_SYMBOL(ttm_bo_mmap_obj);
diff --git a/drivers/gpu/drm/ttm/ttm_trace.h b/drivers/gpu/drm/ttm/ttm_trace.h
index 7c5e55725e8e..9f7cc34b243b 100644
--- a/drivers/gpu/drm/ttm/ttm_trace.h
+++ b/drivers/gpu/drm/ttm/ttm_trace.h
@@ -34,6 +34,7 @@
#include <drm/ttm/ttm_page_alloc.h>
#include <linux/types.h>
#include <linux/tracepoint.h>
+#include <trace/events/mmflags.h>
#define TTM_PLACEMENT_FLAGS_TRACE \
{ TTM_PL_FLAG_SYSTEM, "SYSTEM" },\
@@ -310,6 +311,83 @@ TRACE_EVENT(ttm_bo_release,
TP_printk("bo:%p", __entry->bo)
);
+TRACE_EVENT(ttm_bo_mmap,
+ TP_PROTO(struct ttm_buffer_object *bo, struct vm_area_struct *vma),
+ TP_ARGS(bo, vma),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(unsigned long, vm_start)
+ __field(unsigned long, vm_end)
+ __field(unsigned long, vm_pgoff)
+ __field(unsigned long, vm_flags)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->vm_start = vma->vm_start;
+ __entry->vm_end = vma->vm_end;
+ __entry->vm_pgoff = vma->vm_pgoff;
+ __entry->vm_flags = vma->vm_flags;
+ ),
+
+ TP_printk("bo:%p, vm_start=%lx, vm_end=%lx, vm_pgoff=%lx, vm_flags=%s",
+ __entry->bo,
+ __entry->vm_start, __entry->vm_end, __entry->vm_pgoff,
+ show_vma_flags(__entry->vm_flags))
+);
+
+TRACE_EVENT(ttm_bo_vm_fault,
+ TP_PROTO(struct ttm_buffer_object *bo, struct vm_fault *vmf, int result),
+ TP_ARGS(bo, vmf, result),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(struct vm_area_struct *, vma)
+ __field(unsigned long, fault_address)
+ __field(unsigned long, fault_pgoff)
+ __field(int, result)
+ __field(unsigned int, flags)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->vma = vmf->vma;
+ __entry->fault_address = vmf->address;
+ __entry->fault_pgoff = vmf->pgoff;
+ __entry->flags = vmf->flags;
+ __entry->result = result;
+ ),
+
+ TP_printk("bo:%p, vma=%p, fault_address=%lx, fault_pgoff=%lx, fault_flags=%s %s",
+ __entry->bo, __entry->vma,
+ __entry->fault_address, __entry->fault_pgoff,
+ __entry->flags ? __print_flags(__entry->flags, "|", FAULT_FLAG_TRACE) : "none",
+ __print_flags(__entry->result, "|", VM_FAULT_RESULT_TRACE))
+);
+
+TRACE_EVENT(ttm_bo_vm_access,
+ TP_PROTO(struct ttm_buffer_object *bo, bool write, unsigned long offset, unsigned long len),
+ TP_ARGS(bo, write, offset, len),
+ TP_STRUCT__entry(
+ __field(struct ttm_buffer_object *, bo)
+ __field(bool, write)
+ __field(unsigned long, offset)
+ __field(unsigned long, len)
+ __field(uint32_t, mem_type)
+ ),
+
+ TP_fast_assign(
+ __entry->bo = bo;
+ __entry->write = write;
+ __entry->offset = offset;
+ __entry->len = len;
+ __entry->mem_type = bo->mem.mem_type;
+ ),
+
+ TP_printk("bo:%p, %s offset=%lx, len=%lx, mtype=%d",
+ __entry->bo, __entry->write ? "write" : "read",
+ __entry->offset, __entry->len, __entry->mem_type)
+);
+
#endif
#undef TRACE_INCLUDE_PATH
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [RFC PATCH 3/3] drm/ttm: add ttm mem trace event support
2021-01-28 7:13 [RFC PATCH 0/3] add ttm trace event support Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 1/3] drm/ttm: add ttm bo " Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 2/3] drm/ttm: add ttm vm " Kevin Wang
@ 2021-01-28 7:13 ` Kevin Wang
2021-01-28 7:46 ` [RFC PATCH 0/3] add ttm " Christian König
3 siblings, 0 replies; 6+ messages in thread
From: Kevin Wang @ 2021-01-28 7:13 UTC (permalink / raw)
To: dri-devel, amd-gfx; +Cc: ray.huang, christian.koenig, Kevin Wang
add ttm memory related trace event support
trace events:
ttm:ttm_shrink
ttm:ttm_mem_global_reserve
ttm:ttm_mem_global_free
Signed-off-by: Kevin Wang <kevin1.wang@amd.com>
---
drivers/gpu/drm/ttm/ttm_memory.c | 7 ++++
drivers/gpu/drm/ttm/ttm_trace.h | 70 ++++++++++++++++++++++++++++++++
2 files changed, 77 insertions(+)
diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/ttm/ttm_memory.c
index acd63b70d814..27470b1f1f13 100644
--- a/drivers/gpu/drm/ttm/ttm_memory.c
+++ b/drivers/gpu/drm/ttm/ttm_memory.c
@@ -39,6 +39,8 @@
#include <linux/slab.h>
#include <linux/swap.h>
+#include "ttm_trace.h"
+
#define TTM_MEMORY_ALLOC_RETRIES 4
struct ttm_mem_global ttm_mem_glob;
@@ -272,6 +274,7 @@ static void ttm_shrink(struct ttm_mem_global *glob, bool from_wq,
int ret;
spin_lock(&glob->lock);
+ trace_ttm_shrink(from_wq, extra, ctx);
while (ttm_zones_above_swap_target(glob, from_wq, extra)) {
spin_unlock(&glob->lock);
@@ -518,6 +521,8 @@ static void ttm_mem_global_free_zone(struct ttm_mem_global *glob,
zone->used_mem -= amount;
}
spin_unlock(&glob->lock);
+ trace_ttm_mem_global_free(single_zone->name, amount,
+ single_zone->used_mem, single_zone->max_mem);
}
void ttm_mem_global_free(struct ttm_mem_global *glob,
@@ -590,6 +595,8 @@ static int ttm_mem_global_reserve(struct ttm_mem_global *glob,
ret = 0;
out_unlock:
spin_unlock(&glob->lock);
+ trace_ttm_mem_global_reserve(single_zone->name, amount,
+ single_zone->used_mem, single_zone->max_mem);
ttm_check_swapping(glob);
return ret;
diff --git a/drivers/gpu/drm/ttm/ttm_trace.h b/drivers/gpu/drm/ttm/ttm_trace.h
index 9f7cc34b243b..e25b8a2c423c 100644
--- a/drivers/gpu/drm/ttm/ttm_trace.h
+++ b/drivers/gpu/drm/ttm/ttm_trace.h
@@ -388,6 +388,76 @@ TRACE_EVENT(ttm_bo_vm_access,
__entry->offset, __entry->len, __entry->mem_type)
);
+TRACE_EVENT(ttm_shrink,
+ TP_PROTO(bool from_wq, uint64_t extra, struct ttm_operation_ctx *ctx),
+ TP_ARGS(from_wq, extra, ctx),
+ TP_STRUCT__entry(
+ __field(bool, from_wq)
+ __field(bool, interruptible)
+ __field(bool, wait_gpu)
+ __field(uint64_t, extra)
+ ),
+
+ TP_fast_assign(
+ __entry->from_wq = from_wq;
+ __entry->extra = extra;
+ __entry->interruptible= ctx->interruptible;
+ __entry->wait_gpu = !ctx->no_wait_gpu;
+ ),
+
+ TP_printk("ttm_shrink: from_wq=%s, interruptible=%s, wait_gpu=%s, extra=0x%llx(%lld)",
+ __entry->from_wq ? "true" : "false",
+ __entry->interruptible ? "true" : "false",
+ __entry->wait_gpu? "true" : "false",
+ __entry->extra, __entry->extra)
+);
+
+TRACE_EVENT(ttm_mem_global_reserve,
+ TP_PROTO(const char *zone_name, uint64_t amount,
+ uint64_t used_mem, uint64_t max_mem),
+ TP_ARGS(zone_name, amount, used_mem, max_mem),
+ TP_STRUCT__entry(
+ __string(zone, zone_name)
+ __field(uint64_t, amount)
+ __field(uint64_t, used_mem)
+ __field(uint64_t, max_mem)
+ ),
+
+ TP_fast_assign(
+ __assign_str(zone, zone_name);
+ __entry->amount = amount;
+ __entry->used_mem = used_mem;
+ __entry->max_mem = max_mem;
+ ),
+
+ TP_printk("zone:%s, amount=%lld, used=%lld/%lld",
+ __get_str(zone), __entry->amount,
+ __entry->used_mem, __entry->max_mem)
+);
+
+TRACE_EVENT(ttm_mem_global_free,
+ TP_PROTO(const char *zone_name, uint64_t amount,
+ uint64_t used_mem, uint64_t max_mem),
+ TP_ARGS(zone_name, amount, used_mem, max_mem),
+ TP_STRUCT__entry(
+ __string(zone, zone_name)
+ __field(uint64_t, amount)
+ __field(uint64_t, used_mem)
+ __field(uint64_t, max_mem)
+ ),
+
+ TP_fast_assign(
+ __assign_str(zone, zone_name);
+ __entry->amount = amount;
+ __entry->used_mem = used_mem;
+ __entry->max_mem = max_mem;
+ ),
+
+ TP_printk("zone:%s, amount=%lld, used=%lld/%lld",
+ __get_str(zone), __entry->amount,
+ __entry->used_mem, __entry->max_mem)
+);
+
#endif
#undef TRACE_INCLUDE_PATH
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [RFC PATCH 0/3] add ttm trace event support
2021-01-28 7:13 [RFC PATCH 0/3] add ttm trace event support Kevin Wang
` (2 preceding siblings ...)
2021-01-28 7:13 ` [RFC PATCH 3/3] drm/ttm: add ttm mem " Kevin Wang
@ 2021-01-28 7:46 ` Christian König
2021-01-28 8:19 ` Wang, Kevin(Yang)
3 siblings, 1 reply; 6+ messages in thread
From: Christian König @ 2021-01-28 7:46 UTC (permalink / raw)
To: Kevin Wang, dri-devel, amd-gfx; +Cc: ray.huang, christian.koenig
Not a bad start, but that needs quite some more work.
First of all please rebase on top of current drm-misc-next, a whole
bunch of the stuff you want to trace here was already removed or is
about to be removed.
Then concentrate on the necessary trace points, for example
ttm:ttm_bo_device_init/release are overkill.
On the other hand I'm missing important events like pool shrink, tt
swapout/swapin (ttm_bo_swapout can be dropped) and especially BO init.
I would separate the patches into one for each trace point. Not a must
have, but it could make it easier to review and we can discuss for each
one separately.
Thanks,
Christian.
Am 28.01.21 um 08:13 schrieb Kevin Wang:
> the kernel ftrace can better help analyze the kernel running status.
> add some trace events to support TTM.
>
> add trace events list:
>
> ttm:ttm_bo_add_mem_to_lru
> ttm:ttm_bo_del_from_lru
> ttm:ttm_bo_move_mem
> ttm:ttm_bo_wait
> ttm:ttm_bo_evict
> ttm:ttm_bo_swapout
> ttm:ttm_bo_device_init
> ttm:ttm_bo_device_release
> ttm:ttm_bo_init_reserved
> ttm:ttm_bo_validate
> ttm:ttm_bo_release
> ttm:ttm_bo_mmap
> ttm:ttm_bo_vm_fault
> ttm:ttm_bo_vm_access
> ttm:ttm_shrink
> ttm:ttm_mem_global_reserve
> ttm:ttm_mem_global_free
>
> Kevin Wang (3):
> drm/ttm: add ttm bo trace event support
> drm/ttm: add ttm vm bo trace event support
> drm/ttm: add ttm mem trace event support
>
> drivers/gpu/drm/ttm/ttm_bo.c | 23 ++
> drivers/gpu/drm/ttm/ttm_bo_vm.c | 12 +-
> drivers/gpu/drm/ttm/ttm_memory.c | 7 +
> drivers/gpu/drm/ttm/ttm_module.c | 3 +
> drivers/gpu/drm/ttm/ttm_trace.h | 469 +++++++++++++++++++++++++++++++
> 5 files changed, 512 insertions(+), 2 deletions(-)
> create mode 100644 drivers/gpu/drm/ttm/ttm_trace.h
>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [RFC PATCH 0/3] add ttm trace event support
2021-01-28 7:46 ` [RFC PATCH 0/3] add ttm " Christian König
@ 2021-01-28 8:19 ` Wang, Kevin(Yang)
0 siblings, 0 replies; 6+ messages in thread
From: Wang, Kevin(Yang) @ 2021-01-28 8:19 UTC (permalink / raw)
To: dri-devel, amd-gfx, Koenig, Christian; +Cc: Huang, Ray
[-- Attachment #1.1: Type: text/plain, Size: 2409 bytes --]
[AMD Official Use Only - Internal Distribution Only]
thanks comments.
I will refine these patches, then send out review later.
Best Regards,
Kevin
________________________________
From: Christian König <ckoenig.leichtzumerken@gmail.com>
Sent: Thursday, January 28, 2021 3:46 PM
To: Wang, Kevin(Yang) <Kevin1.Wang@amd.com>; dri-devel@lists.freedesktop.org <dri-devel@lists.freedesktop.org>; amd-gfx@lists.freedesktop.org <amd-gfx@lists.freedesktop.org>
Cc: Huang, Ray <Ray.Huang@amd.com>; Koenig, Christian <Christian.Koenig@amd.com>
Subject: Re: [RFC PATCH 0/3] add ttm trace event support
Not a bad start, but that needs quite some more work.
First of all please rebase on top of current drm-misc-next, a whole
bunch of the stuff you want to trace here was already removed or is
about to be removed.
Then concentrate on the necessary trace points, for example
ttm:ttm_bo_device_init/release are overkill.
On the other hand I'm missing important events like pool shrink, tt
swapout/swapin (ttm_bo_swapout can be dropped) and especially BO init.
I would separate the patches into one for each trace point. Not a must
have, but it could make it easier to review and we can discuss for each
one separately.
Thanks,
Christian.
Am 28.01.21 um 08:13 schrieb Kevin Wang:
> the kernel ftrace can better help analyze the kernel running status.
> add some trace events to support TTM.
>
> add trace events list:
>
> ttm:ttm_bo_add_mem_to_lru
> ttm:ttm_bo_del_from_lru
> ttm:ttm_bo_move_mem
> ttm:ttm_bo_wait
> ttm:ttm_bo_evict
> ttm:ttm_bo_swapout
> ttm:ttm_bo_device_init
> ttm:ttm_bo_device_release
> ttm:ttm_bo_init_reserved
> ttm:ttm_bo_validate
> ttm:ttm_bo_release
> ttm:ttm_bo_mmap
> ttm:ttm_bo_vm_fault
> ttm:ttm_bo_vm_access
> ttm:ttm_shrink
> ttm:ttm_mem_global_reserve
> ttm:ttm_mem_global_free
>
> Kevin Wang (3):
> drm/ttm: add ttm bo trace event support
> drm/ttm: add ttm vm bo trace event support
> drm/ttm: add ttm mem trace event support
>
> drivers/gpu/drm/ttm/ttm_bo.c | 23 ++
> drivers/gpu/drm/ttm/ttm_bo_vm.c | 12 +-
> drivers/gpu/drm/ttm/ttm_memory.c | 7 +
> drivers/gpu/drm/ttm/ttm_module.c | 3 +
> drivers/gpu/drm/ttm/ttm_trace.h | 469 +++++++++++++++++++++++++++++++
> 5 files changed, 512 insertions(+), 2 deletions(-)
> create mode 100644 drivers/gpu/drm/ttm/ttm_trace.h
>
[-- Attachment #1.2: Type: text/html, Size: 5155 bytes --]
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-01-28 8:20 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-28 7:13 [RFC PATCH 0/3] add ttm trace event support Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 1/3] drm/ttm: add ttm bo " Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 2/3] drm/ttm: add ttm vm " Kevin Wang
2021-01-28 7:13 ` [RFC PATCH 3/3] drm/ttm: add ttm mem " Kevin Wang
2021-01-28 7:46 ` [RFC PATCH 0/3] add ttm " Christian König
2021-01-28 8:19 ` Wang, Kevin(Yang)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).