Re: [PATCH 1/5] perf: Wrap perf_lock_task_context using __cond_lock()

Peter Zijlstra
2010-09-30T11:39:05Z

On Mon, 2010-09-27 at 19:39 +0900, Namhyung Kim wrote:
> perf_lock_task_context() conditionally grabs ctx->lock in case of
> returning non-NULL. Rename and wrap it using __cond_lock to make
> sparse happy.
>
> Signed-off-by: Namhyung Kim <namhyung@gmail.com>
> ---
> kernel/perf_event.c | 10 +++++++++-
> 1 files changed, 9 insertions(+), 1 deletions(-)
>
> diff --git a/kernel/perf_event.c b/kernel/perf_event.c
> index db5b560..c058a42 100644
> --- a/kernel/perf_event.c
> +++ b/kernel/perf_event.c
> @@ -151,7 +151,7 @@ static u64 primary_event_id(struct perf_event *event)
> * the context could get moved to another task.
> */
> static struct perf_event_context *
> -perf_lock_task_context(struct task_struct *task, unsigned long *flags)
> +__perf_lock_task_context(struct task_struct *task, unsigned long *flags)
> {
> struct perf_event_context *ctx;
>
> @@ -184,6 +184,14 @@ perf_lock_task_context(struct task_struct *task, unsigned long *flags)
> return ctx;
> }
>
> +static inline struct perf_event_context *
> +perf_lock_task_context(struct task_struct *task, unsigned long *flags)
> +{
> + struct perf_event_context *ctx;
> + __cond_lock(&ctx->lock, ctx = __perf_lock_task_context(task, flags));
> + return ctx;
> +}
> +
> /*
> * Get the context for a task and increment its pin_count so it
> * can't get swapped to another task. This also increments its

This is a rather ugly annotation... why can't sparse use something like
the regular __acquire() function annotation but instead all it
__cond_acquire() ?