All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
@ 2022-08-03 13:48 Lee Jones
  2022-08-03 15:27 ` Jiri Olsa
  2022-08-04 17:16 ` Alexei Starovoitov
  0 siblings, 2 replies; 9+ messages in thread
From: Lee Jones @ 2022-08-03 13:48 UTC (permalink / raw)
  To: lee
  Cc: linux-kernel, Alexei Starovoitov, Daniel Borkmann,
	John Fastabend, Andrii Nakryiko, Martin KaFai Lau, Song Liu,
	Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
	bpf

The documentation for find_pid() clearly states:

  "Must be called with the tasklist_lock or rcu_read_lock() held."

Presently we do neither.

Let's use find_get_pid() which searches for the vpid, then takes a
reference to it preventing early free, all within the safety of
rcu_read_lock().  Once we have our reference we can safely make use of
it up until the point it is put.

Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Daniel Borkmann <daniel@iogearbox.net>
Cc: John Fastabend <john.fastabend@gmail.com>
Cc: Andrii Nakryiko <andrii@kernel.org>
Cc: Martin KaFai Lau <martin.lau@linux.dev>
Cc: Song Liu <song@kernel.org>
Cc: Yonghong Song <yhs@fb.com>
Cc: KP Singh <kpsingh@kernel.org>
Cc: Stanislav Fomichev <sdf@google.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: bpf@vger.kernel.org
Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
Signed-off-by: Lee Jones <lee@kernel.org>
---

v1 => v2:
  * Commit log update - no code differences

 kernel/bpf/syscall.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 83c7136c5788d..c20cff30581c4 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
 	const struct perf_event *event;
 	struct task_struct *task;
 	struct file *file;
+	struct pid *ppid;
 	int err;
 
 	if (CHECK_ATTR(BPF_TASK_FD_QUERY))
@@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
 	if (attr->task_fd_query.flags != 0)
 		return -EINVAL;
 
-	task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
+	ppid = find_get_pid(pid);
+	task = get_pid_task(ppid, PIDTYPE_PID);
+	put_pid(ppid);
 	if (!task)
 		return -ENOENT;
 
