diff mbox

[v3,i-g-t,1/2] tools: intel_aubdump: pass configuration through file descriptor

Message ID 20161101181508.22698-1-lionel.g.landwerlin@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lionel Landwerlin Nov. 1, 2016, 6:15 p.m. UTC
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)

v3: Fix behavior change between bash 4.3 & 4.4 in <<< with \n characters
    (Lionel)

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

--
2.10.2

Comments

Gandikota, Sirisha Nov. 1, 2016, 9:41 p.m. UTC | #1
>-----Original Message-----

>From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of

>Lionel Landwerlin

>Sent: Tuesday, November 01, 2016 11:15 AM

>To: intel-gfx@lists.freedesktop.org

>Subject: [Intel-gfx] [PATCH v3 i-g-t 1/2] tools: intel_aubdump: pass configuration

>through file descriptor

>

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

>

>v3: Fix behavior change between bash 4.3 & 4.4 in <<< with \n characters

>    (Lionel)

>

>Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>

>---

> tools/aubdump.c        | 58 ++++++++++++++++++++++++++++++++++++------------

>--

> tools/intel_aubdump.in | 24 +++++++++++++++------

> 2 files changed, 59 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..18fd03b 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,13 @@ 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<<EOF

>+`echo -e $args`

>+EOF

>--

>2.10.2


 [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
diff mbox

Patch

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..18fd03b 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,13 @@  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<<EOF
+`echo -e $args`
+EOF