All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times
@ 2016-10-06 15:16 Lionel Landwerlin
  2016-10-06 15:16 ` [PATCH i-g-t 2/3] tools: intel_aubdump: pass configuration through file descriptor Lionel Landwerlin
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Lionel Landwerlin @ 2016-10-06 15:16 UTC (permalink / raw)
  To: intel-gfx

For some reason init() seems to be called multiple times. Let's move the
initialization to the first ioctl().

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 tools/aubdump.c | 44 ++++++++++++++++++++++++++++----------------
 1 file changed, 28 insertions(+), 16 deletions(-)

diff --git a/tools/aubdump.c b/tools/aubdump.c
index 30dc742..a2ac7f1 100644
--- a/tools/aubdump.c
+++ b/tools/aubdump.c
@@ -426,6 +426,32 @@ close(int fd)
 	return libc_close(fd);
 }
 
+static void
+maybe_init(void)
+{
+	static bool initialized = false;
+	const char *args = getenv("INTEL_AUBDUMP_ARGS");
+
+	if (initialized)
+		return;
+
+	initialized = true;
+
+	if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
+		   &verbose, &filename, &device) != 3)
+		filename = strdup("intel.aub");
+	fail_if(filename == NULL, "intel_aubdump: out of memory\n");
+
+	if (device)
+		device_override = true;
+
+	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
+	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
+
+	file = fopen(filename, "w+");
+	fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n", filename);
+}
+
 int
 ioctl(int fd, unsigned long request, ...)
 {
@@ -447,6 +473,8 @@ ioctl(int fd, unsigned long request, ...)
 	}
 
 	if (fd == drm_fd) {
+		maybe_init();
+
 		switch (request) {
 		case DRM_IOCTL_I915_GETPARAM: {
 			struct drm_i915_getparam *getparam = argp;
@@ -550,26 +578,10 @@ ioctl(int fd, unsigned long request, ...)
 static void
 init(void)
 {
-	const char *args = getenv("INTEL_AUBDUMP_ARGS");
-
 	libc_close = dlsym(RTLD_NEXT, "close");
 	libc_ioctl = dlsym(RTLD_NEXT, "ioctl");
 	fail_if(libc_close == NULL || libc_ioctl == NULL,
 		"intel_aubdump: failed to get libc ioctl or close\n");
-
-	if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
-		   &verbose, &filename, &device) != 3)
-		filename = strdup("intel.aub");
-	fail_if(filename == NULL, "intel_aubdump: out of memory\n");
-
-	if (device)
-		device_override = true;
-
-	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
-	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
-
-	file = fopen(filename, "w+");
-	fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n", filename);
 }
 
 static int
-- 
2.9.3

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

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

* [PATCH i-g-t 2/3] tools: intel_aubdump: pass configuration through file descriptor
  2016-10-06 15:16 [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Lionel Landwerlin
@ 2016-10-06 15:16 ` Lionel Landwerlin
  2016-10-06 15:16 ` [PATCH v4 i-g-t 3/3] aubdump: add --command option to stream aubdump to another program Lionel Landwerlin
  2016-10-06 21:33 ` [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Gandikota, Sirisha
  2 siblings, 0 replies; 6+ messages in thread
From: Lionel Landwerlin @ 2016-10-06 15:16 UTC (permalink / raw)
  To: intel-gfx

This makes parsing options less complicated and easier to extend.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 tools/aubdump.c        | 32 ++++++++++++++++++++++----------
 tools/intel_aubdump.in | 22 +++++++++++++++-------
 2 files changed, 37 insertions(+), 17 deletions(-)

diff --git a/tools/aubdump.c b/tools/aubdump.c
index a2ac7f1..e82b514 100644
--- a/tools/aubdump.c
+++ b/tools/aubdump.c
@@ -430,26 +430,38 @@ static void
 maybe_init(void)
 {
 	static bool initialized = false;
-	const char *args = getenv("INTEL_AUBDUMP_ARGS");
+	FILE *config;
+	char *key, *value;
 
 	if (initialized)
 		return;
 
 	initialized = true;
 
-	if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
-		   &verbose, &filename, &device) != 3)
-		filename = strdup("intel.aub");
-	fail_if(filename == NULL, "intel_aubdump: out of memory\n");
+	config = fdopen(3, "r");
+	while (fscanf(config, "%m[^=]=%m[^\n]\n", &key, &value) != EOF) {
+		if (!strcmp(key, "verbose")) {
+			verbose = 1;
+		} else if (!strcmp(key, "device")) {
+			device = atoi(value);
+			device_override = true;
+		} else if (!strcmp(key, "file")) {
+			filename = value;
+			file = fopen(filename, "w+");
+			fail_if(file == NULL,
+				"intel_aubdump: failed to open file '%s'\n",
+				filename);
+		} else {
+			fprintf(stderr, "intel_aubdump: unknown option '%s'\n", key);
+		}
 
-	if (device)
-		device_override = true;
+		free(key);
+		free(value);
+	}
+	fclose(config);
 
 	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
 	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
-
-	file = fopen(filename, "w+");
-	fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n", filename);
 }
 
 int
diff --git a/tools/intel_aubdump.in b/tools/intel_aubdump.in
index feee23a..445b60f 100644
--- a/tools/intel_aubdump.in
+++ b/tools/intel_aubdump.in
@@ -21,29 +21,38 @@ EOF
     exit 0
 }
 
-verbose=0
-device=0
+args=""
+command=""
+file=""
+
+function add_arg() {
+    arg=$1
+    args="$args$arg\n"
+}
 
 while true; do
       case "$1" in
 	  -o)
 	      file=$2
+	      add_arg "file=${f:-$(basename ${f}).aub}"
 	      shift 2
 	      ;;
 	  -v)
-	      verbose=1
+	      add_arg "verbose=1"
 	      shift 1
 	      ;;
 	  -o*)
 	      file=${1##-o}
+	      add_arg "file=${file:-$(basename ${file}).aub}"
 	      shift
 	      ;;
 	  --output=*)
 	      file=${1##--output=}
+	      add_arg "file=${file:-$(basename ${file}).aub}"
 	      shift
 	      ;;
 	  --device=*)
-	      device=${1##--device=}
+	      add_arg "device=${1##--device=}"
 	      shift
 	      ;;
 	  --help)
@@ -66,12 +75,11 @@ done
 
 [ -z $1 ] && show_help
 
-file=${file:-$(basename $1).aub}
+[ -z $file ] && add_arg "file=intel.aub"
 
 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@
 
 LD_PRELOAD=${libdir}/intel_aubdump.so${LD_PPRELOAD:+:${LD_PRELOAD}} \
-	  INTEL_AUBDUMP_ARGS="verbose=$verbose;file=$file;device=$device" \
-	  exec -- "$@"
+	  exec -- "$@" 3<<< `printf '%b' "$args"`
-- 
2.9.3

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

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

