Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull perf fixes from Ingo Molnar:
 "A handful of tooling fixes, two PMU driver fixes and a cleanup of
  redundant code that addresses a security analyzer false positive"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/core: Remove a redundant check
  perf/x86/intel/uncore: Remove SBOX support for Broadwell server
  perf ctf: Convert invalid chars in a string before set value
  perf record: Fix crash when kptr is restricted
  perf symbols: Check kptr_restrict for root
  perf/x86/intel/rapl: Fix pmus free during cleanup
This commit is contained in:
Linus Torvalds 2016-06-10 11:15:41 -07:00
commit 7fcbc230c6
6 changed files with 52 additions and 36 deletions

View File

@ -714,7 +714,7 @@ static void cleanup_rapl_pmus(void)
int i; int i;
for (i = 0; i < rapl_pmus->maxpkg; i++) for (i = 0; i < rapl_pmus->maxpkg; i++)
kfree(rapl_pmus->pmus + i); kfree(rapl_pmus->pmus[i]);
kfree(rapl_pmus); kfree(rapl_pmus);
} }

View File

@ -2868,27 +2868,10 @@ static struct intel_uncore_type bdx_uncore_cbox = {
.format_group = &hswep_uncore_cbox_format_group, .format_group = &hswep_uncore_cbox_format_group,
}; };
static struct intel_uncore_type bdx_uncore_sbox = {
.name = "sbox",
.num_counters = 4,
.num_boxes = 4,
.perf_ctr_bits = 48,
.event_ctl = HSWEP_S0_MSR_PMON_CTL0,
.perf_ctr = HSWEP_S0_MSR_PMON_CTR0,
.event_mask = HSWEP_S_MSR_PMON_RAW_EVENT_MASK,
.box_ctl = HSWEP_S0_MSR_PMON_BOX_CTL,
.msr_offset = HSWEP_SBOX_MSR_OFFSET,
.ops = &hswep_uncore_sbox_msr_ops,
.format_group = &hswep_uncore_sbox_format_group,
};
#define BDX_MSR_UNCORE_SBOX 3
static struct intel_uncore_type *bdx_msr_uncores[] = { static struct intel_uncore_type *bdx_msr_uncores[] = {
&bdx_uncore_ubox, &bdx_uncore_ubox,
&bdx_uncore_cbox, &bdx_uncore_cbox,
&hswep_uncore_pcu, &hswep_uncore_pcu,
&bdx_uncore_sbox,
NULL, NULL,
}; };
@ -2897,10 +2880,6 @@ void bdx_uncore_cpu_init(void)
if (bdx_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores) if (bdx_uncore_cbox.num_boxes > boot_cpu_data.x86_max_cores)
bdx_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores; bdx_uncore_cbox.num_boxes = boot_cpu_data.x86_max_cores;
uncore_msr_uncores = bdx_msr_uncores; uncore_msr_uncores = bdx_msr_uncores;
/* BDX-DE doesn't have SBOX */
if (boot_cpu_data.x86_model == 86)
uncore_msr_uncores[BDX_MSR_UNCORE_SBOX] = NULL;
} }
static struct intel_uncore_type bdx_uncore_ha = { static struct intel_uncore_type bdx_uncore_ha = {

View File

@ -3862,10 +3862,8 @@ static void _free_event(struct perf_event *event)
if (event->ctx) if (event->ctx)
put_ctx(event->ctx); put_ctx(event->ctx);
if (event->pmu) { exclusive_event_destroy(event);
exclusive_event_destroy(event); module_put(event->pmu->module);
module_put(event->pmu->module);
}
call_rcu(&event->rcu_head, free_event_rcu); call_rcu(&event->rcu_head, free_event_rcu);
} }

View File

@ -204,6 +204,44 @@ static unsigned long long adjust_signedness(unsigned long long value_int, int si
return (value_int & value_mask) | ~value_mask; return (value_int & value_mask) | ~value_mask;
} }
static int string_set_value(struct bt_ctf_field *field, const char *string)
{
char *buffer = NULL;
size_t len = strlen(string), i, p;
int err;
for (i = p = 0; i < len; i++, p++) {
if (isprint(string[i])) {
if (!buffer)
continue;
buffer[p] = string[i];
} else {
char numstr[5];
snprintf(numstr, sizeof(numstr), "\\x%02x",
(unsigned int)(string[i]) & 0xff);
if (!buffer) {
buffer = zalloc(i + (len - i) * 4 + 2);
if (!buffer) {
pr_err("failed to set unprintable string '%s'\n", string);
return bt_ctf_field_string_set_value(field, "UNPRINTABLE-STRING");
}
if (i > 0)
strncpy(buffer, string, i);
}
strncat(buffer + p, numstr, 4);
p += 3;
}
}
if (!buffer)
return bt_ctf_field_string_set_value(field, string);
err = bt_ctf_field_string_set_value(field, buffer);
free(buffer);
return err;
}
static int add_tracepoint_field_value(struct ctf_writer *cw, static int add_tracepoint_field_value(struct ctf_writer *cw,
struct bt_ctf_event_class *event_class, struct bt_ctf_event_class *event_class,
struct bt_ctf_event *event, struct bt_ctf_event *event,
@ -270,8 +308,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
} }
if (flags & FIELD_IS_STRING) if (flags & FIELD_IS_STRING)
ret = bt_ctf_field_string_set_value(field, ret = string_set_value(field, data + offset + i * len);
data + offset + i * len);
else { else {
unsigned long long value_int; unsigned long long value_int;

View File

@ -673,6 +673,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
int err; int err;
union perf_event *event; union perf_event *event;
if (symbol_conf.kptr_restrict)
return -1;
if (map == NULL) if (map == NULL)
return -1; return -1;

View File

@ -1933,17 +1933,17 @@ int setup_intlist(struct intlist **list, const char *list_str,
static bool symbol__read_kptr_restrict(void) static bool symbol__read_kptr_restrict(void)
{ {
bool value = false; bool value = false;
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
if (geteuid() != 0) { if (fp != NULL) {
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r"); char line[8];
if (fp != NULL) {
char line[8];
if (fgets(line, sizeof(line), fp) != NULL) if (fgets(line, sizeof(line), fp) != NULL)
value = atoi(line) != 0; value = (geteuid() != 0) ?
(atoi(line) != 0) :
(atoi(line) == 2);
fclose(fp); fclose(fp);
}
} }
return value; return value;