From patchwork Wed Oct 5 22:48:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lionel Landwerlin X-Patchwork-Id: 9363549 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 086666075E for ; Wed, 5 Oct 2016 22:48:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DD51B286A9 for ; Wed, 5 Oct 2016 22:48:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D1A8028D20; Wed, 5 Oct 2016 22:48:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 69290286A9 for ; Wed, 5 Oct 2016 22:48:37 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0114F6E256; Wed, 5 Oct 2016 22:48:36 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 002746E256 for ; Wed, 5 Oct 2016 22:48:33 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id b201so772723wmb.1 for ; Wed, 05 Oct 2016 15:48:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=4EirJlAaED4lw+8xEWifs+Op6fizHe+2I0L8fbyL3eE=; b=uaP+S4DGXxHsi/JhRws8Psy/CPWW93tYIpEnCKpZMaUtziSlEdwFNGYDX9V2vGcs82 Fa0O2GbZkxgYEWRwCDH4ElmvCG504YtYNbxxhpJ0rphWh7rD0Be8t0W7lSFHgwiWuaoE LDa20Lv/8LLGxE7LVfXDibq/+LvZ+rJNacyxxgGm+9bqlc8qEoasyHJRgrFjmk/eLl5i 0aekCPUwPsNMIW8WymZjOaubHa8WL1hSjbxZ9BQQ0zYG4Vp7mroUn9nwzlnYaPKf949f N0eX2cd9oIfP9KJ8OvHgcMMbNq6MBvJheFLQ4RX+Jp+57dj5AKWZYLwf00KZHPEkSoOL nhzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=4EirJlAaED4lw+8xEWifs+Op6fizHe+2I0L8fbyL3eE=; b=GQvqNBpvgOcsPnIbBN998GQTulzKHSZk8afBOHT+vgMJr9AK7uw3+SCPsCNLP0b2/1 VDTCjrch23Z4Obd3Zvh5pMr30VsUAjU87nZy4ZVTFkFArH0WHaRB674vSe6GmbH3q6zO BUVPD97+gePjQb7uoWnccwGXtqHXFQQLqxOopT1Y1lczy3PDDiDhPEwbAw87LrUF82xi wY+SkCas5mRQd9dQbYLkVE2AJi2ACMor6ijbvsqZysW3aV0C8FW0Hjgf08B8hiPyDBff eD8tV0DAraahY7U1kfWI32Dqyj4Z+S4c2Mb8gNi/I/aYTQ6uDBzQ6nHGFOd02ks/Y4mB DZ2g== X-Gm-Message-State: AA6/9RkDxUofaL3/fbSf2WKoJf0Gv+cwIbK3f2se71jDBf3AcMWAZzIHYQCPbLPnGrCpLw== X-Received: by 10.28.52.2 with SMTP id b2mr11574835wma.72.1475707712397; Wed, 05 Oct 2016 15:48:32 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:417:1600:d2e1:40ff:fe8b:5c1a]) by smtp.googlemail.com with ESMTPSA id w138sm33822469wmd.1.2016.10.05.15.48.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Oct 2016 15:48:31 -0700 (PDT) From: Lionel Landwerlin X-Google-Original-From: Lionel Landwerlin To: intel-gfx@lists.freedesktop.org Date: Wed, 5 Oct 2016 23:48:27 +0100 Message-Id: <20161005224827.14000-2-lionel.g.landwerlin@intel.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20161005224827.14000-1-lionel.g.landwerlin@intel.com> References: <20161004142111.20370-1-lionel.g.landwerlin@intel.com> <20161005224827.14000-1-lionel.g.landwerlin@intel.com> Cc: Sirisha Gandikota Subject: [Intel-gfx] [PATCH v2 i-g-t 2/2] aubdump: add --command option to stream aubdump to another program X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP 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 Signed-off-by: Lionel Landwerlin Cc: Sirisha Gandikota Reviewed-by: Petri Latvala --- tools/aubdump.c | 107 ++++++++++++++++++++++++++++++++++++++++--------- tools/intel_aubdump.in | 31 +++++++++++++- 2 files changed, 117 insertions(+), 21 deletions(-) -- 2.9.3 diff --git a/tools/aubdump.c b/tools/aubdump.c index 30dc742..3b85bc7 100644 --- a/tools/aubdump.c +++ b/tools/aubdump.c @@ -50,6 +50,7 @@ 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 *command; static char *filename; static FILE *file; static int gen = 0; @@ -113,6 +114,82 @@ fail_if(int cond, const char *format, ...) raise(SIGTRAP); } +static FILE * +launch_command(void) +{ + 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(execv(args[0], args) == -1, + "intel_aubdump: fail to launch child command\n"); + return NULL; + + default: + free(args); + return fdopen(fds[1], "w"); + + case -1: + return NULL; + } +} + +static void +maybe_init_output(void) +{ + const char *args; + static bool initialized = false; + int nb_args; + + if (initialized) + return; + + args = getenv("INTEL_AUBDUMP_ARGS"); + + nb_args = sscanf(args, "verbose=%d;file=%m[^;];device=%i;command=%m[^;];", + &verbose, &filename, &device, &command); + if (nb_args != 4) { + if (filename) + free(filename); + nb_args = sscanf(args, "verbose=%d;file=%m[^;];device=%i;", + &verbose, &filename, &device); + command = strdup(""); + } + fail_if(filename == NULL || command == 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"); + + if (strlen(command) != 0) { + file = launch_command(); + fail_if(file == NULL, + "intel_aubdump: failed to launch command '%s'\n", command); + } else { + file = fopen(filename, "w+"); + fail_if(file == NULL, + "intel_aubdump: failed to open file '%s'\n", filename); + } + + initialized = true; +} + static struct bo * get_bo(uint32_t handle) { @@ -140,13 +217,18 @@ align_u64(uint64_t v, uint64_t a) static void dword_out(uint32_t data) { - fwrite(&data, 1, 4, file); + fail_if(fwrite(&data, 1, 4, file) == 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; + + fail_if(fwrite(data, 1, size, file) == 0, + "Writing to output failed\n"); } static void @@ -447,6 +529,8 @@ ioctl(int fd, unsigned long request, ...) } if (fd == drm_fd) { + maybe_init_output(); + switch (request) { case DRM_IOCTL_I915_GETPARAM: { struct drm_i915_getparam *getparam = argp; @@ -550,26 +634,8 @@ 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 @@ -596,6 +662,7 @@ ioctl_init_helper(int fd, unsigned long request, ...) static void __attribute__ ((destructor)) fini(void) { + free(command); free(filename); if (file) fclose(file); diff --git a/tools/intel_aubdump.in b/tools/intel_aubdump.in index 3666b6e..2a1704c 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 @@ -23,6 +26,19 @@ EOF verbose=0 device=0 +file="intel.aub" +command="" + +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 @@ -38,6 +54,14 @@ while true; do file=${1##--output=} shift ;; + -c) + build_command "$2" + shift 2 + ;; + --command=*) + build_command "${1##--command=}" + shift + ;; --device=*) device=${1##--device=} shift @@ -68,6 +92,11 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ +ARGS="verbose=$verbose;file=$file;device=$device" +if [ ! -z $command ]; then + ARGS="$INTEL_AUBDUMP_ARGS;command=$command;" +fi + LD_PRELOAD=${libdir}/intel_aubdump.so${LD_PPRELOAD:+:${LD_PRELOAD}} \ - INTEL_AUBDUMP_ARGS="verbose=$verbose;file=$file;device=$device" \ + INTEL_AUBDUMP_ARGS="$ARGS" \ exec -- "$@"