All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH umr] top vram add visible vram usage info
@ 2017-07-06  6:32 Qiang Yu
       [not found] ` <1499322740-9421-1-git-send-email-Qiang.Yu-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Qiang Yu @ 2017-07-06  6:32 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW; +Cc: Qiang Yu

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

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH umr] top vram add visible vram usage info
       [not found] ` <1499322740-9421-1-git-send-email-Qiang.Yu-5C7GfCeVMHo@public.gmane.org>
@ 2017-07-11  2:07   ` Yu, Qiang
       [not found]     ` <CY4PR1201MB0117D921D8C47640BB0043298FAE0-1iTaO6aE1DAP/tBwSbHU42rFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Yu, Qiang @ 2017-07-11  2:07 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, StDenis, Tom

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

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH umr] top vram add visible vram usage info
       [not found]     ` <CY4PR1201MB0117D921D8C47640BB0043298FAE0-1iTaO6aE1DAP/tBwSbHU42rFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
@ 2017-07-11  2:10       ` StDenis, Tom
       [not found]         ` <DM5PR1201MB00747B6698E4562693F69383F7AE0-grEf7a3NxMAwZliakWjjqGrFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: StDenis, Tom @ 2017-07-11  2:10 UTC (permalink / raw)
  To: Yu, Qiang, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

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

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH umr] top vram add visible vram usage info
       [not found]         ` <DM5PR1201MB00747B6698E4562693F69383F7AE0-grEf7a3NxMAwZliakWjjqGrFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
@ 2017-07-11 10:50           ` Tom St Denis
       [not found]             ` <db33dc2e-6c0d-aaf0-5c9b-3776a0e06288-5C7GfCeVMHo@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Tom St Denis @ 2017-07-11 10:50 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH umr] top vram add visible vram usage info
       [not found]             ` <db33dc2e-6c0d-aaf0-5c9b-3776a0e06288-5C7GfCeVMHo@public.gmane.org>
@ 2017-07-11 11:30               ` Yu, Qiang
       [not found]                 ` <CY4PR1201MB01177820C86DD239CD9D8A508FAE0-1iTaO6aE1DAP/tBwSbHU42rFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Yu, Qiang @ 2017-07-11 11:30 UTC (permalink / raw)
  To: StDenis, Tom, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


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
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH umr] top vram add visible vram usage info
       [not found]                 ` <CY4PR1201MB01177820C86DD239CD9D8A508FAE0-1iTaO6aE1DAP/tBwSbHU42rFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
@ 2017-07-11 11:34                   ` Tom St Denis
  0 siblings, 0 replies; 6+ messages in thread
From: Tom St Denis @ 2017-07-11 11:34 UTC (permalink / raw)
  To: Yu, Qiang, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

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

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-07-11 11:34 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-06  6:32 [PATCH umr] top vram add visible vram usage info Qiang Yu
     [not found] ` <1499322740-9421-1-git-send-email-Qiang.Yu-5C7GfCeVMHo@public.gmane.org>
2017-07-11  2:07   ` Yu, Qiang
     [not found]     ` <CY4PR1201MB0117D921D8C47640BB0043298FAE0-1iTaO6aE1DAP/tBwSbHU42rFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
2017-07-11  2:10       ` StDenis, Tom
     [not found]         ` <DM5PR1201MB00747B6698E4562693F69383F7AE0-grEf7a3NxMAwZliakWjjqGrFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
2017-07-11 10:50           ` Tom St Denis
     [not found]             ` <db33dc2e-6c0d-aaf0-5c9b-3776a0e06288-5C7GfCeVMHo@public.gmane.org>
2017-07-11 11:30               ` Yu, Qiang
     [not found]                 ` <CY4PR1201MB01177820C86DD239CD9D8A508FAE0-1iTaO6aE1DAP/tBwSbHU42rFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
2017-07-11 11:34                   ` Tom St Denis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.