From nobody Sat Feb 7 21:14:47 2026 Received: from out-171.mta0.migadu.com (out-171.mta0.migadu.com [91.218.175.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB93236CDFB for ; Mon, 2 Feb 2026 14:41:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043288; cv=none; b=uD/iKSTIhq15hx7VpLwr+yVxazXqYg6wosnnGQq24xgjXblOXAm0IahapwCUau649yMPNMIb0cBsMIMiDErGUhWGiBwBLlez4Z5MBstFmMFMlAYvIpKlJxPD4N2ppwcyRwa17pN3BpG0r7X5V67GTtQu8mGWsNwtXoszt90vEDU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043288; c=relaxed/simple; bh=8611ZDges07A76Up+eMpDh8OqwpOEUfnmIdVKq+fFEs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mx2wNlHiRXSo6AyFgWO5lwRTb2K/Wrp8KYaEBj8x7alph+Du3AG71QPBQ1Sa1o85Lcu+Are/TyiMKiaryTWDZ4HA8lSzuZ+8dyxEpYQ5zRLUcakKCoA6k1gc5ybmnoagH5fdxewzocJ12jxnI2YpVdJv2dNVn2wCB126iVvQ5oM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=XLHE1k09; arc=none smtp.client-ip=91.218.175.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="XLHE1k09" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043284; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=SOP9FsLyggZ0t9qAXd0VsgAmwD5kRYUpSQzoquh1BzA=; b=XLHE1k09NjOU1oGyMjJtUOCi1StlL5o1TlswFOOVw3VMV2pis+4qYfPHyhkgpUb/ZHz79v owoOQn88Ylko60oOFst8WFtGNyDyYXRrTnnCxIzEBi+5/+IycAW1rhuwKo3wTGEw1MpQQv /7PVJXx/QdXJCgQ/6nlv4jqx2j9j5Y4= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 1/9] bpf: Extend BPF syscall with common attributes support Date: Mon, 2 Feb 2026 22:40:38 +0800 Message-ID: <20260202144046.30651-2-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Extend the BPF syscall to support a set of common attributes shared across all BPF commands: 1. 'log_buf': User-provided buffer for storing logs. 2. 'log_size': Size of the log buffer. 3. 'log_level': Log verbosity level. 4. 'log_true_size': The size of log reported by kernel. These common attributes are passed as the 4th argument to the BPF syscall, with the 5th argument specifying the size of this structure. To indicate the use of these common attributes from userspace, a new flag 'BPF_COMMON_ATTRS' ('1 << 16') is introduced. This flag is OR-ed into the 'cmd' field of the syscall. When 'cmd & BPF_COMMON_ATTRS' is set, the kernel will copy the common attributes from userspace into kernel space for use. Signed-off-by: Leon Hwang --- include/linux/syscalls.h | 3 ++- include/uapi/linux/bpf.h | 8 ++++++++ kernel/bpf/syscall.c | 25 +++++++++++++++++++++---- tools/include/uapi/linux/bpf.h | 8 ++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index cf84d98964b2..729659202d77 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -937,7 +937,8 @@ asmlinkage long sys_seccomp(unsigned int op, unsigned i= nt flags, asmlinkage long sys_getrandom(char __user *buf, size_t count, unsigned int flags); asmlinkage long sys_memfd_create(const char __user *uname_ptr, unsigned in= t flags); -asmlinkage long sys_bpf(int cmd, union bpf_attr __user *attr, unsigned int= size); +asmlinkage long sys_bpf(int cmd, union bpf_attr __user *attr, unsigned int= size, + struct bpf_common_attr __user *attr_common, unsigned int size_common); asmlinkage long sys_execveat(int dfd, const char __user *filename, const char __user *const __user *argv, const char __user *const __user *envp, int flags); diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index c8d400b7680a..b2126c9641ec 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -994,6 +994,7 @@ enum bpf_cmd { BPF_PROG_STREAM_READ_BY_FD, BPF_PROG_ASSOC_STRUCT_OPS, __MAX_BPF_CMD, + BPF_COMMON_ATTRS =3D 1 << 16, /* Indicate carrying syscall common attrs. = */ }; =20 enum bpf_map_type { @@ -1500,6 +1501,13 @@ struct bpf_stack_build_id { }; }; =20 +struct bpf_common_attr { + __u64 log_buf; + __u32 log_size; + __u32 log_level; + __u32 log_true_size; +}; + #define BPF_OBJ_NAME_LEN 16U =20 enum { diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 5f59dd47a5b1..a58b16735e86 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -6176,8 +6176,10 @@ static int prog_assoc_struct_ops(union bpf_attr *att= r) return ret; } =20 -static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr, unsigned int size) +static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr, unsigned int size, + bpfptr_t uattr_common, unsigned int size_common) { + struct bpf_common_attr attr_common; union bpf_attr attr; int err; =20 @@ -6191,6 +6193,20 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uatt= r, unsigned int size) if (copy_from_bpfptr(&attr, uattr, size) !=3D 0) return -EFAULT; =20 + memset(&attr_common, 0, sizeof(attr_common)); + if (cmd & BPF_COMMON_ATTRS) { + err =3D bpf_check_uarg_tail_zero(uattr_common, sizeof(attr_common), size= _common); + if (err) + return err; + + cmd &=3D ~BPF_COMMON_ATTRS; + size_common =3D min_t(u32, size_common, sizeof(attr_common)); + if (copy_from_bpfptr(&attr_common, uattr_common, size_common) !=3D 0) + return -EFAULT; + } else { + size_common =3D 0; + } + err =3D security_bpf(cmd, &attr, size, uattr.is_kernel); if (err < 0) return err; @@ -6326,9 +6342,10 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uatt= r, unsigned int size) return err; } =20 -SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned in= t, size) +SYSCALL_DEFINE5(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned in= t, size, + struct bpf_common_attr __user *, uattr_common, unsigned int, size_common) { - return __sys_bpf(cmd, USER_BPFPTR(uattr), size); + return __sys_bpf(cmd, USER_BPFPTR(uattr), size, USER_BPFPTR(uattr_common)= , size_common); } =20 static bool syscall_prog_is_valid_access(int off, int size, @@ -6359,7 +6376,7 @@ BPF_CALL_3(bpf_sys_bpf, int, cmd, union bpf_attr *, a= ttr, u32, attr_size) default: return -EINVAL; } - return __sys_bpf(cmd, KERNEL_BPFPTR(attr), attr_size); + return __sys_bpf(cmd, KERNEL_BPFPTR(attr), attr_size, KERNEL_BPFPTR(NULL)= , 0); } =20 =20 diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 5e38b4887de6..c4934c2370fd 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -994,6 +994,7 @@ enum bpf_cmd { BPF_PROG_STREAM_READ_BY_FD, BPF_PROG_ASSOC_STRUCT_OPS, __MAX_BPF_CMD, + BPF_COMMON_ATTRS =3D 1 << 16, /* Indicate carrying syscall common attrs. = */ }; =20 enum bpf_map_type { @@ -1500,6 +1501,13 @@ struct bpf_stack_build_id { }; }; =20 +struct bpf_common_attr { + __u64 log_buf; + __u32 log_size; + __u32 log_level; + __u32 log_true_size; +}; + #define BPF_OBJ_NAME_LEN 16U =20 enum { --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5783F36CE0E; Mon, 2 Feb 2026 14:41:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043298; cv=none; b=d0BlFC79mIHLpDWFR274EgFOa+rXIT/1scbi0cCVdRIwSf1l3yaoNgfPiG0bPmgymq2MkCAqpjpnXXIYlRjudxx2h+/DOVz2ufQa/NbUPmMboBbov7YbI3L13TaOE2JXzPVHNCT0NMJ9uLmse8VXWuBGz39MJ0zUtUTpt+DNuOg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043298; c=relaxed/simple; bh=zaHeGo39l7aEuaZEfB56y1SA/o4IPg0uaFbgQja2DE8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hbOGOmJb9oc0R3uXxSD8KgyiaG7Z331DIEwX9gfkBxJm/cL1lOXUVx3FS5zPJlZQA+Y6S5Hy+FLfngUFA8vCUqnuxGHdCLAtEzXka+bViYe0g4BR+hidqzlxgGy8UtaFoqz8hO5+MIVOkuOtFWnMjMQTRwYY6iTD3JCxNAOxF3U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=DUS2d9Dl; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="DUS2d9Dl" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043293; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=gu+RSjY5ZXq9VFl4b21GzQKsHQDjqCZoGYucoG6n0Lw=; b=DUS2d9DljdUgomFx8gIdL3IroisXYzzO5lniXShtkR1i3rmcexzdM0/uzHAoZbXDog8rJn a9mOKCkGlztJ/TokmV98Tbk4AH6zk5PnyCmSh/3TZk7rbXvhgMw1o8MdDpaREKbj3cIird eff87aZvnKVn6tW/TJDB9N6ge1mD4Og= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 2/9] libbpf: Add support for extended bpf syscall Date: Mon, 2 Feb 2026 22:40:39 +0800 Message-ID: <20260202144046.30651-3-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" To support the extended BPF syscall introduced in the previous commit, introduce the following internal APIs: * 'sys_bpf_ext()' * 'sys_bpf_ext_fd()' They wrap the raw 'syscall()' interface to support passing extended attributes. * 'probe_sys_bpf_ext()' Check whether current kernel supports the BPF syscall common attributes. Signed-off-by: Leon Hwang Acked-by: Andrii Nakryiko --- tools/lib/bpf/bpf.c | 36 +++++++++++++++++++++++++++++++++ tools/lib/bpf/features.c | 8 ++++++++ tools/lib/bpf/libbpf_internal.h | 3 +++ 3 files changed, 47 insertions(+) diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 5846de364209..9d8740761b7a 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -69,6 +69,42 @@ static inline __u64 ptr_to_u64(const void *ptr) return (__u64) (unsigned long) ptr; } =20 +static inline int sys_bpf_ext(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size, + struct bpf_common_attr *attr_common, + unsigned int size_common) +{ + cmd =3D attr_common ? (cmd | BPF_COMMON_ATTRS) : (cmd & ~BPF_COMMON_ATTRS= ); + return syscall(__NR_bpf, cmd, attr, size, attr_common, size_common); +} + +static inline int sys_bpf_ext_fd(enum bpf_cmd cmd, union bpf_attr *attr, + unsigned int size, + struct bpf_common_attr *attr_common, + unsigned int size_common) +{ + int fd; + + fd =3D sys_bpf_ext(cmd, attr, size, attr_common, size_common); + return ensure_good_fd(fd); +} + +int probe_sys_bpf_ext(void) +{ + const size_t attr_sz =3D offsetofend(union bpf_attr, prog_token_fd); + union bpf_attr attr; + int fd; + + memset(&attr, 0, attr_sz); + fd =3D syscall(__NR_bpf, BPF_PROG_LOAD | BPF_COMMON_ATTRS, &attr, attr_sz= , NULL, + sizeof(struct bpf_common_attr)); + if (fd >=3D 0) { + close(fd); + return -EINVAL; + } + return errno =3D=3D EFAULT ? 1 : 0; +} + static inline int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, unsigned int size) { diff --git a/tools/lib/bpf/features.c b/tools/lib/bpf/features.c index b842b83e2480..e0d646a9e233 100644 --- a/tools/lib/bpf/features.c +++ b/tools/lib/bpf/features.c @@ -506,6 +506,11 @@ static int probe_kern_arg_ctx_tag(int token_fd) return probe_fd(prog_fd); } =20 +static int probe_bpf_syscall_common_attrs(int token_fd) +{ + return probe_sys_bpf_ext(); +} + typedef int (*feature_probe_fn)(int /* token_fd */); =20 static struct kern_feature_cache feature_cache; @@ -581,6 +586,9 @@ static struct kern_feature_desc { [FEAT_BTF_QMARK_DATASEC] =3D { "BTF DATASEC names starting from '?'", probe_kern_btf_qmark_datasec, }, + [FEAT_BPF_SYSCALL_COMMON_ATTRS] =3D { + "BPF syscall common attributes support", probe_bpf_syscall_common_attrs, + }, }; =20 bool feat_supported(struct kern_feature_cache *cache, enum kern_feature_id= feat_id) diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_interna= l.h index fc59b21b51b5..aa16be869c4f 100644 --- a/tools/lib/bpf/libbpf_internal.h +++ b/tools/lib/bpf/libbpf_internal.h @@ -392,6 +392,8 @@ enum kern_feature_id { FEAT_ARG_CTX_TAG, /* Kernel supports '?' at the front of datasec names */ FEAT_BTF_QMARK_DATASEC, + /* Kernel supports BPF syscall common attributes */ + FEAT_BPF_SYSCALL_COMMON_ATTRS, __FEAT_CNT, }; =20 @@ -757,4 +759,5 @@ int probe_fd(int fd); #define SHA256_DWORD_SIZE SHA256_DIGEST_LENGTH / sizeof(__u64) =20 void libbpf_sha256(const void *data, size_t len, __u8 out[SHA256_DIGEST_LE= NGTH]); +int probe_sys_bpf_ext(void); #endif /* __LIBBPF_LIBBPF_INTERNAL_H */ --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-174.mta0.migadu.com (out-174.mta0.migadu.com [91.218.175.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F336336BCF0 for ; Mon, 2 Feb 2026 14:41:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043322; cv=none; b=liTthsuBFtxfQyW2YQXiQH1m0bsGab2zXwhUDcvtrRkmWnB0E7G6/t9GzilJHCjklsLnhVKgY/FYlg0Gu+eadc8xRlKQEobDXVqX+iwMyQl4cjWKYpTtAIWYIW3+Uua0jfkBK9+e0lvwxI2anSW07hAcjcUxUrU+nVJ1sLW+DAs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043322; c=relaxed/simple; bh=OLINK77zLE0/2024ngE2NugH7GfEov5zMrEa2nfiX7E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=svHyYap+Q/ivR+Im/q1yY0Y7Lxv4LUlmwNBQL6voVCZXwero+6x799U53Wa1UsxwLgqHypfDmGCaziijNS3PuZ/xruq6Py52R21ZOzf8sAAL+BCz4Iq8LNOG2pms8M/hYdMzXSIGxYEeNuXcAukEwYiGkVLL+HwVXM1AjlWWAec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=atLp7tqg; arc=none smtp.client-ip=91.218.175.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="atLp7tqg" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043316; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2l5Tnb3N0v3njCJOSctRwBXm4lpCrQLco3FHnGD3tAk=; b=atLp7tqgCAmMtgGk1WqLqnyQRy2z0xAsHBkkXKum28ArjtNJvHjZ84p81Oqa6okkTOKfUR 40sSO0NiX/FDI1GUZK3EYNrBqKtwwOyLEsEguauCA5jH2E0vj9m2BThap/D5hcV0Sk6dv4 eUg+zyrrKRvtXVAOJ4Zi2C0wAMm88R0= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 3/9] bpf: Refactor reporting log_true_size for prog_load Date: Mon, 2 Feb 2026 22:40:40 +0800 Message-ID: <20260202144046.30651-4-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" The next commit will add support for reporting logs via extended common attributes, including 'log_true_size'. To prepare for that, refactor the 'log_true_size' reporting logic by introducing a new struct bpf_log_attr to encapsulate log-related behavior: * bpf_prog_load_log_attr_init(): initialize the log fields, which will support extended common attributes in the next commit. * bpf_log_attr_finalize(): handle log finalization and write back 'log_true_size' to userspace. Signed-off-by: Leon Hwang --- include/linux/bpf.h | 4 +++- include/linux/bpf_verifier.h | 10 ++++++++++ kernel/bpf/log.c | 35 +++++++++++++++++++++++++++++++++++ kernel/bpf/syscall.c | 8 +++++--- kernel/bpf/verifier.c | 13 +++---------- 5 files changed, 56 insertions(+), 14 deletions(-) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index cd9b96434904..d4dbcc7ad156 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -2913,7 +2913,9 @@ int bpf_check_uarg_tail_zero(bpfptr_t uaddr, size_t e= xpected_size, size_t actual_size); =20 /* verify correctness of eBPF program */ -int bpf_check(struct bpf_prog **fp, union bpf_attr *attr, bpfptr_t uattr, = u32 uattr_size); +struct bpf_log_attr; +int bpf_check(struct bpf_prog **fp, union bpf_attr *attr, bpfptr_t uattr, + struct bpf_log_attr *attr_log); =20 #ifndef CONFIG_BPF_JIT_ALWAYS_ON void bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth); diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 8355b585cd18..c805b85b6f7a 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -631,6 +631,16 @@ static inline bool bpf_verifier_log_needed(const struc= t bpf_verifier_log *log) return log && log->level; } =20 +struct bpf_log_attr { + u32 offsetof_true_size; + u32 uattr_size; + bpfptr_t uattr; +}; + +int bpf_prog_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_a= ttr *attr, + bpfptr_t uattr, u32 size); +int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log); + #define BPF_MAX_SUBPROGS 256 =20 struct bpf_subprog_arg_info { diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c index a0c3b35de2ce..ff579fcba36f 100644 --- a/kernel/bpf/log.c +++ b/kernel/bpf/log.c @@ -863,3 +863,38 @@ void print_insn_state(struct bpf_verifier_env *env, co= nst struct bpf_verifier_st } print_verifier_state(env, vstate, frameno, false); } + +static void bpf_log_attr_init(struct bpf_log_attr *attr_log, int offsetof_= true_size, bpfptr_t uattr, + u32 uattr_size) +{ + memset(attr_log, 0, sizeof(*attr_log)); + attr_log->offsetof_true_size =3D offsetof_true_size; + attr_log->uattr_size =3D uattr_size; + attr_log->uattr =3D uattr; +} + +int bpf_prog_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_a= ttr *attr, + bpfptr_t uattr, u32 size) +{ + bpf_log_attr_init(attr_log, offsetof(union bpf_attr, log_true_size), uatt= r, size); + return 0; +} + +int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log) +{ + u32 log_true_size; + size_t size; + int err; + + if (!log) + return 0; + + err =3D bpf_vlog_finalize(log, &log_true_size); + + size =3D sizeof(log_true_size); + if (attr->uattr_size >=3D attr->offsetof_true_size + size && + copy_to_bpfptr_offset(attr->uattr, attr->offsetof_true_size, &log_tru= e_size, size)) + err =3D -EFAULT; + + return err; +} diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index a58b16735e86..e81199361241 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -2860,7 +2860,7 @@ static int bpf_prog_mark_insn_arrays_ready(struct bpf= _prog *prog) /* last field in 'union bpf_attr' used by this command */ #define BPF_PROG_LOAD_LAST_FIELD keyring_id =20 -static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr, u32 uattr_s= ize) +static int bpf_prog_load(union bpf_attr *attr, bpfptr_t uattr, struct bpf_= log_attr *attr_log) { enum bpf_prog_type type =3D attr->prog_type; struct bpf_prog *prog, *dst_prog =3D NULL; @@ -3078,7 +3078,7 @@ static int bpf_prog_load(union bpf_attr *attr, bpfptr= _t uattr, u32 uattr_size) goto free_prog_sec; =20 /* run eBPF verifier */ - err =3D bpf_check(&prog, attr, uattr, uattr_size); + err =3D bpf_check(&prog, attr, uattr, attr_log); if (err < 0) goto free_used_maps; =20 @@ -6180,6 +6180,7 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr= , unsigned int size, bpfptr_t uattr_common, unsigned int size_common) { struct bpf_common_attr attr_common; + struct bpf_log_attr attr_log; union bpf_attr attr; int err; =20 @@ -6231,7 +6232,8 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr= , unsigned int size, err =3D map_freeze(&attr); break; case BPF_PROG_LOAD: - err =3D bpf_prog_load(&attr, uattr, size); + err =3D bpf_prog_load_log_attr_init(&attr_log, &attr, uattr, size); + err =3D err ?: bpf_prog_load(&attr, uattr, &attr_log); break; case BPF_OBJ_PIN: err =3D bpf_obj_pin(&attr); diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 6b62b6d57175..1489867671e0 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -25604,12 +25604,12 @@ static int compute_scc(struct bpf_verifier_env *e= nv) return err; } =20 -int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, bpfptr_t uattr= , __u32 uattr_size) +int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, bpfptr_t uattr, + struct bpf_log_attr *attr_log) { u64 start_time =3D ktime_get_ns(); struct bpf_verifier_env *env; int i, len, ret =3D -EINVAL, err; - u32 log_true_size; bool is_priv; =20 BTF_TYPE_EMIT(enum bpf_features); @@ -25808,17 +25808,10 @@ int bpf_check(struct bpf_prog **prog, union bpf_a= ttr *attr, bpfptr_t uattr, __u3 env->prog->aux->verified_insns =3D env->insn_processed; =20 /* preserve original error even if log finalization is successful */ - err =3D bpf_vlog_finalize(&env->log, &log_true_size); + err =3D bpf_log_attr_finalize(attr_log, &env->log); if (err) ret =3D err; =20 - if (uattr_size >=3D offsetofend(union bpf_attr, log_true_size) && - copy_to_bpfptr_offset(uattr, offsetof(union bpf_attr, log_true_size), - &log_true_size, sizeof(log_true_size))) { - ret =3D -EFAULT; - goto err_release_maps; - } - if (ret) goto err_release_maps; =20 --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-185.mta0.migadu.com (out-185.mta0.migadu.com [91.218.175.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9A9E3659F4 for ; Mon, 2 Feb 2026 14:42:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.185 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043330; cv=none; b=YZb7uJDO1LxaovUL9yTSMwBJx324tpa63bdWTn3srQoFno8NKV5U/rDAs8iRNhWa2kLwoNIzNLIwo7xLiYQR0jaXYS6ySl32PzAiOpwY6CziJjzk3wuDoO6tYtBoVt2wLU/A2SVeZy5LJW5hsLyCXZEZrtfuFiXtLBeRuasBs28= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043330; c=relaxed/simple; bh=2y0OYhFd00JT4fqJ7xOW3+N3GZskK/O/58Ra1R2Dofg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wqm/HCRV0xgU0tVKjJAgepo0Tf8pB5w22pDzkLzhRlPh44RLntL9t6HEN2TukFjM6qzlku5nH7Y9+5lCH+buzkhst3pduliolBtRnrvu/hoVw9CoyLF3D2XSVlOt4+gjIdAx/hh21AWRVMnDasc+Oq6/vqVXq/YyvFivLJ7uF4Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=A5Hy1nmO; arc=none smtp.client-ip=91.218.175.185 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="A5Hy1nmO" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043326; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tld7ROmAyVXWaOhOfuRbQu/FqLENM5A62rTK6vgYo1c=; b=A5Hy1nmOsxosHhLcdOHZTH+IG29NSbdsOUPBglUYFlSH2jNgtZvhWFC/Sfb8BMwl3aWQuC K3oQgwf3/eFycT4bLykFdYUYhBOgV/5Db5GcEEqjI2d/YKp+lEo5QMvC7xhvC3xXv8iIJY +DXDo18xyxA663tFcTT8teldFDOyCOg= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 4/9] bpf: Add syscall common attributes support for prog_load Date: Mon, 2 Feb 2026 22:40:41 +0800 Message-ID: <20260202144046.30651-5-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" BPF_PROG_LOAD can now provide log parameters through both union bpf_attr and struct bpf_common_attr. Define clear conflict and precedence rules: - if both are provided and log_buf/log_size/log_level match, use them; - if only one side provides a log buffer, use that one; - if both provide log buffers but differ, return -EINVAL. Signed-off-by: Leon Hwang --- include/linux/bpf_verifier.h | 3 ++- kernel/bpf/log.c | 24 ++++++++++++++++++++++-- kernel/bpf/syscall.c | 3 ++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index c805b85b6f7a..0d106fddbbc5 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -638,7 +638,8 @@ struct bpf_log_attr { }; =20 int bpf_prog_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_a= ttr *attr, - bpfptr_t uattr, u32 size); + bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, + bpfptr_t uattr_common, u32 size_common); int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log); =20 #define BPF_MAX_SUBPROGS 256 diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c index ff579fcba36f..345005ba98dd 100644 --- a/kernel/bpf/log.c +++ b/kernel/bpf/log.c @@ -873,10 +873,30 @@ static void bpf_log_attr_init(struct bpf_log_attr *at= tr_log, int offsetof_true_s attr_log->uattr =3D uattr; } =20 +static bool bpf_log_attrs_diff(struct bpf_common_attr *common, u64 log_buf= , u32 log_size, + u32 log_level) +{ + return log_buf && common->log_buf && (log_buf !=3D common->log_buf || + log_size !=3D common->log_size || + log_level !=3D common->log_level); +} + int bpf_prog_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_a= ttr *attr, - bpfptr_t uattr, u32 size) + bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, + bpfptr_t uattr_common, u32 size_common) { - bpf_log_attr_init(attr_log, offsetof(union bpf_attr, log_true_size), uatt= r, size); + if (bpf_log_attrs_diff(attr_common, attr->log_buf, attr->log_size, attr->= log_level)) + return -EINVAL; + + if (!attr->log_buf && attr_common->log_buf) { + attr->log_buf =3D attr_common->log_buf; + attr->log_size =3D attr_common->log_size; + attr->log_level =3D attr_common->log_level; + bpf_log_attr_init(attr_log, offsetof(struct bpf_common_attr, log_true_si= ze), + uattr_common, size_common); + } else { + bpf_log_attr_init(attr_log, offsetof(union bpf_attr, log_true_size), uat= tr, size); + } return 0; } =20 diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index e81199361241..7125ea445c6c 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -6232,7 +6232,8 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr= , unsigned int size, err =3D map_freeze(&attr); break; case BPF_PROG_LOAD: - err =3D bpf_prog_load_log_attr_init(&attr_log, &attr, uattr, size); + err =3D bpf_prog_load_log_attr_init(&attr_log, &attr, uattr, size, &attr= _common, + uattr_common, size_common); err =3D err ?: bpf_prog_load(&attr, uattr, &attr_log); break; case BPF_OBJ_PIN: --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-189.mta0.migadu.com (out-189.mta0.migadu.com [91.218.175.189]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 55897365A0E for ; Mon, 2 Feb 2026 14:42:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.189 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043340; cv=none; b=c10ROMDjuWK40PTimnmlg/VT01JbK9uJimPMawnuZWGiO9REDFaLG9O/dhritWRDgPTSNiN+83X4Y4rETUm/JuxUsWTWO1SGcVmLRgSKdCly4vzZaRlLikGJ8KM/K3ai3DhchaX2Zhrvzbs/qZIgEz+CVry50JkjrXirZr788vM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043340; c=relaxed/simple; bh=3ChsNWAqV8MktW4tyaP0Zkt+9t7zXMpOzUlFnUjhdUA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gJAu3F0G4cSFP4zufVFUzMqBkmCUjLfH8LsS8HFcvfsqo7lwC8eq0UkA8pAfJ8rZv+pM6i7ht+RtBzqg6UsKWo8mBKjWz6hB17oqzMCkiL7JGpCGOaSo3RRi//7yZXKjphTDJus2e78jjemL3YDYFFdGSon0luCLk35brE0jhbk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=iRFSeIxd; arc=none smtp.client-ip=91.218.175.189 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="iRFSeIxd" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043336; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Id+KPzio2AzA7uwtB8ekwVVfFvWj/yod8A4FNHhFK7c=; b=iRFSeIxdP/VtTc3JUtAOB8E6ciP5HbTra+Jf0bEkIldqsVF3/bIJXtm0n+8hkpl0usWL9y 1qYxB3Y5pDC+pY35bumKXT6bpfI3fWLXwyg++ENxYc2YUrTqs+xR0h+bm7zmaWaAmPPd3U GkJP6Sw7kch7QEy8+IG/RdLlmaSrMVg= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 5/9] bpf: Refactor reporting btf_log_true_size for btf_load Date: Mon, 2 Feb 2026 22:40:42 +0800 Message-ID: <20260202144046.30651-6-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" In the next commit, it will be able to report logs via extended common attributes, which will report 'log_true_size' via the extended common attributes meanwhile. Therefore, refactor the way of 'btf_log_true_size' reporting in order to report 'log_true_size' via the extended common attributes easily. Signed-off-by: Leon Hwang --- include/linux/bpf_verifier.h | 2 ++ include/linux/btf.h | 3 ++- kernel/bpf/btf.c | 26 ++++++-------------------- kernel/bpf/log.c | 7 +++++++ kernel/bpf/syscall.c | 7 ++++--- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 0d106fddbbc5..b6e33ee82f63 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -640,6 +640,8 @@ struct bpf_log_attr { int bpf_prog_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_a= ttr *attr, bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, bpfptr_t uattr_common, u32 size_common); +int bpf_btf_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_at= tr *attr, + bpfptr_t uattr, u32 size); int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log); =20 #define BPF_MAX_SUBPROGS 256 diff --git a/include/linux/btf.h b/include/linux/btf.h index 48108471c5b1..f64d87315c5f 100644 --- a/include/linux/btf.h +++ b/include/linux/btf.h @@ -145,7 +145,8 @@ const char *btf_get_name(const struct btf *btf); void btf_get(struct btf *btf); void btf_put(struct btf *btf); const struct btf_header *btf_header(const struct btf *btf); -int btf_new_fd(const union bpf_attr *attr, bpfptr_t uattr, u32 uattr_sz); +struct bpf_log_attr; +int btf_new_fd(const union bpf_attr *attr, bpfptr_t uattr, struct bpf_log_= attr *attr_log); struct btf *btf_get_by_fd(int fd); int btf_get_info_by_fd(const struct btf *btf, const union bpf_attr *attr, diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c index 8959f3bc1e92..753db6408c71 100644 --- a/kernel/bpf/btf.c +++ b/kernel/bpf/btf.c @@ -5856,22 +5856,8 @@ static int btf_check_type_tags(struct btf_verifier_e= nv *env, return 0; } =20 -static int finalize_log(struct bpf_verifier_log *log, bpfptr_t uattr, u32 = uattr_size) -{ - u32 log_true_size; - int err; - - err =3D bpf_vlog_finalize(log, &log_true_size); - - if (uattr_size >=3D offsetofend(union bpf_attr, btf_log_true_size) && - copy_to_bpfptr_offset(uattr, offsetof(union bpf_attr, btf_log_true_si= ze), - &log_true_size, sizeof(log_true_size))) - err =3D -EFAULT; - - return err; -} - -static struct btf *btf_parse(const union bpf_attr *attr, bpfptr_t uattr, u= 32 uattr_size) +static struct btf *btf_parse(const union bpf_attr *attr, bpfptr_t uattr, + struct bpf_log_attr *attr_log) { bpfptr_t btf_data =3D make_bpfptr(attr->btf, uattr.is_kernel); char __user *log_ubuf =3D u64_to_user_ptr(attr->btf_log_buf); @@ -5953,7 +5939,7 @@ static struct btf *btf_parse(const union bpf_attr *at= tr, bpfptr_t uattr, u32 uat } } =20 - err =3D finalize_log(&env->log, uattr, uattr_size); + err =3D bpf_log_attr_finalize(attr_log, &env->log); if (err) goto errout_free; =20 @@ -5965,7 +5951,7 @@ static struct btf *btf_parse(const union bpf_attr *at= tr, bpfptr_t uattr, u32 uat btf_free_struct_meta_tab(btf); errout: /* overwrite err with -ENOSPC or -EFAULT */ - ret =3D finalize_log(&env->log, uattr, uattr_size); + ret =3D bpf_log_attr_finalize(attr_log, &env->log); if (ret) err =3D ret; errout_free: @@ -8136,12 +8122,12 @@ static int __btf_new_fd(struct btf *btf) return anon_inode_getfd("btf", &btf_fops, btf, O_RDONLY | O_CLOEXEC); } =20 -int btf_new_fd(const union bpf_attr *attr, bpfptr_t uattr, u32 uattr_size) +int btf_new_fd(const union bpf_attr *attr, bpfptr_t uattr, struct bpf_log_= attr *attr_log) { struct btf *btf; int ret; =20 - btf =3D btf_parse(attr, uattr, uattr_size); + btf =3D btf_parse(attr, uattr, attr_log); if (IS_ERR(btf)) return PTR_ERR(btf); =20 diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c index 345005ba98dd..8ad88e4aa12c 100644 --- a/kernel/bpf/log.c +++ b/kernel/bpf/log.c @@ -900,6 +900,13 @@ int bpf_prog_load_log_attr_init(struct bpf_log_attr *a= ttr_log, union bpf_attr *a return 0; } =20 +int bpf_btf_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_at= tr *attr, + bpfptr_t uattr, u32 size) +{ + bpf_log_attr_init(attr_log, offsetof(union bpf_attr, btf_log_true_size), = uattr, size); + return 0; +} + int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log) { u32 log_true_size; diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 7125ea445c6c..b6e4ec641dc1 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -5438,7 +5438,7 @@ static int bpf_obj_get_info_by_fd(const union bpf_att= r *attr, =20 #define BPF_BTF_LOAD_LAST_FIELD btf_token_fd =20 -static int bpf_btf_load(const union bpf_attr *attr, bpfptr_t uattr, __u32 = uattr_size) +static int bpf_btf_load(const union bpf_attr *attr, bpfptr_t uattr, struct= bpf_log_attr *attr_log) { struct bpf_token *token =3D NULL; =20 @@ -5465,7 +5465,7 @@ static int bpf_btf_load(const union bpf_attr *attr, b= pfptr_t uattr, __u32 uattr_ =20 bpf_token_put(token); =20 - return btf_new_fd(attr, uattr, uattr_size); + return btf_new_fd(attr, uattr, attr_log); } =20 #define BPF_BTF_GET_FD_BY_ID_LAST_FIELD fd_by_id_token_fd @@ -6279,7 +6279,8 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr= , unsigned int size, err =3D bpf_raw_tracepoint_open(&attr); break; case BPF_BTF_LOAD: - err =3D bpf_btf_load(&attr, uattr, size); + err =3D bpf_btf_load_log_attr_init(&attr_log, &attr, uattr, size); + err =3D err ?: bpf_btf_load(&attr, uattr, &attr_log); break; case BPF_BTF_GET_FD_BY_ID: err =3D bpf_btf_get_fd_by_id(&attr); --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-184.mta0.migadu.com (out-184.mta0.migadu.com [91.218.175.184]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8526A36CDF8 for ; Mon, 2 Feb 2026 14:42:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.184 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043365; cv=none; b=SgN6zHJm7LtyF9k7KE8IP/uLpT1tuxRAvSolvbWSKUg2JRrU7vo/h3pA5yL+Col3C58BLbGlc4j4ua2/3vDDsRqbAWRmZ+jg2Op2uj0HT1mqkbpHB5ysgFkKRQQUrCZapaW1Uu1l1QdjNVRc34pGFd5pkKXTteBJAFP1v7Pseyw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043365; c=relaxed/simple; bh=DOE7kaq+YsBgs3BwWvd+pFxQeWCaAg9/JVuTk9RVsb0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tB4pawMAYsz8u3Gt8i/PaRSQeIfvl/ukxZMKrV6xGCuE6XhaIhZypUNZ8IQKleqfRQ66fTsPRT5suHX2QNormQcfx1MGM6CskjGQoemxPDcxjKvGqS9yRGb/H75NgEmdIZuZDkSAuSwgbK/YBb1RHEePt/HnlMYF/3EvY7qrMLQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=ZYUOd2vO; arc=none smtp.client-ip=91.218.175.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="ZYUOd2vO" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043359; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JDqAozipUsrJaKHI0sk8XceuK1Rr2jyBiEFvHQN2kjg=; b=ZYUOd2vOwXkSO4tMHv56WeHY/ygcnYI80DKn1bfNvNrn+q1Jk33WrLQmpRZ0U5ofod1jOb zZGZHLBWZAYYrpMfEwoyRLiKNlDbcFcUwaiGeN1hACt5Je3pRA6N6s8wJBWnC8oWxcYD/t /X3Zt5egCIv3hrAESEkpWuI0vwMry7k= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 6/9] bpf: Add syscall common attributes support for btf_load Date: Mon, 2 Feb 2026 22:40:43 +0800 Message-ID: <20260202144046.30651-7-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" BPF_BTF_LOAD can now provide log parameters through both union bpf_attr and bpf_common_attr. Apply the same conflict and precedence rules as prog_load: - if both are provided and btf_log_buf/btf_log_size/btf_log_level match, use them; - if only one side provides a log buffer, use that one; - if both provide log buffers but differ, return -EINVAL. Signed-off-by: Leon Hwang --- include/linux/bpf_verifier.h | 3 ++- kernel/bpf/log.c | 18 ++++++++++++++++-- kernel/bpf/syscall.c | 3 ++- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index b6e33ee82f63..1144657bbc2f 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -641,7 +641,8 @@ int bpf_prog_load_log_attr_init(struct bpf_log_attr *at= tr_log, union bpf_attr *a bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, bpfptr_t uattr_common, u32 size_common); int bpf_btf_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_at= tr *attr, - bpfptr_t uattr, u32 size); + bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, + bpfptr_t uattr_common, u32 size_common); int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log); =20 #define BPF_MAX_SUBPROGS 256 diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c index 8ad88e4aa12c..db2716586f85 100644 --- a/kernel/bpf/log.c +++ b/kernel/bpf/log.c @@ -901,9 +901,23 @@ int bpf_prog_load_log_attr_init(struct bpf_log_attr *a= ttr_log, union bpf_attr *a } =20 int bpf_btf_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_at= tr *attr, - bpfptr_t uattr, u32 size) + bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, + bpfptr_t uattr_common, u32 size_common) { - bpf_log_attr_init(attr_log, offsetof(union bpf_attr, btf_log_true_size), = uattr, size); + if (bpf_log_attrs_diff(attr_common, attr->btf_log_buf, attr->btf_log_size, + attr->btf_log_level)) + return -EINVAL; + + if (!attr->btf_log_buf && attr_common->log_buf) { + attr->btf_log_buf =3D attr_common->log_buf; + attr->btf_log_size =3D attr_common->log_size; + attr->btf_log_level =3D attr_common->log_level; + bpf_log_attr_init(attr_log, offsetof(struct bpf_common_attr, log_true_si= ze), + uattr_common, size_common); + } else { + bpf_log_attr_init(attr_log, offsetof(union bpf_attr, btf_log_true_size),= uattr, + size); + } return 0; } =20 diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index b6e4ec641dc1..4a8933c1dd38 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -6279,7 +6279,8 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr= , unsigned int size, err =3D bpf_raw_tracepoint_open(&attr); break; case BPF_BTF_LOAD: - err =3D bpf_btf_load_log_attr_init(&attr_log, &attr, uattr, size); + err =3D bpf_btf_load_log_attr_init(&attr_log, &attr, uattr, size, &attr_= common, + uattr_common, size_common); err =3D err ?: bpf_btf_load(&attr, uattr, &attr_log); break; case BPF_BTF_GET_FD_BY_ID: --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EBD936E463 for ; Mon, 2 Feb 2026 14:42:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043372; cv=none; b=uXqRkVBVunTFhRnnTznniLPPd+zrGDQqRHpkONeCgl7MJO1jJEGomqs6FoU2NYmG5sU8zqakjyEmznrFQ27a1Te+kaZ6ZUSZTxhSUfrxI2d5cXrEoOWGfKz5zPVxArPu5VpHfPNoy8jQpQKfxMmDceAs0L11kp0m5pbeSSfkmng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043372; c=relaxed/simple; bh=q4mloiRGv97HLmBuXTflJlWY2KbOvWCjh1eKJfd9gVA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hm/7/old7YbltRb4hpJd31Jp8z1z/sSOdWo65G6bjqazpX7nF3BS8ILVGRWjQbT+VEDIJzFhAblIsak42gAK7xcAqO8u1uShtkj3yQ50NJyogUzpuEs70UWT9IOo0HL5Rf3l5yKegRSqqqORYk4X18rMeQEQ4vERGi+dWy4Za/k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=LwjJeTtN; arc=none smtp.client-ip=91.218.175.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="LwjJeTtN" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043368; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=r1IL5jcW7izqQBTN2Qr9iizL8Oj6rJcIwoLudQx/Ja4=; b=LwjJeTtNbaVxWEtbRwEXSRC01ufCSHfPfbc3fth2K3sFrosT+CdOVFO0Tr1fsdncpcjifI ecsw1S0zo8ttprWBsgdr7+L9AcJCDAnFYCPfhvcgwj8j3n/hE2ZGecG5dqpTYB0Y/4DWdt TSw0sn9uabhMDSfaL3B2O1ZYpoEoET0= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 7/9] bpf: Add syscall common attributes support for map_create Date: Mon, 2 Feb 2026 22:40:44 +0800 Message-ID: <20260202144046.30651-8-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Many BPF_MAP_CREATE validation failures currently return -EINVAL without any explanation to userspace. Plumb common syscall log attributes into map_create(), create a verifier log from bpf_common_attr::log_buf/log_size/log_level, and report map-creation failure reasons through that buffer. This improves debuggability by allowing userspace to inspect why map creation failed and read back log_true_size from common attributes. Signed-off-by: Leon Hwang --- include/linux/bpf_verifier.h | 3 ++ kernel/bpf/log.c | 25 ++++++++++++++ kernel/bpf/syscall.c | 65 ++++++++++++++++++++++++++++++------ 3 files changed, 83 insertions(+), 10 deletions(-) diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h index 1144657bbc2f..eb7e6e0458f5 100644 --- a/include/linux/bpf_verifier.h +++ b/include/linux/bpf_verifier.h @@ -643,6 +643,9 @@ int bpf_prog_load_log_attr_init(struct bpf_log_attr *at= tr_log, union bpf_attr *a int bpf_btf_load_log_attr_init(struct bpf_log_attr *attr_log, union bpf_at= tr *attr, bpfptr_t uattr, u32 size, struct bpf_common_attr *attr_common, bpfptr_t uattr_common, u32 size_common); +struct bpf_verifier_log *bpf_log_attr_create_vlog(struct bpf_log_attr *att= r_log, + struct bpf_common_attr *common, bpfptr_t uattr, + u32 size); int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log); =20 #define BPF_MAX_SUBPROGS 256 diff --git a/kernel/bpf/log.c b/kernel/bpf/log.c index db2716586f85..e5a46ad4eb23 100644 --- a/kernel/bpf/log.c +++ b/kernel/bpf/log.c @@ -921,6 +921,31 @@ int bpf_btf_load_log_attr_init(struct bpf_log_attr *at= tr_log, union bpf_attr *at return 0; } =20 +struct bpf_verifier_log *bpf_log_attr_create_vlog(struct bpf_log_attr *att= r_log, + struct bpf_common_attr *common, bpfptr_t uattr, + u32 size) +{ + struct bpf_verifier_log *log; + int err; + + if (!common->log_buf) + return NULL; + + log =3D kzalloc(sizeof(*log), GFP_KERNEL); + if (!log) + return ERR_PTR(-ENOMEM); + + err =3D bpf_vlog_init(log, common->log_level, u64_to_user_ptr(common->log= _buf), + common->log_size); + if (err) { + kfree(log); + return ERR_PTR(err); + } + + bpf_log_attr_init(attr_log, offsetof(struct bpf_common_attr, log_true_siz= e), uattr, size); + return log; +} + int bpf_log_attr_finalize(struct bpf_log_attr *attr, struct bpf_verifier_l= og *log) { u32 log_true_size; diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 4a8933c1dd38..d26f63bd460e 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -1365,7 +1365,7 @@ static int map_check_btf(struct bpf_map *map, struct = bpf_token *token, =20 #define BPF_MAP_CREATE_LAST_FIELD excl_prog_hash_size /* called via syscall */ -static int map_create(union bpf_attr *attr, bpfptr_t uattr) +static int __map_create(union bpf_attr *attr, bpfptr_t uattr, struct bpf_v= erifier_log *log) { const struct bpf_map_ops *ops; struct bpf_token *token =3D NULL; @@ -1377,8 +1377,10 @@ static int map_create(union bpf_attr *attr, bpfptr_t= uattr) int err; =20 err =3D CHECK_ATTR(BPF_MAP_CREATE); - if (err) + if (err) { + bpf_log(log, "Invalid attr.\n"); return -EINVAL; + } =20 /* check BPF_F_TOKEN_FD flag, remember if it's set, and then clear it * to avoid per-map type checks tripping on unknown flag @@ -1387,17 +1389,25 @@ static int map_create(union bpf_attr *attr, bpfptr_= t uattr) attr->map_flags &=3D ~BPF_F_TOKEN_FD; =20 if (attr->btf_vmlinux_value_type_id) { - if (attr->map_type !=3D BPF_MAP_TYPE_STRUCT_OPS || - attr->btf_key_type_id || attr->btf_value_type_id) + if (attr->map_type !=3D BPF_MAP_TYPE_STRUCT_OPS) { + bpf_log(log, "btf_vmlinux_value_type_id can only be used with struct_op= s maps.\n"); return -EINVAL; + } + if (attr->btf_key_type_id || attr->btf_value_type_id) { + bpf_log(log, "btf_vmlinux_value_type_id is mutually exclusive with btf_= key_type_id and btf_value_type_id.\n"); + return -EINVAL; + } } else if (attr->btf_key_type_id && !attr->btf_value_type_id) { + bpf_log(log, "Invalid btf_value_type_id.\n"); return -EINVAL; } =20 if (attr->map_type !=3D BPF_MAP_TYPE_BLOOM_FILTER && attr->map_type !=3D BPF_MAP_TYPE_ARENA && - attr->map_extra !=3D 0) + attr->map_extra !=3D 0) { + bpf_log(log, "Invalid map_extra.\n"); return -EINVAL; + } =20 f_flags =3D bpf_get_file_flag(attr->map_flags); if (f_flags < 0) @@ -1405,13 +1415,17 @@ static int map_create(union bpf_attr *attr, bpfptr_= t uattr) =20 if (numa_node !=3D NUMA_NO_NODE && ((unsigned int)numa_node >=3D nr_node_ids || - !node_online(numa_node))) + !node_online(numa_node))) { + bpf_log(log, "Invalid numa_node.\n"); return -EINVAL; + } =20 /* find map type and init map: hashtable vs rbtree vs bloom vs ... */ map_type =3D attr->map_type; - if (map_type >=3D ARRAY_SIZE(bpf_map_types)) + if (map_type >=3D ARRAY_SIZE(bpf_map_types)) { + bpf_log(log, "Invalid map_type.\n"); return -EINVAL; + } map_type =3D array_index_nospec(map_type, ARRAY_SIZE(bpf_map_types)); ops =3D bpf_map_types[map_type]; if (!ops) @@ -1429,8 +1443,10 @@ static int map_create(union bpf_attr *attr, bpfptr_t= uattr) =20 if (token_flag) { token =3D bpf_token_get_from_fd(attr->map_token_fd); - if (IS_ERR(token)) + if (IS_ERR(token)) { + bpf_log(log, "Invalid map_token_fd.\n"); return PTR_ERR(token); + } =20 /* if current token doesn't grant map creation permissions, * then we can't use this token, so ignore it and rely on @@ -1513,8 +1529,10 @@ static int map_create(union bpf_attr *attr, bpfptr_t= uattr) =20 err =3D bpf_obj_name_cpy(map->name, attr->map_name, sizeof(attr->map_name)); - if (err < 0) + if (err < 0) { + bpf_log(log, "Invalid map_name.\n"); goto free_map; + } =20 preempt_disable(); map->cookie =3D gen_cookie_next(&bpf_map_cookie); @@ -1537,6 +1555,7 @@ static int map_create(union bpf_attr *attr, bpfptr_t = uattr) =20 btf =3D btf_get_by_fd(attr->btf_fd); if (IS_ERR(btf)) { + bpf_log(log, "Invalid btf_fd.\n"); err =3D PTR_ERR(btf); goto free_map; } @@ -1564,6 +1583,7 @@ static int map_create(union bpf_attr *attr, bpfptr_t = uattr) bpfptr_t uprog_hash =3D make_bpfptr(attr->excl_prog_hash, uattr.is_kerne= l); =20 if (attr->excl_prog_hash_size !=3D SHA256_DIGEST_SIZE) { + bpf_log(log, "Invalid excl_prog_hash_size.\n"); err =3D -EINVAL; goto free_map; } @@ -1579,6 +1599,7 @@ static int map_create(union bpf_attr *attr, bpfptr_t = uattr) goto free_map; } } else if (attr->excl_prog_hash_size) { + bpf_log(log, "Invalid excl_prog_hash_size.\n"); err =3D -EINVAL; goto free_map; } @@ -1617,6 +1638,30 @@ static int map_create(union bpf_attr *attr, bpfptr_t= uattr) return err; } =20 +static int map_create(union bpf_attr *attr, bpfptr_t uattr, struct bpf_com= mon_attr *attr_common, + bpfptr_t uattr_common, u32 size_common) +{ + struct bpf_verifier_log *log; + struct bpf_log_attr attr_log; + int err, ret; + + log =3D bpf_log_attr_create_vlog(&attr_log, attr_common, uattr_common, si= ze_common); + if (IS_ERR(log)) + return PTR_ERR(log); + + err =3D __map_create(attr, uattr, log); + if (err >=3D 0) + goto free; + + ret =3D bpf_log_attr_finalize(&attr_log, log); + if (ret) + err =3D ret; + +free: + kfree(log); + return err; +} + void bpf_map_inc(struct bpf_map *map) { atomic64_inc(&map->refcnt); @@ -6214,7 +6259,7 @@ static int __sys_bpf(enum bpf_cmd cmd, bpfptr_t uattr= , unsigned int size, =20 switch (cmd) { case BPF_MAP_CREATE: - err =3D map_create(&attr, uattr); + err =3D map_create(&attr, uattr, &attr_common, uattr_common, size_common= ); break; case BPF_MAP_LOOKUP_ELEM: err =3D map_lookup_elem(&attr); --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-181.mta0.migadu.com (out-181.mta0.migadu.com [91.218.175.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D977036EAB1 for ; Mon, 2 Feb 2026 14:42:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043380; cv=none; b=WSdE63FkWo8YxvXgRZXJ9qK3ysu86sluVyLVGYVAZIQpLbztzrAAkcqPxUSadLMZR5QhqU3l2GfSyIfdpMXJdPcwhYt7OtcN59TrHtYzr4jcWptLeGD5sCKQ0ksYPnpQsNB84Rg74cga5K0bePeTdp2Dm9bDAkTVOyUJGgU9ltg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043380; c=relaxed/simple; bh=RoVqq0qKRTtZkvPyA0OK31cvnMmOvon7veF/oreYESs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OY+bS3LJgoudlT9RVhUtMK464nbdQ+WC7qzb1TqlW3hmkTZNtJrmI5j3FoWgt2mwpTEMKIMnOaU+j/EUU3j9EpZ7a5iAybKqvuzpEcQHvqHNj8ITbACx1BrGDJx2DStvw9e2UsKz8+fpL0/zU4/QGn3qYr1u+PxnXf1U4RaLdIU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=qBcXW0tA; arc=none smtp.client-ip=91.218.175.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="qBcXW0tA" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043375; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=AoKtZ5+P7Wxb1aJQ0fxakYbtUswnhN9EllnMlBVZL/I=; b=qBcXW0tAIJoYotYfaOz49iTMmf6+3xC54TvVGZlnV+YaUZ+z27Gd0oudloaV6H244bS5Fg MwIsAjgxR6LEwVodsd3HrR0UgP1ENiTuB/lAu6ylAu6+ORL92XtOrssmQMPNwAv8rmQXhH ja+KxLltJR0GnVroEgrvngOd9wzrd58= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 8/9] libbpf: Add syscall common attributes support for map_create Date: Mon, 2 Feb 2026 22:40:45 +0800 Message-ID: <20260202144046.30651-9-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" With the previous commit adding common attribute support for BPF_MAP_CREATE, users can now retrieve detailed error messages when map creation fails via the log_buf field. Introduce struct bpf_log_opts with the following fields: log_buf, log_size, log_level, and log_true_size. Extend bpf_map_create_opts with a new field log_opts, allowing users to capture and inspect log messages on map creation failures. Signed-off-by: Leon Hwang Acked-by: Andrii Nakryiko --- tools/lib/bpf/bpf.c | 16 +++++++++++++++- tools/lib/bpf/bpf.h | 17 ++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 9d8740761b7a..0c3e40844d80 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -209,6 +209,9 @@ int bpf_map_create(enum bpf_map_type map_type, const struct bpf_map_create_opts *opts) { const size_t attr_sz =3D offsetofend(union bpf_attr, excl_prog_hash_size); + const size_t attr_common_sz =3D sizeof(struct bpf_common_attr); + struct bpf_common_attr attr_common; + struct bpf_log_opts *log_opts; union bpf_attr attr; int fd; =20 @@ -242,7 +245,18 @@ int bpf_map_create(enum bpf_map_type map_type, attr.excl_prog_hash =3D ptr_to_u64(OPTS_GET(opts, excl_prog_hash, NULL)); attr.excl_prog_hash_size =3D OPTS_GET(opts, excl_prog_hash_size, 0); =20 - fd =3D sys_bpf_fd(BPF_MAP_CREATE, &attr, attr_sz); + log_opts =3D OPTS_GET(opts, log_opts, NULL); + if (log_opts && feat_supported(NULL, FEAT_BPF_SYSCALL_COMMON_ATTRS)) { + memset(&attr_common, 0, attr_common_sz); + attr_common.log_buf =3D ptr_to_u64(OPTS_GET(log_opts, log_buf, NULL)); + attr_common.log_size =3D OPTS_GET(log_opts, log_size, 0); + attr_common.log_level =3D OPTS_GET(log_opts, log_level, 0); + fd =3D sys_bpf_ext_fd(BPF_MAP_CREATE, &attr, attr_sz, &attr_common, attr= _common_sz); + OPTS_SET(log_opts, log_true_size, attr_common.log_true_size); + } else { + fd =3D sys_bpf_fd(BPF_MAP_CREATE, &attr, attr_sz); + OPTS_SET(log_opts, log_true_size, 0); + } return libbpf_err_errno(fd); } =20 diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index 2c8e88ddb674..59673f094f86 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -37,6 +37,18 @@ extern "C" { =20 LIBBPF_API int libbpf_set_memlock_rlim(size_t memlock_bytes); =20 +struct bpf_log_opts { + size_t sz; /* size of this struct for forward/backward compatibility */ + + char *log_buf; + __u32 log_size; + __u32 log_level; + __u32 log_true_size; + + size_t :0; +}; +#define bpf_log_opts__last_field log_true_size + struct bpf_map_create_opts { size_t sz; /* size of this struct for forward/backward compatibility */ =20 @@ -57,9 +69,12 @@ struct bpf_map_create_opts { =20 const void *excl_prog_hash; __u32 excl_prog_hash_size; + + struct bpf_log_opts *log_opts; + size_t :0; }; -#define bpf_map_create_opts__last_field excl_prog_hash_size +#define bpf_map_create_opts__last_field log_opts =20 LIBBPF_API int bpf_map_create(enum bpf_map_type map_type, const char *map_name, --=20 2.52.0 From nobody Sat Feb 7 21:14:47 2026 Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6A7E636CDFA for ; Mon, 2 Feb 2026 14:43:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043403; cv=none; b=FlXnO9ru1MVMlBqAOHG/8kX94xUfcwu1d2M/Gb4sJPi1unKZe4RYthnjw3LsB25G52yUFBefm70/Uh6jISntfdyljFJ9MJVYxQ0SqrHt8sgjdSiDz4MPklsNtKQGDDkr6SbMR+Zj+0sTAfhPBcxmknlS0/1WfBhf5cP60IGuWKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770043403; c=relaxed/simple; bh=lRMaXBCmuroYEA8EMWnl7dKsDl+uPc5spkCIVT8MdKg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Hq3TSViyf/6TfkWG18yRme1LHk401Tafd7MVJ3YXMwHsTD+eOVeq+6aB6eXY46Igb1LT/FBNDtHKWus8LmAApkHnW+qvDHbmN+1QyU/WGBupnFFJup5rih7p7T6XNMaAjQYBPdmv4+AV6PBiMEjh69ZlHBg4V7gnBzel/aNDca0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=Q19T/4cF; arc=none smtp.client-ip=91.218.175.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="Q19T/4cF" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1770043398; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bTUbEhqHJLhG8hIlAVdEqIlik/ffHI3gpe+iOi5xJpk=; b=Q19T/4cFOzGDk104lhoD2ZvwEjMMFR7mtWwVZ79gJzct0Lf1uZnr4spX90vYn2CyDEx+xy W4t6bj2/CVAJC3BPefMEJWjQwzjds1XPbAAVaQ3B2qS6+MJ1Qp/8SZE0s8iQdcI9XAOCCD RE7aa2vn8WVUxC9pOOnstgGn+8ceHmk= From: Leon Hwang To: bpf@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , John Fastabend , Andrii Nakryiko , Martin KaFai Lau , Eduard Zingerman , Song Liu , Yonghong Song , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa , Shuah Khan , Christian Brauner , Seth Forshee , Yuichiro Tsuji , Andrey Albershteyn , Leon Hwang , Willem de Bruijn , Jason Xing , Tao Chen , Mykyta Yatsenko , Kumar Kartikeya Dwivedi , Anton Protopopov , Amery Hung , Rong Tao , linux-kernel@vger.kernel.org, linux-api@vger.kernel.org, linux-kselftest@vger.kernel.org, kernel-patches-bot@fb.com Subject: [PATCH bpf-next v9 9/9] selftests/bpf: Add tests to verify map create failure log Date: Mon, 2 Feb 2026 22:40:46 +0800 Message-ID: <20260202144046.30651-10-leon.hwang@linux.dev> In-Reply-To: <20260202144046.30651-1-leon.hwang@linux.dev> References: <20260202144046.30651-1-leon.hwang@linux.dev> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" Add tests to verify that the kernel reports the expected error messages when map creation fails. Signed-off-by: Leon Hwang --- .../selftests/bpf/prog_tests/map_init.c | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/map_init.c b/tools/test= ing/selftests/bpf/prog_tests/map_init.c index 14a31109dd0e..89e6daf2fcfd 100644 --- a/tools/testing/selftests/bpf/prog_tests/map_init.c +++ b/tools/testing/selftests/bpf/prog_tests/map_init.c @@ -212,3 +212,171 @@ void test_map_init(void) if (test__start_subtest("pcpu_lru_map_init")) test_pcpu_lru_map_init(); } + +#define BPF_LOG_FIXED 8 + +static void test_map_create(enum bpf_map_type map_type, const char *map_na= me, + struct bpf_map_create_opts *opts, const char *exp_msg) +{ + const int key_size =3D 4, value_size =3D 4, max_entries =3D 1; + char log_buf[128]; + int fd; + LIBBPF_OPTS(bpf_log_opts, log_opts); + + log_buf[0] =3D '\0'; + log_opts.log_buf =3D log_buf; + log_opts.log_size =3D sizeof(log_buf); + log_opts.log_level =3D BPF_LOG_FIXED; + opts->log_opts =3D &log_opts; + fd =3D bpf_map_create(map_type, map_name, key_size, value_size, max_entri= es, opts); + if (!ASSERT_LT(fd, 0, "bpf_map_create")) { + close(fd); + return; + } + + ASSERT_STREQ(log_buf, exp_msg, "log_buf"); + ASSERT_EQ(log_opts.log_true_size, strlen(exp_msg) + 1, "log_true_size"); +} + +static void test_map_create_array(struct bpf_map_create_opts *opts, const = char *exp_msg) +{ + test_map_create(BPF_MAP_TYPE_ARRAY, "test_map_create", opts, exp_msg); +} + +static void test_invalid_vmlinux_value_type_id_struct_ops(void) +{ + const char *msg =3D "btf_vmlinux_value_type_id can only be used with stru= ct_ops maps.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .btf_vmlinux_value_type_id =3D 1, + ); + + test_map_create_array(&opts, msg); +} + +static void test_invalid_vmlinux_value_type_id_kv_type_id(void) +{ + const char *msg =3D "btf_vmlinux_value_type_id is mutually exclusive with= btf_key_type_id and btf_value_type_id.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .btf_vmlinux_value_type_id =3D 1, + .btf_key_type_id =3D 1, + ); + + test_map_create(BPF_MAP_TYPE_STRUCT_OPS, "test_map_create", &opts, msg); +} + +static void test_invalid_value_type_id(void) +{ + const char *msg =3D "Invalid btf_value_type_id.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .btf_key_type_id =3D 1, + ); + + test_map_create_array(&opts, msg); +} + +static void test_invalid_map_extra(void) +{ + const char *msg =3D "Invalid map_extra.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .map_extra =3D 1, + ); + + test_map_create_array(&opts, msg); +} + +static void test_invalid_numa_node(void) +{ + const char *msg =3D "Invalid numa_node.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .map_flags =3D BPF_F_NUMA_NODE, + .numa_node =3D 0xFF, + ); + + test_map_create_array(&opts, msg); +} + +static void test_invalid_map_type(void) +{ + const char *msg =3D "Invalid map_type.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts); + + test_map_create(__MAX_BPF_MAP_TYPE, "test_map_create", &opts, msg); +} + +static void test_invalid_token_fd(void) +{ + const char *msg =3D "Invalid map_token_fd.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .map_flags =3D BPF_F_TOKEN_FD, + .token_fd =3D 0xFF, + ); + + test_map_create_array(&opts, msg); +} + +static void test_invalid_map_name(void) +{ + const char *msg =3D "Invalid map_name.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts); + + test_map_create(BPF_MAP_TYPE_ARRAY, "test-!@#", &opts, msg); +} + +static void test_invalid_btf_fd(void) +{ + const char *msg =3D "Invalid btf_fd.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .btf_fd =3D -1, + .btf_key_type_id =3D 1, + .btf_value_type_id =3D 1, + ); + + test_map_create_array(&opts, msg); +} + +static void test_excl_prog_hash_size_1(void) +{ + const char *msg =3D "Invalid excl_prog_hash_size.\n"; + const char *hash =3D "DEADCODE"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .excl_prog_hash =3D hash, + ); + + test_map_create_array(&opts, msg); +} + +static void test_excl_prog_hash_size_2(void) +{ + const char *msg =3D "Invalid excl_prog_hash_size.\n"; + LIBBPF_OPTS(bpf_map_create_opts, opts, + .excl_prog_hash_size =3D 1, + ); + + test_map_create_array(&opts, msg); +} + +void test_map_create_failure(void) +{ + if (test__start_subtest("invalid_vmlinux_value_type_id_struct_ops")) + test_invalid_vmlinux_value_type_id_struct_ops(); + if (test__start_subtest("invalid_vmlinux_value_type_id_kv_type_id")) + test_invalid_vmlinux_value_type_id_kv_type_id(); + if (test__start_subtest("invalid_value_type_id")) + test_invalid_value_type_id(); + if (test__start_subtest("invalid_map_extra")) + test_invalid_map_extra(); + if (test__start_subtest("invalid_numa_node")) + test_invalid_numa_node(); + if (test__start_subtest("invalid_map_type")) + test_invalid_map_type(); + if (test__start_subtest("invalid_token_fd")) + test_invalid_token_fd(); + if (test__start_subtest("invalid_map_name")) + test_invalid_map_name(); + if (test__start_subtest("invalid_btf_fd")) + test_invalid_btf_fd(); + if (test__start_subtest("invalid_excl_prog_hash_size_1")) + test_excl_prog_hash_size_1(); + if (test__start_subtest("invalid_excl_prog_hash_size_2")) + test_excl_prog_hash_size_2(); +} --=20 2.52.0