From: Kuniyuki Iwashima <kuniyu@google.com>
To: Breno Leitao <leitao@debian.org>
Cc: Jiayuan Chen <jiayuan.chen@linux.dev>,
acme@kernel.org, netdev@vger.kernel.org, llvm@lists.linux.dev,
ast@kernel.org, yonghong.song@linux.dev, bpf@vger.kernel.org,
kuba@kernel.org, tj@kernel.org
Subject: Re: [BUG] bpf: tcp: bpf_tcp_ops_set_rcvlowat() missing from BTF with clang KCSAN
Date: Fri, 6 Nov 2026 19:05:25 +0000 [thread overview]
Message-ID: <au4kpSGVSH3tYiZm@google.com> (raw)
In-Reply-To: <au347UiVUe5oUuxM@gmail.com>
On Fri, 06 Nov 2026 07:58:01 -0800, Breno Leitao wrote:
> On Fri, Nov 06, 2026 at 09:16:24PM +0800, Jiayuan Chen wrote:
> > Thanks for the report !
> >
> >
> > On 11/6/26 7:38 PM, Breno Leitao wrote:
> > > My arm64 KCSAN builds of linux-next fail since next-20261015, because
> > > bpf_tcp_ops_set_rcvlowat() is missing from the vmlinux BTF:
> > >
> > > WARN: resolve_btfids: no BTF func for kfunc bpf_tcp_ops_set_rcvlowat in bpf_tcp_ops_set_rcvlowat_kfunc_set
> > > WARN: resolve_btfids: unresolved symbol bpf_tcp_ops_set_rcvlowat
> > > Failed to generate BTF for vmlinux
> > > Try to disable CONFIG_DEBUG_INFO_BTF
> > > make[4]: *** [scripts/Makefile.vmlinux:72: vmlinux.unstripped] Error 1
> >
> >
> >
> > Has pahole fixed this issue?
>
> I don't think so, see the line below:
Could you try this ?
---8<---
diff --git a/dwarf_loader.c b/dwarf_loader.c
index 01049e9802a3..92793ae6cf98 100644
--- a/dwarf_loader.c
+++ b/dwarf_loader.c
@@ -1782,18 +1782,32 @@ static uint64_t dwarf_op__const_value(const Dwarf_Op *op)
return op->number;
}
+static bool cu__is_arg_reg(const struct cu *cu, int reg)
+{
+ if (cu->register_params[0] < 0)
+ return reg >= DW_OP_reg0;
+
+ for (int i = 0; i < cu->nr_register_params; i++) {
+ if (cu->register_params[i] == reg)
+ return true;
+ }
+ return false;
+}
+
static void parameter__set_loc_reg(struct parameter *parm, int reg)
{
if (parm->loc_reg == PARAMETER_UNKNOWN_REG)
parm->loc_reg = reg;
}
-static void parameter__record_loc_reg(struct parameter *parm, int reg,
- int64_t offset, bool is_deref,
- uint8_t size)
+static void parameter__record_loc_reg(struct parameter *parm, const struct cu *cu,
+ bool for_inline, int reg, int64_t offset,
+ bool is_deref, uint8_t size)
{
if (reg < DW_OP_reg0 || !size)
return;
+ if (!for_inline && (is_deref || !cu__is_arg_reg(cu, reg)))
+ return;
parameter__set_loc_reg(parm, reg);
@@ -1920,7 +1934,8 @@ static void parameter__finish_piece_decode(struct parameter *parm, Dwarf_Die *di
* ABI-preserved or should be replaced by the single used member candidate.
*/
static void parameter__multi_exprs(Dwarf_Op *expr, int loc_num, struct cu *cu,
- size_t exprlen, struct parameter *parm)
+ size_t exprlen, struct parameter *parm,
+ bool for_inline)
{
int regs[2], nregs = 0;
uint64_t piece_size = 0;
@@ -1951,11 +1966,12 @@ static void parameter__multi_exprs(Dwarf_Op *expr, int loc_num, struct cu *cu,
switch (expr[0].atom) {
case DW_OP_reg0 ... DW_OP_reg31:
if (loc_num == 0)
- parameter__record_loc_reg(parm, expr[0].atom, 0, false, size);
+ parameter__record_loc_reg(parm, cu, for_inline, expr[0].atom,
+ 0, false, size);
return;
case DW_OP_breg0 ... DW_OP_breg31:
if (loc_num == 0)
- parameter__record_loc_reg(parm,
+ parameter__record_loc_reg(parm, cu, for_inline,
expr[0].atom - DW_OP_breg0 + DW_OP_reg0,
dwarf_op__snumber(&expr[0]),
!had_stack_value, size);
@@ -1994,14 +2010,15 @@ static void parameter__multi_exprs(Dwarf_Op *expr, int loc_num, struct cu *cu,
if (off < cu->addr_size || parm->loc_reg == PARAMETER_UNKNOWN_REG) {
uint8_t size = parameter__loc_size(parm, cu);
- parameter__record_loc_reg(parm, expr[i].atom, 0, false, size);
+ parameter__record_loc_reg(parm, cu, for_inline, expr[i].atom,
+ 0, false, size);
}
} else {
reg_pieces = false;
}
}
- if (loc_num == 0 && reg_pieces && nregs == ARRAY_SIZE(regs) &&
+ if (for_inline && loc_num == 0 && reg_pieces && nregs == ARRAY_SIZE(regs) &&
piece_size == parm->type_byte_size)
parameter__record_loc_reg_pair(parm, DW_OP_reg0 + regs[0],
DW_OP_reg0 + regs[1]);
@@ -2009,7 +2026,7 @@ static void parameter__multi_exprs(Dwarf_Op *expr, int loc_num, struct cu *cu,
static void parameter__decode_location(Dwarf_Attribute *attr, struct conf_load *conf,
struct cu *cu, Dwarf_Die *die,
- struct parameter *parm)
+ struct parameter *parm, bool for_inline)
{
Dwarf_Addr base, start, end;
Dwarf_Op *expr, *entry_ops;
@@ -2051,7 +2068,7 @@ static void parameter__decode_location(Dwarf_Attribute *attr, struct conf_load *
continue;
if (exprlen != 1) {
- parameter__multi_exprs(expr, loc_num, cu, exprlen, parm);
+ parameter__multi_exprs(expr, loc_num, cu, exprlen, parm, for_inline);
continue;
}
@@ -2060,11 +2077,12 @@ static void parameter__decode_location(Dwarf_Attribute *attr, struct conf_load *
switch (expr->atom) {
case DW_OP_reg0 ... DW_OP_reg31:
if (loc_num == 0)
- parameter__record_loc_reg(parm, expr->atom, 0, false, size);
+ parameter__record_loc_reg(parm, cu, for_inline, expr->atom,
+ 0, false, size);
break;
case DW_OP_breg0 ... DW_OP_breg31:
if (loc_num == 0)
- parameter__record_loc_reg(parm,
+ parameter__record_loc_reg(parm, cu, for_inline,
expr->atom - DW_OP_breg0 + DW_OP_reg0,
dwarf_op__snumber(expr),
had_deref || !had_stack_value,
@@ -2103,7 +2121,8 @@ static void parameter__decode_location(Dwarf_Attribute *attr, struct conf_load *
if (dwarf_getlocation_attr(attr, expr, &entry_attr) == 0 &&
dwarf_getlocation(&entry_attr, &entry_ops, &entry_len) == 0 &&
entry_len == 1 && dwarf_op__is_reg(entry_ops->atom))
- parameter__record_loc_reg(parm, entry_ops->atom, 0, false, size);
+ parameter__record_loc_reg(parm, cu, for_inline, entry_ops->atom,
+ 0, false, size);
break;
}
}
@@ -2171,7 +2190,8 @@ static struct parameter *parameter__new(Dwarf_Die *die, struct cu *cu, struct co
parameter__record_attr_const_value(&attr, cu, parm);
parm->has_loc = dwarf_attr(die, DW_AT_location, &attr) != NULL;
if (parm->has_loc)
- parameter__decode_location(&attr, conf, cu, die, parm);
+ parameter__decode_location(&attr, conf, cu, die, parm,
+ ftype == NULL);
}
return parm;
---8<---
next prev parent reply other threads:[~2026-11-06 19:05 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 11:38 [BUG] bpf: tcp: bpf_tcp_ops_set_rcvlowat() missing from BTF with clang KCSAN Breno Leitao
2026-11-06 13:16 ` Jiayuan Chen
2026-11-06 15:58 ` Breno Leitao
2026-11-06 19:05 ` Kuniyuki Iwashima [this message]
2026-11-09 12:33 ` Breno Leitao
2026-11-09 17:51 ` Arnaldo Carvalho de Melo
2026-11-10 5:40 ` netdev-bot+sashiko
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=au4kpSGVSH3tYiZm@google.com \
--to=kuniyu@google.com \
--cc=acme@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=jiayuan.chen@linux.dev \
--cc=kuba@kernel.org \
--cc=leitao@debian.org \
--cc=llvm@lists.linux.dev \
--cc=netdev@vger.kernel.org \
--cc=tj@kernel.org \
--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;
as well as URLs for NNTP newsgroup(s).