Em Wed, May 22, 2019 at 02:32:48PM +0900, Namhyung Kim escreveu:
> It seems that the current code lacks holding the namespace lock in
> thread__namespaces().  Otherwise it can see inconsistent results.
> 
> Signed-off-by: Namhyung Kim <[email protected]>
> ---
>  tools/perf/util/thread.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
> index 403045a2bbea..b413ba5b9835 100644
> --- a/tools/perf/util/thread.c
> +++ b/tools/perf/util/thread.c
> @@ -133,7 +133,7 @@ void thread__put(struct thread *thread)
>       }
>  }
>  
> -struct namespaces *thread__namespaces(const struct thread *thread)
> +static struct namespaces *__thread__namespaces(const struct thread *thread)
>  {
>       if (list_empty(&thread->namespaces_list))
>               return NULL;
> @@ -141,10 +141,21 @@ struct namespaces *thread__namespaces(const struct 
> thread *thread)
>       return list_first_entry(&thread->namespaces_list, struct namespaces, 
> list);
>  }
>  
> +struct namespaces *thread__namespaces(const struct thread *thread)
> +{
> +     struct namespaces *ns;
> +
> +     down_read((struct rw_semaphore *)&thread->namespaces_lock);
> +     ns = __thread__namespaces(thread);
> +     up_read((struct rw_semaphore *)&thread->namespaces_lock);
> +

Humm, so we need to change thread__namespaces() to remove that const
instead of throwing it away with that cast, right?

- Arnaldo

> +     return ns;
> +}
> +
>  static int __thread__set_namespaces(struct thread *thread, u64 timestamp,
>                                   struct namespaces_event *event)
>  {
> -     struct namespaces *new, *curr = thread__namespaces(thread);
> +     struct namespaces *new, *curr = __thread__namespaces(thread);
>  
>       new = namespaces__new(event);
>       if (!new)
> -- 
> 2.21.0.1020.gf2820cf01a-goog

-- 

- Arnaldo

Reply via email to