[AMD Official Use Only - General] Soft ping for the series. Thanks, Prike > -----Original Message----- > From: Liang, Prike <Prike.Liang@xxxxxxx> > Sent: Tuesday, April 16, 2024 4:52 PM > To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>; Liang, Prike > <Prike.Liang@xxxxxxx> > Subject: [PATCH 3/3] drm/amdgpu: add the amdgpu buffer object move > speed metrics > > Add the amdgpu buffer object move speed metrics. > > Signed-off-by: Prike Liang <Prike.Liang@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c | 78 > ++++++++++++++----- > drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 2 +- > 3 files changed, 61 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 163d221b3bbd..2840f1536b51 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -502,7 +502,7 @@ void amdgpu_device_wb_free(struct amdgpu_device > *adev, u32 wb); > /* > * Benchmarking > */ > -int amdgpu_benchmark(struct amdgpu_device *adev, int test_number); > +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number, > +struct seq_file *m); > > int amdgpu_benchmark_dump(struct amdgpu_device *adev, struct seq_file > *m); > /* > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c > index f6848b574dea..fcd186ca088a 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c > @@ -65,20 +65,27 @@ static void amdgpu_benchmark_log_results(struct > amdgpu_device *adev, > int n, unsigned size, > s64 time_ms, > unsigned sdomain, unsigned > ddomain, > - char *kind) > + char *kind, struct seq_file *m) > { > s64 throughput = (n * (size >> 10)); > > throughput = div64_s64(throughput, time_ms); > > - dev_info(adev->dev, "amdgpu: %s %u bo moves of %u kB from" > - " %d to %d in %lld ms, throughput: %lld Mb/s or %lld > MB/s\n", > - kind, n, size >> 10, sdomain, ddomain, time_ms, > - throughput * 8, throughput); > + if (m) { > + seq_printf(m, "\tamdgpu: %s %u bo moves of %u kB from" > + " %d to %d in %lld ms, throughput: %lld Mb/s or %lld > MB/s\n", > + kind, n, size >> 10, sdomain, ddomain, time_ms, > + throughput * 8, throughput); > + } else { > + dev_info(adev->dev, "amdgpu: %s %u bo moves of %u kB > from" > + " %d to %d in %lld ms, throughput: %lld Mb/s or %lld > MB/s\n", > + kind, n, size >> 10, sdomain, ddomain, time_ms, > + throughput * 8, throughput); > + } > } > > static int amdgpu_benchmark_move(struct amdgpu_device *adev, unsigned > size, > - unsigned sdomain, unsigned ddomain) > + unsigned sdomain, unsigned ddomain, struct > seq_file *m) > { > struct amdgpu_bo *dobj = NULL; > struct amdgpu_bo *sobj = NULL; > @@ -109,7 +116,7 @@ static int amdgpu_benchmark_move(struct > amdgpu_device *adev, unsigned size, > goto out_cleanup; > else > amdgpu_benchmark_log_results(adev, n, size, > time_ms, > - sdomain, ddomain, > "dma"); > + sdomain, ddomain, "dma", > m); > } > > out_cleanup: > @@ -124,7 +131,7 @@ static int amdgpu_benchmark_move(struct > amdgpu_device *adev, unsigned size, > return r; > } > > -int amdgpu_benchmark(struct amdgpu_device *adev, int test_number) > +int amdgpu_benchmark(struct amdgpu_device *adev, int test_number, > +struct seq_file *m) > { > int i, r; > static const int > common_modes[AMDGPU_BENCHMARK_COMMON_MODES_N] = { @@ - > 153,13 +160,16 @@ int amdgpu_benchmark(struct amdgpu_device *adev, int > test_number) > dev_info(adev->dev, > "benchmark test: %d (simple test, VRAM to GTT and > GTT to VRAM)\n", > test_number); > + if (m) > + seq_printf(m, "\tbenchmark test: %d (simple test, > VRAM to GTT and GTT to VRAM)\n", > + test_number); > /* simple test, VRAM to GTT and GTT to VRAM */ > r = amdgpu_benchmark_move(adev, 1024*1024, > AMDGPU_GEM_DOMAIN_GTT, > - AMDGPU_GEM_DOMAIN_VRAM); > + AMDGPU_GEM_DOMAIN_VRAM, > m); > if (r) > goto done; > r = amdgpu_benchmark_move(adev, 1024*1024, > AMDGPU_GEM_DOMAIN_VRAM, > - AMDGPU_GEM_DOMAIN_GTT); > + AMDGPU_GEM_DOMAIN_GTT, m); > if (r) > goto done; > break; > @@ -167,9 +177,13 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > dev_info(adev->dev, > "benchmark test: %d (simple test, VRAM to > VRAM)\n", > test_number); > + if (m) > + seq_printf(m, "\tbenchmark test: %d (simple test, > VRAM to VRAM)\n", > + test_number); > + > /* simple test, VRAM to VRAM */ > r = amdgpu_benchmark_move(adev, 1024*1024, > AMDGPU_GEM_DOMAIN_VRAM, > - AMDGPU_GEM_DOMAIN_VRAM); > + AMDGPU_GEM_DOMAIN_VRAM, > m); > if (r) > goto done; > break; > @@ -177,11 +191,15 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > dev_info(adev->dev, > "benchmark test: %d (GTT to VRAM, buffer size > sweep, powers of 2)\n", > test_number); > + if (m) > + seq_printf(m, "\tbenchmark test: %d (GTT to VRAM, > buffer size sweep, powers of 2)\n", > + test_number); > + > /* GTT to VRAM, buffer size sweep, powers of 2 */ > for (i = 1; i <= 16384; i <<= 1) { > r = amdgpu_benchmark_move(adev, i * > AMDGPU_GPU_PAGE_SIZE, > > AMDGPU_GEM_DOMAIN_GTT, > - > AMDGPU_GEM_DOMAIN_VRAM); > + > AMDGPU_GEM_DOMAIN_VRAM, m); > if (r) > goto done; > } > @@ -190,11 +208,14 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > dev_info(adev->dev, > "benchmark test: %d (VRAM to GTT, buffer size > sweep, powers of 2)\n", > test_number); > + if (m) > + seq_printf(m,"\tbenchmark test: %d (VRAM to GTT, > buffer size sweep, powers of 2)\n", > + test_number); > /* VRAM to GTT, buffer size sweep, powers of 2 */ > for (i = 1; i <= 16384; i <<= 1) { > r = amdgpu_benchmark_move(adev, i * > AMDGPU_GPU_PAGE_SIZE, > > AMDGPU_GEM_DOMAIN_VRAM, > - > AMDGPU_GEM_DOMAIN_GTT); > + > AMDGPU_GEM_DOMAIN_GTT, m); > if (r) > goto done; > } > @@ -203,11 +224,14 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > dev_info(adev->dev, > "benchmark test: %d (VRAM to VRAM, buffer size > sweep, powers of 2)\n", > test_number); > + if (m) > + seq_printf(m, "\tbenchmark test: %d (VRAM to VRAM, > buffer size sweep, powers of 2)\n", > + test_number); > /* VRAM to VRAM, buffer size sweep, powers of 2 */ > for (i = 1; i <= 16384; i <<= 1) { > r = amdgpu_benchmark_move(adev, i * > AMDGPU_GPU_PAGE_SIZE, > > AMDGPU_GEM_DOMAIN_VRAM, > - > AMDGPU_GEM_DOMAIN_VRAM); > + > AMDGPU_GEM_DOMAIN_VRAM, m); > if (r) > goto done; > } > @@ -216,11 +240,14 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > dev_info(adev->dev, > "benchmark test: %d (GTT to VRAM, buffer size > sweep, common modes)\n", > test_number); > + if (m) > + seq_printf(m,"\tbenchmark test: %d (GTT to VRAM, > buffer size sweep, common modes)\n", > + test_number); > /* GTT to VRAM, buffer size sweep, common modes */ > for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; > i++) { > r = amdgpu_benchmark_move(adev, > common_modes[i], > > AMDGPU_GEM_DOMAIN_GTT, > - > AMDGPU_GEM_DOMAIN_VRAM); > + > AMDGPU_GEM_DOMAIN_VRAM, m); > if (r) > goto done; > } > @@ -229,11 +256,14 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > dev_info(adev->dev, > "benchmark test: %d (VRAM to GTT, buffer size > sweep, common modes)\n", > test_number); > + if (m) > + seq_printf(m,"\tbenchmark test: %d (VRAM to GTT, > buffer size sweep, common modes)\n", > + test_number); > /* VRAM to GTT, buffer size sweep, common modes */ > for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; > i++) { > r = amdgpu_benchmark_move(adev, > common_modes[i], > > AMDGPU_GEM_DOMAIN_VRAM, > - > AMDGPU_GEM_DOMAIN_GTT); > + > AMDGPU_GEM_DOMAIN_GTT, m); > if (r) > goto done; > } > @@ -241,12 +271,15 @@ int amdgpu_benchmark(struct amdgpu_device > *adev, int test_number) > case 8: > dev_info(adev->dev, > "benchmark test: %d (VRAM to VRAM, buffer size > sweep, common modes)\n", > - test_number); > + test_number); > + if (m) > + seq_printf(m,"\tbenchmark test: %d (VRAM to VRAM, > buffer size sweep, common modes)\n", > + test_number); > /* VRAM to VRAM, buffer size sweep, common modes */ > for (i = 0; i < AMDGPU_BENCHMARK_COMMON_MODES_N; > i++) { > r = amdgpu_benchmark_move(adev, > common_modes[i], > AMDGPU_GEM_DOMAIN_VRAM, > - AMDGPU_GEM_DOMAIN_VRAM); > + AMDGPU_GEM_DOMAIN_VRAM, > m); > if (r) > goto done; > } > @@ -449,7 +482,7 @@ static void > amdgpu_benchmark_mem_metrics_dump(struct amdgpu_device *adev, > struct > &adev->mman.gtt_mgr.manager; > struct ttm_resource_manager *vram_man = > &adev->mman.vram_mgr.manager; > - uint32_t l1_cache_size; > + uint32_t l1_cache_size, j; > > seq_puts(m, "amdgpu benchmark mem metrics dump:\n"); > > @@ -483,6 +516,13 @@ static void > amdgpu_benchmark_mem_metrics_dump(struct amdgpu_device *adev, > struct > atomic64_read(&adev->gart_pin_size)); > seq_printf(m, "\tGTT heap usage size:%lld KB\n", > ttm_resource_manager_usage(gtt_man)); > > + seq_printf(m, "\t--------amdgpu buffer object move speed test begin--- > -----\n"); > + for (j = 1; j < 8; j++) { > + /*TODO: Add the cases of gfx and CPU move cases.*/ > + amdgpu_benchmark(adev, j, m); > + } > + seq_printf(m, "\t--------amdgpu buffer object move speed test > +end--------\n"); > + > seq_printf(m, "\n"); > > } > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c > index 7e935b9736c1..4d710c5f8465 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c > @@ -1760,7 +1760,7 @@ static int amdgpu_debugfs_benchmark(void *data, > u64 val) > return r; > } > > - r = amdgpu_benchmark(adev, val); > + r = amdgpu_benchmark(adev, val, NULL); > > pm_runtime_mark_last_busy(dev->dev); > pm_runtime_put_autosuspend(dev->dev); > -- > 2.34.1