Commit b130a699 authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'perf-urgent-for-mingo-4.14-20170912' of...

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

Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

- Fix TUI progress bar when delta from new total from that of the
  previous update is greater than the progress "step" (screen width
  progress bar block))  (Jiri Olsa)

- Make tools/lib/api make DEBUG=1 build use -D_FORTIFY_SOURCE=2 not
  to cripple debuginfo, just like tools/perf/ does (Jiri Olsa)

- Avoid leaking the 'perf.data' file to workloads started from the
  'perf record' command line by using the O_CLOEXEC open flag (Jiri Olsa)

- Fix building when libunwind's 'unwind.h' file is present in the
  include path, clashing with tools/perf/util/unwind.h (Milian Wolff)

- Check per .perfconfig section entry flag, not just per section (Taeung Song)

- Support running perf binaries with a dash in their name, needed to
  run perf as an AppImage (Milian Wolff)

- Wait for the right child by using waitpid() when running workloads
  from 'perf stat', also to fix using perf as an AppImage (Milian Wolff)
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 6d8ef53e dfc9eec7
...@@ -21,11 +21,14 @@ ...@@ -21,11 +21,14 @@
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
#define noinline __attribute__((noinline)) #define noinline __attribute__((noinline))
#ifndef __packed
#define __packed __attribute__((packed)) #define __packed __attribute__((packed))
#endif
#ifndef __noreturn
#define __noreturn __attribute__((noreturn)) #define __noreturn __attribute__((noreturn))
#endif
#ifndef __aligned
#define __aligned(x) __attribute__((aligned(x))) #define __aligned(x) __attribute__((aligned(x)))
#endif
#define __printf(a, b) __attribute__((format(printf, a, b))) #define __printf(a, b) __attribute__((format(printf, a, b)))
#define __scanf(a, b) __attribute__((format(scanf, a, b))) #define __scanf(a, b) __attribute__((format(scanf, a, b)))
...@@ -17,13 +17,19 @@ MAKEFLAGS += --no-print-directory ...@@ -17,13 +17,19 @@ MAKEFLAGS += --no-print-directory
LIBFILE = $(OUTPUT)libapi.a LIBFILE = $(OUTPUT)libapi.a
CFLAGS := $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) 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) ifeq ($(CC_NO_CLANG), 0)
CFLAGS += -O3 CFLAGS += -O3
else else
CFLAGS += -O6 CFLAGS += -O6
endif endif
endif
ifeq ($(DEBUG),0)
CFLAGS += -D_FORTIFY_SOURCE
endif
# Treat warnings as errors unless directed not to # Treat warnings as errors unless directed not to
ifneq ($(WERROR),0) ifneq ($(WERROR),0)
......
...@@ -59,7 +59,7 @@ static int set_config(struct perf_config_set *set, const char *file_name, ...@@ -59,7 +59,7 @@ static int set_config(struct perf_config_set *set, const char *file_name,
fprintf(fp, "[%s]\n", section->name); fprintf(fp, "[%s]\n", section->name);
perf_config_items__for_each_entry(&section->items, item) { 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; continue;
if (item->value) if (item->value)
fprintf(fp, "\t%s = %s\n", fprintf(fp, "\t%s = %s\n",
......
...@@ -707,7 +707,7 @@ static int __run_perf_stat(int argc, const char **argv) ...@@ -707,7 +707,7 @@ static int __run_perf_stat(int argc, const char **argv)
process_interval(); process_interval();
} }
} }
wait(&status); waitpid(child_pid, &status, 0);
if (workload_exec_errno) { if (workload_exec_errno) {
const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg)); const char *emsg = str_error_r(workload_exec_errno, msg, sizeof(msg));
......
...@@ -467,15 +467,21 @@ int main(int argc, const char **argv) ...@@ -467,15 +467,21 @@ int main(int argc, const char **argv)
* - cannot execute it externally (since it would just do * - cannot execute it externally (since it would just do
* the same thing over again) * the same thing over again)
* *
* So we just directly call the internal command handler, and * So we just directly call the internal command handler. If that one
* die if that one cannot handle it. * 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-")) { if (strstarts(cmd, "perf-")) {
cmd += 5; cmd += 5;
argv[0] = cmd; argv[0] = cmd;
handle_internal_command(argc, argv); 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")) { if (strstarts(cmd, "trace")) {
#ifdef HAVE_LIBAUDIT_SUPPORT #ifdef HAVE_LIBAUDIT_SUPPORT
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include "debug.h" #include "debug.h"
#include "machine.h" #include "machine.h"
#include "event.h" #include "event.h"
#include "unwind.h" #include "../util/unwind.h"
#include "perf_regs.h" #include "perf_regs.h"
#include "map.h" #include "map.h"
#include "thread.h" #include "thread.h"
......
#include <linux/kernel.h>
#include "../cache.h" #include "../cache.h"
#include "progress.h" #include "progress.h"
...@@ -14,10 +15,14 @@ struct ui_progress_ops *ui_progress__ops = &null_progress__ops; ...@@ -14,10 +15,14 @@ struct ui_progress_ops *ui_progress__ops = &null_progress__ops;
void ui_progress__update(struct ui_progress *p, u64 adv) void ui_progress__update(struct ui_progress *p, u64 adv)
{ {
u64 last = p->curr;
p->curr += adv; p->curr += adv;
if (p->curr >= p->next) { 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); ui_progress__ops->update(p);
} }
} }
...@@ -25,7 +30,7 @@ void ui_progress__update(struct ui_progress *p, u64 adv) ...@@ -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) void ui_progress__init(struct ui_progress *p, u64 total, const char *title)
{ {
p->curr = 0; p->curr = 0;
p->next = p->step = total / 16; p->next = p->step = total / 16 ?: 1;
p->total = total; p->total = total;
p->title = title; p->title = title;
......
...@@ -10,6 +10,16 @@ ...@@ -10,6 +10,16 @@
#include "util.h" #include "util.h"
#include "debug.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) static bool check_pipe(struct perf_data_file *file)
{ {
struct stat st; struct stat st;
...@@ -96,7 +106,8 @@ static int open_file_write(struct perf_data_file *file) ...@@ -96,7 +106,8 @@ static int open_file_write(struct perf_data_file *file)
if (check_backup(file)) if (check_backup(file))
return -1; 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) if (fd < 0)
pr_err("failed to open %s : %s\n", file->path, pr_err("failed to open %s : %s\n", file->path,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment