[Mesa-dev] [PATCH 10/10] radeonsi/gfx9: add VM fault dmesg parser support

Marek Olšák maraeo at gmail.com
Mon Jul 10 21:21:45 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_debug.c | 29 +++++++++++++++++++++++------
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c
index 0d26ce5..06dea61 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -859,21 +859,21 @@ static void si_dump_dma(struct si_context *sctx,
 	for (i = 0; i < saved->num_dw; ++i) {
 		fprintf(f, " %08x\n", saved->ib[i]);
 	}
 
 	fprintf(f, "------------------- %s end -------------------\n", ib_name);
 	fprintf(f, "\n");
 
 	fprintf(f, "SDMA Dump Done.\n");
 }
 
-static bool si_vm_fault_occured(struct si_context *sctx, uint32_t *out_addr)
+static bool si_vm_fault_occured(struct si_context *sctx, uint64_t *out_addr)
 {
 	char line[2000];
 	unsigned sec, usec;
 	int progress = 0;
 	uint64_t timestamp = 0;
 	bool fault = false;
 
 	FILE *p = popen("dmesg", "r");
 	if (!p)
 		return false;
@@ -914,32 +914,49 @@ static bool si_vm_fault_occured(struct si_context *sctx, uint32_t *out_addr)
 			line[len-1] = 0;
 
 		/* Get the message part. */
 		msg = strchr(line, ']');
 		if (!msg) {
 			assert(0);
 			continue;
 		}
 		msg++;
 
+		const char *header_line, *addr_line_prefix, *addr_line_format;
+
+		if (sctx->b.chip_class >= GFX9) {
+			/* Match this:
+			 * ..: [gfxhub] VMC page fault (src_id:0 ring:158 vm_id:2 pas_id:0)
+			 * ..:   at page 0x0000000219f8f000 from 27
+			 * ..: VM_L2_PROTECTION_FAULT_STATUS:0x0020113C
+			 */
+			header_line = "VMC page fault";
+			addr_line_prefix = "   at page";
+			addr_line_format = "%"PRIx64;
+		} else {
+			header_line = "GPU fault detected:";
+			addr_line_prefix = "VM_CONTEXT1_PROTECTION_FAULT_ADDR";
+			addr_line_format = "%"PRIX64;
+		}
+
 		switch (progress) {
 		case 0:
-			if (strstr(msg, "GPU fault detected:"))
+			if (strstr(msg, header_line))
 				progress = 1;
 			break;
 		case 1:
-			msg = strstr(msg, "VM_CONTEXT1_PROTECTION_FAULT_ADDR");
+			msg = strstr(msg, addr_line_prefix);
 			if (msg) {
 				msg = strstr(msg, "0x");
 				if (msg) {
 					msg += 2;
-					if (sscanf(msg, "%X", out_addr) == 1)
+					if (sscanf(msg, addr_line_format, out_addr) == 1)
 						fault = true;
 				}
 			}
 			progress = 0;
 			break;
 		default:
 			progress = 0;
 		}
 	}
 	pclose(p);
@@ -948,37 +965,37 @@ static bool si_vm_fault_occured(struct si_context *sctx, uint32_t *out_addr)
 		sctx->dmesg_timestamp = timestamp;
 	return fault;
 }
 
 void si_check_vm_faults(struct r600_common_context *ctx,
 			struct radeon_saved_cs *saved, enum ring_type ring)
 {
 	struct si_context *sctx = (struct si_context *)ctx;
 	struct pipe_screen *screen = sctx->b.b.screen;
 	FILE *f;
-	uint32_t addr;
+	uint64_t addr;
 	char cmd_line[4096];
 
 	if (!si_vm_fault_occured(sctx, &addr))
 		return;
 
 	f = dd_get_debug_file(false);
 	if (!f)
 		return;
 
 	fprintf(f, "VM fault report.\n\n");
 	if (os_get_command_line(cmd_line, sizeof(cmd_line)))
 		fprintf(f, "Command: %s\n", cmd_line);
 	fprintf(f, "Driver vendor: %s\n", screen->get_vendor(screen));
 	fprintf(f, "Device vendor: %s\n", screen->get_device_vendor(screen));
 	fprintf(f, "Device name: %s\n\n", screen->get_name(screen));
-	fprintf(f, "Failing VM page: 0x%08x\n\n", addr);
+	fprintf(f, "Failing VM page: 0x%08"PRIx64"\n\n", addr);
 
 	if (sctx->apitrace_call_number)
 		fprintf(f, "Last apitrace call: %u\n\n",
 			sctx->apitrace_call_number);
 
 	switch (ring) {
 	case RING_GFX:
 		si_dump_debug_state(&sctx->b.b, f,
 				    PIPE_DUMP_CURRENT_STATES |
 				    PIPE_DUMP_CURRENT_SHADERS |
-- 
2.7.4



More information about the mesa-dev mailing list