-- 
2.37.1.455.g008518b4e5-goog


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-03 13:48 [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid() Lee Jones
@ 2022-08-03 15:27 ` Jiri Olsa
  2022-08-09  6:50   ` Lee Jones
  2022-08-04 17:16 ` Alexei Starovoitov
  1 sibling, 1 reply; 9+ messages in thread
From: Jiri Olsa @ 2022-08-03 15:27 UTC (permalink / raw)
  To: Lee Jones
  Cc: linux-kernel, Alexei Starovoitov, Daniel Borkmann,
	John Fastabend, Andrii Nakryiko, Martin KaFai Lau, Song Liu,
	Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, bpf

On Wed, Aug 03, 2022 at 02:48:21PM +0100, Lee Jones wrote:
> The documentation for find_pid() clearly states:

nit: typo find_vpid

> 
>   "Must be called with the tasklist_lock or rcu_read_lock() held."
> 
> Presently we do neither.
> 
> Let's use find_get_pid() which searches for the vpid, then takes a
> reference to it preventing early free, all within the safety of
> rcu_read_lock().  Once we have our reference we can safely make use of
> it up until the point it is put.
> 
> Cc: Alexei Starovoitov <ast@kernel.org>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: John Fastabend <john.fastabend@gmail.com>
> Cc: Andrii Nakryiko <andrii@kernel.org>
> Cc: Martin KaFai Lau <martin.lau@linux.dev>
> Cc: Song Liu <song@kernel.org>
> Cc: Yonghong Song <yhs@fb.com>
> Cc: KP Singh <kpsingh@kernel.org>
> Cc: Stanislav Fomichev <sdf@google.com>
> Cc: Hao Luo <haoluo@google.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: bpf@vger.kernel.org
> Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> Signed-off-by: Lee Jones <lee@kernel.org>

Acked-by: Jiri Olsa <jolsa@kernel.org>

jirka

> ---
> 
> v1 => v2:
>   * Commit log update - no code differences
> 
>  kernel/bpf/syscall.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> index 83c7136c5788d..c20cff30581c4 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
>  	const struct perf_event *event;
>  	struct task_struct *task;
>  	struct file *file;
> +	struct pid *ppid;
>  	int err;
>  
>  	if (CHECK_ATTR(BPF_TASK_FD_QUERY))
> @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
>  	if (attr->task_fd_query.flags != 0)
>  		return -EINVAL;
>  
> -	task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
> +	ppid = find_get_pid(pid);
> +	task = get_pid_task(ppid, PIDTYPE_PID);
> +	put_pid(ppid);
>  	if (!task)
>  		return -ENOENT;
>  
> -- 
> 2.37.1.455.g008518b4e5-goog
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-03 13:48 [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid() Lee Jones
  2022-08-03 15:27 ` Jiri Olsa
@ 2022-08-04 17:16 ` Alexei Starovoitov
  2022-08-09  6:50   ` Lee Jones
  1 sibling, 1 reply; 9+ messages in thread
From: Alexei Starovoitov @ 2022-08-04 17:16 UTC (permalink / raw)
  To: Lee Jones
  Cc: LKML, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
	Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf

On Wed, Aug 3, 2022 at 6:48 AM Lee Jones <lee@kernel.org> wrote:
>
> The documentation for find_pid() clearly states:
>
>   "Must be called with the tasklist_lock or rcu_read_lock() held."
>
> Presently we do neither.
>
> Let's use find_get_pid() which searches for the vpid, then takes a
> reference to it preventing early free, all within the safety of
> rcu_read_lock().  Once we have our reference we can safely make use of
> it up until the point it is put.
>
> Cc: Alexei Starovoitov <ast@kernel.org>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: John Fastabend <john.fastabend@gmail.com>
> Cc: Andrii Nakryiko <andrii@kernel.org>
> Cc: Martin KaFai Lau <martin.lau@linux.dev>
> Cc: Song Liu <song@kernel.org>
> Cc: Yonghong Song <yhs@fb.com>
> Cc: KP Singh <kpsingh@kernel.org>
> Cc: Stanislav Fomichev <sdf@google.com>
> Cc: Hao Luo <haoluo@google.com>
> Cc: Jiri Olsa <jolsa@kernel.org>
> Cc: bpf@vger.kernel.org
> Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> Signed-off-by: Lee Jones <lee@kernel.org>
> ---
>
> v1 => v2:
>   * Commit log update - no code differences
>
>  kernel/bpf/syscall.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> index 83c7136c5788d..c20cff30581c4 100644
> --- a/kernel/bpf/syscall.c
> +++ b/kernel/bpf/syscall.c
> @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
>         const struct perf_event *event;
>         struct task_struct *task;
>         struct file *file;
> +       struct pid *ppid;
>         int err;
>
>         if (CHECK_ATTR(BPF_TASK_FD_QUERY))
> @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
>         if (attr->task_fd_query.flags != 0)
>                 return -EINVAL;
>
> -       task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
> +       ppid = find_get_pid(pid);
> +       task = get_pid_task(ppid, PIDTYPE_PID);
> +       put_pid(ppid);

rcu_read_lock/unlock around this line
would be a cheaper and faster alternative than pid's
refcount inc/dec.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-04 17:16 ` Alexei Starovoitov
@ 2022-08-09  6:50   ` Lee Jones
  2022-08-09 14:38     ` Alexei Starovoitov
  0 siblings, 1 reply; 9+ messages in thread
From: Lee Jones @ 2022-08-09  6:50 UTC (permalink / raw)
  To: Alexei Starovoitov
  Cc: LKML, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
	Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf

On Thu, 04 Aug 2022, Alexei Starovoitov wrote:

> On Wed, Aug 3, 2022 at 6:48 AM Lee Jones <lee@kernel.org> wrote:
> >
> > The documentation for find_pid() clearly states:
> >
> >   "Must be called with the tasklist_lock or rcu_read_lock() held."
> >
> > Presently we do neither.
> >
> > Let's use find_get_pid() which searches for the vpid, then takes a
> > reference to it preventing early free, all within the safety of
> > rcu_read_lock().  Once we have our reference we can safely make use of
> > it up until the point it is put.
> >
> > Cc: Alexei Starovoitov <ast@kernel.org>
> > Cc: Daniel Borkmann <daniel@iogearbox.net>
> > Cc: John Fastabend <john.fastabend@gmail.com>
> > Cc: Andrii Nakryiko <andrii@kernel.org>
> > Cc: Martin KaFai Lau <martin.lau@linux.dev>
> > Cc: Song Liu <song@kernel.org>
> > Cc: Yonghong Song <yhs@fb.com>
> > Cc: KP Singh <kpsingh@kernel.org>
> > Cc: Stanislav Fomichev <sdf@google.com>
> > Cc: Hao Luo <haoluo@google.com>
> > Cc: Jiri Olsa <jolsa@kernel.org>
> > Cc: bpf@vger.kernel.org
> > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> > Signed-off-by: Lee Jones <lee@kernel.org>
> > ---
> >
> > v1 => v2:
> >   * Commit log update - no code differences
> >
> >  kernel/bpf/syscall.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> > index 83c7136c5788d..c20cff30581c4 100644
> > --- a/kernel/bpf/syscall.c
> > +++ b/kernel/bpf/syscall.c
> > @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> >         const struct perf_event *event;
> >         struct task_struct *task;
> >         struct file *file;
> > +       struct pid *ppid;
> >         int err;
> >
> >         if (CHECK_ATTR(BPF_TASK_FD_QUERY))
> > @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> >         if (attr->task_fd_query.flags != 0)
> >                 return -EINVAL;
> >
> > -       task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
> > +       ppid = find_get_pid(pid);
> > +       task = get_pid_task(ppid, PIDTYPE_PID);
> > +       put_pid(ppid);
> 
> rcu_read_lock/unlock around this line
> would be a cheaper and faster alternative than pid's
> refcount inc/dec.

This was already discussed here:

https://lore.kernel.org/all/YtsFT1yFtb7UW2Xu@krava/

-- 
Lee Jones [李琼斯]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-03 15:27 ` Jiri Olsa
@ 2022-08-09  6:50   ` Lee Jones
  0 siblings, 0 replies; 9+ messages in thread
From: Lee Jones @ 2022-08-09  6:50 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: linux-kernel, Alexei Starovoitov, Daniel Borkmann,
	John Fastabend, Andrii Nakryiko, Martin KaFai Lau, Song Liu,
	Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, bpf

On Wed, 03 Aug 2022, Jiri Olsa wrote:

> On Wed, Aug 03, 2022 at 02:48:21PM +0100, Lee Jones wrote:
> > The documentation for find_pid() clearly states:
> 
> nit: typo find_vpid

Sorry missed this.

Will fix.

> >   "Must be called with the tasklist_lock or rcu_read_lock() held."
> > 
> > Presently we do neither.
> > 
> > Let's use find_get_pid() which searches for the vpid, then takes a
> > reference to it preventing early free, all within the safety of
> > rcu_read_lock().  Once we have our reference we can safely make use of
> > it up until the point it is put.
> > 
> > Cc: Alexei Starovoitov <ast@kernel.org>
> > Cc: Daniel Borkmann <daniel@iogearbox.net>
> > Cc: John Fastabend <john.fastabend@gmail.com>
> > Cc: Andrii Nakryiko <andrii@kernel.org>
> > Cc: Martin KaFai Lau <martin.lau@linux.dev>
> > Cc: Song Liu <song@kernel.org>
> > Cc: Yonghong Song <yhs@fb.com>
> > Cc: KP Singh <kpsingh@kernel.org>
> > Cc: Stanislav Fomichev <sdf@google.com>
> > Cc: Hao Luo <haoluo@google.com>
> > Cc: Jiri Olsa <jolsa@kernel.org>
> > Cc: bpf@vger.kernel.org
> > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> > Signed-off-by: Lee Jones <lee@kernel.org>
> 
> Acked-by: Jiri Olsa <jolsa@kernel.org>

Thanks.

-- 
Lee Jones [李琼斯]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-09  6:50   ` Lee Jones
@ 2022-08-09 14:38     ` Alexei Starovoitov
  2022-08-10 11:03       ` Lee Jones
  0 siblings, 1 reply; 9+ messages in thread
From: Alexei Starovoitov @ 2022-08-09 14:38 UTC (permalink / raw)
  To: Lee Jones
  Cc: LKML, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
	Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf

On Mon, Aug 8, 2022 at 11:50 PM Lee Jones <lee@kernel.org> wrote:
>
> On Thu, 04 Aug 2022, Alexei Starovoitov wrote:
>
> > On Wed, Aug 3, 2022 at 6:48 AM Lee Jones <lee@kernel.org> wrote:
> > >
> > > The documentation for find_pid() clearly states:
> > >
> > >   "Must be called with the tasklist_lock or rcu_read_lock() held."
> > >
> > > Presently we do neither.
> > >
> > > Let's use find_get_pid() which searches for the vpid, then takes a
> > > reference to it preventing early free, all within the safety of
> > > rcu_read_lock().  Once we have our reference we can safely make use of
> > > it up until the point it is put.
> > >
> > > Cc: Alexei Starovoitov <ast@kernel.org>
> > > Cc: Daniel Borkmann <daniel@iogearbox.net>
> > > Cc: John Fastabend <john.fastabend@gmail.com>
> > > Cc: Andrii Nakryiko <andrii@kernel.org>
> > > Cc: Martin KaFai Lau <martin.lau@linux.dev>
> > > Cc: Song Liu <song@kernel.org>
> > > Cc: Yonghong Song <yhs@fb.com>
> > > Cc: KP Singh <kpsingh@kernel.org>
> > > Cc: Stanislav Fomichev <sdf@google.com>
> > > Cc: Hao Luo <haoluo@google.com>
> > > Cc: Jiri Olsa <jolsa@kernel.org>
> > > Cc: bpf@vger.kernel.org
> > > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> > > Signed-off-by: Lee Jones <lee@kernel.org>
> > > ---
> > >
> > > v1 => v2:
> > >   * Commit log update - no code differences
> > >
> > >  kernel/bpf/syscall.c | 5 ++++-
> > >  1 file changed, 4 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> > > index 83c7136c5788d..c20cff30581c4 100644
> > > --- a/kernel/bpf/syscall.c
> > > +++ b/kernel/bpf/syscall.c
> > > @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> > >         const struct perf_event *event;
> > >         struct task_struct *task;
> > >         struct file *file;
> > > +       struct pid *ppid;
> > >         int err;
> > >
> > >         if (CHECK_ATTR(BPF_TASK_FD_QUERY))
> > > @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> > >         if (attr->task_fd_query.flags != 0)
> > >                 return -EINVAL;
> > >
> > > -       task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
> > > +       ppid = find_get_pid(pid);
> > > +       task = get_pid_task(ppid, PIDTYPE_PID);
> > > +       put_pid(ppid);
> >
> > rcu_read_lock/unlock around this line
> > would be a cheaper and faster alternative than pid's
> > refcount inc/dec.
>
> This was already discussed here:
>
> https://lore.kernel.org/all/YtsFT1yFtb7UW2Xu@krava/

Since several people thought about rcu_read_lock instead of your
approach it means that it's preferred.
Sooner or later somebody will send a patch to optimize
refcnt into rcu_read_lock.
So let's avoid the churn and do it now.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-09 14:38     ` Alexei Starovoitov
@ 2022-08-10 11:03       ` Lee Jones
  2022-08-10 11:52         ` Jiri Olsa
  2022-08-10 15:09         ` Yonghong Song
  0 siblings, 2 replies; 9+ messages in thread
From: Lee Jones @ 2022-08-10 11:03 UTC (permalink / raw)
  To: Alexei Starovoitov
  Cc: LKML, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
	Andrii Nakryiko, Martin KaFai Lau, Song Liu, Yonghong Song,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf

On Tue, 09 Aug 2022, Alexei Starovoitov wrote:

> On Mon, Aug 8, 2022 at 11:50 PM Lee Jones <lee@kernel.org> wrote:
> >
> > On Thu, 04 Aug 2022, Alexei Starovoitov wrote:
> >
> > > On Wed, Aug 3, 2022 at 6:48 AM Lee Jones <lee@kernel.org> wrote:
> > > >
> > > > The documentation for find_pid() clearly states:
> > > >
> > > >   "Must be called with the tasklist_lock or rcu_read_lock() held."
> > > >
> > > > Presently we do neither.
> > > >
> > > > Let's use find_get_pid() which searches for the vpid, then takes a
> > > > reference to it preventing early free, all within the safety of
> > > > rcu_read_lock().  Once we have our reference we can safely make use of
> > > > it up until the point it is put.
> > > >
> > > > Cc: Alexei Starovoitov <ast@kernel.org>
> > > > Cc: Daniel Borkmann <daniel@iogearbox.net>
> > > > Cc: John Fastabend <john.fastabend@gmail.com>
> > > > Cc: Andrii Nakryiko <andrii@kernel.org>
> > > > Cc: Martin KaFai Lau <martin.lau@linux.dev>
> > > > Cc: Song Liu <song@kernel.org>
> > > > Cc: Yonghong Song <yhs@fb.com>
> > > > Cc: KP Singh <kpsingh@kernel.org>
> > > > Cc: Stanislav Fomichev <sdf@google.com>
> > > > Cc: Hao Luo <haoluo@google.com>
> > > > Cc: Jiri Olsa <jolsa@kernel.org>
> > > > Cc: bpf@vger.kernel.org
> > > > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> > > > Signed-off-by: Lee Jones <lee@kernel.org>
> > > > ---
> > > >
> > > > v1 => v2:
> > > >   * Commit log update - no code differences
> > > >
> > > >  kernel/bpf/syscall.c | 5 ++++-
> > > >  1 file changed, 4 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> > > > index 83c7136c5788d..c20cff30581c4 100644
> > > > --- a/kernel/bpf/syscall.c
> > > > +++ b/kernel/bpf/syscall.c
> > > > @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> > > >         const struct perf_event *event;
> > > >         struct task_struct *task;
> > > >         struct file *file;
> > > > +       struct pid *ppid;
> > > >         int err;
> > > >
> > > >         if (CHECK_ATTR(BPF_TASK_FD_QUERY))
> > > > @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> > > >         if (attr->task_fd_query.flags != 0)
> > > >                 return -EINVAL;
> > > >
> > > > -       task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
> > > > +       ppid = find_get_pid(pid);
> > > > +       task = get_pid_task(ppid, PIDTYPE_PID);
> > > > +       put_pid(ppid);
> > >
> > > rcu_read_lock/unlock around this line
> > > would be a cheaper and faster alternative than pid's
> > > refcount inc/dec.
> >
> > This was already discussed here:
> >
> > https://lore.kernel.org/all/YtsFT1yFtb7UW2Xu@krava/
> 
> Since several people thought about rcu_read_lock instead of your
> approach it means that it's preferred.
> Sooner or later somebody will send a patch to optimize
> refcnt into rcu_read_lock.
> So let's avoid the churn and do it now.

I'm not wed to either approach.  Please discuss it with Yonghong and
Jiri and I'll do whatever is agreed upon.

-- 
Lee Jones [李琼斯]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-10 11:03       ` Lee Jones
@ 2022-08-10 11:52         ` Jiri Olsa
  2022-08-10 15:09         ` Yonghong Song
  1 sibling, 0 replies; 9+ messages in thread
From: Jiri Olsa @ 2022-08-10 11:52 UTC (permalink / raw)
  To: Lee Jones
  Cc: Alexei Starovoitov, LKML, Alexei Starovoitov, Daniel Borkmann,
	John Fastabend, Andrii Nakryiko, Martin KaFai Lau, Song Liu,
	Yonghong Song, KP Singh, Stanislav Fomichev, Hao Luo, bpf

On Wed, Aug 10, 2022 at 12:03:33PM +0100, Lee Jones wrote:
> On Tue, 09 Aug 2022, Alexei Starovoitov wrote:
> 
> > On Mon, Aug 8, 2022 at 11:50 PM Lee Jones <lee@kernel.org> wrote:
> > >
> > > On Thu, 04 Aug 2022, Alexei Starovoitov wrote:
> > >
> > > > On Wed, Aug 3, 2022 at 6:48 AM Lee Jones <lee@kernel.org> wrote:
> > > > >
> > > > > The documentation for find_pid() clearly states:
> > > > >
> > > > >   "Must be called with the tasklist_lock or rcu_read_lock() held."
> > > > >
> > > > > Presently we do neither.
> > > > >
> > > > > Let's use find_get_pid() which searches for the vpid, then takes a
> > > > > reference to it preventing early free, all within the safety of
> > > > > rcu_read_lock().  Once we have our reference we can safely make use of
> > > > > it up until the point it is put.
> > > > >
> > > > > Cc: Alexei Starovoitov <ast@kernel.org>
> > > > > Cc: Daniel Borkmann <daniel@iogearbox.net>
> > > > > Cc: John Fastabend <john.fastabend@gmail.com>
> > > > > Cc: Andrii Nakryiko <andrii@kernel.org>
> > > > > Cc: Martin KaFai Lau <martin.lau@linux.dev>
> > > > > Cc: Song Liu <song@kernel.org>
> > > > > Cc: Yonghong Song <yhs@fb.com>
> > > > > Cc: KP Singh <kpsingh@kernel.org>
> > > > > Cc: Stanislav Fomichev <sdf@google.com>
> > > > > Cc: Hao Luo <haoluo@google.com>
> > > > > Cc: Jiri Olsa <jolsa@kernel.org>
> > > > > Cc: bpf@vger.kernel.org
> > > > > Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
> > > > > Signed-off-by: Lee Jones <lee@kernel.org>
> > > > > ---
> > > > >
> > > > > v1 => v2:
> > > > >   * Commit log update - no code differences
> > > > >
> > > > >  kernel/bpf/syscall.c | 5 ++++-
> > > > >  1 file changed, 4 insertions(+), 1 deletion(-)
> > > > >
> > > > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
> > > > > index 83c7136c5788d..c20cff30581c4 100644
> > > > > --- a/kernel/bpf/syscall.c
> > > > > +++ b/kernel/bpf/syscall.c
> > > > > @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> > > > >         const struct perf_event *event;
> > > > >         struct task_struct *task;
> > > > >         struct file *file;
> > > > > +       struct pid *ppid;
> > > > >         int err;
> > > > >
> > > > >         if (CHECK_ATTR(BPF_TASK_FD_QUERY))
> > > > > @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
> > > > >         if (attr->task_fd_query.flags != 0)
> > > > >                 return -EINVAL;
> > > > >
> > > > > -       task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
> > > > > +       ppid = find_get_pid(pid);
> > > > > +       task = get_pid_task(ppid, PIDTYPE_PID);
> > > > > +       put_pid(ppid);
> > > >
> > > > rcu_read_lock/unlock around this line
> > > > would be a cheaper and faster alternative than pid's
> > > > refcount inc/dec.
> > >
> > > This was already discussed here:
> > >
> > > https://lore.kernel.org/all/YtsFT1yFtb7UW2Xu@krava/
> > 
> > Since several people thought about rcu_read_lock instead of your
> > approach it means that it's preferred.
> > Sooner or later somebody will send a patch to optimize
> > refcnt into rcu_read_lock.
> > So let's avoid the churn and do it now.
> 
> I'm not wed to either approach.  Please discuss it with Yonghong and
> Jiri and I'll do whatever is agreed upon.

yea, I thought using rcu_read_lock would be better, but I did not
have strong feelings against doing the pid's refcount inc/dec when
Yonghong supported that.. now with Alexei it's 2 against 1 in favour
of using rcu_read_lock ;-)

jirka

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid()
  2022-08-10 11:03       ` Lee Jones
  2022-08-10 11:52         ` Jiri Olsa
@ 2022-08-10 15:09         ` Yonghong Song
  1 sibling, 0 replies; 9+ messages in thread
From: Yonghong Song @ 2022-08-10 15:09 UTC (permalink / raw)
  To: Lee Jones, Alexei Starovoitov
  Cc: LKML, Alexei Starovoitov, Daniel Borkmann, John Fastabend,
	Andrii Nakryiko, Martin KaFai Lau, Song Liu, KP Singh,
	Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf



On 8/10/22 4:03 AM, Lee Jones wrote:
> On Tue, 09 Aug 2022, Alexei Starovoitov wrote:
> 
>> On Mon, Aug 8, 2022 at 11:50 PM Lee Jones <lee@kernel.org> wrote:
>>>
>>> On Thu, 04 Aug 2022, Alexei Starovoitov wrote:
>>>
>>>> On Wed, Aug 3, 2022 at 6:48 AM Lee Jones <lee@kernel.org> wrote:
>>>>>
>>>>> The documentation for find_pid() clearly states:
>>>>>
>>>>>    "Must be called with the tasklist_lock or rcu_read_lock() held."
>>>>>
>>>>> Presently we do neither.
>>>>>
>>>>> Let's use find_get_pid() which searches for the vpid, then takes a
>>>>> reference to it preventing early free, all within the safety of
>>>>> rcu_read_lock().  Once we have our reference we can safely make use of
>>>>> it up until the point it is put.
>>>>>
>>>>> Cc: Alexei Starovoitov <ast@kernel.org>
>>>>> Cc: Daniel Borkmann <daniel@iogearbox.net>
>>>>> Cc: John Fastabend <john.fastabend@gmail.com>
>>>>> Cc: Andrii Nakryiko <andrii@kernel.org>
>>>>> Cc: Martin KaFai Lau <martin.lau@linux.dev>
>>>>> Cc: Song Liu <song@kernel.org>
>>>>> Cc: Yonghong Song <yhs@fb.com>
>>>>> Cc: KP Singh <kpsingh@kernel.org>
>>>>> Cc: Stanislav Fomichev <sdf@google.com>
>>>>> Cc: Hao Luo <haoluo@google.com>
>>>>> Cc: Jiri Olsa <jolsa@kernel.org>
>>>>> Cc: bpf@vger.kernel.org
>>>>> Fixes: 41bdc4b40ed6f ("bpf: introduce bpf subcommand BPF_TASK_FD_QUERY")
>>>>> Signed-off-by: Lee Jones <lee@kernel.org>
>>>>> ---
>>>>>
>>>>> v1 => v2:
>>>>>    * Commit log update - no code differences
>>>>>
>>>>>   kernel/bpf/syscall.c | 5 ++++-
>>>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
>>>>> index 83c7136c5788d..c20cff30581c4 100644
>>>>> --- a/kernel/bpf/syscall.c
>>>>> +++ b/kernel/bpf/syscall.c
>>>>> @@ -4385,6 +4385,7 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
>>>>>          const struct perf_event *event;
>>>>>          struct task_struct *task;
>>>>>          struct file *file;
>>>>> +       struct pid *ppid;
>>>>>          int err;
>>>>>
>>>>>          if (CHECK_ATTR(BPF_TASK_FD_QUERY))
>>>>> @@ -4396,7 +4397,9 @@ static int bpf_task_fd_query(const union bpf_attr *attr,
>>>>>          if (attr->task_fd_query.flags != 0)
>>>>>                  return -EINVAL;
>>>>>
>>>>> -       task = get_pid_task(find_vpid(pid), PIDTYPE_PID);
>>>>> +       ppid = find_get_pid(pid);
>>>>> +       task = get_pid_task(ppid, PIDTYPE_PID);
>>>>> +       put_pid(ppid);
>>>>
>>>> rcu_read_lock/unlock around this line
>>>> would be a cheaper and faster alternative than pid's
>>>> refcount inc/dec.
>>>
>>> This was already discussed here:
>>>
>>> https://lore.kernel.org/all/YtsFT1yFtb7UW2Xu@krava/
>>
>> Since several people thought about rcu_read_lock instead of your
>> approach it means that it's preferred.
>> Sooner or later somebody will send a patch to optimize
>> refcnt into rcu_read_lock.
>> So let's avoid the churn and do it now.
> 
> I'm not wed to either approach.  Please discuss it with Yonghong and
> Jiri and I'll do whatever is agreed upon.

Hi, Lee, Let us just do rcu_read_lock() approach then. I am okay with 
that. Thanks!

> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-08-10 15:09 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-03 13:48 [PATCH v2 1/1] bpf: Drop unprotected find_vpid() in favour of find_get_pid() Lee Jones
2022-08-03 15:27 ` Jiri Olsa
2022-08-09  6:50   ` Lee Jones
2022-08-04 17:16 ` Alexei Starovoitov
2022-08-09  6:50   ` Lee Jones
2022-08-09 14:38     ` Alexei Starovoitov
2022-08-10 11:03       ` Lee Jones
2022-08-10 11:52         ` Jiri Olsa
2022-08-10 15:09         ` Yonghong Song

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.