* [PATCH v4 i-g-t 3/3] aubdump: add --command option to stream aubdump to another program
  2016-10-06 15:16 [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Lionel Landwerlin
  2016-10-06 15:16 ` [PATCH i-g-t 2/3] tools: intel_aubdump: pass configuration through file descriptor Lionel Landwerlin
@ 2016-10-06 15:16 ` Lionel Landwerlin
  2016-10-06 21:41   ` Gandikota, Sirisha
  2016-10-06 21:33 ` [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Gandikota, Sirisha
  2 siblings, 1 reply; 6+ messages in thread
From: Lionel Landwerlin @ 2016-10-06 15:16 UTC (permalink / raw)
  To: intel-gfx; +Cc: Sirisha Gandikota

This comes handy if you want to look at your application output without
having to save it into a file. For example, use this with aubinator from
Mesa :

$ intel_aubdump -c '/path/to/aubinator --gen=hsw' my_gl_app

v2: Fix handling empty command line option

v3: Fix command line concatenation (again...)

v4: Use execvp (Petri)
    Indentation (Petri)
    Allow recording to a file and stream to an external application (Lionel)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: Sirisha Gandikota <Sirisha.Gandikota@intel.com>
---
 tools/aubdump.c        | 81 ++++++++++++++++++++++++++++++++++++++++++++------
 tools/intel_aubdump.in | 26 +++++++++++++++-
 2 files changed, 97 insertions(+), 10 deletions(-)

diff --git a/tools/aubdump.c b/tools/aubdump.c
index e82b514..61aa83c 100644
--- a/tools/aubdump.c
+++ b/tools/aubdump.c
@@ -43,6 +43,10 @@
 #include "intel_aub.h"
 #include "intel_chipset.h"

+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
+#endif
+
 static int close_init_helper(int fd);
 static int ioctl_init_helper(int fd, unsigned long request, ...);

@@ -50,8 +54,8 @@ static int (*libc_close)(int fd) = close_init_helper;
 static int (*libc_ioctl)(int fd, unsigned long request, ...) = ioctl_init_helper;

 static int drm_fd = -1;
-static char *filename;
-static FILE *file;
+static char *filename = NULL;
+static FILE *files[2] = { NULL, NULL };
 static int gen = 0;
 static int verbose = 0;
 static const uint32_t gtt_size = 0x10000;
@@ -140,13 +144,28 @@ align_u64(uint64_t v, uint64_t a)
 static void
 dword_out(uint32_t data)
 {
-	fwrite(&data, 1, 4, file);
+	for (int i = 0; i < ARRAY_SIZE (files); i++) {
+		if (files[i] == NULL)
+			continue;
+
+		fail_if(fwrite(&data, 1, 4, files[i]) == 0,
+			"Writing to output failed\n");
+	}
 }

 static void
 data_out(const void *data, size_t size)
 {
-	fwrite(data, 1, size, file);
+	if (size == 0)
+		return;
+
+	for (int i = 0; i < ARRAY_SIZE (files); i++) {
+		if (files[i] == NULL)
+			continue;
+
+		fail_if(fwrite(data, 1, size, files[i]) == 0,
+			"Writing to output failed\n");
+	}
 }

 static void
@@ -393,7 +412,10 @@ dump_execbuffer2(int fd, struct drm_i915_gem_execbuffer2 *execbuffer2)
 	aub_dump_ringbuffer(batch_bo->offset + execbuffer2->batch_start_offset,
 			    offset, ring_flag);

-	fflush(file);
+	for (int i = 0; i < ARRAY_SIZE(files); i++) {
+		if (files[i] != NULL)
+			fflush(files[i]);
+	}
 }

 static void
@@ -426,6 +448,40 @@ close(int fd)
 	return libc_close(fd);
 }

+static FILE *
+launch_command(char *command)
+{
+	int i = 0, fds[2];
+	char **args = calloc(strlen(command), sizeof(char *));
+	char *iter = command;
+
+	args[i++] = iter = command;
+
+	while ((iter = strstr(iter, ",")) != NULL) {
+		*iter = '\0';
+		iter += 1;
+		args[i++] = iter;
+	}
+
+	if (pipe(fds) == -1)
+		return NULL;
+
+	switch (fork()) {
+	case 0:
+		dup2(fds[0], 0);
+		fail_if(execvp(args[0], args) == -1,
+			"intel_aubdump: failed to launch child command\n");
+		return NULL;
+
+	default:
+		free(args);
+		return fdopen(fds[1], "w");
+
+	case -1:
+		return NULL;
+	}
+}
+
 static void
 maybe_init(void)
 {
@@ -447,10 +503,15 @@ maybe_init(void)
 			device_override = true;
 		} else if (!strcmp(key, "file")) {
 			filename = value;
-			file = fopen(filename, "w+");
-			fail_if(file == NULL,
+			files[0] = fopen(filename, "w+");
+			fail_if(files[0] == NULL,
 				"intel_aubdump: failed to open file '%s'\n",
 				filename);
+		} else if (!strcmp(key,  "command")) {
+			files[1] = launch_command(value);
+			fail_if(files[1] == NULL,
+				"intel_aubdump: failed to launch command '%s'\n",
+				value);
 		} else {
 			fprintf(stderr, "intel_aubdump: unknown option '%s'\n", key);
 		}
@@ -621,7 +682,9 @@ static void __attribute__ ((destructor))
 fini(void)
 {
 	free(filename);
-	if (file)
-		fclose(file);
+	for (int i = 0; i < ARRAY_SIZE(files); i++) {
+		if (files[i] != NULL)
+			fclose(files[i]);
+	}
 	free(bos);
 }
diff --git a/tools/intel_aubdump.in b/tools/intel_aubdump.in
index 445b60f..a8e96d6 100644
--- a/tools/intel_aubdump.in
+++ b/tools/intel_aubdump.in
@@ -10,6 +10,9 @@ contents and execution of the GEM application.

   -o, --output=FILE  Name of AUB file. Defaults to COMMAND.aub

+  -c, --command=CMD  Execute CMD and write the AUB file's content to its
+                     standard input
+
       --device=ID    Override PCI ID of the reported device

   -v                 Enable verbose output
@@ -30,6 +33,17 @@ function add_arg() {
     args="$args$arg\n"
 }

+function build_command () {
+      command=""
+      for i in $1; do
+	  if [ -z $command ]; then
+	      command=$i
+	  else
+	      command="$command,$i"
+	  fi;
+      done
+}
+
 while true; do
       case "$1" in
 	  -o)
@@ -51,6 +65,16 @@ while true; do
 	      add_arg "file=${file:-$(basename ${file}).aub}"
 	      shift
 	      ;;
+	  -c)
+	      build_command "$2"
+	      add_arg "command=$command"
+	      shift 2
+	      ;;
+	  --command=*)
+	      build_command "${1##--command=}"
+	      add_arg "command=$command"
+	      shift
+	      ;;
 	  --device=*)
 	      add_arg "device=${1##--device=}"
 	      shift
@@ -75,7 +99,7 @@ done

 [ -z $1 ] && show_help

-[ -z $file ] && add_arg "file=intel.aub"
+[ -z $file ] && [ -z $command ] && add_arg "file=intel.aub"

 prefix=@prefix@
 exec_prefix=@exec_prefix@
--
2.9.3
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times
  2016-10-06 15:16 [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Lionel Landwerlin
  2016-10-06 15:16 ` [PATCH i-g-t 2/3] tools: intel_aubdump: pass configuration through file descriptor Lionel Landwerlin
  2016-10-06 15:16 ` [PATCH v4 i-g-t 3/3] aubdump: add --command option to stream aubdump to another program Lionel Landwerlin
@ 2016-10-06 21:33 ` Gandikota, Sirisha
  2016-10-07 10:00   ` [PATCH v2 i-g-t] tools: intel_aubdump: pass configuration through file descriptor Lionel Landwerlin
  2 siblings, 1 reply; 6+ messages in thread
From: Gandikota, Sirisha @ 2016-10-06 21:33 UTC (permalink / raw)
  To: Lionel Landwerlin, intel-gfx

>-----Original Message-----
>From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of
>Lionel Landwerlin
>Sent: Thursday, October 06, 2016 8:17 AM
>To: intel-gfx@lists.freedesktop.org
>Subject: [Intel-gfx] [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing
>multiple times
>
>For some reason init() seems to be called multiple times. Let's move the
>initialization to the first ioctl().
>
>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
>---
> tools/aubdump.c | 44 ++++++++++++++++++++++++++++----------------
> 1 file changed, 28 insertions(+), 16 deletions(-)
>
>diff --git a/tools/aubdump.c b/tools/aubdump.c index 30dc742..a2ac7f1 100644
>--- a/tools/aubdump.c
>+++ b/tools/aubdump.c
>@@ -426,6 +426,32 @@ close(int fd)
> 	return libc_close(fd);
> }
>
>+static void
>+maybe_init(void)
>+{
>+	static bool initialized = false;
>+	const char *args = getenv("INTEL_AUBDUMP_ARGS");
>+
>+	if (initialized)
>+		return;
>+
>+	initialized = true;
>+
>+	if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
>+		   &verbose, &filename, &device) != 3)
>+		filename = strdup("intel.aub");
>+	fail_if(filename == NULL, "intel_aubdump: out of memory\n");
>+
>+	if (device)
>+		device_override = true;
>+
>+	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
>+	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
>+
>+	file = fopen(filename, "w+");
>+	fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n",
>+filename); }
>+

[SG]  Since you are adding a new method anyway, I would combine patches 1 and 2 and send only 1 patch instead. Patch 2 is also working on the same new method with few additional changes. Additionally, please verify if intel_aubdump works with --device=<pccid> option. It failed for me for 0x1602 (bdw) but works without device option on system (hsw in my case).

> int
> ioctl(int fd, unsigned long request, ...)  { @@ -447,6 +473,8 @@ ioctl(int fd,
>unsigned long request, ...)
> 	}
>
> 	if (fd == drm_fd) {
>+		maybe_init();
>+
> 		switch (request) {
> 		case DRM_IOCTL_I915_GETPARAM: {
> 			struct drm_i915_getparam *getparam = argp; @@ -
>550,26 +578,10 @@ ioctl(int fd, unsigned long request, ...)  static void
> init(void)
> {
>-	const char *args = getenv("INTEL_AUBDUMP_ARGS");
>-
> 	libc_close = dlsym(RTLD_NEXT, "close");
> 	libc_ioctl = dlsym(RTLD_NEXT, "ioctl");
> 	fail_if(libc_close == NULL || libc_ioctl == NULL,
> 		"intel_aubdump: failed to get libc ioctl or close\n");
>-
>-	if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
>-		   &verbose, &filename, &device) != 3)
>-		filename = strdup("intel.aub");
>-	fail_if(filename == NULL, "intel_aubdump: out of memory\n");
>-
>-	if (device)
>-		device_override = true;
>-
>-	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
>-	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
>-
>-	file = fopen(filename, "w+");
>-	fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n",
>filename);
> }
>
> static int
>--
>2.9.3
>
>_______________________________________________
>Intel-gfx mailing list
>Intel-gfx@lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH v4 i-g-t 3/3] aubdump: add --command option to stream aubdump to another program
  2016-10-06 15:16 ` [PATCH v4 i-g-t 3/3] aubdump: add --command option to stream aubdump to another program Lionel Landwerlin
@ 2016-10-06 21:41   ` Gandikota, Sirisha
  0 siblings, 0 replies; 6+ messages in thread
From: Gandikota, Sirisha @ 2016-10-06 21:41 UTC (permalink / raw)
  To: Lionel Landwerlin, intel-gfx

