diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index d5d94510afd3..81e48f841764 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -327,7 +327,7 @@ static void blk_trace_free(struct request_queue *q, struct blk_trace *bt) } free_percpu(bt->sequence); free_percpu(bt->msg_data); - kfree(bt); + kfree_rcu(bt, rcu); } static void get_probe_ref(void) @@ -380,7 +380,6 @@ static int blk_trace_stop(struct blk_trace *bt) static void blk_trace_cleanup(struct request_queue *q, struct blk_trace *bt) { blk_trace_stop(bt); - synchronize_rcu(); blk_trace_free(q, bt); put_probe_ref(); } diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 122c62e561fc..5f927328b7e6 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -26,6 +26,7 @@ struct blk_trace { struct dentry *dir; struct list_head running_list; atomic_t dropped; + struct rcu_head rcu; }; extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *);