[PATCH umr] top vram add visible vram usage info

Tom St Denis tom.stdenis at amd.com
Tue Jul 11 11:34:03 UTC 2017


Hi Qiang,

Apologies I booted a 4.9 kernel I was testing and I guess it doesn't 
have the ioctl you're using to read visvram.

Booted into 4.11 it's working as expected.

I'll add my Rb and push it momentarily.

Cheers,
Tom

On 11/07/17 07:30 AM, Yu, Qiang wrote:
> 
>  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