>-----Original Message-----
>From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of
>Lionel Landwerlin
>Sent: Thursday, October 06, 2016 8:17 AM
>To: intel-gfx@lists.freedesktop.org
>Cc: Gandikota, Sirisha <sirisha.gandikota@intel.com>
>Subject: [Intel-gfx] [PATCH v4 i-g-t 3/3] aubdump: add --command option to
>stream aubdump to another program
>
>This comes handy if you want to look at your application output without having
>to save it into a file. For example, use this with aubinator from Mesa :
>
>$ intel_aubdump -c '/path/to/aubinator --gen=hsw' my_gl_app
>
>v2: Fix handling empty command line option
>
>v3: Fix command line concatenation (again...)
>
>v4: Use execvp (Petri)
>    Indentation (Petri)
>    Allow recording to a file and stream to an external application (Lionel)
>
>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
>Cc: Sirisha Gandikota <Sirisha.Gandikota@intel.com>
>---
> tools/aubdump.c        | 81
>++++++++++++++++++++++++++++++++++++++++++++------
> tools/intel_aubdump.in | 26 +++++++++++++++-
> 2 files changed, 97 insertions(+), 10 deletions(-)
>
>diff --git a/tools/aubdump.c b/tools/aubdump.c index e82b514..61aa83c 100644
>--- a/tools/aubdump.c
>+++ b/tools/aubdump.c
>@@ -43,6 +43,10 @@
> #include "intel_aub.h"
> #include "intel_chipset.h"
>
>+#ifndef ARRAY_SIZE
>+#define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) #endif
>+
> static int close_init_helper(int fd);
> static int ioctl_init_helper(int fd, unsigned long request, ...);
>
>@@ -50,8 +54,8 @@ static int (*libc_close)(int fd) = close_init_helper;  static int
>(*libc_ioctl)(int fd, unsigned long request, ...) = ioctl_init_helper;
>
> static int drm_fd = -1;
>-static char *filename;
>-static FILE *file;
>+static char *filename = NULL;
>+static FILE *files[2] = { NULL, NULL };
> static int gen = 0;
> static int verbose = 0;
> static const uint32_t gtt_size = 0x10000; @@ -140,13 +144,28 @@
>align_u64(uint64_t v, uint64_t a)  static void  dword_out(uint32_t data)  {
>-	fwrite(&data, 1, 4, file);
>+	for (int i = 0; i < ARRAY_SIZE (files); i++) {
>+		if (files[i] == NULL)
>+			continue;
>+
>+		fail_if(fwrite(&data, 1, 4, files[i]) == 0,
>+			"Writing to output failed\n");
>+	}
> }
>
> static void
> data_out(const void *data, size_t size)  {
>-	fwrite(data, 1, size, file);
>+	if (size == 0)
>+		return;
>+
>+	for (int i = 0; i < ARRAY_SIZE (files); i++) {
>+		if (files[i] == NULL)
>+			continue;
>+
>+		fail_if(fwrite(data, 1, size, files[i]) == 0,
>+			"Writing to output failed\n");
>+	}
> }
>
> static void
>@@ -393,7 +412,10 @@ dump_execbuffer2(int fd, struct
>drm_i915_gem_execbuffer2 *execbuffer2)
> 	aub_dump_ringbuffer(batch_bo->offset + execbuffer2-
>>batch_start_offset,
> 			    offset, ring_flag);
>
>-	fflush(file);
>+	for (int i = 0; i < ARRAY_SIZE(files); i++) {
>+		if (files[i] != NULL)
>+			fflush(files[i]);
>+	}
> }
>
> static void
>@@ -426,6 +448,40 @@ close(int fd)
> 	return libc_close(fd);
> }
>
>+static FILE *
>+launch_command(char *command)
>+{
>+	int i = 0, fds[2];
>+	char **args = calloc(strlen(command), sizeof(char *));
>+	char *iter = command;
>+
>+	args[i++] = iter = command;
>+
>+	while ((iter = strstr(iter, ",")) != NULL) {
>+		*iter = '\0';
>+		iter += 1;
>+		args[i++] = iter;
>+	}
>+
>+	if (pipe(fds) == -1)
>+		return NULL;
>+
>+	switch (fork()) {
>+	case 0:
>+		dup2(fds[0], 0);
>+		fail_if(execvp(args[0], args) == -1,
>+			"intel_aubdump: failed to launch child command\n");
>+		return NULL;
>+
>+	default:
>+		free(args);
>+		return fdopen(fds[1], "w");
>+
>+	case -1:
>+		return NULL;
>+	}
>+}
>+
> static void
> maybe_init(void)
> {
>@@ -447,10 +503,15 @@ maybe_init(void)
> 			device_override = true;
> 		} else if (!strcmp(key, "file")) {
> 			filename = value;
>-			file = fopen(filename, "w+");
>-			fail_if(file == NULL,
>+			files[0] = fopen(filename, "w+");
>+			fail_if(files[0] == NULL,
> 				"intel_aubdump: failed to open file '%s'\n",
> 				filename);
>+		} else if (!strcmp(key,  "command")) {
>+			files[1] = launch_command(value);
>+			fail_if(files[1] == NULL,
>+				"intel_aubdump: failed to launch command
>'%s'\n",
>+				value);
> 		} else {
> 			fprintf(stderr, "intel_aubdump: unknown option '%s'\n",
>key);
> 		}
>@@ -621,7 +682,9 @@ static void __attribute__ ((destructor))
> fini(void)
> {
> 	free(filename);
>-	if (file)
>-		fclose(file);
>+	for (int i = 0; i < ARRAY_SIZE(files); i++) {
>+		if (files[i] != NULL)
>+			fclose(files[i]);
>+	}
> 	free(bos);
> }
>diff --git a/tools/intel_aubdump.in b/tools/intel_aubdump.in index
>445b60f..a8e96d6 100644
>--- a/tools/intel_aubdump.in
>+++ b/tools/intel_aubdump.in
>@@ -10,6 +10,9 @@ contents and execution of the GEM application.
>
>   -o, --output=FILE  Name of AUB file. Defaults to COMMAND.aub
>
>+  -c, --command=CMD  Execute CMD and write the AUB file's content to its
>+                     standard input
>+
>       --device=ID    Override PCI ID of the reported device
>
>   -v                 Enable verbose output
>@@ -30,6 +33,17 @@ function add_arg() {
>     args="$args$arg\n"
> }
>
>+function build_command () {
>+      command=""
>+      for i in $1; do
>+	  if [ -z $command ]; then
>+	      command=$i
>+	  else
>+	      command="$command,$i"
>+	  fi;
>+      done
>+}
>+
> while true; do
>       case "$1" in
> 	  -o)
>@@ -51,6 +65,16 @@ while true; do
> 	      add_arg "file=${file:-$(basename ${file}).aub}"
> 	      shift
> 	      ;;
>+	  -c)
>+	      build_command "$2"
>+	      add_arg "command=$command"
>+	      shift 2
>+	      ;;
>+	  --command=*)
>+	      build_command "${1##--command=}"
>+	      add_arg "command=$command"
>+	      shift
>+	      ;;
> 	  --device=*)
> 	      add_arg "device=${1##--device=}"
> 	      shift
>@@ -75,7 +99,7 @@ done
>
> [ -z $1 ] && show_help
>
>-[ -z $file ] && add_arg "file=intel.aub"
>+[ -z $file ] && [ -z $command ] && add_arg "file=intel.aub"
>
> prefix=@prefix@
> exec_prefix=@exec_prefix@
>--
>2.9.3

 [SG]  Works for me.
