Skip to content

Commit

Permalink
perf: Don't free perf_mmap_data until work has been done
Browse files Browse the repository at this point in the history
In the CONFIG_PERF_USE_VMALLOC case, perf_mmap_data_free() only
schedules the cleanup of the perf_mmap_data struct.  In that
case we have to wait until the work has been done before we free
data.

Signed-off-by: Kristian Høgsberg <krh@bitplanet.net>
Cc: David S. Miller <davem@davemloft.net>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: <stable@kernel.org>
LKML-Reference: <1259697901-1747-1-git-send-email-krh@bitplanet.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
krh authored and Ingo Molnar committed Dec 2, 2009
1 parent bdad0db commit ec70ccd
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -2210,6 +2210,7 @@ static void perf_mmap_data_free(struct perf_mmap_data *data)
perf_mmap_free_page((unsigned long)data->user_page);
for (i = 0; i < data->nr_pages; i++)
perf_mmap_free_page((unsigned long)data->data_pages[i]);
kfree(data);
}

#else
Expand Down Expand Up @@ -2250,6 +2251,7 @@ static void perf_mmap_data_free_work(struct work_struct *work)
perf_mmap_unmark_page(base + (i * PAGE_SIZE));

vfree(base);
kfree(data);
}

static void perf_mmap_data_free(struct perf_mmap_data *data)
Expand Down Expand Up @@ -2355,7 +2357,6 @@ static void perf_mmap_data_free_rcu(struct rcu_head *rcu_head)

data = container_of(rcu_head, struct perf_mmap_data, rcu_head);
perf_mmap_data_free(data);
kfree(data);
}

static void perf_mmap_data_release(struct perf_event *event)
Expand Down

0 comments on commit ec70ccd

Please sign in to comment.