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;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 = {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user