Reviewed-by Sirisha Gandikota <sirisha.gandikota@intel.com>
>_______________________________________________
>Intel-gfx mailing list
>Intel-gfx@lists.freedesktop.org
>https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* [PATCH v2 i-g-t] tools: intel_aubdump: pass configuration through file descriptor
  2016-10-06 21:33 ` [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Gandikota, Sirisha
@ 2016-10-07 10:00   ` Lionel Landwerlin
  0 siblings, 0 replies; 6+ messages in thread
From: Lionel Landwerlin @ 2016-10-07 10:00 UTC (permalink / raw)
  To: intel-gfx

This makes parsing options less complicated and easier to extend.

v2: Fix device id parsing (atoi -> sscanf) (Sirisha)
    Combine with previous commit moving init function (Sirisha)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 tools/aubdump.c        | 58 ++++++++++++++++++++++++++++++++++++--------------
 tools/intel_aubdump.in | 22 +++++++++++++------
 2 files changed, 57 insertions(+), 23 deletions(-)

diff --git a/tools/aubdump.c b/tools/aubdump.c
index 30dc742..f2cd2c1 100644
--- a/tools/aubdump.c
+++ b/tools/aubdump.c
@@ -426,6 +426,46 @@ close(int fd)
 	return libc_close(fd);
 }

