mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 07:50:04 +00:00
- Make sure the context refcount is transferred too when migrating perf
events -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmVaAW4ACgkQEsHwGGHe VUq4bQ/5ATpnsIYxn/rjshZa2hfDrOfS9FRegfMCZyz7w/HDmRlwjIbXbQE7ttS7 vU55QgftybwS38N//LRzx9etGIhbcmeNgNibskslxsuVFCxBJLUVT3UJ9T9AtWrM v9i0W+D8SuJsIKoKo77K+OkTvKHZgpvxyABQivyHMjeD2zmPHUslJ+OTWYNooM7g kPmTu/M6sJme/q/PgtezOVKhV3tdaHB2oBKUEv9y4nVBNNVRnX/Fo+Zd/FEgs45F JhxnvwqP5cU7mSmn9itcNRKY8nW5lv2OdYNtgyqWbpYY39JPZxy/EKF4GUPv1Jqb d/eQov0B8K844j982bBa0lgecmiGYq7DNevVHlUB/JowQpNsfxVJAVphVnWZr5iy hzZQU5EfvmkRE/ja/g1wUn15mdxvAQ3QRmOGBJwCQi2QLC9zCiki4esnGc4U9Zp7 ZVQ22PVliuBnLRloOSHsp1G65i3K+VPlKyBOkp0YmEVz9EHahOceBPa39WkGCHOh 1EkhPIzemTYUzAE5KuzbLp7C6KzMvaP8Zc9fOLy9SEesb2HjwoIQjkRKmJ38rbSu KEY5SbdxIkVCsks4kajOVSysS89rafbH7ykd/Di3cXb1rOJtRSyWghnaap1trghd uf0EAVb9y8er2xvdOHHwHIdNILK3Y1F2TcOg+jAyywudrfmnIls= =lbBn -----END PGP SIGNATURE----- Merge tag 'perf_urgent_for_v6.7_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull perf fix from Borislav Petkov: - Make sure the context refcount is transferred too when migrating perf events * tag 'perf_urgent_for_v6.7_rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/core: Fix cpuctx refcounting
This commit is contained in:
commit
c8b3443cbd
@ -843,11 +843,11 @@ struct perf_event {
|
||||
};
|
||||
|
||||
/*
|
||||
* ,-----------------------[1:n]----------------------.
|
||||
* V V
|
||||
* perf_event_context <-[1:n]-> perf_event_pmu_context <--- perf_event
|
||||
* ^ ^ | |
|
||||
* `--------[1:n]---------' `-[n:1]-> pmu <-[1:n]-'
|
||||
* ,-----------------------[1:n]------------------------.
|
||||
* V V
|
||||
* perf_event_context <-[1:n]-> perf_event_pmu_context <-[1:n]- perf_event
|
||||
* | |
|
||||
* `--[n:1]-> pmu <-[1:n]--'
|
||||
*
|
||||
*
|
||||
* struct perf_event_pmu_context lifetime is refcount based and RCU freed
|
||||
@ -865,6 +865,9 @@ struct perf_event {
|
||||
* ctx->mutex pinning the configuration. Since we hold a reference on
|
||||
* group_leader (through the filedesc) it can't go away, therefore it's
|
||||
* associated pmu_ctx must exist and cannot change due to ctx->mutex.
|
||||
*
|
||||
* perf_event holds a refcount on perf_event_context
|
||||
* perf_event holds a refcount on perf_event_pmu_context
|
||||
*/
|
||||
struct perf_event_pmu_context {
|
||||
struct pmu *pmu;
|
||||
|
@ -4828,6 +4828,11 @@ find_get_pmu_context(struct pmu *pmu, struct perf_event_context *ctx,
|
||||
void *task_ctx_data = NULL;
|
||||
|
||||
if (!ctx->task) {
|
||||
/*
|
||||
* perf_pmu_migrate_context() / __perf_pmu_install_event()
|
||||
* relies on the fact that find_get_pmu_context() cannot fail
|
||||
* for CPU contexts.
|
||||
*/
|
||||
struct perf_cpu_pmu_context *cpc;
|
||||
|
||||
cpc = per_cpu_ptr(pmu->cpu_pmu_context, event->cpu);
|
||||
@ -12889,6 +12894,9 @@ static void __perf_pmu_install_event(struct pmu *pmu,
|
||||
int cpu, struct perf_event *event)
|
||||
{
|
||||
struct perf_event_pmu_context *epc;
|
||||
struct perf_event_context *old_ctx = event->ctx;
|
||||
|
||||
get_ctx(ctx); /* normally find_get_context() */
|
||||
|
||||
event->cpu = cpu;
|
||||
epc = find_get_pmu_context(pmu, ctx, event);
|
||||
@ -12897,6 +12905,11 @@ static void __perf_pmu_install_event(struct pmu *pmu,
|
||||
if (event->state >= PERF_EVENT_STATE_OFF)
|
||||
event->state = PERF_EVENT_STATE_INACTIVE;
|
||||
perf_install_in_context(ctx, event, cpu);
|
||||
|
||||
/*
|
||||
* Now that event->ctx is updated and visible, put the old ctx.
|
||||
*/
|
||||
put_ctx(old_ctx);
|
||||
}
|
||||
|
||||
static void __perf_pmu_install(struct perf_event_context *ctx,
|
||||
@ -12935,6 +12948,10 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu)
|
||||
struct perf_event_context *src_ctx, *dst_ctx;
|
||||
LIST_HEAD(events);
|
||||
|
||||
/*
|
||||
* Since per-cpu context is persistent, no need to grab an extra
|
||||
* reference.
|
||||
*/
|
||||
src_ctx = &per_cpu_ptr(&perf_cpu_context, src_cpu)->ctx;
|
||||
dst_ctx = &per_cpu_ptr(&perf_cpu_context, dst_cpu)->ctx;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user