Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar: "Mostly tooling fixes, but also a lockdep annotation fix, a PMU event list fix and a new model addition" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: tools/liblockdep: Fix compilation error tools/liblockdep: Fix linker error in case of cross compile perf tools: Use getconf to determine number of online CPUs tools: Fix tools/vm build perf/x86/rapl: Enable Broadwell-U RAPL support perf/x86/intel: Fix SLM cache event list perf: Annotate inherited event ctx->mutex recursion
This commit is contained in:
Коммит
ef4a293a44
|
@ -1134,7 +1134,7 @@ static __initconst const u64 slm_hw_cache_extra_regs
|
||||||
[ C(LL ) ] = {
|
[ C(LL ) ] = {
|
||||||
[ C(OP_READ) ] = {
|
[ C(OP_READ) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = SLM_DMND_READ|SLM_LLC_ACCESS,
|
[ C(RESULT_ACCESS) ] = SLM_DMND_READ|SLM_LLC_ACCESS,
|
||||||
[ C(RESULT_MISS) ] = SLM_DMND_READ|SLM_LLC_MISS,
|
[ C(RESULT_MISS) ] = 0,
|
||||||
},
|
},
|
||||||
[ C(OP_WRITE) ] = {
|
[ C(OP_WRITE) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = SLM_DMND_WRITE|SLM_LLC_ACCESS,
|
[ C(RESULT_ACCESS) ] = SLM_DMND_WRITE|SLM_LLC_ACCESS,
|
||||||
|
@ -1184,8 +1184,7 @@ static __initconst const u64 slm_hw_cache_event_ids
|
||||||
[ C(OP_READ) ] = {
|
[ C(OP_READ) ] = {
|
||||||
/* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */
|
/* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */
|
||||||
[ C(RESULT_ACCESS) ] = 0x01b7,
|
[ C(RESULT_ACCESS) ] = 0x01b7,
|
||||||
/* OFFCORE_RESPONSE.ANY_DATA.ANY_LLC_MISS */
|
[ C(RESULT_MISS) ] = 0,
|
||||||
[ C(RESULT_MISS) ] = 0x01b7,
|
|
||||||
},
|
},
|
||||||
[ C(OP_WRITE) ] = {
|
[ C(OP_WRITE) ] = {
|
||||||
/* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */
|
/* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */
|
||||||
|
@ -1217,7 +1216,7 @@ static __initconst const u64 slm_hw_cache_event_ids
|
||||||
[ C(ITLB) ] = {
|
[ C(ITLB) ] = {
|
||||||
[ C(OP_READ) ] = {
|
[ C(OP_READ) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = 0x00c0, /* INST_RETIRED.ANY_P */
|
[ C(RESULT_ACCESS) ] = 0x00c0, /* INST_RETIRED.ANY_P */
|
||||||
[ C(RESULT_MISS) ] = 0x0282, /* ITLB.MISSES */
|
[ C(RESULT_MISS) ] = 0x40205, /* PAGE_WALKS.I_SIDE_WALKS */
|
||||||
},
|
},
|
||||||
[ C(OP_WRITE) ] = {
|
[ C(OP_WRITE) ] = {
|
||||||
[ C(RESULT_ACCESS) ] = -1,
|
[ C(RESULT_ACCESS) ] = -1,
|
||||||
|
|
|
@ -722,6 +722,7 @@ static int __init rapl_pmu_init(void)
|
||||||
break;
|
break;
|
||||||
case 60: /* Haswell */
|
case 60: /* Haswell */
|
||||||
case 69: /* Haswell-Celeron */
|
case 69: /* Haswell-Celeron */
|
||||||
|
case 61: /* Broadwell */
|
||||||
rapl_cntr_mask = RAPL_IDX_HSW;
|
rapl_cntr_mask = RAPL_IDX_HSW;
|
||||||
rapl_pmu_events_group.attrs = rapl_events_hsw_attr;
|
rapl_pmu_events_group.attrs = rapl_events_hsw_attr;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -913,10 +913,30 @@ static void put_ctx(struct perf_event_context *ctx)
|
||||||
* Those places that change perf_event::ctx will hold both
|
* Those places that change perf_event::ctx will hold both
|
||||||
* perf_event_ctx::mutex of the 'old' and 'new' ctx value.
|
* perf_event_ctx::mutex of the 'old' and 'new' ctx value.
|
||||||
*
|
*
|
||||||
* Lock ordering is by mutex address. There is one other site where
|
* Lock ordering is by mutex address. There are two other sites where
|
||||||
* perf_event_context::mutex nests and that is put_event(). But remember that
|
* perf_event_context::mutex nests and those are:
|
||||||
* that is a parent<->child context relation, and migration does not affect
|
*
|
||||||
* children, therefore these two orderings should not interact.
|
* - perf_event_exit_task_context() [ child , 0 ]
|
||||||
|
* __perf_event_exit_task()
|
||||||
|
* sync_child_event()
|
||||||
|
* put_event() [ parent, 1 ]
|
||||||
|
*
|
||||||
|
* - perf_event_init_context() [ parent, 0 ]
|
||||||
|
* inherit_task_group()
|
||||||
|
* inherit_group()
|
||||||
|
* inherit_event()
|
||||||
|
* perf_event_alloc()
|
||||||
|
* perf_init_event()
|
||||||
|
* perf_try_init_event() [ child , 1 ]
|
||||||
|
*
|
||||||
|
* While it appears there is an obvious deadlock here -- the parent and child
|
||||||
|
* nesting levels are inverted between the two. This is in fact safe because
|
||||||
|
* life-time rules separate them. That is an exiting task cannot fork, and a
|
||||||
|
* spawning task cannot (yet) exit.
|
||||||
|
*
|
||||||
|
* But remember that that these are parent<->child context relations, and
|
||||||
|
* migration does not affect children, therefore these two orderings should not
|
||||||
|
* interact.
|
||||||
*
|
*
|
||||||
* The change in perf_event::ctx does not affect children (as claimed above)
|
* The change in perf_event::ctx does not affect children (as claimed above)
|
||||||
* because the sys_perf_event_open() case will install a new event and break
|
* because the sys_perf_event_open() case will install a new event and break
|
||||||
|
@ -3657,9 +3677,6 @@ static void perf_remove_from_owner(struct perf_event *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Called when the last reference to the file is gone.
|
|
||||||
*/
|
|
||||||
static void put_event(struct perf_event *event)
|
static void put_event(struct perf_event *event)
|
||||||
{
|
{
|
||||||
struct perf_event_context *ctx;
|
struct perf_event_context *ctx;
|
||||||
|
@ -3697,6 +3714,9 @@ int perf_event_release_kernel(struct perf_event *event)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(perf_event_release_kernel);
|
EXPORT_SYMBOL_GPL(perf_event_release_kernel);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when the last reference to the file is gone.
|
||||||
|
*/
|
||||||
static int perf_release(struct inode *inode, struct file *file)
|
static int perf_release(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
put_event(file->private_data);
|
put_event(file->private_data);
|
||||||
|
@ -7364,7 +7384,12 @@ static int perf_try_init_event(struct pmu *pmu, struct perf_event *event)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (event->group_leader != event) {
|
if (event->group_leader != event) {
|
||||||
ctx = perf_event_ctx_lock(event->group_leader);
|
/*
|
||||||
|
* This ctx->mutex can nest when we're called through
|
||||||
|
* inheritance. See the perf_event_ctx_lock_nested() comment.
|
||||||
|
*/
|
||||||
|
ctx = perf_event_ctx_lock_nested(event->group_leader,
|
||||||
|
SINGLE_DEPTH_NESTING);
|
||||||
BUG_ON(!ctx);
|
BUG_ON(!ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,9 +14,10 @@ define allow-override
|
||||||
$(eval $(1) = $(2)))
|
$(eval $(1) = $(2)))
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
|
# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix.
|
||||||
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
|
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
|
||||||
$(call allow-override,AR,$(CROSS_COMPILE)ar)
|
$(call allow-override,AR,$(CROSS_COMPILE)ar)
|
||||||
|
$(call allow-override,LD,$(CROSS_COMPILE)ld)
|
||||||
|
|
||||||
INSTALL = install
|
INSTALL = install
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,9 @@
|
||||||
#define __init
|
#define __init
|
||||||
#define noinline
|
#define noinline
|
||||||
#define list_add_tail_rcu list_add_tail
|
#define list_add_tail_rcu list_add_tail
|
||||||
|
#define list_for_each_entry_rcu list_for_each_entry
|
||||||
|
#define barrier()
|
||||||
|
#define synchronize_sched()
|
||||||
|
|
||||||
#ifndef CALLER_ADDR0
|
#ifndef CALLER_ADDR0
|
||||||
#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
||||||
|
|
|
@ -24,7 +24,7 @@ unexport MAKEFLAGS
|
||||||
# (To override it, run 'make JOBS=1' and similar.)
|
# (To override it, run 'make JOBS=1' and similar.)
|
||||||
#
|
#
|
||||||
ifeq ($(JOBS),)
|
ifeq ($(JOBS),)
|
||||||
JOBS := $(shell egrep -c '^processor|^CPU' /proc/cpuinfo 2>/dev/null)
|
JOBS := $(shell (getconf _NPROCESSORS_ONLN || egrep -c '^processor|^CPU[0-9]' /proc/cpuinfo) 2>/dev/null)
|
||||||
ifeq ($(JOBS),0)
|
ifeq ($(JOBS),0)
|
||||||
JOBS := 1
|
JOBS := 1
|
||||||
endif
|
endif
|
||||||
|
|
Загрузка…
Ссылка в новой задаче