On Fri, Nov 07, 2014 at 09:14:51PM +0100, Oleg Nesterov wrote:
> task_state() does seq_printf() under rcu_read_lock(), but this is only
> needed for task_tgid_nr_ns() and task_numa_group_id(). We can calculate
> tgid/ngid and drop rcu lock.
> 
> Signed-off-by: Oleg Nesterov <[email protected]>

Reviewed-by: Paul E. McKenney <[email protected]>

> ---
>  fs/proc/array.c |   12 ++++++------
>  1 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/proc/array.c b/fs/proc/array.c
> index 7c8d9ae..800e30f 100644
> --- a/fs/proc/array.c
> +++ b/fs/proc/array.c
> @@ -158,7 +158,7 @@ static inline void task_state(struct seq_file *m, struct 
> pid_namespace *ns,
>       struct group_info *group_info;
>       int g;
>       const struct cred *cred;
> -     pid_t ppid, tpid;
> +     pid_t ppid, tpid, tgid, ngid;
>       unsigned int max_fds = 0;
> 
>       rcu_read_lock();
> @@ -170,12 +170,16 @@ static inline void task_state(struct seq_file *m, 
> struct pid_namespace *ns,
>               if (tracer)
>                       tpid = task_pid_nr_ns(tracer, ns);
>       }
> +
> +     tgid = task_tgid_nr_ns(p, ns);
> +     ngid = task_numa_group_id(p);
>       cred = get_task_cred(p);
> 
>       task_lock(p);
>       if (p->files)
>               max_fds = files_fdtable(p->files)->max_fds;
>       task_unlock(p);
> +     rcu_read_unlock();
> 
>       seq_printf(m,
>               "State:\t%s\n"
> @@ -188,10 +192,7 @@ static inline void task_state(struct seq_file *m, struct 
> pid_namespace *ns,
>               "Gid:\t%d\t%d\t%d\t%d\n"
>               "FDSize:\t%d\nGroups:\t",
>               get_task_state(p),
> -             task_tgid_nr_ns(p, ns),
> -             task_numa_group_id(p),
> -             pid_nr_ns(pid, ns),
> -             ppid, tpid,
> +             tgid, ngid, pid_nr_ns(pid, ns), ppid, tpid,
>               from_kuid_munged(user_ns, cred->uid),
>               from_kuid_munged(user_ns, cred->euid),
>               from_kuid_munged(user_ns, cred->suid),
> @@ -201,7 +202,6 @@ static inline void task_state(struct seq_file *m, struct 
> pid_namespace *ns,
>               from_kgid_munged(user_ns, cred->sgid),
>               from_kgid_munged(user_ns, cred->fsgid),
>               max_fds);
> -     rcu_read_unlock();
> 
>       group_info = cred->group_info;
>       for (g = 0; g < group_info->ngroups; g++)
> -- 
> 1.5.5.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to