From: "Christian König" <deathsimple@vodafone.de>
To: "Marek Olšák" <maraeo@gmail.com>, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 2/6] drm/radeon: track memory statistics about VRAM and GTT usage and buffer moves
Date: Mon, 24 Feb 2014 17:20:17 +0100 [thread overview]
Message-ID: <530B7141.9060207@vodafone.de> (raw)
In-Reply-To: <1393255246-8296-3-git-send-email-maraeo@gmail.com>
Am 24.02.2014 16:20, schrieb Marek Olšák:
> From: Marek Olšák <marek.olsak@amd.com>
>
> The statistics are:
> - VRAM usage in bytes
> - GTT usage in bytes
> - number of bytes moved by TTM
>
> The last one is actually a counter, so you need to sample it before and after
> command submission and take the difference.
>
> This is useful for finding performance bottlenecks. Userspace queries are
> also added.
>
> Signed-off-by: Marek Olšák <marek.olsak@amd.com>
> ---
> drivers/gpu/drm/radeon/radeon.h | 5 +++++
> drivers/gpu/drm/radeon/radeon_device.c | 1 +
> drivers/gpu/drm/radeon/radeon_kms.c | 15 ++++++++++++++
> drivers/gpu/drm/radeon/radeon_object.c | 38 +++++++++++++++++++++++++++++++++-
> drivers/gpu/drm/radeon/radeon_object.h | 2 +-
> drivers/gpu/drm/radeon/radeon_ttm.c | 10 ++++++++-
> include/uapi/drm/radeon_drm.h | 3 +++
> 7 files changed, 71 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 3f10782..d37a57a 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -2307,6 +2307,11 @@ struct radeon_device {
> /* virtual memory */
> struct radeon_vm_manager vm_manager;
> struct mutex gpu_clock_mutex;
> + /* memory stats */
> + struct mutex memory_stats_mutex;
> + uint64_t vram_usage;
> + uint64_t gtt_usage;
> + uint64_t num_bytes_moved;
As far as I can see you could make those tree values atomic64_t instead
and avoid the mutex.
> /* ACPI interface */
> struct radeon_atif atif;
> struct radeon_atcs atcs;
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index b012cbb..6564af7 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -1184,6 +1184,7 @@ int radeon_device_init(struct radeon_device *rdev,
> mutex_init(&rdev->gem.mutex);
> mutex_init(&rdev->pm.mutex);
> mutex_init(&rdev->gpu_clock_mutex);
> + mutex_init(&rdev->memory_stats_mutex);
> mutex_init(&rdev->srbm_mutex);
> init_rwsem(&rdev->pm.mclk_lock);
> init_rwsem(&rdev->exclusive_lock);
> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
> index 0b631eb..ddc8c74 100644
> --- a/drivers/gpu/drm/radeon/radeon_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> @@ -486,6 +486,21 @@ static int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file
> case RADEON_INFO_VCE_FB_VERSION:
> *value = rdev->vce.fb_version;
> break;
> + case RADEON_INFO_NUM_BYTES_MOVED:
> + value = (uint32_t*)&value64;
> + value_size = sizeof(uint64_t);
> + value64 = rdev->num_bytes_moved;
> + break;
> + case RADEON_INFO_VRAM_USAGE:
> + value = (uint32_t*)&value64;
> + value_size = sizeof(uint64_t);
> + value64 = rdev->vram_usage;
> + break;
> + case RADEON_INFO_GTT_USAGE:
> + value = (uint32_t*)&value64;
> + value_size = sizeof(uint64_t);
> + value64 = rdev->gtt_usage;
> + break;
> default:
> DRM_DEBUG_KMS("Invalid request %d\n", info->request);
> return -EINVAL;
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index dd12bb4..d676ee2 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -56,11 +56,38 @@ static void radeon_bo_clear_va(struct radeon_bo *bo)
> }
> }
>
> +static void radeon_update_memory_usage(struct radeon_bo *bo,
> + unsigned mem_type, int sign)
> +{
> + struct radeon_device *rdev = bo->rdev;
> + u64 size = (u64)bo->tbo.num_pages << PAGE_SHIFT;
> +
> + mutex_lock(&rdev->memory_stats_mutex);
> + switch (mem_type) {
> + case TTM_PL_TT:
> + if (sign > 0)
> + rdev->gtt_usage += size;
> + else
> + rdev->gtt_usage -= size;
> + break;
> + case TTM_PL_VRAM:
> + if (sign > 0)
> + rdev->vram_usage += size;
> + else
> + rdev->vram_usage -= size;
> + break;
> + }
> + mutex_unlock(&rdev->memory_stats_mutex);
> +}
> +
> static void radeon_ttm_bo_destroy(struct ttm_buffer_object *tbo)
> {
> struct radeon_bo *bo;
>
> bo = container_of(tbo, struct radeon_bo, tbo);
> +
> + radeon_update_memory_usage(bo, bo->tbo.mem.mem_type, -1);
> +
> mutex_lock(&bo->rdev->gem.mutex);
> list_del_init(&bo->list);
> mutex_unlock(&bo->rdev->gem.mutex);
> @@ -567,14 +594,23 @@ int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
> }
>
> void radeon_bo_move_notify(struct ttm_buffer_object *bo,
> - struct ttm_mem_reg *mem)
> + struct ttm_mem_reg *new_mem)
> {
> struct radeon_bo *rbo;
> +
> if (!radeon_ttm_bo_is_radeon_bo(bo))
> return;
> +
> rbo = container_of(bo, struct radeon_bo, tbo);
> radeon_bo_check_tiling(rbo, 0, 1);
> radeon_vm_bo_invalidate(rbo->rdev, rbo);
> +
> + /* update statistics */
> + if (!new_mem)
> + return;
> +
> + radeon_update_memory_usage(rbo, bo->mem.mem_type, -1);
> + radeon_update_memory_usage(rbo, new_mem->mem_type, 1);
> }
>
> int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
> diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
> index 209b111..a9a8c11 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.h
> +++ b/drivers/gpu/drm/radeon/radeon_object.h
> @@ -151,7 +151,7 @@ extern void radeon_bo_get_tiling_flags(struct radeon_bo *bo,
> extern int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
> bool force_drop);
> extern void radeon_bo_move_notify(struct ttm_buffer_object *bo,
> - struct ttm_mem_reg *mem);
> + struct ttm_mem_reg *new_mem);
> extern int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
> extern int radeon_bo_get_surface_reg(struct radeon_bo *bo);
>
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index 77f5b0c..7e2e833 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -406,8 +406,16 @@ static int radeon_bo_move(struct ttm_buffer_object *bo,
> if (r) {
> memcpy:
> r = ttm_bo_move_memcpy(bo, evict, no_wait_gpu, new_mem);
> + if (r) {
> + return r;
> + }
> }
> - return r;
> +
> + /* update statistics */
> + mutex_lock(&rdev->memory_stats_mutex);
> + rdev->num_bytes_moved += (u64)bo->num_pages << PAGE_SHIFT;
> + mutex_unlock(&rdev->memory_stats_mutex);
> + return 0;
> }
>
> static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
> index cb5c93a..aefa2f6 100644
> --- a/include/uapi/drm/radeon_drm.h
> +++ b/include/uapi/drm/radeon_drm.h
> @@ -1004,6 +1004,9 @@ struct drm_radeon_cs {
> #define RADEON_INFO_VCE_FW_VERSION 0x1b
> /* version of VCE feedback */
> #define RADEON_INFO_VCE_FB_VERSION 0x1c
> +#define RADEON_INFO_NUM_BYTES_MOVED 0x1d
> +#define RADEON_INFO_VRAM_USAGE 0x1e
> +#define RADEON_INFO_GTT_USAGE 0x1f
>
>
> struct drm_radeon_info {
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2014-02-24 16:20 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-24 15:20 [PATCH 0/6] Radeon memory management improvements Marek Olšák
2014-02-24 15:20 ` [PATCH 1/6] drm/radeon: add a way to get and set initial buffer domains Marek Olšák
2014-02-24 16:17 ` Christian König
2014-02-26 0:44 ` Marek Olšák
2014-02-26 9:39 ` Christian König
2014-02-26 10:58 ` Marek Olšák
2014-02-24 15:20 ` [PATCH 2/6] drm/radeon: track memory statistics about VRAM and GTT usage and buffer moves Marek Olšák
2014-02-24 16:20 ` Christian König [this message]
2014-02-26 17:56 ` Marek Olšák
2014-02-26 18:26 ` Christian König
2014-02-27 0:39 ` Marek Olšák
2014-02-24 15:20 ` [PATCH 3/6] drm/radeon: deduplicate code in radeon_gem_busy_ioctl Marek Olšák
2014-02-24 15:20 ` [PATCH 4/6] drm/radeon: add buffers to the LRU list from smallest to largest Marek Olšák
2014-02-24 15:20 ` [PATCH 5/6] drm/radeon: validate relocations in the order determined by userspace Marek Olšák
2014-02-24 16:27 ` Christian König
2014-02-24 15:20 ` [PATCH 6/6] drm/radeon: limit how much memory TTM can move per IB according to VRAM usage Marek Olšák
2014-02-24 16:40 ` [PATCH 0/6] Radeon memory management improvements Christian König
2014-02-24 19:23 ` Alex Deucher
2014-02-24 19:39 ` Marek Olšák
2014-02-25 10:11 ` Christian König
2014-02-25 23:29 ` Marek Olšák
2014-02-27 1:17 ` Jerome Glisse
2014-02-25 2:52 ` Michel Dänzer
-- strict thread matches above, loose matches on Subject: below --
2014-02-26 18:25 [PATCH 1/6] drm/radeon: add a way to get and set initial buffer domains Marek Olšák
2014-02-26 18:25 ` [PATCH 2/6] drm/radeon: track memory statistics about VRAM and GTT usage and buffer moves Marek Olšák
2014-03-01 23:56 [PATCH 0/6] Radeon memory management improvements v3 Marek Olšák
2014-03-01 23:56 ` [PATCH 2/6] drm/radeon: track memory statistics about VRAM and GTT usage and buffer moves Marek Olšák
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=530B7141.9060207@vodafone.de \
--to=deathsimple@vodafone.de \
--cc=dri-devel@lists.freedesktop.org \
--cc=maraeo@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox