public inbox for bpf@vger.kernel.org
 help / color / mirror / Atom feed
From: Nam Cao <namcaov@gmail.com>
To: "Björn Töpel" <bjorn@kernel.org>
Cc: linux-riscv@lists.infradead.org, Guo Ren <guoren@kernel.org>,
	bpf@vger.kernel.org, Hou Tao <houtao@huaweicloud.com>,
	yonghong.song@linux.dev,
	Alexei Starovoitov <alexei.starovoitov@gmail.com>,
	Puranjay Mohan <puranjay12@gmail.com>
Subject: Re: RISC-V uprobe bug (Was: Re: WARNING: CPU: 3 PID: 261 at kernel/bpf/memalloc.c:342)
Date: Sun, 27 Aug 2023 11:39:00 +0200	[thread overview]
Message-ID: <ZOsZtH+5P0/R6kvd@nam-dell> (raw)
In-Reply-To: <87y1hw7t5p.fsf@all.your.base.are.belong.to.us>

On Sun, Aug 27, 2023 at 11:04:34AM +0200, Björn Töpel wrote:
> Nam Cao <namcaov@gmail.com> writes:
> 
> > On Sun, Aug 27, 2023 at 10:11:25AM +0200, Björn Töpel wrote:
> >> The default implementation of is_trap_insn() which RISC-V is using calls
> >> is_swbp_insn(), which is doing what your patch does. Your patch does not
> >> address the issue.
> >
> > is_swbp_insn() does this:
> >
> >         #ifdef CONFIG_RISCV_ISA_C
> >                 return (*insn & 0xffff) == UPROBE_SWBP_INSN;
> >         #else
> >                 return *insn == UPROBE_SWBP_INSN;
> >         #endif
> >
> > ...so it doesn't even check for 32-bit ebreak if C extension is on. My patch
> > is not the same.
> 
> Ah, was too quick.
> 
> AFAIU uprobes *always* uses c.ebreak when CONFIG_RISCV_ISA_C is set, and
> ebreak otherwise. That's the reason is_swbp_insn() is implemented like
> that.

That's what I understand too.

> If that's not the case, there's a another bug, that your patches
> addresses.

I think it's a bug regardless. is_trap_insn() is used by uprobes to figure out
if there is an instruction that generates trap exception, not just instructions
that are "SWBP". The reason is because when there is a trap, but uprobes doesn't
see a probe installed here, it needs is_trap_insn() to figure out if the trap
is generated by ebreak from something else, or because the probe is just removed.
In the latter case, uprobes will return back, because probe has already been removed,
so it should be safe to do so. That's why I think the incorrect is_swbp_insn()
would cause a hang, because uprobes incorrectly thinks there is no ebreak there,
so it should be okay to go back, but there actually is.

So, from my understanding, if uprobes encounter a 32-bit ebreak for any reason,
the kernel would hang. I think your patch is a great addition nonetheless, but I
am guessing that it only masks the problem by preventing uprobes from seeing the
32-bit ebreak in the specific test, not really solve it. So, if there is a 32-bit
ebreak in userspace, the bug still causes the kernel to hang.

I am still quite confident of my logic, so I would be very suprised if my fix
doesn't solve the reported hang. Do you mind testing my patch? My potato of a
laptop unfortunately cannot run the test :(

Best regards,
Nam

  reply	other threads:[~2023-08-27  9:39 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-25 10:32 WARNING: CPU: 3 PID: 261 at kernel/bpf/memalloc.c:342 Björn Töpel
2023-08-25 15:28 ` Yonghong Song
2023-08-25 18:53   ` Alexei Starovoitov
2023-08-25 19:49     ` Alexei Starovoitov
2023-08-25 21:31       ` Andrii Nakryiko
2023-08-26 22:49         ` Kumar Kartikeya Dwivedi
2023-08-26  3:48   ` Hou Tao
2023-08-26  9:23     ` Björn Töpel
2023-08-26 10:27       ` Hou Tao
2023-08-26 10:49         ` Björn Töpel
2023-08-27  8:37           ` Björn Töpel
2023-08-27 14:53             ` Yonghong Song
2023-08-28 13:57               ` Hou Tao
2023-08-29  0:54                 ` Yonghong Song
2023-08-29  7:26                 ` Björn Töpel
2023-08-29 11:46                   ` Björn Töpel
2023-08-30 12:15                     ` Hou Tao
2023-08-29 12:54                   ` Björn Töpel
2023-08-29 15:26                 ` Alexei Starovoitov
2023-08-30 12:08                   ` Hou Tao
2023-08-30 21:05                     ` Alexei Starovoitov
2023-08-26 13:44 ` RISC-V uprobe bug (Was: Re: WARNING: CPU: 3 PID: 261 at kernel/bpf/memalloc.c:342) Björn Töpel
2023-08-26 18:12   ` Nam Cao
2023-08-26 18:31     ` Nam Cao
2023-08-27  8:11     ` Björn Töpel
2023-08-27  8:35       ` Nam Cao
2023-08-27  9:04         ` Björn Töpel
2023-08-27  9:39           ` Nam Cao [this message]
2023-08-27 19:20             ` Björn Töpel
2023-08-27 19:41               ` Nam Cao
2023-08-27 20:15               ` Nam Cao

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZOsZtH+5P0/R6kvd@nam-dell \
    --to=namcaov@gmail.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=bjorn@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=guoren@kernel.org \
    --cc=houtao@huaweicloud.com \
    --cc=linux-riscv@lists.infradead.org \
    --cc=puranjay12@gmail.com \
    --cc=yonghong.song@linux.dev \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox