* [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.