[umr] top vram add visible vram usage info

Submitted by StDenis, Tom on July 11, 2017, 2:10 a.m.

Details

Message ID DM5PR1201MB00747B6698E4562693F69383F7AE0@DM5PR1201MB0074.namprd12.prod.outlook.com
State New
Headers show
Series "top vram add visible vram usage info" ( rev: 2 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

StDenis, Tom July 11, 2017, 2:10 a.m.
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

Patch hide | download patch | download mbox

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);


Comments

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@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@amd.com>
> Sent: Thursday, July 6, 2017 2:32:20 PM
> To: amd-gfx@lists.freedesktop.org
> Cc: Yu, Qiang
> Subject: [PATCH umr] top vram add visible vram usage info
> 
> Signed-off-by: Qiang Yu <Qiang.Yu@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@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>
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
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@lists.freedesktop.org> on behalf of Tom 
> St Denis <tom.stdenis@amd.com>
> Sent: Tuesday, July 11, 2017 6:50:46 PM
> To: amd-gfx@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@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@amd.com>
>> Sent: Thursday, July 6, 2017 2:32:20 PM
>> To: amd-gfx@lists.freedesktop.org
>> Cc: Yu, Qiang
>> Subject: [PATCH umr] top vram add visible vram usage info
>>
>> Signed-off-by: Qiang Yu <Qiang.Yu@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@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>>
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx