mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
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:
commit
7fcbc230c6
@ -714,7 +714,7 @@ static void cleanup_rapl_pmus(void)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < rapl_pmus->maxpkg; i++)
|
||||
kfree(rapl_pmus->pmus + i);
|
||||
kfree(rapl_pmus->pmus[i]);
|
||||
kfree(rapl_pmus);
|
||||
}
|
||||
|
||||
|
@ -2868,27 +2868,10 @@ static struct intel_uncore_type bdx_uncore_cbox = {
|
||||
.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[] = {
|
||||
&bdx_uncore_ubox,
|
||||
&bdx_uncore_cbox,
|
||||
&hswep_uncore_pcu,
|
||||
&bdx_uncore_sbox,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@ -2897,10 +2880,6 @@ void bdx_uncore_cpu_init(void)
|
||||
if (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;
|
||||
|
||||
/* 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 = {
|
||||
|
@ -3862,10 +3862,8 @@ static void _free_event(struct perf_event *event)
|
||||
if (event->ctx)
|
||||
put_ctx(event->ctx);
|
||||
|
||||
if (event->pmu) {
|
||||
exclusive_event_destroy(event);
|
||||
module_put(event->pmu->module);
|
||||
}
|
||||
|
||||
call_rcu(&event->rcu_head, free_event_rcu);
|
||||
}
|
||||
|
@ -204,6 +204,44 @@ static unsigned long long adjust_signedness(unsigned long long value_int, int si
|
||||
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,
|
||||
struct bt_ctf_event_class *event_class,
|
||||
struct bt_ctf_event *event,
|
||||
@ -270,8 +308,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
|
||||
}
|
||||
|
||||
if (flags & FIELD_IS_STRING)
|
||||
ret = bt_ctf_field_string_set_value(field,
|
||||
data + offset + i * len);
|
||||
ret = string_set_value(field, data + offset + i * len);
|
||||
else {
|
||||
unsigned long long value_int;
|
||||
|
||||
|
@ -673,6 +673,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
|
||||
int err;
|
||||
union perf_event *event;
|
||||
|
||||
if (symbol_conf.kptr_restrict)
|
||||
return -1;
|
||||
if (map == NULL)
|
||||
return -1;
|
||||
|
||||
|
@ -1933,18 +1933,18 @@ int setup_intlist(struct intlist **list, const char *list_str,
|
||||
static bool symbol__read_kptr_restrict(void)
|
||||
{
|
||||
bool value = false;
|
||||
|
||||
if (geteuid() != 0) {
|
||||
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
|
||||
|
||||
if (fp != NULL) {
|
||||
char line[8];
|
||||
|
||||
if (fgets(line, sizeof(line), fp) != NULL)
|
||||
value = atoi(line) != 0;
|
||||
value = (geteuid() != 0) ?
|
||||
(atoi(line) != 0) :
|
||||
(atoi(line) == 2);
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user