From: Andrii Nakryiko <andrii.nakryiko@xxxxxxxxx> Date: Wed, 11 Aug 2021 14:15:50 -0700 > On Tue, Aug 10, 2021 at 2:29 AM Kuniyuki Iwashima <kuniyu@xxxxxxxxxxxx> wrote: > > > > /proc/net/unix uses "%c" to print a single-byte character to escape '\0' in > > the name of the abstract UNIX domain socket. The following selftest uses > > it, so this patch adds support for "%c". Note that it does not support > > wide character ("%lc" and "%llc") for simplicity. > > > > Signed-off-by: Kuniyuki Iwashima <kuniyu@xxxxxxxxxxxx> > > --- > > kernel/bpf/helpers.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c > > index 15746f779fe1..6d3aaf94e9ac 100644 > > --- a/kernel/bpf/helpers.c > > +++ b/kernel/bpf/helpers.c > > @@ -907,6 +907,20 @@ int bpf_bprintf_prepare(char *fmt, u32 fmt_size, const u64 *raw_args, > > tmp_buf += err; > > num_spec++; > > > > + continue; > > + } else if (fmt[i] == 'c') { > > you are adding new features to printk-like helpers, please add > corresponding tests as well. I'm particularly curious how something > like "% 9c" (which is now allowed, along with a few other unusual > combinations) will work. I see. I'll add a test. I'm now thinking of test like: 1. pin the bpf prog that outputs "% 9c" and other format strings. 2. read and validate it Is there any related test ? and is there other complicated fomat strings to test ? Also, "% 9c" worked as is :) ---8<--- $ sudo ./tools/bpftool/bpftool iter pin ./bpf_iter_unix.o /sys/fs/bpf/unix $ sudo cat /sys/fs/bpf/unix | head -n 1 a $ git diff diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_unix.c b/tools/testing/selftests/bpf/progs/bpf_iter_unix.c index ad397e2962cf..8a7d5aa4c054 100644 --- a/tools/testing/selftests/bpf/progs/bpf_iter_unix.c +++ b/tools/testing/selftests/bpf/progs/bpf_iter_unix.c @@ -34,8 +34,10 @@ int dump_unix(struct bpf_iter__unix *ctx) seq = ctx->meta->seq; seq_num = ctx->meta->seq_num; - if (seq_num == 0) + if (seq_num == 0) { + BPF_SEQ_PRINTF(seq, "% 9c\n", 'a'); BPF_SEQ_PRINTF(seq, "Num RefCount Protocol Flags Type St Inode Path\n"); + } BPF_SEQ_PRINTF(seq, "%pK: %08X %08X %08X %04X %02X %8lu", unix_sk, ---8<--- > > > + if (!tmp_buf) > > + goto nocopy_fmt; > > + > > + if (tmp_buf_end == tmp_buf) { > > + err = -ENOSPC; > > + goto out; > > + } > > + > > + *tmp_buf = raw_args[num_spec]; > > + tmp_buf++; > > + num_spec++; > > + > > continue; > > } > > > > -- > > 2.30.2