[PATCH umr] top vram add visible vram usage info
Yu, Qiang
Qiang.Yu at amd.com
Tue Jul 11 11:30:01 UTC 2017
>From my side, it should be like:
VRAM: 249/4096 vis 50/237 (MiB)
steam:( 3203) : 63304 KiB VRAM, 14088 KiB vis VRAM, 20072 KiB GTT
compiz:( 2510) : 82144 KiB VRAM, 7072 KiB vis VRAM, 20460 KiB GTT
Xorg:( 1682) : 125536 KiB VRAM, 11616 KiB vis VRAM, 21812 KiB GTT
What's the value of visible_vram_size on your side?
Regards,
Qiang
________________________________________
From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> on behalf of Tom St Denis <tom.stdenis at amd.com>
Sent: Tuesday, July 11, 2017 6:50:46 PM
To: amd-gfx at lists.freedesktop.org
Subject: Re: [PATCH umr] top vram add visible vram usage info
Trying out the patch I see the following in the "vram" list
VRAM: 1096/2048 vis 195/238 (MiB)
xonotic-glx:( 4364) : 965612 KiB VRAM, 0 KiB
vis VRAM, 5064 KiB GTT
umr:( 4315) : 0 KiB VRAM, 0 KiB
vis VRAM, 0 KiB GTT
gnome-shell:( 3322) : 120548 KiB VRAM, 0 KiB
vis VRAM, 2492 KiB GTT
So you capture the visible ram at the top but not per process. Unless
I'm reading it right some process should have visible ram tallied up right?
Tom
On 10/07/17 10:10 PM, StDenis, Tom wrote:
> Hi Qiang,
>
> Sorry I must have missed that. I'll try it out first thing in the morning (Markham time). If it's all good I'll add a Rb and push it out.
>
> Cheers,
> Tom
> ________________________________________
> From: Yu, Qiang
> Sent: Monday, July 10, 2017 22:07
> To: amd-gfx at lists.freedesktop.org; StDenis, Tom
> Subject: Re: [PATCH umr] top vram add visible vram usage info
>
> Hi Tom,
>
> Any feedback on this patch?
>
> Regards,
> Qiang
> ________________________________________
> From: Qiang Yu <Qiang.Yu at amd.com>
> Sent: Thursday, July 6, 2017 2:32:20 PM
> To: amd-gfx at lists.freedesktop.org
> Cc: Yu, Qiang
> Subject: [PATCH umr] top vram add visible vram usage info
>
> Signed-off-by: Qiang Yu <Qiang.Yu at amd.com>
> ---
> src/app/top.c | 56 ++++++++++++++++++++++++++++++++++++++++-------------
> src/lib/query_drm.c | 4 ++--
> src/umr.h | 2 +-
> 3 files changed, 46 insertions(+), 16 deletions(-)
>
> diff --git a/src/app/top.c b/src/app/top.c
> index 4a12f1b..359d241 100644
> --- a/src/app/top.c
> +++ b/src/app/top.c
> @@ -287,6 +287,8 @@ static struct umr_bitfield stat_drm_bits[] = {
>
> static FILE *logfile = NULL;
>
> +static uint64_t visible_vram_size = 0;
> +
> static volatile int sensor_thread_quit = 0;
> static volatile uint32_t gpu_power_data[32];
> static volatile struct umr_bitfield *sensor_bits = NULL;
> @@ -634,7 +636,7 @@ static void parse_drm(struct umr_asic *asic, uint32_t addr, struct umr_bitfield
> else if (bits[j].start == AMDGPU_INFO_WAVES)
> counts[j] = vi_count_waves(asic);
> else
> - umr_query_drm(asic, bits[j].start, &counts[j]);
> + umr_query_drm(asic, bits[j].start, &counts[j], sizeof(counts[j]));
> }
> }
>
> @@ -643,6 +645,7 @@ static void grab_vram(struct umr_asic *asic)
> char name[256];
> FILE *f;
> unsigned long total, free, used;
> + unsigned long man_size, ram_usage, vis_usage;
>
> snprintf(name, sizeof(name)-1, "/sys/kernel/debug/dri/%d/amdgpu_vram_mm", asic->instance);
> f = fopen(name, "rb");
> @@ -650,47 +653,57 @@ static void grab_vram(struct umr_asic *asic)
> fseek(f, -128, SEEK_END); // skip to end of file
> memset(name, 0, sizeof name);
> while (fgets(name, sizeof(name)-1, f)) {
> - if (memcmp(name, "total:", 6) == 0) {
> - if (sscanf(name, "total: %lu, used %lu free %lu", &total, &used, &free) == 3)
> - printw("\nVRAM: %lu/%lu (MiB)\n", (used * 4096) / 1048576, (total * 4096) / 1048576);
> - break;
> - }
> + if (!memcmp(name, "total:", 6))
> + sscanf(name, "total: %lu, used %lu free %lu", &total, &used, &free);
> + else if (!memcmp(name, "man size:", 9))
> + sscanf(name, "man size:%lu pages, ram usage:%luMB, vis usage:%luMB",
> + &man_size, &ram_usage, &vis_usage);
> }
> fclose(f);
> +
> + printw("\nVRAM: %lu/%lu vis %lu/%llu (MiB)\n",
> + (used * 4096) / 1048576, (total * 4096) / 1048576,
> + vis_usage, visible_vram_size >> 20);
> }
> }
>
> static void analyze_drm_info(struct umr_asic *asic)
> {
> char region[256], name[256], line[256];
> - unsigned long old_pid, pid, id, size, tot_vram, tot_gtt;
> + unsigned long old_pid, pid, id, size, tot_vram, tot_gtt, tot_vis_vram;
> FILE *f;
> + unsigned long long vram_addr;
>
> snprintf(name, sizeof(name)-1, "/sys/kernel/debug/dri/%d/amdgpu_gem_info", asic->instance);
> f = fopen(name, "rb");
> if (f) {
> name[0] = 0;
> - old_pid = pid = tot_vram = tot_gtt = 0;
> + old_pid = pid = tot_vram = tot_gtt = tot_vis_vram = 0;
> while (fgets(line, sizeof(line)-1, f)) {
> if (sscanf(line, "pid %lu command %s:", &pid, region) == 2) {
> if (name[0]) {
> snprintf(line, sizeof(line)-1, "%s(%5lu)", name, old_pid);
> - printw(" %-30s: %10lu KiB VRAM, %10lu KiB GTT\n", line, tot_vram>>10, tot_gtt>>10);
> + printw(" %-30s: %10lu KiB VRAM, %10lu KiB vis VRAM, %10lu KiB GTT\n",
> + line, tot_vram>>10, tot_vis_vram>>10, tot_gtt>>10);
> }
> - tot_vram = tot_gtt = 0;
> + tot_vram = tot_gtt = tot_vis_vram = 0;
> old_pid = pid;
> strcpy(name, region);
> } else {
> - sscanf(line, "\t0x%08lx: %lu byte %s @", &id, &size, region);
> - if (!strcmp(region, "VRAM"))
> + sscanf(line, "\t0x%08lx: %lu byte %s @ %llx", &id, &size, region, &vram_addr);
> + if (!strcmp(region, "VRAM")) {
> tot_vram += size;
> + if (vram_addr < visible_vram_size>>12)
> + tot_vis_vram += size;
> + }
> else
> tot_gtt += size;
> }
> }
> if (name[0]) {
> snprintf(line, sizeof(line)-1, "%s(%5lu)", name, old_pid);
> - printw(" %-30s: %10lu KiB VRAM, %10lu KiB GTT\n", line, tot_vram>>10, tot_gtt>>10);
> + printw(" %-30s: %10lu KiB VRAM, %10lu KiB vis VRAM, %10lu KiB GTT\n",
> + line, tot_vram>>10, tot_vis_vram>>10, tot_gtt>>10);
> }
> fclose(f);
> }
> @@ -923,6 +936,21 @@ static void toggle_logger(void)
> }
> }
>
> +#define AMDGPU_INFO_VRAM_GTT 0x14
> +static uint64_t get_visible_vram_size(struct umr_asic *asic)
> +{
> + struct drm_amdgpu_info_vram_gtt {
> + uint64_t vram_size;
> + uint64_t vram_cpu_accessible_size;
> + uint64_t gtt_size;
> + } info;
> +
> + if (umr_query_drm(asic, AMDGPU_INFO_VRAM_GTT, &info, sizeof(info)))
> + return 0;
> +
> + return info.vram_cpu_accessible_size;
> +}
> +
> void umr_top(struct umr_asic *asic)
> {
> int i, j, k;
> @@ -967,6 +995,8 @@ void umr_top(struct umr_asic *asic)
> return;
> }
>
> + visible_vram_size = get_visible_vram_size(asic);
> +
> initscr();
> start_color();
> cbreak();
> diff --git a/src/lib/query_drm.c b/src/lib/query_drm.c
> index 755c65f..c92794b 100644
> --- a/src/lib/query_drm.c
> +++ b/src/lib/query_drm.c
> @@ -33,13 +33,13 @@
> #define DRM_IOCTL_BASE 'd'
> #define DRM_COMMAND_BASE 0x40
>
> -int umr_query_drm(struct umr_asic *asic, int field, uint64_t *ret)
> +int umr_query_drm(struct umr_asic *asic, int field, void *ret, int size)
> {
> struct drm_amdgpu_info inf;
>
> memset(&inf, 0, sizeof inf);
> inf.return_pointer = (uintptr_t)ret;
> - inf.return_size = sizeof(*ret);
> + inf.return_size = size;
> inf.query = field;
> return ioctl(asic->fd.drm, DRM_IOC(DRM_IOC_WRITE, DRM_IOCTL_BASE, DRM_COMMAND_BASE + DRM_AMDGPU_INFO, sizeof(inf)), &inf);
>
> diff --git a/src/umr.h b/src/umr.h
> index 4d63708..0a15c50 100644
> --- a/src/umr.h
> +++ b/src/umr.h
> @@ -456,7 +456,7 @@ struct umr_asic *umr_discover_asic_by_did(struct umr_options *options, long did)
> struct umr_asic *umr_discover_asic_by_name(struct umr_options *options, char *name);
> void umr_free_asic(struct umr_asic *asic);
> void umr_close_asic(struct umr_asic *asic); // call this to close a fully open asic
> -int umr_query_drm(struct umr_asic *asic, int field, uint64_t *ret);
> +int umr_query_drm(struct umr_asic *asic, int field, void *ret, int size);
> void umr_enumerate_devices(void);
> int umr_update(struct umr_asic *asic, char *script);
>
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>
_______________________________________________
amd-gfx mailing list
amd-gfx at lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list