+static void
+maybe_init(void)
+{
+	static bool initialized = false;
+	FILE *config;
+	char *key, *value;
+
+	if (initialized)
+		return;
+
+	initialized = true;
+
+	config = fdopen(3, "r");
+	while (fscanf(config, "%m[^=]=%m[^\n]\n", &key, &value) != EOF) {
+		if (!strcmp(key, "verbose")) {
+			verbose = 1;
+		} else if (!strcmp(key, "device")) {
+			fail_if(sscanf(value, "%i", &device) != 1,
+				"intel_aubdump: failed to parse device id '%s'",
+				value);
+			device_override = true;
+		} else if (!strcmp(key, "file")) {
+			filename = value;
+			file = fopen(filename, "w+");
+			fail_if(file == NULL,
+				"intel_aubdump: failed to open file '%s'\n",
+				filename);
+		} else {
+			fprintf(stderr, "intel_aubdump: unknown option '%s'\n", key);
+		}
+
+		free(key);
+		free(value);
+	}
+	fclose(config);
+
+	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
+	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
+}
+
 int
 ioctl(int fd, unsigned long request, ...)
 {
@@ -447,6 +487,8 @@ ioctl(int fd, unsigned long request, ...)
 	}

 	if (fd == drm_fd) {
+		maybe_init();
+
 		switch (request) {
 		case DRM_IOCTL_I915_GETPARAM: {
 			struct drm_i915_getparam *getparam = argp;
@@ -550,26 +592,10 @@ ioctl(int fd, unsigned long request, ...)
 static void
 init(void)
 {
-	const char *args = getenv("INTEL_AUBDUMP_ARGS");
-
 	libc_close = dlsym(RTLD_NEXT, "close");
 	libc_ioctl = dlsym(RTLD_NEXT, "ioctl");
 	fail_if(libc_close == NULL || libc_ioctl == NULL,
 		"intel_aubdump: failed to get libc ioctl or close\n");
-
-	if (sscanf(args, "verbose=%d;file=%m[^;];device=%i",
-		   &verbose, &filename, &device) != 3)
-		filename = strdup("intel.aub");
-	fail_if(filename == NULL, "intel_aubdump: out of memory\n");
-
-	if (device)
-		device_override = true;
-
-	bos = malloc(MAX_BO_COUNT * sizeof(bos[0]));
-	fail_if(bos == NULL, "intel_aubdump: out of memory\n");
-
-	file = fopen(filename, "w+");
-	fail_if(file == NULL, "intel_aubdump: failed to open file '%s'\n", filename);
 }

 static int
diff --git a/tools/intel_aubdump.in b/tools/intel_aubdump.in
index feee23a..445b60f 100644
--- a/tools/intel_aubdump.in
+++ b/tools/intel_aubdump.in
@@ -21,29 +21,38 @@ EOF
     exit 0
 }

-verbose=0
-device=0
+args=""
+command=""
+file=""
+
+function add_arg() {
+    arg=$1
+    args="$args$arg\n"
+}

 while true; do
       case "$1" in
 	  -o)
 	      file=$2
+	      add_arg "file=${f:-$(basename ${f}).aub}"
 	      shift 2
 	      ;;
 	  -v)
-	      verbose=1
+	      add_arg "verbose=1"
 	      shift 1
 	      ;;
 	  -o*)
 	      file=${1##-o}
+	      add_arg "file=${file:-$(basename ${file}).aub}"
 	      shift
 	      ;;
 	  --output=*)
 	      file=${1##--output=}
+	      add_arg "file=${file:-$(basename ${file}).aub}"
 	      shift
 	      ;;
 	  --device=*)
-	      device=${1##--device=}
+	      add_arg "device=${1##--device=}"
 	      shift
 	      ;;
 	  --help)
@@ -66,12 +75,11 @@ done

 [ -z $1 ] && show_help

-file=${file:-$(basename $1).aub}
+[ -z $file ] && add_arg "file=intel.aub"

 prefix=@prefix@
 exec_prefix=@exec_prefix@
 libdir=@libdir@

 LD_PRELOAD=${libdir}/intel_aubdump.so${LD_PPRELOAD:+:${LD_PRELOAD}} \
-	  INTEL_AUBDUMP_ARGS="verbose=$verbose;file=$file;device=$device" \
-	  exec -- "$@"
+	  exec -- "$@" 3<<< `printf '%b' "$args"`
--
2.9.3
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

end of thread, other threads:[~2016-10-07 10:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-06 15:16 [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Lionel Landwerlin
2016-10-06 15:16 ` [PATCH i-g-t 2/3] tools: intel_aubdump: pass configuration through file descriptor Lionel Landwerlin
2016-10-06 15:16 ` [PATCH v4 i-g-t 3/3] aubdump: add --command option to stream aubdump to another program Lionel Landwerlin
2016-10-06 21:41   ` Gandikota, Sirisha
2016-10-06 21:33 ` [PATCH i-g-t 1/3] tools: intel_aubdump: avoid initializing multiple times Gandikota, Sirisha
2016-10-07 10:00   ` [PATCH v2 i-g-t] tools: intel_aubdump: pass configuration through file descriptor Lionel Landwerlin

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.