Linus,

Please pull the latest perf-urgent-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 
perf-urgent-for-linus

   # HEAD: b130a699c07155a1d6ef7d971a5f3bf0e3818d5a Merge tag 
'perf-urgent-for-mingo-4.14-20170912' of 
git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent

A handful of tooling fixes.

 Thanks,

        Ingo

------------------>
Arnaldo Carvalho de Melo (1):
      tools include linux: Guard against redefinition of some macros

Jiri Olsa (4):
      tools lib api: Fix make DEBUG=1 build
      perf tools: Open perf.data with O_CLOEXEC flag
      perf ui progress: Make sure we always define step value
      perf ui progress: Fix progress update

Milian Wolff (3):
      perf tests: Fix compile when libunwind's unwind.h is available
      perf tools: Support running perf binaries with a dash in their name
      perf stat: Wait for the correct child

Taeung Song (1):
      perf config: Check not only section->from_system_config but also item's


 tools/include/linux/compiler-gcc.h |  9 ++++++---
 tools/lib/api/Makefile             |  8 +++++++-
 tools/perf/builtin-config.c        |  2 +-
 tools/perf/builtin-stat.c          |  2 +-
 tools/perf/perf.c                  | 14 ++++++++++----
 tools/perf/tests/dwarf-unwind.c    |  2 +-
 tools/perf/ui/progress.c           |  9 +++++++--
 tools/perf/util/data.c             | 13 ++++++++++++-
 8 files changed, 45 insertions(+), 14 deletions(-)

diff --git a/tools/include/linux/compiler-gcc.h 
b/tools/include/linux/compiler-gcc.h
index bd39b2090ad1..3723b9f8f964 100644
--- a/tools/include/linux/compiler-gcc.h
+++ b/tools/include/linux/compiler-gcc.h
@@ -21,11 +21,14 @@
 #define __must_be_array(a)     BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
 
 #define  noinline      __attribute__((noinline))
-
+#ifndef __packed
 #define __packed       __attribute__((packed))
-
+#endif
+#ifndef __noreturn
 #define __noreturn     __attribute__((noreturn))
-
+#endif
+#ifndef __aligned
 #define __aligned(x)   __attribute__((aligned(x)))
+#endif
 #define __printf(a, b) __attribute__((format(printf, a, b)))
 #define __scanf(a, b)  __attribute__((format(scanf, a, b)))
diff --git a/tools/lib/api/Makefile b/tools/lib/api/Makefile
index 4563ba7ede6f..1e83e3c07448 100644
--- a/tools/lib/api/Makefile
+++ b/tools/lib/api/Makefile
@@ -17,13 +17,19 @@ MAKEFLAGS += --no-print-directory
 LIBFILE = $(OUTPUT)libapi.a
 
 CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
-CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE 
-D_FORTIFY_SOURCE=2 -fPIC
+CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 -U_FORTIFY_SOURCE -fPIC
 
+ifeq ($(DEBUG),0)
 ifeq ($(CC_NO_CLANG), 0)
   CFLAGS += -O3
 else
   CFLAGS += -O6
 endif
+endif
+
+ifeq ($(DEBUG),0)
+  CFLAGS += -D_FORTIFY_SOURCE
+endif
 
 # Treat warnings as errors unless directed not to
 ifneq ($(WERROR),0)
diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index 3ddcc6e2abeb..a1d82e33282c 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -59,7 +59,7 @@ static int set_config(struct perf_config_set *set, const char 
*file_name,
                fprintf(fp, "[%s]\n", section->name);
 
                perf_config_items__for_each_entry(&section->items, item) {
-                       if (!use_system_config && section->from_system_config)
+                       if (!use_system_config && item->from_system_config)
                                continue;
                        if (item->value)
                                fprintf(fp, "\t%s = %s\n",
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 85e992d9215b..69523ed55894 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -707,7 +707,7 @@ static int __run_perf_stat(int argc, const char **argv)
                                process_interval();
                        }
                }
-               wait(&status);
+               waitpid(child_pid, &status, 0);
 
                if (workload_exec_errno) {
                        const char *emsg = str_error_r(workload_exec_errno, 
msg, sizeof(msg));
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index e0279babe0c0..2f19e03c5c40 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -467,15 +467,21 @@ int main(int argc, const char **argv)
         *  - cannot execute it externally (since it would just do
         *    the same thing over again)
         *
-        * So we just directly call the internal command handler, and
-        * die if that one cannot handle it.
+        * So we just directly call the internal command handler. If that one
+        * fails to handle this, then maybe we just run a renamed perf binary
+        * that contains a dash in its name. To handle this scenario, we just
+        * fall through and ignore the "xxxx" part of the command string.
         */
        if (strstarts(cmd, "perf-")) {
                cmd += 5;
                argv[0] = cmd;
                handle_internal_command(argc, argv);
-               fprintf(stderr, "cannot handle %s internally", cmd);
-               goto out;
+               /*
+                * If the command is handled, the above function does not
+                * return undo changes and fall through in such a case.
+                */
+               cmd -= 5;
+               argv[0] = cmd;
        }
        if (strstarts(cmd, "trace")) {
 #ifdef HAVE_LIBAUDIT_SUPPORT
diff --git a/tools/perf/tests/dwarf-unwind.c b/tools/perf/tests/dwarf-unwind.c
index 2a7b9b47bbcb..9ba1d216a89f 100644
--- a/tools/perf/tests/dwarf-unwind.c
+++ b/tools/perf/tests/dwarf-unwind.c
@@ -6,7 +6,7 @@
 #include "debug.h"
 #include "machine.h"
 #include "event.h"
-#include "unwind.h"
+#include "../util/unwind.h"
 #include "perf_regs.h"
 #include "map.h"
 #include "thread.h"
diff --git a/tools/perf/ui/progress.c b/tools/perf/ui/progress.c
index a0f24c7115c5..ae91c8148edf 100644
--- a/tools/perf/ui/progress.c
+++ b/tools/perf/ui/progress.c
@@ -1,3 +1,4 @@
+#include <linux/kernel.h>
 #include "../cache.h"
 #include "progress.h"
 
@@ -14,10 +15,14 @@ struct ui_progress_ops *ui_progress__ops = 
&null_progress__ops;
 
 void ui_progress__update(struct ui_progress *p, u64 adv)
 {
+       u64 last = p->curr;
+
        p->curr += adv;
 
        if (p->curr >= p->next) {
-               p->next += p->step;
+               u64 nr = DIV_ROUND_UP(p->curr - last, p->step);
+
+               p->next += nr * p->step;
                ui_progress__ops->update(p);
        }
 }
@@ -25,7 +30,7 @@ void ui_progress__update(struct ui_progress *p, u64 adv)
 void ui_progress__init(struct ui_progress *p, u64 total, const char *title)
 {
        p->curr = 0;
-       p->next = p->step = total / 16;
+       p->next = p->step = total / 16 ?: 1;
        p->total = total;
        p->title = title;
 
diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c
index e84bbc8ec058..263f5a906ba5 100644
--- a/tools/perf/util/data.c
+++ b/tools/perf/util/data.c
@@ -10,6 +10,16 @@
 #include "util.h"
 #include "debug.h"
 
+#ifndef O_CLOEXEC
+#ifdef __sparc__
+#define O_CLOEXEC      0x400000
+#elif defined(__alpha__) || defined(__hppa__)
+#define O_CLOEXEC      010000000
+#else
+#define O_CLOEXEC      02000000
+#endif
+#endif
+
 static bool check_pipe(struct perf_data_file *file)
 {
        struct stat st;
@@ -96,7 +106,8 @@ static int open_file_write(struct perf_data_file *file)
        if (check_backup(file))
                return -1;
 
-       fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC, S_IRUSR|S_IWUSR);
+       fd = open(file->path, O_CREAT|O_RDWR|O_TRUNC|O_CLOEXEC,
+                 S_IRUSR|S_IWUSR);
 
        if (fd < 0)
                pr_err("failed to open %s : %s\n", file->path,

Reply via email to