perf: Don't free perf_mmap_data until work has been done

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>
This commit is contained in:
Kristian Høgsberg 2009-12-01 15:05:01 -05:00 committed by Ingo Molnar
parent bdad0db7db
commit ec70ccd806

View File

@ -2210,6 +2210,7 @@ static void perf_mmap_data_free(struct perf_mmap_data *data)
perf_mmap_free_page((unsigned long)data->user_page); perf_mmap_free_page((unsigned long)data->user_page);
for (i = 0; i < data->nr_pages; i++) for (i = 0; i < data->nr_pages; i++)
perf_mmap_free_page((unsigned long)data->data_pages[i]); perf_mmap_free_page((unsigned long)data->data_pages[i]);
kfree(data);
} }
#else #else
@ -2250,6 +2251,7 @@ static void perf_mmap_data_free_work(struct work_struct *work)
perf_mmap_unmark_page(base + (i * PAGE_SIZE)); perf_mmap_unmark_page(base + (i * PAGE_SIZE));
vfree(base); vfree(base);
kfree(data);
} }
static void perf_mmap_data_free(struct perf_mmap_data *data) static void perf_mmap_data_free(struct perf_mmap_data *data)
@ -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); data = container_of(rcu_head, struct perf_mmap_data, rcu_head);
perf_mmap_data_free(data); perf_mmap_data_free(data);
kfree(data);
} }
static void perf_mmap_data_release(struct perf_event *event) static void perf_mmap_data_release(struct perf_event *event)