6.11.2-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 257/695 bpf, lsm: Add check for BPF LSM return value
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Kuohai <[email protected]>
[ Upstream commit 5d99e198be279045e6ecefe220f5c52f8ce9bfd5 ]
A bpf prog returning a positive number attached to file_alloc_security hook makes kernel panic.
This happens because file system can not filter out the positive number returned by the LSM prog using IS_ERR, and misinterprets this positive number as a file pointer.
Given that hook file_alloc_security never returned positive number before the introduction of BPF LSM, and other BPF LSM hooks may encounter similar issues, this patch adds LSM return value check in verifier, to ensure no unexpected value is returned.
--- include/linux/bpf.h | 1 + include/linux/bpf_lsm.h | 8 ++++++ kernel/bpf/bpf_lsm.c | 34 ++++++++++++++++++++++- kernel/bpf/btf.c | 5 +++- kernel/bpf/verifier.c | 60 ++++++++++++++++++++++++++++++++++------- 5 files changed, 97 insertions(+), 11 deletions(-)
include/linux/bpf.h +1 -0
@@ -927,6 +927,7 @@ struct bpf_insn_access_aux { }; };struct bpf_verifier_log *log;/* for verbose logs */ +bool is_retval;/* is accessing function return value ? */ }; static inline void
include/linux/bpf_lsm.h +8 -0
@@ -9,6 +9,7 @@#include <linux/sched.h> #include <linux/bpf.h> +#include <linux/bpf_verifier.h> #include <linux/lsm_hooks.h> #ifdef CONFIG_BPF_LSM
@@ -45,6 +46,8 @@ void bpf_inode_storage_free(struct inode *inode);void bpf_lsm_find_cgroup_shim (const struct bpf_prog *prog,bpf_func_t *bpf_func); +int bpf_lsm_get_retval_range (const struct bpf_prog *prog, +struct bpf_retval_range *range);#else /* !CONFIG_BPF_LSM */ static inline bool bpf_lsm_is_sleepable_hook (u32 btf_id)
@@ -78,6 +81,11 @@ static inline void bpf_lsm_find_cgroup_shim(const struct bpf_prog *prog, { } +static inline int bpf_lsm_get_retval_range (const struct bpf_prog *prog, +struct bpf_retval_range *range) +{ +return -EOPNOTSUPP ; +}#endif /* CONFIG_BPF_LSM */ #endif /* _LINUX_BPF_LSM_H */
kernel/bpf/bpf_lsm.c +33 -1
@@ -11,7 +11,6 @@#include <linux/lsm_hooks.h> #include <linux/bpf_lsm.h> #include <linux/kallsyms.h> -#include <linux/bpf_verifier.h> #include <net/bpf_sk_storage.h> #include <linux/bpf_local_storage.h> #include <linux/btf_ids.h>
@@ -390,3 +389,36 @@ const struct bpf_verifier_ops lsm_verifier_ops = { .get_func_proto = bpf_lsm_func_proto, .is_valid_access = btf_ctx_access, }; + +/* hooks return 0 or 1 */ +BTF_SET_START(bool_lsm_hooks) +#ifdef CONFIG_SECURITY_NETWORK_XFRM +BTF_ID(func, bpf_lsm_xfrm_state_pol_flow_match) +#endif +#ifdef CONFIG_AUDIT +BTF_ID(func, bpf_lsm_audit_rule_known) +#endif +BTF_ID(func, bpf_lsm_inode_xattr_skipcap) +BTF_SET_END (bool_lsm_hooks) + +int bpf_lsm_get_retval_range(const struct bpf_prog *prog, +struct bpf_retval_range *retval_range) +{ +/* no return value range for void hooks */ +if (!prog->aux->attach_func_proto->type) +return -EINVAL ; + +if (btf_id_set_contains (&bool_lsm_hooks, prog->aux->attach_btf_id)) { + retval_range->minval =0 ; + retval_range->maxval =1 ; + }else { +/* All other available LSM hooks, except task_prctl, return 0 +* on success and negative error code on failure. +* To keep things simple, we only allow bpf progs to return 0 +* or negative errno for task_prctl too. +*/ + retval_range->minval = -MAX_ERRNO ; + retval_range->maxval =0 ; + } +return 0 ; +}
kernel/bpf/btf.c +4 -1
@@ -6418,8 +6418,11 @@ bool btf_ctx_access(int off, int size, enum bpf_access_type type,if (arg == nr_args) {switch (prog->expected_attach_type) { -case BPF_LSM_CGROUP :case BPF_LSM_MAC : +/* mark we are accessing the return value */ + info->is_retval = true; + fallthrough; +case BPF_LSM_CGROUP :case BPF_TRACE_FEXIT :/* When LSM programs are attached to void LSM hooks * they use FEXIT trampolines and when attached to
kernel/bpf/verifier.c +51 -9
112 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 258/695 bpf: Fix compare error in function retval_range_within
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xu Kuohai <[email protected]>
[ Upstream commit 763aa759d3b2c4f95b11855e3d37b860860107e2 ]
After checking lsm hook return range in verifier, the test case "test_progs -t test_lsm" failed, and the failure log says:
libbpf: prog 'test_int_hook': BPF program load failed: Invalid argument
libbpf: prog 'test_int_hook': -- BEGIN PROG LOAD LOG --
0: R1=ctx() R10=fp0
; int BPF_PROG(test_int_hook, struct vm_area_struct *vma, @ lsm.c:89
0: (79) r0 = *(u64 *)(r1 +24) ; R0_w=scalar(smin=smin32=-4095,smax=smax32=0) R1=ctx()
[...]
24: (b4) w0 = -1 ; R0_w=0xffffffff
; int BPF_PROG(test_int_hook, struct vm_area_struct *vma, @ lsm.c:89
25: (95) exit
At program exit the register R0 has smin=4294967295 smax=4294967295 should have been in [-4095, 0]
It can be seen that instruction "w0 = -1" zero extended -1 to 64-bit register r0, setting both smin and smax values of r0 to 4294967295. This resulted in a false reject when r0 was checked with range [-4095, 0].
Given bpf lsm does not return 64-bit values, this patch fixes it by changing the compare between r0 and return range from 64-bit operation to 32-bit operation for bpf lsm.
--- kernel/bpf/verifier.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
kernel/bpf/verifier.c +11 -5
@@ -9964,9 +9964,13 @@ static bool in_rbtree_lock_required_cb(struct bpf_verifier_env *env)return is_rbtree_lock_required_kfunc (kfunc_btf_id); } -static bool retval_range_within (struct bpf_retval_range range,const struct bpf_reg_state *reg) +static bool retval_range_within (struct bpf_retval_range range,const struct bpf_reg_state *reg, +bool return_32bit) { -return range.minval <= reg->smin_value && reg->smax_value <= range.maxval; +if (return_32bit) +return range.minval <= reg->s32_min_value && reg->s32_max_value <= range.maxval; +else +return range.minval <= reg->smin_value && reg->smax_value <= range.maxval; }static int prepare_func_exit (struct bpf_verifier_env *env,int *insn_idx)
@@ -10003,8 +10007,8 @@ static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)if (err)return err; -/* enforce R0 return value range */ -if (!retval_range_within (callee->callback_ret_range, r0)) { +/* enforce R0 return value range, and bpf_callback_t returns 64bit */ +if (!retval_range_within (callee->callback_ret_range, r0, false)) {verbose_invalid_scalar (env, r0, callee->callback_ret_range,"At callback return" ,"R0" );return -EINVAL ;
@@ -15610,6 +15614,7 @@ static int check_return_code(struct bpf_verifier_env *env, int regno, const charint err;struct bpf_func_state *frame = env->cur_state->frame[0 ];const bool is_subprog = frame->subprogno; +bool return_32bit = false;/* LSM and struct_ops func-ptr's return type could be "void" */ if (!is_subprog || frame->in_exception_callback_fn) {
@@ -15721,6 +15726,7 @@ static int check_return_code(struct bpf_verifier_env *env, int regno, const char/* no restricted range, any return value is allowed */ if (range.minval ==S32_MIN && range.maxval ==S32_MAX )return 0 ; + return_32bit = true; }else if (!env->prog->aux->attach_func_proto->type) {/* Make sure programs that attach to void * hooks don't try to modify return value.
@@ -15751,7 +15757,7 @@ static int check_return_code(struct bpf_verifier_env *env, int regno, const charif (err)return err; -if (!retval_range_within (range, reg)) { +if (!retval_range_within (range, reg, return_32bit)) {verbose_invalid_scalar (env, reg, range, exit_ctx, reg_name); if (!is_subprog && prog->expected_attach_type == BPF_LSM_CGROUP &&
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 259/695 selftests/bpf: Workaround strict bpf_lsm return value check.
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
[ Upstream commit aa8ebb270c66cea1f56a25d0f938036e91ad085a ]
test_progs-no_alu32 -t libbpf_get_fd_by_id_opts is being rejected by the verifier with the following error due to compiler optimization:
6: (67) r0 <<= 62 ; R0_w=scalar(smax=0x4000000000000000,umax=0xc000000000000000,smin32=0,smax32=umax32=0,var_off=(0x0; 0xc000000000000000))
7: (c7) r0 s>>= 63 ; R0_w=scalar(smin=smin32=-1,smax=smax32=0)
; @ test_libbpf_get_fd_by_id_opts.c:0
8: (57) r0 &= -13 ; R0_w=scalar(smax=0x7ffffffffffffff3,umax=0xfffffffffffffff3,smax32=0x7ffffff3,umax32=0xfffffff3,var_off=(0x0; 0xfffffffffffffff3))
; int BPF_PROG(check_access, struct bpf_map *map, fmode_t fmode) @ test_libbpf_get_fd_by_id_opts.c:27 9: (95) exit
At program exit the register R0 has smax=9223372036854775795 should have been in [-4095, 0]
Workaround by adding barrier().
Eventually the verifier will be able to recognize it.
--- .../testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/progs/test_libbpf_get_fd_by_id_opts.c +1 -0
@@ -31,6 +31,7 @@ int BPF_PROG(check_access, struct bpf_map *map, fmode_t fmode)if (fmode &FMODE_WRITE )return -EACCES ; +barrier ();return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 260/695 selftests/bpf: Fix error linking uprobe_multi on mips
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit a5f40d596bff182b4b47547712f540885e8fb17b ]
Linking uprobe_multi.c on mips64el fails due to relocation overflows, when the GOT entries required exceeds the default maximum. Add a specific CFLAGS (-mxgot) for uprobe_multi.c on MIPS that allows using a larger GOT and avoids errors such as:
/tmp/ccBTNQzv.o: in function `bench':
uprobe_multi.c:49:(.text+0x1d7720): relocation truncated to fit: R_MIPS_GOT_DISP against uprobe_multi_func_08188' uprobe_multi.c:49:(.text+0x1d7730): relocation truncated to fit: R_MIPS_GOT_DISP against uprobe_multi_func_08189'
...
collect2: error: ld returned 1 exit status
--- tools/testing/selftests/bpf/Makefile | 2 ++ 1 file changed, 2 insertions(+)
tools/testing/selftests/bpf/Makefile +2 -0
@@ -762,6 +762,8 @@ $(OUTPUT)/veristat: $(OUTPUT)/veristat.o $(call msg,BINARY,,$@) $(Q)$(CC) $(CFLAGS) $(LDFLAGS) $(filter %.a %.o,$^) $(LDLIBS) -o $@ +# Linking uprobe_multi can fail due to relocation overflows on mips. +$(OUTPUT)/uprobe_multi: CFLAGS += $(if $(filter mips, $(ARCH)),-mxgot) $(OUTPUT)/uprobe_multi: uprobe_multi.c $(call msg,BINARY,,$@) $(Q)$(CC) $(CFLAGS) -O0 $(LDFLAGS) $^ $(LDLIBS) -o $@
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 261/695 selftests/bpf: Fix wrong binary in Makefile log output
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 3ece93a4087b2db7b99ebb2412bd60cf26bbbb51 ]
Make log output incorrectly shows 'test_maps' as the binary name for every 'CLNG-BPF' build step, apparently picking up the last value defined for the $(TRUNNER_BINARY) variable. Update the 'CLANG_BPF_BUILD_RULE' variants to fix this confusing output.
Current output:
CLNG-BPF [test_maps] access_map_in_map.bpf.o GEN-SKEL [test_progs] access_map_in_map.skel.h
...
CLNG-BPF [test_maps] access_map_in_map.bpf.o GEN-SKEL [test_progs-no_alu32] access_map_in_map.skel.h
...
CLNG-BPF [test_maps] access_map_in_map.bpf.o GEN-SKEL [test_progs-cpuv4] access_map_in_map.skel.h
After fix:
CLNG-BPF [test_progs] access_map_in_map.bpf.o GEN-SKEL [test_progs] access_map_in_map.skel.h
...
CLNG-BPF [test_progs-no_alu32] access_map_in_map.bpf.o GEN-SKEL [test_progs-no_alu32] access_map_in_map.skel.h
...
CLNG-BPF [test_progs-cpuv4] access_map_in_map.bpf.o GEN-SKEL [test_progs-cpuv4] access_map_in_map.skel.h
--- tools/testing/selftests/bpf/Makefile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
tools/testing/selftests/bpf/Makefile +6 -5
@@ -427,23 +427,24 @@ $(OUTPUT)/cgroup_getset_retval_hooks.o: cgroup_getset_retval_hooks.h # $1 - input .c file # $2 - output .o file # $3 - CFLAGS +# $4 - binary name define CLANG_BPF_BUILD_RULE - $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) + $(call msg,CLNG-BPF,$4,$2) $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v3 -o $2 endef # Similar to CLANG_BPF_BUILD_RULE, but with disabled alu32 define CLANG_NOALU32_BPF_BUILD_RULE - $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) + $(call msg,CLNG-BPF,$4,$2) $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v2 -o $2 endef # Similar to CLANG_BPF_BUILD_RULE, but with cpu-v4 define CLANG_CPUV4_BPF_BUILD_RULE - $(call msg,CLNG-BPF,$(TRUNNER_BINARY),$2) + $(call msg,CLNG-BPF,$4,$2) $(Q)$(CLANG) $3 -O2 --target=bpf -c $1 -mcpu=v4 -o $2 endef # Build BPF object using GCC define GCC_BPF_BUILD_RULE - $(call msg,GCC-BPF,$(TRUNNER_BINARY),$2) + $(call msg,GCC-BPF,$4,$2) $(Q)$(BPF_GCC) $3 -DBPF_NO_PRESERVE_ACCESS_INDEX -Wno-attributes -O2 -c $1 -o $2 endef
@@ -535,7 +536,7 @@ $(TRUNNER_BPF_OBJS): $(TRUNNER_OUTPUT)/%.bpf.o: \ $$(call $(TRUNNER_BPF_BUILD_RULE),$$<,$$@, \ $(TRUNNER_BPF_CFLAGS) \ $$($$<-CFLAGS) \ - $$($$<-$2-CFLAGS)) + $$($$<-$2-CFLAGS),$(TRUNNER_BINARY)) $(TRUNNER_BPF_SKELS): %.skel.h: %.bpf.o $(BPFTOOL) | $(TRUNNER_OUTPUT) $$(call msg,GEN-SKEL,$(TRUNNER_BINARY),$$@)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 262/695 tools/runqslower: Fix LDFLAGS and add LDLIBS support
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit f86601c3661946721e8f260bdd812b759854ac22 ]
Actually use previously defined LDFLAGS during build and add support for LDLIBS to link extra standalone libraries e.g. 'argp' which is not provided by musl libc.
--- tools/bpf/runqslower/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/bpf/runqslower/Makefile +2 -1
@@ -15,6 +15,7 @@ INCLUDES := -I$(OUTPUT) -I$(BPF_INCLUDE) -I$(abspath ../../include/uapi) CFLAGS := -g -Wall $(CLANG_CROSS_FLAGS) CFLAGS += $(EXTRA_CFLAGS) LDFLAGS += $(EXTRA_LDFLAGS) +LDLIBS += -lelf -lz # Try to detect best kernel BTF source KERNEL_REL := $(shell uname -r)
@@ -51,7 +52,7 @@ clean: libbpf_hdrs: $(BPFOBJ) $(OUTPUT)/runqslower: $(OUTPUT)/runqslower.o $(BPFOBJ) - $(QUIET_LINK)$(CC) $(CFLAGS) $^ -lelf -lz -o $@ + $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@ $(OUTPUT)/runqslower.o: runqslower.h $(OUTPUT)/runqslower.skel.h \ $(OUTPUT)/runqslower.bpf.o | libbpf_hdrs
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 263/695 bpf: Fail verification for sign-extension of packet data/data_end/data_meta
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonghong Song <[email protected]>
[ Upstream commit 92de36080c93296ef9005690705cba260b9bd68a ]
syzbot reported a kernel crash due to
commit 1f1e864b6555 ("bpf: Handle sign-extenstin ctx member accesses").
The reason is due to sign-extension of 32-bit load for
packet data/data_end/data_meta uapi field.
The original code looks like:
r2 = *(s32 *)(r1 + 76) /* load __sk_buff->data */
r3 = *(u32 *)(r1 + 80) /* load __sk_buff->data_end */
r0 = r2
r0 += 8
if r3 > r0 goto +1
...Note that __sk_buff->data load has 32-bit sign extension.
After verification and convert_ctx_accesses(), the final asm code looks like:
r2 = *(u64 *)(r1 +208)
r2 = (s32)r2
r3 = *(u64 *)(r1 +80)
r0 = r2
r0 += 8
if r3 > r0 goto pc+1
...Note that 'r2 = (s32)r2' may make the kernel __sk_buff->data address invalid which may cause runtime failure.
Currently, in C code, typically we have
void *data = (void *)(long)skb->data;
void *data_end = (void *)(long)skb->data_end;
...
and it will generate
r2 = *(u64 *)(r1 +208)
r3 = *(u64 *)(r1 +80)
r0 = r2
r0 += 8
if r3 > r0 goto pc+1If we allow sign-extension,
void *data = (void *)(long)(int)skb->data;
void *data_end = (void *)(long)skb->data_end;
...
the generated code looks like
r2 = *(u64 *)(r1 +208)
r2 <<= 32
r2 s>>= 32
r3 = *(u64 *)(r1 +80)
r0 = r2
r0 += 8
if r3 > r0 goto pc+1and this will cause verification failure since "r2 <<= 32" is not allowed as "r2" is a packet pointer.
To fix this issue for case
r2 = *(s32 *)(r1 + 76) /* load __sk_buff->data */
this patch added additional checking in is_valid_access() callback function for packet data/data_end/data_meta access. If those accesses are with sign-extenstion, the verification will fail.
[1] https://lore.kernel.org/bpf/[email protected]/
--- include/linux/bpf.h | 1 + kernel/bpf/verifier.c | 5 +++-- net/core/filter.c | 21 ++++++++++++++++----- 3 files changed, 20 insertions(+), 7 deletions(-)
include/linux/bpf.h +1 -0
@@ -919,6 +919,7 @@ static_assert(__BPF_REG_TYPE_MAX <= BPF_BASE_TYPE_LIMIT);*/ struct bpf_insn_access_aux { enum bpf_reg_type reg_type; + bool is_ldsx; union { int ctx_field_size; struct {
kernel/bpf/verifier.c +3 -2
@@ -5606,12 +5606,13 @@ static int check_packet_access(struct bpf_verifier_env *env, u32 regno, int off,/* check access to 'struct bpf_context' fields. Supports fixed offsets only */ static int check_ctx_access (struct bpf_verifier_env *env,int insn_idx,int off,int size,enum bpf_access_type t,enum bpf_reg_type *reg_type, -struct btf **btf,u32 *btf_id,bool *is_retval) +struct btf **btf,u32 *btf_id,bool *is_retval,bool is_ldsx) {struct bpf_insn_access_aux info = { .reg_type = *reg_type, .log = &env->log, .is_retval = false, + .is_ldsx = is_ldsx, }; if (env->ops->is_valid_access &&
@@ -6925,7 +6926,7 @@ static int check_mem_access(struct bpf_verifier_env *env, int insn_idx, u32 regnreturn err; err =check_ctx_access (env, insn_idx, off, size, t, ®_type, &btf, - &btf_id, &is_retval); + &btf_id, &is_retval, is_ldsx);if (err)verbose_linfo (env, insn_idx,"; " );if (!err && t ==BPF_READ && value_regno >=0 ) {
net/core/filter.c +16 -5
@@ -8579,13 +8579,16 @@ static bool bpf_skb_is_valid_access(int off, int size, enum bpf_access_type type if (off + size > offsetofend(struct __sk_buff, cb[4]))return false;break ; + case bpf_ctx_range(struct __sk_buff, data): + case bpf_ctx_range(struct __sk_buff, data_meta): + case bpf_ctx_range(struct __sk_buff, data_end): +if (info->is_ldsx || size != size_default) +return false; +break ; case bpf_ctx_range_till(struct __sk_buff, remote_ip6[0], remote_ip6[3]): case bpf_ctx_range_till(struct __sk_buff, local_ip6[0], local_ip6[3]): case bpf_ctx_range_till(struct __sk_buff, remote_ip4, remote_ip4): case bpf_ctx_range_till(struct __sk_buff, local_ip4, local_ip4): - case bpf_ctx_range(struct __sk_buff, data): - case bpf_ctx_range(struct __sk_buff, data_meta): - case bpf_ctx_range(struct __sk_buff, data_end):if (size != size_default)return false;break ;
@@ -9029,6 +9032,14 @@ static bool xdp_is_valid_access(int off, int size, } }return false; + }else { +switch (off) { +case offsetof(struct xdp_md , data_meta): +case offsetof(struct xdp_md , data): +case offsetof(struct xdp_md , data_end): +if (info->is_ldsx) +return false; + } }switch (off) {
@@ -9354,12 +9365,12 @@ static bool flow_dissector_is_valid_access(int off, int size,switch (off) { case bpf_ctx_range(struct __sk_buff, data): -if (size != size_default) +if (info->is_ldsx || size != size_default)return false; info->reg_type =PTR_TO_PACKET ;return true; case bpf_ctx_range(struct __sk_buff, data_end): -if (size != size_default) +if (info->is_ldsx || size != size_default)return false; info->reg_type =PTR_TO_PACKET_END ;return true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 264/695 selftests/bpf: Use pid_t consistently in test_progs.c
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit ec4fe2f0fa12fd2d0115df7e58414dc26899cc5e ]
Use pid_t rather than __pid_t when allocating memory for 'worker_pids' in 'struct test_env', as this is its declared type and also avoids compile errors seen building against musl libc on mipsel64:
test_progs.c:1738:49: error: '__pid_t' undeclared (first use in this function); did you mean 'pid_t'?
1738 | env.worker_pids = calloc(sizeof(__pid_t), env.workers);
| ^~~~~~~
| pid_ttest_progs.c:1738:49: note: each undeclared identifier is reported only once for each function it appears in
--- tools/testing/selftests/bpf/test_progs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/test_progs.c +1 -1
@@ -1731,7 +1731,7 @@ int main(int argc, char **argv)/* launch workers if requested */ env.worker_id =-1 ;/* main process */ if (env.workers) { - env.worker_pids =calloc (sizeof (__pid_t), env.workers); + env.worker_pids =calloc (sizeof (pid_t), env.workers); env.worker_socks =calloc (sizeof (int ), env.workers);if (env.debug)fprintf (stdout,"Launching %d workers.\n" , env.workers);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 265/695 selftests/bpf: Fix compile error from rlim_t in sk_storage_map.c
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit d393f9479d4aaab0fa4c3caf513f28685e831f13 ]
Cast 'rlim_t' argument to match expected type of printf() format and avoid compile errors seen building for mips64el/musl-libc:
In file included from map_tests/sk_storage_map.c:20:
map_tests/sk_storage_map.c: In function 'test_sk_storage_map_stress_free':
map_tests/sk_storage_map.c:414:56: error: format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'rlim_t' {aka 'long long unsigned int'} [-Werror=format=]
414 | CHECK(err, "setrlimit(RLIMIT_NOFILE)", "rlim_new:%lu errno:%d",
| ^~~~~~~~~~~~~~~~~~~~~~~
415 | rlim_new.rlim_cur, errno);
| ~~~~~~~~~~~~~~~~~
| |
| rlim_t {aka long long unsigned int}
./test_maps.h:12:24: note: in definition of macro 'CHECK'
12 | printf(format); \
| ^~~~~~
map_tests/sk_storage_map.c:414:68: note: format string is defined here
414 | CHECK(err, "setrlimit(RLIMIT_NOFILE)", "rlim_new:%lu errno:%d",
| ~~^
| |
| long unsigned int
| %llucc1: all warnings being treated as errors
--- tools/testing/selftests/bpf/map_tests/sk_storage_map.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/map_tests/sk_storage_map.c +1 -1
@@ -412,7 +412,7 @@ static void test_sk_storage_map_stress_free(void) rlim_new.rlim_max = rlim_new.rlim_cur +128 ; err =setrlimit (RLIMIT_NOFILE , &rlim_new);CHECK (err,"setrlimit(RLIMIT_NOFILE)" ,"rlim_new:%lu errno:%d" , - rlim_new.rlim_cur, errno); + (unsigned long ) rlim_new.rlim_cur, errno); } err =do_sk_storage_map_stress_free ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 266/695 selftests/bpf: Fix error compiling bpf_iter_setsockopt.c with musl libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 7b10f0c227ce3fa055d601f058dc411092a62a78 ]
Existing code calls getsockname() with a 'struct sockaddr_in6 *' argument where a 'struct sockaddr *' argument is declared, yielding compile errors when building for mips64el/musl-libc:
bpf_iter_setsockopt.c: In function 'get_local_port':
bpf_iter_setsockopt.c:98:30: error: passing argument 2 of 'getsockname' from incompatible pointer type [-Werror=incompatible-pointer-types]
98 | if (!getsockname(fd, &addr, &addrlen))
| ^~~~~
| |
| struct sockaddr_in6 *
In file included from .../netinet/in.h:10,
from .../arpa/inet.h:9,
from ./test_progs.h:17,
from bpf_iter_setsockopt.c:5:
.../sys/socket.h:391:23: note: expected 'struct sockaddr * restrict' but argument is of type 'struct sockaddr_in6 *'
391 | int getsockname (int, struct sockaddr *__restrict, socklen_t *__restrict);
| ^cc1: all warnings being treated as errors
This compiled under glibc only because the argument is declared to be a "funky" transparent union which includes both types above. Explicitly cast the argument to allow compiling for both musl and glibc.
--- tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/bpf_iter_setsockopt.c +1 -1
@@ -95,7 +95,7 @@ static unsigned short get_local_port(int fd)struct sockaddr_in6 addr;socklen_t addrlen =sizeof (addr); -if (!getsockname (fd, &addr, &addrlen)) +if (!getsockname (fd, (struct sockaddr *)&addr, &addrlen))return ntohs (addr.sin6_port);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 267/695 selftests/bpf: Drop unneeded error.h includes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 69f409469c9b1515a5db40d5a36fda372376fa2d ]
The addition of general support for unprivileged tests in test_loader.c breaks building test_verifier on non-glibc (e.g. musl) systems, due to the inclusion of glibc extension '<error.h>' in 'unpriv_helpers.c'. However, the header is actually not needed, so remove it to restore building.
Similarly for sk_lookup.c and flow_dissector.c, error.h is not necessary and causes problems, so drop them.
--- tools/testing/selftests/bpf/prog_tests/flow_dissector.c | 1 - tools/testing/selftests/bpf/prog_tests/sk_lookup.c | 1 - tools/testing/selftests/bpf/unpriv_helpers.c | 1 - 3 files changed, 3 deletions(-)
tools/testing/selftests/bpf/prog_tests/flow_dissector.c +0 -1
@@ -1,7 +1,6 @@// SPDX-License-Identifier: GPL-2.0 #include <test_progs.h> #include <network_helpers.h> -#include <error.h> #include <linux/if_tun.h> #include <sys/uio.h>
tools/testing/selftests/bpf/prog_tests/sk_lookup.c +0 -1
@@ -18,7 +18,6 @@#include <arpa/inet.h> #include <assert.h> #include <errno.h> -#include <error.h> #include <fcntl.h> #include <sched.h> #include <stdio.h>
tools/testing/selftests/bpf/unpriv_helpers.c +0 -1
@@ -2,7 +2,6 @@#include <stdbool.h> #include <stdlib.h> -#include <error.h> #include <stdio.h> #include <string.h> #include <unistd.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 268/695 selftests/bpf: Fix missing ARRAY_SIZE() definition in bench.c
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit d44c93fc2f5a0c47b23fa03d374e45259abd92d2 ]
Add a "bpf_util.h" include to avoid the following error seen compiling for mips64el with musl libc:
bench.c: In function 'find_benchmark':
bench.c:590:25: error: implicit declaration of function 'ARRAY_SIZE' [-Werror=implicit-function-declaration]
590 | for (i = 0; i < ARRAY_SIZE(benchs); i++) {
| ^~~~~~~~~~cc1: all warnings being treated as errors
--- tools/testing/selftests/bpf/bench.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/bench.c +1 -0
@@ -10,6 +10,7 @@#include <sys/sysinfo.h> #include <signal.h> #include "bench.h" +#include "bpf_util.h" #include "testing_helpers.h" struct env env = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 269/695 selftests/bpf: Fix missing UINT_MAX definitions in benchmarks
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit a2c155131b710959beb508ca6a54769b6b1bd488 ]
Include <limits.h> in 'bench.h' to provide a UINT_MAX definition and avoid multiple compile errors against mips64el/musl-libc like:
benchs/bench_local_storage.c: In function 'parse_arg':
benchs/bench_local_storage.c:40:38: error: 'UINT_MAX' undeclared (first use in this function)
40 | if (ret < 1 || ret > UINT_MAX) {
| ^~~~~~~~
benchs/bench_local_storage.c:11:1: note: 'UINT_MAX' is defined in header '<limits.h>'; did you forget to '#include <limits.h>'?
10 | #include <test_btf.h>
+++ |+#include <limits.h>
11 |seen with bench_local_storage.c, bench_local_storage_rcu_tasks_trace.c, and bench_bpf_hashmap_lookup.c.
--- tools/testing/selftests/bpf/bench.h | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/bench.h +1 -0
@@ -10,6 +10,7 @@#include <math.h> #include <time.h> #include <sys/syscall.h> +#include <limits.h> struct cpu_set {bool *cpus;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 270/695 selftests/bpf: Fix missing BUILD_BUG_ON() declaration
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 6495eb79ca7d15bd87c38d77307e8f9b6b7bf4ef ]
Explicitly include '<linux/build_bug.h>' to fix errors seen compiling with gcc targeting mips64el/musl-libc:
user_ringbuf.c: In function 'test_user_ringbuf_loop':
user_ringbuf.c:426:9: error: implicit declaration of function 'BUILD_BUG_ON' [-Werror=implicit-function-declaration]
426 | BUILD_BUG_ON(total_samples <= c_max_entries);
| ^~~~~~~~~~~~cc1: all warnings being treated as errors
--- tools/testing/selftests/bpf/prog_tests/user_ringbuf.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/user_ringbuf.c +1 -0
@@ -4,6 +4,7 @@#define _GNU_SOURCE#include <linux/compiler.h> #include <linux/ring_buffer.h> +#include <linux/build_bug.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 271/695 selftests/bpf: Fix include of <sys/fcntl.h>
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 21f0b0af977203220ad58aff95e372151288ec47 ]
Update ns_current_pid_tgid.c to use '#include <fcntl.h>' and avoid compile error against mips64el/musl libc:
In file included from .../prog_tests/ns_current_pid_tgid.c:14:
.../include/sys/fcntl.h:1:2: error: #warning redirecting incorrect #include <sys/fcntl.h> to <fcntl.h> [-Werror=cpp]
1 | #warning redirecting incorrect #include <sys/fcntl.h> to <fcntl.h>
| ^~~~~~~
cc1: all warnings being treated as errors
--- tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/ns_current_pid_tgid.c +1 -1
@@ -11,7 +11,7 @@#include <sched.h> #include <sys/wait.h> #include <sys/mount.h> -#include <sys/fcntl.h> +#include <fcntl.h> #include "network_helpers.h" #define STACK_SIZE (1024 * 1024)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 272/695 selftests/bpf: Fix compiling parse_tcp_hdr_opt.c with musl-libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 4c329b99ef9c118343379bde9f97e8ce5cac9fc9 ]
The GNU version of 'struct tcphdr', with members 'doff' and 'urg_ptr', is not exposed by musl headers unless _GNU_SOURCE is defined.
Add this definition to fix errors seen compiling for mips64el/musl-libc:
parse_tcp_hdr_opt.c:18:21: error: 'struct tcphdr' has no member named 'urg_ptr'
18 | .pk6_v6.tcp.urg_ptr = 123,
| ^~~~~~~
parse_tcp_hdr_opt.c:19:21: error: 'struct tcphdr' has no member named 'doff'
19 | .pk6_v6.tcp.doff = 9, /* 16 bytes of options */
| ^~~~--- tools/testing/selftests/bpf/prog_tests/parse_tcp_hdr_opt.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/parse_tcp_hdr_opt.c +1 -0
@@ -1,5 +1,6 @@// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE#include <test_progs.h> #include <network_helpers.h> #include "test_parse_tcp_hdr_opt.skel.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 273/695 selftests/bpf: Fix compiling kfree_skb.c with musl-libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit bae9a5ce7d3a9b3a9e07b31ab9e9c58450e3e9fd ]
The GNU version of 'struct tcphdr' with member 'doff' is not exposed by musl headers unless _GNU_SOURCE is defined. Add this definition to fix errors seen compiling for mips64el/musl-libc:
In file included from kfree_skb.c:2:
kfree_skb.c: In function 'on_sample':
kfree_skb.c:45:30: error: 'struct tcphdr' has no member named 'doff'
45 | if (CHECK(pkt_v6->tcp.doff != 5, "check_tcp",
| ^--- tools/testing/selftests/bpf/prog_tests/kfree_skb.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/kfree_skb.c +1 -0
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE#include <test_progs.h> #include <network_helpers.h> #include "kfree_skb.skel.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 274/695 selftests/bpf: Fix compiling flow_dissector.c with musl-libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 5e4c43bcb85973243d7274e0058b6e8f5810e4f7 ]
The GNU version of 'struct tcphdr' has members 'doff', 'source' and 'dest', which are not exposed by musl libc headers unless _GNU_SOURCE is defined.
Add this definition to fix errors seen compiling for mips64el/musl-libc:
flow_dissector.c:118:30: error: 'struct tcphdr' has no member named 'doff'
118 | .tcp.doff = 5,
| ^~~~
flow_dissector.c:119:30: error: 'struct tcphdr' has no member named 'source'
119 | .tcp.source = 80,
| ^~~~~~
flow_dissector.c:120:30: error: 'struct tcphdr' has no member named 'dest'
120 | .tcp.dest = 8080,
| ^~~~--- tools/testing/selftests/bpf/prog_tests/flow_dissector.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/flow_dissector.c +1 -0
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE#include <test_progs.h> #include <network_helpers.h> #include <linux/if_tun.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 275/695 selftests/bpf: Fix compiling tcp_rtt.c with musl-libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 18826fb0b79c3c3cd1fe765d85f9c6f1a902c722 ]
The GNU version of 'struct tcp_info' in 'netinet/tcp.h' is not exposed by musl headers unless _GNU_SOURCE is defined.
Add this definition to fix errors seen compiling for mips64el/musl-libc:
tcp_rtt.c: In function 'wait_for_ack':
tcp_rtt.c:24:25: error: storage size of 'info' isn't known
24 | struct tcp_info info;
| ^~~~ tcp_rtt.c:24:25: error: unused variable 'info' [-Werror=unused-variable]
cc1: all warnings being treated as errors
--- tools/testing/selftests/bpf/prog_tests/tcp_rtt.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/tcp_rtt.c +1 -0
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE#include <test_progs.h> #include "cgroup_helpers.h" #include "network_helpers.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 276/695 selftests/bpf: Fix compiling core_reloc.c with musl-libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit debfa4f628f271f72933bf38d581cc53cfe1def5 ]
The type 'loff_t' is a GNU extension and not exposed by the musl 'fcntl.h' header unless _GNU_SOURCE is defined. Add this definition to fix errors seen compiling for mips64el/musl-libc:
In file included from tools/testing/selftests/bpf/prog_tests/core_reloc.c:4:
./bpf_testmod/bpf_testmod.h:10:9: error: unknown type name 'loff_t'
10 | loff_t off;
| ^~~~~~
./bpf_testmod/bpf_testmod.h:16:9: error: unknown type name 'loff_t'
16 | loff_t off;
| ^~~~~~--- tools/testing/selftests/bpf/prog_tests/core_reloc.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/core_reloc.c +1 -0
@@ -1,4 +1,5 @@// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE#include <test_progs.h> #include "progs/core_reloc_types.h" #include "bpf_testmod/bpf_testmod.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 277/695 selftests/bpf: Fix errors compiling lwt_redirect.c with musl libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 27c4797ce51c8dd51e35e68e9024a892f62d78b2 ]
Remove a redundant include of '<linux/icmp.h>' which is already provided in 'lwt_helpers.h'. This avoids errors seen compiling for mips64el/musl-libc:
In file included from .../arpa/inet.h:9,
from lwt_redirect.c:51:
.../netinet/in.h:23:8: error: redefinition of 'struct in6_addr'
23 | struct in6_addr {
| ^~~~~~~~
In file included from .../linux/icmp.h:24,
from lwt_redirect.c:50:
.../linux/in6.h:33:8: note: originally defined here
33 | struct in6_addr {
| ^~~~~~~~
.../netinet/in.h:34:8: error: redefinition of 'struct sockaddr_in6'
34 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../linux/in6.h:50:8: note: originally defined here
50 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../netinet/in.h:42:8: error: redefinition of 'struct ipv6_mreq'
42 | struct ipv6_mreq {
| ^~~~~~~~~
.../linux/in6.h:60:8: note: originally defined here
60 | struct ipv6_mreq {
| ^~~~~~~~~--- tools/testing/selftests/bpf/prog_tests/lwt_redirect.c | 1 - 1 file changed, 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/lwt_redirect.c +0 -1
@@ -47,7 +47,6 @@#include <linux/if_ether.h> #include <linux/if_packet.h> #include <linux/if_tun.h> -#include <linux/icmp.h> #include <arpa/inet.h> #include <unistd.h> #include <errno.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 278/695 selftests/bpf: Fix errors compiling decap_sanity.c with musl libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 1b00f355130a5dfc38a01ad02458ae2cb2ebe609 ]
Remove a redundant include of '<linux/in6.h>', whose needed definitions are already provided by 'test_progs.h'. This avoids errors seen compiling for mips64el/musl-libc:
In file included from .../arpa/inet.h:9,
from ./test_progs.h:17,
from prog_tests/decap_sanity.c:9:
.../netinet/in.h:23:8: error: redefinition of 'struct in6_addr'
23 | struct in6_addr {
| ^~~~~~~~
In file included from decap_sanity.c:7:
.../linux/in6.h:33:8: note: originally defined here
33 | struct in6_addr {
| ^~~~~~~~
.../netinet/in.h:34:8: error: redefinition of 'struct sockaddr_in6'
34 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../linux/in6.h:50:8: note: originally defined here
50 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../netinet/in.h:42:8: error: redefinition of 'struct ipv6_mreq'
42 | struct ipv6_mreq {
| ^~~~~~~~~
.../linux/in6.h:60:8: note: originally defined here
60 | struct ipv6_mreq {
| ^~~~~~~~~--- tools/testing/selftests/bpf/prog_tests/decap_sanity.c | 1 - 1 file changed, 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/decap_sanity.c +0 -1
@@ -4,7 +4,6 @@#include <sys/types.h> #include <sys/socket.h> #include <net/if.h> -#include <linux/in6.h> #include "test_progs.h" #include "network_helpers.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 279/695 selftests/bpf: Fix errors compiling crypto_sanity.c with musl libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 9822be702fe6e1c3e0933ef4b68a8c56683d930d ]
Remove a redundant include of '<linux/in6.h>', whose needed definitions are already provided by 'test_progs.h'. This avoids errors seen compiling for mips64el/musl-libc:
In file included from .../arpa/inet.h:9,
from ./test_progs.h:17,
from prog_tests/crypto_sanity.c:10:
.../netinet/in.h:23:8: error: redefinition of 'struct in6_addr'
23 | struct in6_addr {
| ^~~~~~~~
In file included from crypto_sanity.c:7:
.../linux/in6.h:33:8: note: originally defined here
33 | struct in6_addr {
| ^~~~~~~~
.../netinet/in.h:34:8: error: redefinition of 'struct sockaddr_in6'
34 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../linux/in6.h:50:8: note: originally defined here
50 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../netinet/in.h:42:8: error: redefinition of 'struct ipv6_mreq'
42 | struct ipv6_mreq {
| ^~~~~~~~~
.../linux/in6.h:60:8: note: originally defined here
60 | struct ipv6_mreq {
| ^~~~~~~~~--- tools/testing/selftests/bpf/prog_tests/crypto_sanity.c | 1 - 1 file changed, 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/crypto_sanity.c +0 -1
@@ -4,7 +4,6 @@#include <sys/types.h> #include <sys/socket.h> #include <net/if.h> -#include <linux/in6.h> #include <linux/if_alg.h> #include "test_progs.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 280/695 selftests/bpf: Fix errors compiling cg_storage_multi.h with musl libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 730561d3c08d4a327cceaabf11365958a1c00cec ]
Remove a redundant include of '<asm/types.h>', whose needed definitions are already included (via '<linux/types.h>') in cg_storage_multi_egress_only.c, cg_storage_multi_isolated.c, and cg_storage_multi_shared.c. This avoids redefinition errors seen compiling for mips64el/musl-libc like:
In file included from progs/cg_storage_multi_egress_only.c:13:
In file included from progs/cg_storage_multi.h:6:
In file included from /usr/mips64el-linux-gnuabi64/include/asm/types.h:23:
/usr/include/asm-generic/int-l64.h:29:25: error: typedef redefinition with different types ('long' vs 'long long')
29 | typedef __signed__ long __s64;
| ^
/usr/include/asm-generic/int-ll64.h:30:44: note: previous definition is here
30 | __extension__ typedef __signed__ long long __s64;
| ^--- tools/testing/selftests/bpf/progs/cg_storage_multi.h | 2 -- 1 file changed, 2 deletions(-)
tools/testing/selftests/bpf/progs/cg_storage_multi.h +0 -2
@@ -3,8 +3,6 @@ #ifndef __PROGS_CG_STORAGE_MULTI_H #define __PROGS_CG_STORAGE_MULTI_H -#include <asm/types.h> - struct cgroup_value { __u32 egress_pkts; __u32 ingress_pkts;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 281/695 libbpf: Dont take direct pointers into BTF data from st_ops
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Vernet <[email protected]>
[ Upstream commit 04a94133f1b3cccb19e056c26f056c50b4e5b3b1 ]
In struct bpf_struct_ops, we have take a pointer to a BTF type name, and a struct btf_type. This was presumably done for convenience, but can actually result in subtle and confusing bugs given that BTF data can be invalidated before a program is loaded. For example, in sched_ext, we may sometimes resize a data section after a skeleton has been opened, but before the struct_ops scheduler map has been loaded. This may cause the BTF data to be realloc'd, which can then cause a UAF when loading the program because the struct_ops map has pointers directly into the BTF data.
We're already storing the BTF type_id in struct bpf_struct_ops. Because type_id is stable, we can therefore just update the places where we were looking at those pointers to instead do the lookups we need from the type_id.
--- tools/lib/bpf/libbpf.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-)
tools/lib/bpf/libbpf.c +13 -10
@@ -496,8 +496,6 @@ struct bpf_program { };struct bpf_struct_ops { -const char *tname; -const struct btf_type *type;struct bpf_program **progs;__u32 *kern_func_off;/* e.g. struct tcp_congestion_ops in bpf_prog's btf format */
@@ -1083,11 +1081,14 @@ static int bpf_object_adjust_struct_ops_autoload(struct bpf_object *obj)continue ;for (j =0 ; j < obj->nr_maps; ++j) { +const struct btf_type *type; + map = &obj->maps[j];if (!bpf_map__is_struct_ops (map))continue ; - vlen =btf_vlen (map->st_ops->type); + type =btf__type_by_id (obj->btf, map->st_ops->type_id); + vlen =btf_vlen (type);for (k =0 ; k < vlen; ++k) { slot_prog = map->st_ops->progs[k];if (prog != slot_prog)
@@ -1121,8 +1122,8 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map)int err; st_ops = map->st_ops; - type = st_ops->type; - tname = st_ops->tname; + type =btf__type_by_id (btf, st_ops->type_id); + tname =btf__name_by_offset (btf, type->name_off); err = find_struct_ops_kern_types(obj, tname, &mod_btf, &kern_type, &kern_type_id, &kern_vtype, &kern_vtype_id,
@@ -1423,8 +1424,6 @@ static int init_struct_ops_maps(struct bpf_object *obj, const char *sec_name,memcpy (st_ops->data, data->d_buf + vsi->offset, type->size); - st_ops->tname = tname; - st_ops->type = type; st_ops->type_id = type_id; pr_debug("struct_ops init: struct %s(type_id=%u) %s found at offset %u\n",
@@ -8445,11 +8444,13 @@ static int bpf_object__resolve_externs(struct bpf_object *obj,static void bpf_map_prepare_vdata (const struct bpf_map *map) { +const struct btf_type *type;struct bpf_struct_ops *st_ops;__u32 i; st_ops = map->st_ops; -for (i =0 ; i <btf_vlen (st_ops->type); i++) { + type =btf__type_by_id (map->obj->btf, st_ops->type_id); +for (i =0 ; i <btf_vlen (type); i++) {struct bpf_program *prog = st_ops->progs[i];void *kern_data;int prog_fd;
@@ -9712,6 +9713,7 @@ static struct bpf_map *find_struct_ops_map_by_offset(struct bpf_object *obj,static int bpf_object__collect_st_ops_relos (struct bpf_object *obj,Elf64_Shdr *shdr,Elf_Data *data) { +const struct btf_type *type;const struct btf_member *member;struct bpf_struct_ops *st_ops;struct bpf_program *prog;
@@ -9771,13 +9773,14 @@ static int bpf_object__collect_st_ops_relos(struct bpf_object *obj, } insn_idx = sym->st_value /BPF_INSN_SZ ; - member =find_member_by_offset (st_ops->type, moff *8 ); + type =btf__type_by_id (btf, st_ops->type_id); + member =find_member_by_offset (type, moff *8 );if (!member) {pr_warn ("struct_ops reloc %s: cannot find member at moff %u\n" , map->name, moff);return -EINVAL ; } - member_idx = member -btf_members (st_ops->type); + member_idx = member -btf_members (type); name =btf__name_by_offset (btf, member->name_off);if (!resolve_func_ptr (btf, member->type,NULL )) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 282/695 selftests/bpf: Fix arg parsing in veristat, test_progs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 03bfcda1fbc37ef34aa21d2b9e09138335afc6ee ]
Current code parses arguments with strtok_r() using a construct like
char *state = NULL;
while ((next = strtok_r(state ? NULL : input, ",", &state))) {
...
}where logic assumes the 'state' var can distinguish between first and subsequent strtok_r() calls, and adjusts parameters accordingly. However, 'state' is strictly internal context for strtok_r() and no such assumptions are supported in the man page. Moreover, the exact behaviour of 'state' depends on the libc implementation, making the above code fragile.
Indeed, invoking "./test_progs -t <test_name>" on mips64el/musl will hang, with the above code in an infinite loop.
Similarly, we see strange behaviour running 'veristat' on mips64el/musl:
$ ./veristat -e file,prog,verdict,insns -C two-ok add-failure
Can't specify more than 9 statsRewrite code using a counter to distinguish between strtok_r() calls.
--- tools/testing/selftests/bpf/testing_helpers.c | 4 ++-- tools/testing/selftests/bpf/veristat.c | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-)
tools/testing/selftests/bpf/testing_helpers.c +2 -2
@@ -220,13 +220,13 @@ int parse_test_list(const char *s, bool is_glob_pattern) {char *input, *state =NULL , *test_spec; -int err =0 ; +int err =0 , cnt =0 ; input =strdup (s);if (!input)return -ENOMEM ; -while ((test_spec =strtok_r (state ?NULL : input,"," , &state))) { +while ((test_spec =strtok_r (cnt++ ?NULL : input,"," , &state))) { err =insert_test (set, test_spec, is_glob_pattern);if (err)break ;
tools/testing/selftests/bpf/veristat.c +4 -4
@@ -784,13 +784,13 @@ static int parse_stat(const char *stat_name, struct stat_specs *specs)static int parse_stats (const char *stats_str,struct stat_specs *specs) {char *input, *state =NULL , *next; -int err; +int err, cnt =0 ; input =strdup (stats_str);if (!input)return -ENOMEM ; -while ((next =strtok_r (state ?NULL : input,"," , &state))) { +while ((next =strtok_r (cnt++ ?NULL : input,"," , &state))) { err =parse_stat (next, specs);if (err) {free (input);
@@ -1493,7 +1493,7 @@ static int parse_stats_csv(const char *filename, struct stat_specs *specs,while (fgets (line,sizeof (line), f)) {char *input = line, *state =NULL , *next;struct verif_stats *st =NULL ; -int col =0 ; +int col =0 , cnt =0 ;if (!header) {void *tmp;
@@ -1511,7 +1511,7 @@ static int parse_stats_csv(const char *filename, struct stat_specs *specs, *stat_cntp +=1 ; } -while ((next =strtok_r (state ?NULL : input,",\n" , &state))) { +while ((next =strtok_r (cnt++ ?NULL : input,",\n" , &state))) {if (header) {/* for the first line, set up spec stats */ err =parse_stat (next, specs);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 283/695 selftests/bpf: Fix error compiling test_lru_map.c
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit cacf2a5a78cd1f5f616eae043ebc6f024104b721 ]
Although the post-increment in macro 'CPU_SET(next++, &cpuset)' seems safe, the sequencing can raise compile errors, so move the increment outside the macro. This avoids an error seen using gcc 12.3.0 for mips64el/musl-libc:
In file included from test_lru_map.c:11:
test_lru_map.c: In function 'sched_next_online':
test_lru_map.c:129:29: error: operation on 'next' may be undefined [-Werror=sequence-point]
129 | CPU_SET(next++, &cpuset);
| ^cc1: all warnings being treated as errors
--- tools/testing/selftests/bpf/test_lru_map.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/bpf/test_lru_map.c +2 -1
@@ -126,7 +126,8 @@ static int sched_next_online(int pid, int *next_to_try)while (next < nr_cpus) {CPU_ZERO (&cpuset); -CPU_SET (next++, &cpuset); +CPU_SET (next, &cpuset); + next++;if (!sched_setaffinity (pid,sizeof (cpuset), &cpuset)) { ret =0 ;break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 284/695 selftests/bpf: Fix C++ compile error from missing _Bool type
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit aa95073fd290b5b3e45f067fa22bb25e59e1ff7c ]
While building, bpftool makes a skeleton from test_core_extern.c, which itself includes <stdbool.h> and uses the 'bool' type. However, the skeleton test_core_extern.skel.h generated *does not* include <stdbool.h> or use the 'bool' type, instead using the C-only '_Bool' type. Compiling test_cpp.cpp with g++ 12.3 for mips64el/musl-libc then fails with error:
In file included from test_cpp.cpp:9:
test_core_extern.skel.h:45:17: error: '_Bool' does not name a type
45 | _Bool CONFIG_BOOL;
| ^~~~~This was likely missed previously because glibc uses a GNU extension for <stdbool.h> with C++ (#define _Bool bool), not supported by musl libc.
Normally, a C fragment would include <stdbool.h> and use the 'bool' type, and thus cleanly work after import by C++. The ideal fix would be for 'bpftool gen skeleton' to output the correct type/include supporting C++, but in the meantime add a conditional define as above.
--- tools/testing/selftests/bpf/test_cpp.cpp | 4 ++++ 1 file changed, 4 insertions(+)
tools/testing/selftests/bpf/test_cpp.cpp +4 -0
@@ -6,6 +6,10 @@ #include <bpf/libbpf.h> #include <bpf/bpf.h> #include <bpf/btf.h> + +#ifndef _Bool +#define _Bool bool +#endif #include "test_core_extern.skel.h" #include "struct_ops_module.skel.h"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 285/695 selftests/bpf: Fix redefinition errors compiling lwt_reroute.c
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 16b795cc59528cf280abc79af3c70bda42f715b9 ]
Compiling lwt_reroute.c with GCC 12.3 for mips64el/musl-libc yields errors:
In file included from .../include/arpa/inet.h:9,
from ./test_progs.h:18,
from tools/testing/selftests/bpf/prog_tests/lwt_helpers.h:11,
from tools/testing/selftests/bpf/prog_tests/lwt_reroute.c:52:
.../include/netinet/in.h:23:8: error: redefinition of 'struct in6_addr'
23 | struct in6_addr {
| ^~~~~~~~
In file included from .../include/linux/icmp.h:24,
from tools/testing/selftests/bpf/prog_tests/lwt_helpers.h:9:
.../include/linux/in6.h:33:8: note: originally defined here
33 | struct in6_addr {
| ^~~~~~~~
.../include/netinet/in.h:34:8: error: redefinition of 'struct sockaddr_in6'
34 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../include/linux/in6.h:50:8: note: originally defined here
50 | struct sockaddr_in6 {
| ^~~~~~~~~~~~
.../include/netinet/in.h:42:8: error: redefinition of 'struct ipv6_mreq'
42 | struct ipv6_mreq {
| ^~~~~~~~~
.../include/linux/in6.h:60:8: note: originally defined here
60 | struct ipv6_mreq {
| ^~~~~~~~~These errors occur because <linux/in6.h> is included before <netinet/in.h>, bypassing the Linux uapi/libc compat mechanism's partial musl support. As described in [1] and [2], fix these errors by including <netinet/in.h> in lwt_reroute.c before any uapi headers.
[1]: commit c0bace798436 ("uapi libc compat: add fallback for unsupported libcs") [2]: https://git.musl-libc.org/cgit/musl/commit/?id=04983f227238
--- tools/testing/selftests/bpf/prog_tests/lwt_reroute.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/bpf/prog_tests/lwt_reroute.c +1 -0
@@ -49,6 +49,7 @@* is not crashed, it is considered successful. */ #define NETNS "ns_lwt_reroute" +#include <netinet/in.h> #include "lwt_helpers.h" #include "network_helpers.h" #include <linux/net_tstamp.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 286/695 selftests/bpf: Fix compile if backtrace support missing in libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit c9a83e76b5a96801a2c7ea0a79ca77c356d8b38d ]
Include GNU <execinfo.h> header only with glibc and provide weak, stubbed backtrace functions as a fallback in test_progs.c. This allows for non-GNU replacements while avoiding compile errors (e.g. with musl libc) like:
test_progs.c:13:10: fatal error: execinfo.h: No such file or directory
13 | #include <execinfo.h> /* backtrace */
| ^~~~~~~~~~~~
test_progs.c: In function 'crash_handler':
test_progs.c:1034:14: error: implicit declaration of function 'backtrace' [-Werror=implicit-function-declaration]
1034 | sz = backtrace(bt, ARRAY_SIZE(bt));
| ^~~~~~~~~
test_progs.c:1045:9: error: implicit declaration of function 'backtrace_symbols_fd' [-Werror=implicit-function-declaration]
1045 | backtrace_symbols_fd(bt, sz, STDERR_FILENO);
| ^~~~~~~~~~~~~~~~~~~~--- tools/testing/selftests/bpf/test_progs.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
tools/testing/selftests/bpf/test_progs.c +15 -1
@@ -10,7 +10,6 @@#include <sched.h> #include <signal.h> #include <string.h> -#include <execinfo.h> /* backtrace */ #include <sys/sysinfo.h> /* get_nprocs */ #include <netinet/in.h> #include <sys/select.h>
@@ -19,6 +18,21 @@#include <bpf/btf.h> #include "json_writer.h" +#ifdef __GLIBC__ +#include <execinfo.h> /* backtrace */ +#endif + +/* Default backtrace funcs if missing at link */ +__weak int backtrace (void **buffer,int size) +{ +return 0 ; +} + +__weak void backtrace_symbols_fd (void *const *buffer,int size,int fd) +{ +dprintf (fd,"<backtrace not supported>\n" ); +} +static bool verbose (void ) {return env.verbosity >VERBOSE_NONE ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 287/695 selftests/bpf: Fix error compiling tc_redirect.c with musl libc
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit 21c5f4f55da759c7444a1ef13e90b6e6f674eeeb ]
Linux 5.1 implemented 64-bit time types and related syscalls to address the Y2038 problem generally across archs. Userspace handling of Y2038 varies with the libc however. While musl libc uses 64-bit time across all 32-bit and 64-bit platforms, GNU glibc uses 64-bit time on 64-bit platforms but defaults to 32-bit time on 32-bit platforms unless they "opt-in" to 64-bit time or explicitly use 64-bit syscalls and time structures.
One specific area is the standard setsockopt() call, SO_TIMESTAMPNS option used for timestamping, and the related output 'struct timespec'. GNU glibc defaults as above, also exposing the SO_TIMESTAMPNS_NEW flag to explicitly use a 64-bit call and 'struct __kernel_timespec'. Since these are not exposed or needed with musl libc, their use in tc_redirect.c leads to compile errors building for mips64el/musl:
tc_redirect.c: In function 'rcv_tstamp':
tc_redirect.c:425:32: error: 'SO_TIMESTAMPNS_NEW' undeclared (first use in this function); did you mean 'SO_TIMESTAMPNS'?
425 | cmsg->cmsg_type == SO_TIMESTAMPNS_NEW)
| ^~~~~~~~~~~~~~~~~~
| SO_TIMESTAMPNS
tc_redirect.c:425:32: note: each undeclared identifier is reported only once for each function it appears in
tc_redirect.c: In function 'test_inet_dtime':
tc_redirect.c:491:49: error: 'SO_TIMESTAMPNS_NEW' undeclared (first use in this function); did you mean 'SO_TIMESTAMPNS'?
491 | err = setsockopt(listen_fd, SOL_SOCKET, SO_TIMESTAMPNS_NEW,
| ^~~~~~~~~~~~~~~~~~
| SO_TIMESTAMPNSHowever, using SO_TIMESTAMPNS_NEW isn't strictly needed, nor is Y2038 being explicitly tested. The timestamp checks in tc_redirect.c are simple: the packet receive timestamp is non-zero and processed/handled in less than 5 seconds.
Switch to using the standard setsockopt() call and SO_TIMESTAMPNS option to ensure compatibility across glibc and musl libc. In the worst-case, there is a 5-second window 14 years from now where tc_redirect tests may fail on 32-bit systems. However, we should reasonably expect glibc to adopt a 64-bit mandate rather than the current "opt-in" policy before the Y2038 roll-over.
--- tools/testing/selftests/bpf/prog_tests/tc_redirect.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/testing/selftests/bpf/prog_tests/tc_redirect.c +6 -6
@@ -471,7 +471,7 @@ static int set_forwarding(bool enable)static int __rcv_tstamp (int fd,const char *expected,size_t s,__u64 *tstamp) { -struct __kernel_timespec pkt_ts = {}; +struct timespec pkt_ts = {};char ctl[CMSG_SPACE (sizeof (pkt_ts))];struct timespec now_ts;struct msghdr msg = {};
@@ -495,7 +495,7 @@ static int __rcv_tstamp(int fd, const char *expected, size_t s, __u64 *tstamp) cmsg =CMSG_FIRSTHDR (&msg);if (cmsg && cmsg->cmsg_level ==SOL_SOCKET && - cmsg->cmsg_type ==SO_TIMESTAMPNS_NEW ) + cmsg->cmsg_type ==SO_TIMESTAMPNS )memcpy (&pkt_ts,CMSG_DATA (cmsg),sizeof (pkt_ts)); pkt_ns = pkt_ts.tv_sec *NSEC_PER_SEC + pkt_ts.tv_nsec;
@@ -537,9 +537,9 @@ static int wait_netstamp_needed_key(void)if (!ASSERT_GE (srv_fd,0 ,"start_server" )) goto done; - err =setsockopt (srv_fd,SOL_SOCKET ,SO_TIMESTAMPNS_NEW , + err =setsockopt (srv_fd,SOL_SOCKET ,SO_TIMESTAMPNS , &opt,sizeof (opt)); -if (!ASSERT_OK (err,"setsockopt(SO_TIMESTAMPNS_NEW)" )) +if (!ASSERT_OK (err,"setsockopt(SO_TIMESTAMPNS)" )) goto done; cli_fd =connect_to_fd (srv_fd,TIMEOUT_MILLIS );
@@ -621,9 +621,9 @@ static void test_inet_dtime(int family, int type, const char *addr, __u16 port)return ;/* Ensure the kernel puts the (rcv) timestamp for all skb */ - err =setsockopt (listen_fd,SOL_SOCKET ,SO_TIMESTAMPNS_NEW , + err =setsockopt (listen_fd,SOL_SOCKET ,SO_TIMESTAMPNS , &opt,sizeof (opt)); -if (!ASSERT_OK (err,"setsockopt(SO_TIMESTAMPNS_NEW)" )) +if (!ASSERT_OK (err,"setsockopt(SO_TIMESTAMPNS)" )) goto done;if (type ==SOCK_STREAM ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 288/695 s390/entry: Move early program check handler to entry.S
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit f2bb5b97b51ce5425e8f59f899643ce4eadba667 ]
Have all program check handlers in one file to make future changes easy.
Stable-dep-of: f101b305a7b9 ("s390/entry: Make early program check handler relocated lowcore aware")
--- arch/s390/kernel/Makefile | 2 +- arch/s390/kernel/earlypgm.S | 23 ----------------------- arch/s390/kernel/entry.S | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 24 deletions(-) delete mode 100644 arch/s390/kernel/earlypgm.S
arch/s390/kernel/Makefile +1 -1
@@ -36,7 +36,7 @@ CFLAGS_stacktrace.o += -fno-optimize-sibling-calls CFLAGS_dumpstack.o += -fno-optimize-sibling-calls CFLAGS_unwind_bc.o += -fno-optimize-sibling-calls -obj-y := head64.o traps.o time.o process.o earlypgm.o early.o setup.o idle.o vtime.o +obj-y := head64.o traps.o time.o process.o early.o setup.o idle.o vtime.o obj-y += processor.o syscall.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o obj-y += debug.o irq.o ipl.o dis.o diag.o vdso.o cpufeature.o obj-y += sysinfo.o lgr.o os_info.o ctlreg.o
arch/s390/kernel/earlypgm.S deleted +0 -23
@@ -1,23 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* - * Copyright IBM Corp. 2006, 2007 - * Author(s): Michael Holzheu <[email protected]> - */ - -#include <linux/linkage.h> -#include <asm/asm-offsets.h> - -SYM_CODE_START(early_pgm_check_handler) - stmg %r8,%r15,__LC_SAVE_AREA_SYNC - aghi %r15,-(STACK_FRAME_OVERHEAD+__PT_SIZE) - la %r11,STACK_FRAME_OVERHEAD(%r15) - xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) - stmg %r0,%r7,__PT_R0(%r11) - mvc __PT_PSW(16,%r11),__LC_PGM_OLD_PSW - mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC - lgr %r2,%r11 - brasl %r14,__do_early_pgm_check - mvc __LC_RETURN_PSW(16),STACK_FRAME_OVERHEAD+__PT_PSW(%r15) - lmg %r0,%r15,STACK_FRAME_OVERHEAD+__PT_R0(%r15) - lpswe __LC_RETURN_PSW -SYM_CODE_END(early_pgm_check_handler)
arch/s390/kernel/entry.S +15 -0
@@ -599,6 +599,21 @@ SYM_CODE_START(restart_int_handler) 3: j 3b SYM_CODE_END(restart_int_handler) +SYM_CODE_START(early_pgm_check_handler) + stmg %r8,%r15,__LC_SAVE_AREA_SYNC + aghi %r15,-(STACK_FRAME_OVERHEAD+__PT_SIZE) + la %r11,STACK_FRAME_OVERHEAD(%r15) + xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) + stmg %r0,%r7,__PT_R0(%r11) + mvc __PT_PSW(16,%r11),__LC_PGM_OLD_PSW + mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC + lgr %r2,%r11 + brasl %r14,__do_early_pgm_check + mvc __LC_RETURN_PSW(16),STACK_FRAME_OVERHEAD+__PT_PSW(%r15) + lmg %r0,%r15,STACK_FRAME_OVERHEAD+__PT_R0(%r15) + lpswe __LC_RETURN_PSW +SYM_CODE_END(early_pgm_check_handler) + .section .kprobes.text, "ax" #if defined(CONFIG_CHECK_STACK) || defined(CONFIG_VMAP_STACK)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 289/695 s390/entry: Make early program check handler relocated lowcore aware
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit f101b305a7b9513a8042a2cf09018de4ff371af2 ]
Add the missing pieces so the early program check handler also works with a relocated lowcore. Right now the result of an early program check in case of a relocated lowcore would be a program check loop.
--- arch/s390/kernel/early.c | 7 +++++-- arch/s390/kernel/entry.S | 11 ++++++----- 2 files changed, 11 insertions(+), 7 deletions(-)
arch/s390/kernel/early.c +5 -2
@@ -183,12 +183,15 @@ void __do_early_pgm_check(struct pt_regs *regs) static noinline __init void setup_lowcore_early(void) { +struct lowcore *lc =get_lowcore ();psw_t psw; psw.addr = (unsigned long )early_pgm_check_handler; psw.mask =PSW_KERNEL_BITS ; -get_lowcore ()->program_new_psw = psw; -get_lowcore ()->preempt_count =INIT_PREEMPT_COUNT ; + lc->program_new_psw = psw; + lc->preempt_count =INIT_PREEMPT_COUNT ; + lc->return_lpswe =gen_lpswe (__LC_RETURN_PSW); + lc->return_mcck_lpswe =gen_lpswe (__LC_RETURN_MCCK_PSW); }static __init void detect_diag9c (void )
arch/s390/kernel/entry.S +6 -5
@@ -600,18 +600,19 @@ SYM_CODE_START(restart_int_handler) SYM_CODE_END(restart_int_handler) SYM_CODE_START(early_pgm_check_handler) - stmg %r8,%r15,__LC_SAVE_AREA_SYNC + STMG_LC %r8,%r15,__LC_SAVE_AREA_SYNC + GET_LC %r13 aghi %r15,-(STACK_FRAME_OVERHEAD+__PT_SIZE) la %r11,STACK_FRAME_OVERHEAD(%r15) xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) stmg %r0,%r7,__PT_R0(%r11) - mvc __PT_PSW(16,%r11),__LC_PGM_OLD_PSW - mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC + mvc __PT_PSW(16,%r11),__LC_PGM_OLD_PSW(%r13) + mvc __PT_R8(64,%r11),__LC_SAVE_AREA_SYNC(%r13) lgr %r2,%r11 brasl %r14,__do_early_pgm_check - mvc __LC_RETURN_PSW(16),STACK_FRAME_OVERHEAD+__PT_PSW(%r15) + mvc __LC_RETURN_PSW(16,%r13),STACK_FRAME_OVERHEAD+__PT_PSW(%r15) lmg %r0,%r15,STACK_FRAME_OVERHEAD+__PT_R0(%r15) - lpswe __LC_RETURN_PSW + LPSWEY __LC_RETURN_PSW,__LC_RETURN_LPSWE SYM_CODE_END(early_pgm_check_handler) .section .kprobes.text, "ax"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 290/695 libbpf: Fix license for btf_relocate.c
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Maguire <[email protected]>
[ Upstream commit 4a4c013d3385b0db85dc361203dc42ff048b6fd6 ]
License should be
// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
...as with other libbpf files.
--- tools/lib/bpf/btf_relocate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/bpf/btf_relocate.c +1 -1
@@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) /* Copyright (c) 2024, Oracle and/or its affiliates. */ #ifndef _GNU_SOURCE
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 291/695 samples/bpf: Fix compilation errors with cf-protection option
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiangshan Yi <[email protected]>
[ Upstream commit fdf1c728fac541891ef1aa773bfd42728626769c ]
Currently, compiling the bpf programs will result the compilation errors with the cf-protection option as follows in arm64 and loongarch64 machine when using gcc 12.3.1 and clang 17.0.6. This commit fixes the compilation errors by limited the cf-protection option only used in x86 platform.
[root@localhost linux]# make M=samples/bpf
......
CLANG-bpf samples/bpf/xdp2skb_meta_kern.o
error: option 'cf-protection=return' cannot be specified on this target
error: option 'cf-protection=branch' cannot be specified on this target 2 errors generated.
CLANG-bpf samples/bpf/syscall_tp_kern.o
error: option 'cf-protection=return' cannot be specified on this target
error: option 'cf-protection=branch' cannot be specified on this target 2 errors generated.
......
--- samples/bpf/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
samples/bpf/Makefile +5 -1
@@ -169,6 +169,10 @@ BPF_EXTRA_CFLAGS += -I$(srctree)/arch/mips/include/asm/mach-generic endif endif +ifeq ($(ARCH), x86) +BPF_EXTRA_CFLAGS += -fcf-protection +endif + TPROGS_CFLAGS += -Wall -O2 TPROGS_CFLAGS += -Wmissing-prototypes TPROGS_CFLAGS += -Wstrict-prototypes
@@ -405,7 +409,7 @@ $(obj)/%.o: $(src)/%.c -Wno-gnu-variable-sized-type-not-at-end \ -Wno-address-of-packed-member -Wno-tautological-compare \ -Wno-unknown-warning-option $(CLANG_ARCH_ARGS) \ - -fno-asynchronous-unwind-tables -fcf-protection \ + -fno-asynchronous-unwind-tables \ -I$(srctree)/samples/bpf/ -include asm_goto_workaround.h \ -O2 -emit-llvm -Xclang -disable-llvm-passes -c $< -o - | \ $(OPT) -O2 -mtriple=bpf-pc-linux | $(LLVM_DIS) | \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 292/695 selftests/bpf: no need to track next_match_pos in struct test_loader
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 4ef5d6af493558124b7a6c13cace58b938fe27d4 ]
The call stack for validate_case() function looks as follows:
- test_loader__run_subtests()
- process_subtest()
- run_subtest()
- prepare_case(), which does 'tester->next_match_pos = 0';
- validate_case(), which increments tester->next_match_pos.
Hence, each subtest is run with next_match_pos freshly set to zero. Meaning that there is no need to persist this variable in the struct test_loader, use local variable instead.
Stable-dep-of: f00bb757ed63 ("selftests/bpf: fix to avoid __msg tag de-duplication by clang")
--- tools/testing/selftests/bpf/test_loader.c | 19 ++++++++----------- tools/testing/selftests/bpf/test_progs.h | 1 - 2 files changed, 8 insertions(+), 12 deletions(-)
tools/testing/selftests/bpf/test_loader.c +8 -11
@@ -434,7 +434,6 @@ static void prepare_case(struct test_loader *tester,bpf_program__set_flags (prog, prog_flags | spec->prog_flags); tester->log_buf[0 ] ='\0' ; - tester->next_match_pos =0 ; }static void emit_verifier_log (const char *log_buf,bool force)
@@ -450,25 +449,23 @@ static void validate_case(struct test_loader *tester, struct bpf_program *prog, int load_err) { - int i, j, err; -char *match;regmatch_t reg_match[1 ]; +const char *log = tester->log_buf; +int i, j, err;for (i =0 ; i < subspec->expect_msg_cnt; i++) {struct expect_msg *msg = &subspec->expect_msgs[i]; +const char *match =NULL ;if (msg->substr) { - match =strstr (tester->log_buf + tester->next_match_pos, msg->substr); + match =strstr (log, msg->substr);if (match) - tester->next_match_pos = match - tester->log_buf +strlen (msg->substr); + log +=strlen (msg->substr); }else { - err =regexec (&msg->regex, - tester->log_buf + tester->next_match_pos,1 , reg_match,0 ); + err =regexec (&msg->regex, log,1 , reg_match,0 );if (err ==0 ) { - match = tester->log_buf + tester->next_match_pos + reg_match[0 ].rm_so; - tester->next_match_pos += reg_match[0 ].rm_eo; - }else { - match =NULL ; + match = log + reg_match[0 ].rm_so; + log += reg_match[0 ].rm_eo; } }
tools/testing/selftests/bpf/test_progs.h +0 -1
@@ -447,7 +447,6 @@ typedef int (*pre_execution_cb)(struct bpf_object *obj);struct test_loader {char *log_buf;size_t log_buf_sz; -size_t next_match_pos;pre_execution_cb pre_execution_cb;struct bpf_object *obj;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 293/695 selftests/bpf: extract test_loader->expect_msgs as a data structure
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 64f01e935ddb26f48baec71883c27878ac4231dc ]
Non-functional change: use a separate data structure to represented expected messages in test_loader.
This would allow to use the same functionality for expected set of disassembled instructions in the follow-up commit.
Stable-dep-of: f00bb757ed63 ("selftests/bpf: fix to avoid __msg tag de-duplication by clang")
--- tools/testing/selftests/bpf/test_loader.c | 81 ++++++++++++----------- 1 file changed, 41 insertions(+), 40 deletions(-)
tools/testing/selftests/bpf/test_loader.c +41 -40
@@ -55,11 +55,15 @@ struct expect_msg {regex_t regex; }; +struct expected_msgs { +struct expect_msg *patterns; +size_t cnt; +}; +struct test_subspec {char *name;bool expect_failure; -struct expect_msg *expect_msgs; -size_t expect_msg_cnt; +struct expected_msgs expect_msgs;int retval;bool execute; };
@@ -96,44 +100,45 @@ void test_loader_fini(struct test_loader *tester)free (tester->log_buf); } -static void free_test_spec (struct test_spec *spec) +static void free_msgs (struct expected_msgs *msgs) {int i; +for (i =0 ; i < msgs->cnt; i++) +if (msgs->patterns[i].regex_str) +regfree (&msgs->patterns[i].regex); +free (msgs->patterns); + msgs->patterns =NULL ; + msgs->cnt =0 ; +} + +static void free_test_spec (struct test_spec *spec) +{/* Deallocate expect_msgs arrays. */ -for (i =0 ; i < spec->priv.expect_msg_cnt; i++) -if (spec->priv.expect_msgs[i].regex_str) -regfree (&spec->priv.expect_msgs[i].regex); -for (i =0 ; i < spec->unpriv.expect_msg_cnt; i++) -if (spec->unpriv.expect_msgs[i].regex_str) -regfree (&spec->unpriv.expect_msgs[i].regex); +free_msgs (&spec->priv.expect_msgs); +free_msgs (&spec->unpriv.expect_msgs);free (spec->priv.name);free (spec->unpriv.name); -free (spec->priv.expect_msgs); -free (spec->unpriv.expect_msgs); - spec->priv.name =NULL ; spec->unpriv.name =NULL ; - spec->priv.expect_msgs =NULL ; - spec->unpriv.expect_msgs =NULL ; } -static int push_msg (const char *substr,const char *regex_str,struct test_subspec *subspec) +static int push_msg (const char *substr,const char *regex_str,struct expected_msgs *msgs) {void *tmp;int regcomp_res;char error_msg[100 ];struct expect_msg *msg; - tmp =realloc (subspec->expect_msgs, - (1 + subspec->expect_msg_cnt) *sizeof (struct expect_msg )); + tmp =realloc (msgs->patterns, + (1 + msgs->cnt) *sizeof (struct expect_msg ));if (!tmp) {ASSERT_FAIL ("failed to realloc memory for messages\n" );return -ENOMEM ; } - subspec->expect_msgs = tmp; - msg = &subspec->expect_msgs[subspec->expect_msg_cnt]; + msgs->patterns = tmp; + msg = &msgs->patterns[msgs->cnt];if (substr) { msg->substr = substr;
@@ -150,7 +155,7 @@ static int push_msg(const char *substr, const char *regex_str, struct test_subsp } } - subspec->expect_msg_cnt +=1 ; + msgs->cnt +=1 ;return 0 ; }
@@ -272,25 +277,25 @@ static int parse_test_spec(struct test_loader *tester, spec->mode_mask |=UNPRIV ; }else if (str_has_pfx (s,TEST_TAG_EXPECT_MSG_PFX )) { msg = s +sizeof (TEST_TAG_EXPECT_MSG_PFX ) -1 ; - err =push_msg (msg,NULL , &spec->priv); + err =push_msg (msg,NULL , &spec->priv.expect_msgs);if (err) goto cleanup; spec->mode_mask |=PRIV ; }else if (str_has_pfx (s,TEST_TAG_EXPECT_MSG_PFX_UNPRIV )) { msg = s +sizeof (TEST_TAG_EXPECT_MSG_PFX_UNPRIV ) -1 ; - err =push_msg (msg,NULL , &spec->unpriv); + err =push_msg (msg,NULL , &spec->unpriv.expect_msgs);if (err) goto cleanup; spec->mode_mask |=UNPRIV ; }else if (str_has_pfx (s,TEST_TAG_EXPECT_REGEX_PFX )) { msg = s +sizeof (TEST_TAG_EXPECT_REGEX_PFX ) -1 ; - err =push_msg (NULL , msg, &spec->priv); + err =push_msg (NULL , msg, &spec->priv.expect_msgs);if (err) goto cleanup; spec->mode_mask |=PRIV ; }else if (str_has_pfx (s,TEST_TAG_EXPECT_REGEX_PFX_UNPRIV )) { msg = s +sizeof (TEST_TAG_EXPECT_REGEX_PFX_UNPRIV ) -1 ; - err =push_msg (NULL , msg, &spec->unpriv); + err =push_msg (NULL , msg, &spec->unpriv.expect_msgs);if (err) goto cleanup; spec->mode_mask |=UNPRIV ;
@@ -387,11 +392,12 @@ static int parse_test_spec(struct test_loader *tester, spec->unpriv.execute = spec->priv.execute; } -if (!spec->unpriv.expect_msgs) { -for (i =0 ; i < spec->priv.expect_msg_cnt; i++) { -struct expect_msg *msg = &spec->priv.expect_msgs[i]; +if (spec->unpriv.expect_msgs.cnt ==0 ) { +for (i =0 ; i < spec->priv.expect_msgs.cnt; i++) { +struct expect_msg *msg = &spec->priv.expect_msgs.patterns[i]; - err =push_msg (msg->substr, msg->regex_str, &spec->unpriv); + err =push_msg (msg->substr, msg->regex_str, + &spec->unpriv.expect_msgs);if (err) goto cleanup; }
@@ -443,18 +449,14 @@ static void emit_verifier_log(const char *log_buf, bool force)fprintf (stdout,"VERIFIER LOG:\n=============\n%s=============\n" , log_buf); } -static void validate_case (struct test_loader *tester, -struct test_subspec *subspec, -struct bpf_object *obj, -struct bpf_program *prog, -int load_err) +static void validate_msgs (char *log_buf,struct expected_msgs *msgs) {regmatch_t reg_match[1 ]; -const char *log = tester->log_buf; +const char *log = log_buf;int i, j, err; -for (i =0 ; i < subspec->expect_msg_cnt; i++) { -struct expect_msg *msg = &subspec->expect_msgs[i]; +for (i =0 ; i < msgs->cnt; i++) { +struct expect_msg *msg = &msgs->patterns[i];const char *match =NULL ;if (msg->substr) {
@@ -471,9 +473,9 @@ static void validate_case(struct test_loader *tester,if (!ASSERT_OK_PTR (match,"expect_msg" )) {if (env.verbosity ==VERBOSE_NONE ) -emit_verifier_log (tester->log_buf, true/*force*/ ); +emit_verifier_log (log_buf, true/*force*/ );for (j =0 ; j <= i; j++) { - msg = &subspec->expect_msgs[j]; + msg = &msgs->patterns[j]; fprintf(stderr, "%s %s: '%s'\n", j < i ? "MATCHED " : "EXPECTED", msg->substr ? "SUBSTR" : " REGEX",
@@ -692,9 +694,8 @@ void run_subtest(struct test_loader *tester, goto tobj_cleanup; } } -emit_verifier_log (tester->log_buf, false/*force*/ ); -validate_case (tester, subspec, tobj, tprog, err); +validate_msgs (tester->log_buf, &subspec->expect_msgs);if (should_do_test_run (spec, subspec)) {/* For some reason test_verifier executes programs
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 294/695 selftests/bpf: allow checking xlated programs in verifier_* tests
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 9c9f7339131030949a8ef111080427ff1a8085b5 ]
Add a macro __xlated("...") for use with test_loader tests.
When such annotations are present for the test case:
- bpf_prog_get_info_by_fd() is used to get BPF program after all rewrites are applied by verifier.
- the program is disassembled and patterns specified in __xlated are searched for in the disassembly text.
__xlated matching follows the same mechanics as __msg:
each subsequent pattern is matched from the point where previous pattern ended.
This allows to write tests like below, where the goal is to verify the behavior of one of the of the transformations applied by verifier:
SEC("raw_tp")
__xlated("1: w0 = ")
__xlated("2: r0 = &(void __percpu *)(r0)")
__xlated("3: r0 = *(u32 *)(r0 +0)")
__xlated("4: exit")
__success __naked void simple(void)
{
asm volatile (
"call %[bpf_get_smp_processor_id];"
"exit;"
:
: __imm(bpf_get_smp_processor_id)
: __clobber_all);
}Stable-dep-of: f00bb757ed63 ("selftests/bpf: fix to avoid __msg tag de-duplication by clang")
--- tools/testing/selftests/bpf/progs/bpf_misc.h | 5 ++ tools/testing/selftests/bpf/test_loader.c | 82 +++++++++++++++++++- 2 files changed, 84 insertions(+), 3 deletions(-)
tools/testing/selftests/bpf/progs/bpf_misc.h +5 -0
@@ -26,6 +26,9 @@* * __regex Same as __msg, but using a regular expression. * __regex_unpriv Same as __msg_unpriv but using a regular expression. +* __xlated Expect a line in a disassembly log after verifier applies rewrites. +* Multiple __xlated attributes could be specified. +* __xlated_unpriv Same as __xlated but for unprivileged mode. * * __success Expect program load success in privileged mode. * __success_unpriv Expect program load success in unprivileged mode.
@@ -63,11 +66,13 @@*/ #define __msg (msg) __attribute__((btf_decl_tag("comment:test_expect_msg=" msg)))#define __regex (regex) __attribute__((btf_decl_tag("comment:test_expect_regex=" regex))) +#define __xlated (msg) __attribute__((btf_decl_tag("comment:test_expect_xlated=" msg)))#define __failure __attribute__((btf_decl_tag("comment:test_expect_failure")))#define __success __attribute__((btf_decl_tag("comment:test_expect_success")))#define __description (desc) __attribute__((btf_decl_tag("comment:test_description=" desc)))#define __msg_unpriv (msg) __attribute__((btf_decl_tag("comment:test_expect_msg_unpriv=" msg)))#define __regex_unpriv (regex) __attribute__((btf_decl_tag("comment:test_expect_regex_unpriv=" regex))) +#define __xlated_unpriv (msg) __attribute__((btf_decl_tag("comment:test_expect_xlated_unpriv=" msg)))#define __failure_unpriv __attribute__((btf_decl_tag("comment:test_expect_failure_unpriv")))#define __success_unpriv __attribute__((btf_decl_tag("comment:test_expect_success_unpriv")))#define __log_level (lvl) __attribute__((btf_decl_tag("comment:test_log_level="#lvl)))
tools/testing/selftests/bpf/test_loader.c +79 -3
146 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 295/695 selftests/bpf: __arch_* macro to limit test cases to specific archs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit ee7fe84468b1732fe65c5af3836437d54ac4c419 ]
Add annotations __arch_x86_64, __arch_arm64, __arch_riscv64 to specify on which architecture the test case should be tested. Several __arch_* annotations could be specified at once. When test case is not run on current arch it is marked as skipped.
For example, the following would be tested only on arm64 and riscv64:
SEC("raw_tp")
__arch_arm64
__arch_riscv64
__xlated("1: *(u64 *)(r10 - 16) = r1")
__xlated("2: call")
__xlated("3: r1 = *(u64 *)(r10 - 16);")
__success
__naked void canary_arm64_riscv64(void)
{
asm volatile (
"r1 = 1;"
"*(u64 *)(r10 - 16) = r1;"
"call %[bpf_get_smp_processor_id];"
"r1 = *(u64 *)(r10 - 16);"
"exit;"
:
: __imm(bpf_get_smp_processor_id)
: __clobber_all);
}On x86 it would be skipped:
#467/2 verifier_nocsr/canary_arm64_riscv64:SKIP
Stable-dep-of: f00bb757ed63 ("selftests/bpf: fix to avoid __msg tag de-duplication by clang")
--- tools/testing/selftests/bpf/progs/bpf_misc.h | 8 ++++ tools/testing/selftests/bpf/test_loader.c | 43 ++++++++++++++++++++ 2 files changed, 51 insertions(+)
tools/testing/selftests/bpf/progs/bpf_misc.h +8 -0
@@ -63,6 +63,10 @@* __auxiliary Annotated program is not a separate test, but used as auxiliary * for some other test cases and should always be loaded. * __auxiliary_unpriv Same, but load program in unprivileged mode. +* +* __arch_* Specify on which architecture the test case should be tested. +* Several __arch_* annotations could be specified at once. +* When test case is not run on current arch it is marked as skipped. */ #define __msg (msg) __attribute__((btf_decl_tag("comment:test_expect_msg=" msg)))#define __regex (regex) __attribute__((btf_decl_tag("comment:test_expect_regex=" regex)))
@@ -82,6 +86,10 @@#define __auxiliary __attribute__((btf_decl_tag("comment:test_auxiliary")))#define __auxiliary_unpriv __attribute__((btf_decl_tag("comment:test_auxiliary_unpriv")))#define __btf_path (path) __attribute__((btf_decl_tag("comment:test_btf_path=" path))) +#define __arch (arch) __attribute__((btf_decl_tag("comment:test_arch=" arch))) +#define __arch_x86_64 __arch("X86_64") +#define __arch_arm64 __arch("ARM64") +#define __arch_riscv64 __arch("RISCV64")/* Convenience macro for use with 'asm volatile' blocks */ #define __naked __attribute__((naked))
tools/testing/selftests/bpf/test_loader.c +43 -0
90 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 296/695 selftests/bpf: fix to avoid __msg tag de-duplication by clang
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit f00bb757ed630affc951691ddaff206039cbb7ee ]
__msg, __regex and __xlated tags are based on
__attribute__((btf_decl_tag("..."))) annotations.
Clang de-duplicates such annotations, e.g. the following two sequences of tags are identical in final BTF:
/* seq A */ /* seq B */
__tag("foo") __tag("foo")
__tag("bar") __tag("bar")
__tag("foo")Fix this by adding a unique suffix for each tag using __COUNTER__ pre-processor macro. E.g. here is a new definition for __msg:
#define __msg(msg) \
__attribute__((btf_decl_tag("comment:test_expect_msg=" XSTR(__COUNTER__) "=" msg)))Using this definition the "seq A" from example above is translated to BTF as follows:
[..] DECL_TAG 'comment:test_expect_msg=0=foo' type_id=X component_idx=-1
[..] DECL_TAG 'comment:test_expect_msg=1=bar' type_id=X component_idx=-1
[..] DECL_TAG 'comment:test_expect_msg=2=foo' type_id=X component_idx=-1Surprisingly, this bug affects a single existing test:
verifier_spill_fill/old_stack_misc_vs_cur_ctx_ptr, where sequence of identical messages was expected in the log.
--- tools/testing/selftests/bpf/progs/bpf_misc.h | 15 +++--- .../selftests/bpf/progs/verifier_spill_fill.c | 8 ++-- tools/testing/selftests/bpf/test_loader.c | 47 ++++++++++++++----- 3 files changed, 48 insertions(+), 22 deletions(-)
tools/testing/selftests/bpf/progs/bpf_misc.h +9 -6
@@ -2,6 +2,9 @@#ifndef __BPF_MISC_H__#define __BPF_MISC_H__ +#define XSTR (s) STR(s) +#define STR (s) #s +/* This set of attributes controls behavior of the * test_loader.c:test_loader__run_subtests(). *
@@ -68,15 +71,15 @@* Several __arch_* annotations could be specified at once. * When test case is not run on current arch it is marked as skipped. */ -#define __msg (msg) __attribute__((btf_decl_tag("comment:test_expect_msg=" msg))) -#define __regex (regex) __attribute__((btf_decl_tag("comment:test_expect_regex=" regex))) -#define __xlated (msg) __attribute__((btf_decl_tag("comment:test_expect_xlated=" msg))) +#define __msg (msg) __attribute__((btf_decl_tag("comment:test_expect_msg=" XSTR(__COUNTER__) "=" msg))) +#define __regex (regex) __attribute__((btf_decl_tag("comment:test_expect_regex=" XSTR(__COUNTER__) "=" regex))) +#define __xlated (msg) __attribute__((btf_decl_tag("comment:test_expect_xlated=" XSTR(__COUNTER__) "=" msg)))#define __failure __attribute__((btf_decl_tag("comment:test_expect_failure")))#define __success __attribute__((btf_decl_tag("comment:test_expect_success")))#define __description (desc) __attribute__((btf_decl_tag("comment:test_description=" desc))) -#define __msg_unpriv (msg) __attribute__((btf_decl_tag("comment:test_expect_msg_unpriv=" msg))) -#define __regex_unpriv (regex) __attribute__((btf_decl_tag("comment:test_expect_regex_unpriv=" regex))) -#define __xlated_unpriv (msg) __attribute__((btf_decl_tag("comment:test_expect_xlated_unpriv=" msg))) +#define __msg_unpriv (msg) __attribute__((btf_decl_tag("comment:test_expect_msg_unpriv=" XSTR(__COUNTER__) "=" msg))) +#define __regex_unpriv (regex) __attribute__((btf_decl_tag("comment:test_expect_regex_unpriv=" XSTR(__COUNTER__) "=" regex))) +#define __xlated_unpriv (msg) __attribute__((btf_decl_tag("comment:test_expect_xlated_unpriv=" XSTR(__COUNTER__) "=" msg)))#define __failure_unpriv __attribute__((btf_decl_tag("comment:test_expect_failure_unpriv")))#define __success_unpriv __attribute__((btf_decl_tag("comment:test_expect_success_unpriv")))#define __log_level (lvl) __attribute__((btf_decl_tag("comment:test_log_level="#lvl)))
tools/testing/selftests/bpf/progs/verifier_spill_fill.c +4 -4
@@ -1213,10 +1213,10 @@ __success __log_level(2)* - once for path entry - label 2; * - once for path entry - label 1 - label 2. */ -__msg("r1 = *(u64 *)(r10 -8)") -__msg("exit") -__msg("r1 = *(u64 *)(r10 -8)") -__msg("exit") +__msg("8: (79) r1 = *(u64 *)(r10 -8)") +__msg("9: (95) exit") +__msg("from 2 to 7") +__msg("8: safe") __msg("processed 11 insns")__flag (BPF_F_TEST_STATE_FREQ) __naked void old_stack_misc_vs_cur_ctx_ptr(void)
tools/testing/selftests/bpf/test_loader.c +35 -12
79 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 297/695 bpf: correctly handle malformed BPF_CORE_TYPE_ID_LOCAL relos
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 3d2786d65aaa954ebd3fcc033ada433e10da21c4 ]
In case of malformed relocation record of kind BPF_CORE_TYPE_ID_LOCAL referencing a non-existing BTF type, function bpf_core_calc_relo_insn would cause a null pointer deference.
Fix this by adding a proper check upper in call stack, as malformed relocation records could be passed from user space.
Simplest reproducer is a program:
r0 = 0
exitWith a single relocation record:
.insn_off = 0, /* patch first instruction */
.type_id = 100500, /* this type id does not exist */
.access_str_off = 6, /* offset of string "0" */ .kind = BPF_CORE_TYPE_ID_LOCAL,
See the link for original reproducer or next commit for a test case.
--- kernel/bpf/btf.c | 8 ++++++++ 1 file changed, 8 insertions(+)
kernel/bpf/btf.c +8 -0
@@ -8891,6 +8891,7 @@ int bpf_core_apply(struct bpf_core_ctx *ctx, const struct bpf_core_relo *relo,struct bpf_core_cand_list cands = {};struct bpf_core_relo_res targ_res;struct bpf_core_spec *specs; +const struct btf_type *type;int err;/* ~4k of temp memory necessary to convert LLVM spec like "0:1:0:5"
@@ -8900,6 +8901,13 @@ int bpf_core_apply(struct bpf_core_ctx *ctx, const struct bpf_core_relo *relo,if (!specs)return -ENOMEM ; + type =btf_type_by_id (ctx->btf, relo->type_id); +if (!type) { +bpf_log (ctx->log,"relo #%u: bad type id %u\n" , + relo_idx, relo->type_id); +return -EINVAL ; + } +if (need_cands) {struct bpf_cand_cache *cc;int i;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 298/695 selftests/bpf: Fix incorrect parameters in NULL pointer checking
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hao Ge <[email protected]>
[ Upstream commit c264487e5410e5a72db8a414566ab7d144223e6c ]
Smatch reported the following warning:
./tools/testing/selftests/bpf/testing_helpers.c:455 get_xlated_program()
warn: variable dereferenced before check 'buf' (see line 454)
It seems correct,so let's modify it based on it's suggestion.
Actually,commit b23ed4d74c4d ("selftests/bpf: Fix invalid pointer check in get_xlated_program()") fixed an issue in the test_verifier.c once,but it was reverted this time.
Let's solve this issue with the minimal changes possible.
--- tools/testing/selftests/bpf/testing_helpers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/testing_helpers.c +1 -1
@@ -451,7 +451,7 @@ int get_xlated_program(int fd_prog, struct bpf_insn **buf, __u32 *cnt) *cnt = xlated_prog_len / buf_element_size; *buf =calloc (*cnt, buf_element_size); -if (!buf) { +if (!*buf) {perror ("can't allocate xlated program buffer" );return -ENOMEM ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 299/695 libbpf: Fix bpf_object__open_skeleton()s mishandling of options
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Nakryiko <[email protected]>
[ Upstream commit c634d6f4e12d00c954410ba11db45799a8c77b5b ]
We do an ugly copying of options in bpf_object__open_skeleton() just to be able to set object name from skeleton's recorded name (while still allowing user to override it through opts->object_name).
This is not just ugly, but it also is broken due to memcpy() that doesn't take into account potential skel_opts' and user-provided opts' sizes differences due to backward and forward compatibility. This leads to copying over extra bytes and then failing to validate options properly. It could, technically, lead also to SIGSEGV, if we are unlucky.
So just get rid of that memory copy completely and instead pass default object name into bpf_object_open() directly, simplifying all this significantly. The rule now is that obj_name should be non-NULL for bpf_object_open() when called with in-memory buffer, so validate that explicitly as well.
We adopt bpf_object__open_mem() to this as well and generate default name (based on buffer memory address and size) outside of bpf_object_open().
--- tools/lib/bpf/libbpf.c | 52 +++++++++++++++--------------------------- 1 file changed, 19 insertions(+), 33 deletions(-)
tools/lib/bpf/libbpf.c +19 -33
@@ -7905,16 +7905,19 @@ static int bpf_object_init_progs(struct bpf_object *obj, const struct bpf_object }static struct bpf_object *bpf_object_open (const char *path,const void *obj_buf,size_t obj_buf_sz, +const char *obj_name,const struct bpf_object_open_opts *opts) { -const char *obj_name, *kconfig, *btf_tmp_path, *token_path; +const char *kconfig, *btf_tmp_path, *token_path;struct bpf_object *obj; -char tmp_name[64 ];int err;char *log_buf;size_t log_size;__u32 log_level; +if (obj_buf && !obj_name) +return ERR_PTR (-EINVAL ); +if (elf_version (EV_CURRENT ) ==EV_NONE ) {pr_warn ("failed to init libelf for %s\n" , path ? :"(mem buf)" );
@@ -7924,16 +7927,12 @@ static struct bpf_object *bpf_object_open(const char *path, const void *obj_buf,if (!OPTS_VALID (opts, bpf_object_open_opts))return ERR_PTR (-EINVAL ); - obj_name =OPTS_GET (opts, object_name,NULL ); + obj_name =OPTS_GET (opts, object_name,NULL ) ?: obj_name;if (obj_buf) { -if (!obj_name) { -snprintf (tmp_name,sizeof (tmp_name),"%lx-%lx" , - (unsigned long )obj_buf, - (unsigned long )obj_buf_sz); - obj_name = tmp_name; - } path = obj_name;pr_debug ("loading object '%s' from buffer\n" , obj_name); + }else { +pr_debug ("loading object from %s\n" , path); } log_buf =OPTS_GET (opts, kernel_log_buf,NULL );
@@ -8017,9 +8016,7 @@ bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts)if (!path)return libbpf_err_ptr (-EINVAL ); -pr_debug ("loading %s\n" , path); - -return libbpf_ptr (bpf_object_open (path,NULL ,0 , opts)); +return libbpf_ptr (bpf_object_open (path,NULL ,0 ,NULL , opts)); }struct bpf_object *bpf_object__open (const char *path)
@@ -8031,10 +8028,15 @@ struct bpf_object * bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, const struct bpf_object_open_opts *opts) { + char tmp_name[64]; +if (!obj_buf || obj_buf_sz ==0 )return libbpf_err_ptr (-EINVAL ); - return libbpf_ptr(bpf_object_open(NULL, obj_buf, obj_buf_sz, opts)); +/* create a (quite useless) default "name" for this memory buffer object */ +snprintf (tmp_name,sizeof (tmp_name),"%lx-%zx" , (unsigned long )obj_buf, obj_buf_sz); + +return libbpf_ptr (bpf_object_open (NULL , obj_buf, obj_buf_sz, tmp_name, opts)); }static int bpf_object_unload (struct bpf_object *obj)
@@ -13761,29 +13763,13 @@ static int populate_skeleton_progs(const struct bpf_object *obj,int bpf_object__open_skeleton (struct bpf_object_skeleton *s,const struct bpf_object_open_opts *opts) { -DECLARE_LIBBPF_OPTS (bpf_object_open_opts, skel_opts, - .object_name = s->name, - );struct bpf_object *obj;int err; -/* Attempt to preserve opts->object_name, unless overriden by user -* explicitly. Overwriting object name for skeletons is discouraged, -* as it breaks global data maps, because they contain object name -* prefix as their own map name prefix. When skeleton is generated, -* bpftool is making an assumption that this name will stay the same. -*/ -if (opts) { -memcpy (&skel_opts, opts,sizeof (*opts)); -if (!opts->object_name) - skel_opts.object_name = s->name; - } - - obj =bpf_object__open_mem (s->data, s->data_sz, &skel_opts); - err =libbpf_get_error (obj); -if (err) { -pr_warn ("failed to initialize skeleton BPF object '%s': %d\n" , - s->name, err); + obj =bpf_object_open (NULL , s->data, s->data_sz, s->name, opts); +if (IS_ERR (obj)) { + err =PTR_ERR (obj); +pr_warn ("failed to initialize skeleton BPF object '%s': %d\n" , s->name, err);return libbpf_err (err); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 300/695 s390/ap: Fix deadlock caused by recursive lock of the AP bus scan mutex
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harald Freudenberger <[email protected]>
[ Upstream commit 56199bb956c3ea82e39c72d2972ebf8c18c6a8c0 ]
There is a possibility to deadlock with an recursive lock of the AP bus scan mutex ap_scan_bus_mutex:
... kernel: ============================================
... kernel: WARNING: possible recursive locking detected
... kernel: 5.14.0-496.el9.s390x #3 Not tainted
... kernel: --------------------------------------------
... kernel: kworker/12:1/130 is trying to acquire lock:
... kernel: 0000000358bc1510 (ap_scan_bus_mutex){+.+.}-{3:3}, at: ap_bus_force_rescan+0x92/0x108 ... kernel:
but task is already holding lock:
... kernel: 0000000358bc1510 (ap_scan_bus_mutex){+.+.}-{3:3}, at: ap_scan_bus_wq_callback+0x28/0x60 ... kernel:
other info that might help us debug this:
... kernel: Possible unsafe locking scenario:
... kernel: CPU0
... kernel: ----
... kernel: lock(ap_scan_bus_mutex);
... kernel: lock(ap_scan_bus_mutex);
... kernel:
*** DEADLOCK ***
Here is how the callstack looks like:
... [<00000003576fe9ce>] process_one_work+0x2a6/0x748
... [<0000000358150c00>] ap_scan_bus_wq_callback+0x40/0x60 <- mutex locked
... [<00000003581506e2>] ap_scan_bus+0x5a/0x3b0
... [<000000035815037c>] ap_scan_adapter+0x5b4/0x8c0
... [<000000035814fa34>] ap_scan_domains+0x2d4/0x668
... [<0000000357d989b4>] device_add+0x4a4/0x6b8
... [<0000000357d9bb54>] bus_probe_device+0xb4/0xc8
... [<0000000357d9daa8>] __device_attach+0x120/0x1b0
... [<0000000357d9a632>] bus_for_each_drv+0x8a/0xd0
... [<0000000357d9d548>] __device_attach_driver+0xc0/0x140
... [<0000000357d9d3d8>] driver_probe_device+0x40/0xf0
... [<0000000357d9cec2>] really_probe+0xd2/0x460
... [<000000035814d7b0>] ap_device_probe+0x150/0x208
... [<000003ff802a5c46>] zcrypt_cex4_queue_probe+0xb6/0x1c0 [zcrypt_cex4] ... [<000003ff7fb2d36e>] zcrypt_queue_register+0xe6/0x1b0 [zcrypt] ... [<000003ff7fb2c8ac>] zcrypt_rng_device_add+0x94/0xd8 [zcrypt] ... [<0000000357d7bc52>] hwrng_register+0x212/0x228
... [<0000000357d7b8c2>] add_early_randomness+0x102/0x110
... [<000003ff7fb29c94>] zcrypt_rng_data_read+0x94/0xb8 [zcrypt]
... [<0000000358150aca>] ap_bus_force_rescan+0x92/0x108
... [<0000000358177572>] mutex_lock_interruptible_nested+0x32/0x40 <- lock again
Note this only happens when the very first random data providing crypto card appears via hot plug in the system AND is in disabled state ("deconfig"). Then the initial pull of random data fails and a re-scan of the AP bus is triggered while already in the middle of an AP bus scan caused by the appearing new hardware.
The fix is relatively simple once the scenario us understood:
The AP bus force rescan function will immediately return if there is currently an AP bus scan running with the very same thread id.
--- drivers/s390/crypto/ap_bus.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/s390/crypto/ap_bus.c +17 -0
@@ -107,6 +107,7 @@ debug_info_t *ap_dbf_info;static bool ap_scan_bus (void );static bool ap_scan_bus_result;/* result of last ap_scan_bus() */ static DEFINE_MUTEX (ap_scan_bus_mutex);/* mutex ap_scan_bus() invocations */ +static struct task_struct *ap_scan_bus_task;/* thread holding the scan mutex */ static atomic64_t ap_scan_bus_count;/* counter ap_scan_bus() invocations */ static int ap_scan_bus_time =AP_CONFIG_TIME ;static struct timer_list ap_scan_bus_timer;
@@ -1006,11 +1007,25 @@ bool ap_bus_force_rescan(void)if (scan_counter <=0 ) goto out; +/* +* There is one unlikely but nevertheless valid scenario where the +* thread holding the mutex may try to send some crypto load but +* all cards are offline so a rescan is triggered which causes +* a recursive call of ap_bus_force_rescan(). A simple return if +* the mutex is already locked by this thread solves this. +*/ +if (mutex_is_locked (&ap_scan_bus_mutex)) { +if (ap_scan_bus_task == current) + goto out; + } +/* Try to acquire the AP scan bus mutex */ if (mutex_trylock (&ap_scan_bus_mutex)) {/* mutex acquired, run the AP bus scan */ + ap_scan_bus_task = current; ap_scan_bus_result =ap_scan_bus (); rc = ap_scan_bus_result; + ap_scan_bus_task =NULL ;mutex_unlock (&ap_scan_bus_mutex); goto out; }
@@ -2284,7 +2299,9 @@ static void ap_scan_bus_wq_callback(struct work_struct *unused)* system_long_wq which invokes this function here again. */ if (mutex_trylock (&ap_scan_bus_mutex)) { + ap_scan_bus_task = current; ap_scan_bus_result =ap_scan_bus (); + ap_scan_bus_task =NULL ;mutex_unlock (&ap_scan_bus_mutex); } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 301/695 libbpf: Ensure new BTF objects inherit input endianness
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Ambardar <[email protected]>
[ Upstream commit da18bfa59d403040d8bcba1284285916fe9e4425 ]
New split BTF needs to preserve base's endianness. Similarly, when creating a distilled BTF, we need to preserve original endianness.
Fix by updating libbpf's btf__distill_base() and btf_new_empty() to retain the byte order of any source BTF objects when creating new ones.
--- tools/lib/bpf/btf.c | 4 ++++ 1 file changed, 4 insertions(+)
tools/lib/bpf/btf.c +4 -0
@@ -996,6 +996,7 @@ static struct btf *btf_new_empty(struct btf *base_btf) btf->base_btf = base_btf; btf->start_id =btf__type_cnt (base_btf); btf->start_str_off = base_btf->hdr->str_len; + btf->swapped_endian = base_btf->swapped_endian; }/* +1 for empty string at offset 0 */
@@ -5394,6 +5395,9 @@ int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf, new_base =btf__new_empty ();if (!new_base)return libbpf_err (-ENOMEM ); + +btf__set_endianness (new_base,btf__endianness (src_btf)); + dist.id_map =calloc (n,sizeof (*dist.id_map));if (!dist.id_map) { err = -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 302/695 xz: cleanup CRC32 edits from 2018
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lasse Collin <[email protected]>
[ Upstream commit 2ee96abef214550d9e92f5143ee3ac1fd1323e67 ]
In 2018, a dependency on <linux/crc32poly.h> was added to avoid duplicating the same constant in multiple files. Two months later it was found to be a bad idea and the definition of CRC32_POLY_LE macro was moved into xz_private.h to avoid including <linux/crc32poly.h>.
xz_private.h is a wrong place for it too. Revert back to the upstream version which has the poly in xz_crc32_init() in xz_crc32.c.
--- lib/xz/xz_crc32.c | 2 +- lib/xz/xz_private.h | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-)
lib/xz/xz_crc32.c +1 -1
@@ -29,7 +29,7 @@ STATIC_RW_DATA uint32_t xz_crc32_table[256]; XZ_EXTERN void xz_crc32_init(void) { -const uint32_t poly =CRC32_POLY_LE ; +const uint32_t poly =0xEDB88320 ;uint32_t i;uint32_t j;
lib/xz/xz_private.h +0 -4
@@ -105,10 +105,6 @@# endif #endif -#ifndef CRC32_POLY_LE -#define CRC32_POLY_LE 0xedb88320 -#endif -/* * Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used * before calling xz_dec_lzma2_run().
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 303/695 kthread: fix task state in kthread worker if being frozen
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Yu <[email protected]>
[ Upstream commit e16c7b07784f3fb03025939c4590b9a7c64970a7 ]
When analyzing a kernel waring message, Peter pointed out that there is a race condition when the kworker is being frozen and falls into try_to_freeze() with TASK_INTERRUPTIBLE, which could trigger a might_sleep() warning in try_to_freeze(). Although the root cause is not related to freeze()[1], it is still worthy to fix this issue ahead.
One possible race scenario:
CPU 0 CPU 1
----- -----
// kthread_worker_fn
set_current_state(TASK_INTERRUPTIBLE);
suspend_freeze_processes()
freeze_processes
static_branch_inc(&freezer_active);
freeze_kernel_threads
pm_nosig_freezing = true;
if (work) { //false
__set_current_state(TASK_RUNNING);
} else if (!freezing(current)) //false, been frozen
freezing():
if (static_branch_unlikely(&freezer_active))
if (pm_nosig_freezing)
return true;
schedule()
}
// state is still TASK_INTERRUPTIBLE
try_to_freeze()
might_sleep() <--- warningFix this by explicitly set the TASK_RUNNING before entering try_to_freeze().
--- kernel/kthread.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
kernel/kthread.c +9 -1
@@ -845,8 +845,16 @@ int kthread_worker_fn(void *worker_ptr)* event only cares about the address. */ trace_sched_kthread_work_execute_end (work, func); - }else if (!freezing (current)) + }else if (!freezing (current)) {schedule (); + }else { +/* +* Handle the case where the current remains +* TASK_INTERRUPTIBLE. try_to_freeze() expects +* the current to be TASK_RUNNING. +*/ +__set_current_state (TASK_RUNNING ); + }try_to_freeze ();cond_resched ();
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 304/695 ext4: clear EXT4_GROUP_INFO_WAS_TRIMMED_BIT even mount with discard
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: yangerkun <[email protected]>
[ Upstream commit 20cee68f5b44fdc2942d20f3172a262ec247b117 ]
Commit 3d56b8d2c74c ("ext4: Speed up FITRIM by recording flags in ext4_group_info") speed up fstrim by skipping trim trimmed group. We also has the chance to clear trimmed once there exists some block free for this group(mount without discard), and the next trim for this group will work well too.
For mount with discard, we will issue dicard when we free blocks, so leave trimmed flag keep alive to skip useless trim trigger from userspace seems reasonable. But for some case like ext4 build on dm-thinpool(ext4 blocksize 4K, pool blocksize 128K), discard from ext4 maybe unaligned for dm thinpool, and thinpool will just finish this discard(see process_discard_bio when begein equals to end) without actually process discard. For this case, trim from userspace can really help us to free some thinpool block.
So convert to clear trimmed flag for all case no matter mounted with discard or not.
--- fs/ext4/mballoc.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
fs/ext4/mballoc.c +4 -6
@@ -3887,11 +3887,8 @@ static void ext4_free_data_in_buddy(struct super_block *sb,/* * Clear the trimmed flag for the group so that the next * ext4_trim_fs can trim it. -* If the volume is mounted with -o discard, online discard -* is supported and the free blocks will be trimmed online. */ -if (!test_opt (sb,DISCARD )) -EXT4_MB_GRP_CLEAR_TRIMMED (db); +EXT4_MB_GRP_CLEAR_TRIMMED (db);if (!db->bb_free_root.rb_node) {/* No more items in the per group rb tree
@@ -6515,8 +6512,9 @@ static void ext4_mb_clear_bb(handle_t *handle, struct inode *inode," group:%u block:%d count:%lu failed" " with %d" , block_group, bit, count, err); - }else -EXT4_MB_GRP_CLEAR_TRIMMED (e4b.bd_info); + } + +EXT4_MB_GRP_CLEAR_TRIMMED (e4b.bd_info);ext4_lock_group (sb, block_group);mb_free_blocks (inode, &e4b, bit, count_clusters);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 305/695 bpftool: Fix handling enum64 in btf dump sorting
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mykyta Yatsenko <[email protected]>
[ Upstream commit b0222d1d9e6f8551a056b89b0bff38f515f3c9b5 ]
Wrong function is used to access the first enum64 element. Substituting btf_enum(t) with btf_enum64(t) for BTF_KIND_ENUM64.
--- tools/bpf/bpftool/btf.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
tools/bpf/bpftool/btf.c +4 -3
@@ -561,9 +561,10 @@ static const char *btf_type_sort_name(const struct btf *btf, __u32 index, bool fcase BTF_KIND_ENUM64 : {int name_off = t->name_off; -/* Use name of the first element for anonymous enums if allowed */ -if (!from_ref && !t->name_off &&btf_vlen (t)) - name_off =btf_enum (t)->name_off; +if (!from_ref && !name_off &&btf_vlen (t)) + name_off =btf_kind (t) ==BTF_KIND_ENUM64 ? +btf_enum64 (t)->name_off : +btf_enum (t)->name_off;return btf__name_by_offset (btf, name_off); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 306/695 sched/deadline: Fix schedstats vs deadline servers
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huang Shijie <[email protected]>
[ Upstream commit 9c602adb799e72ee537c0c7ca7e828c3fe2acad6 ]
In dl_server_start(), when schedstats is enabled, the following happens:
dl_server_start()
dl_se->dl_server = 1;
enqueue_dl_entity()
update_stats_enqueue_dl()
__schedstats_from_dl_se()
dl_task_of()
BUG_ON(dl_server(dl_se));Since only tasks have schedstats and internal entries do not, avoid trying to update stats in this case.
--- kernel/sched/deadline.c | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-)
kernel/sched/deadline.c +16 -22
@@ -1599,46 +1599,40 @@ static inline bool __dl_less(struct rb_node *a, const struct rb_node *b)return dl_time_before (__node_2_dle (a)->deadline,__node_2_dle (b)->deadline); } -static inline struct sched_statistics * +static __always_inline struct sched_statistics *__schedstats_from_dl_se (struct sched_dl_entity *dl_se) { +if (!schedstat_enabled ()) +return NULL ; + +if (dl_server (dl_se)) +return NULL ; +return &dl_task_of (dl_se)->stats; }static inline void update_stats_wait_start_dl (struct dl_rq *dl_rq,struct sched_dl_entity *dl_se) { -struct sched_statistics *stats; - -if (!schedstat_enabled ()) -return ; - - stats =__schedstats_from_dl_se (dl_se); -__update_stats_wait_start (rq_of_dl_rq (dl_rq),dl_task_of (dl_se), stats); +struct sched_statistics *stats =__schedstats_from_dl_se (dl_se); +if (stats) +__update_stats_wait_start (rq_of_dl_rq (dl_rq),dl_task_of (dl_se), stats); }static inline void update_stats_wait_end_dl (struct dl_rq *dl_rq,struct sched_dl_entity *dl_se) { -struct sched_statistics *stats; - -if (!schedstat_enabled ()) -return ; - - stats =__schedstats_from_dl_se (dl_se); -__update_stats_wait_end (rq_of_dl_rq (dl_rq),dl_task_of (dl_se), stats); +struct sched_statistics *stats =__schedstats_from_dl_se (dl_se); +if (stats) +__update_stats_wait_end (rq_of_dl_rq (dl_rq),dl_task_of (dl_se), stats); }static inline void update_stats_enqueue_sleeper_dl (struct dl_rq *dl_rq,struct sched_dl_entity *dl_se) { -struct sched_statistics *stats; - -if (!schedstat_enabled ()) -return ; - - stats =__schedstats_from_dl_se (dl_se); -__update_stats_enqueue_sleeper (rq_of_dl_rq (dl_rq),dl_task_of (dl_se), stats); +struct sched_statistics *stats =__schedstats_from_dl_se (dl_se); +if (stats) +__update_stats_enqueue_sleeper (rq_of_dl_rq (dl_rq),dl_task_of (dl_se), stats); } static inline void
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 307/695 smackfs: Use rcu_assign_pointer() to ensure safe assignment in smk_set_cipso
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiawei Ye <[email protected]>
[ Upstream commit 2749749afa071f8a0e405605de9da615e771a7ce ]
In the smk_set_cipso function, the skp->smk_netlabel.attr.mls.cat field is directly assigned to a new value without using the appropriate RCU pointer assignment functions. According to RCU usage rules, this is illegal and can lead to unpredictable behavior, including data inconsistencies and impossible-to-diagnose memory corruption issues.
This possible bug was identified using a static analysis tool developed by myself, specifically designed to detect RCU-related issues.
To address this, the assignment is now done using rcu_assign_pointer(), which ensures that the pointer assignment is done safely, with the necessary memory barriers and synchronization. This change prevents potential RCU dereference issues by ensuring that the cat field is safely updated while still adhering to RCU's requirements.
--- security/smack/smackfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
security/smack/smackfs.c +1 -1
@@ -932,7 +932,7 @@ static ssize_t smk_set_cipso(struct file *file, const char __user *buf, }if (rc >=0 ) { old_cat = skp->smk_netlabel.attr.mls.cat; - skp->smk_netlabel.attr.mls.cat = ncats.attr.mls.cat; +rcu_assign_pointer (skp->smk_netlabel.attr.mls.cat, ncats.attr.mls.cat); skp->smk_netlabel.attr.mls.lvl = ncats.attr.mls.lvl;synchronize_rcu ();netlbl_catmap_free (old_cat);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 308/695 ext4: avoid buffer_head leak in ext4_mark_inode_used()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kemeng Shi <[email protected]>
[ Upstream commit 5e5b2a56c57def1b41efd49596621504d7bcc61c ]
Release inode_bitmap_bh from ext4_read_inode_bitmap() in ext4_mark_inode_used() to avoid buffer_head leak.
By the way, remove unneeded goto for invalid ino when inode_bitmap_bh is NULL.
--- fs/ext4/ialloc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/ext4/ialloc.c +3 -2
@@ -755,10 +755,10 @@ int ext4_mark_inode_used(struct super_block *sb, int ino)struct ext4_group_desc *gdp;ext4_group_t group;int bit; -int err = -EFSCORRUPTED ; +int err;if (ino <EXT4_FIRST_INO (sb) || ino > max_ino) - goto out; +return -EFSCORRUPTED ; group = (ino -1 ) /EXT4_INODES_PER_GROUP (sb); bit = (ino -1 ) %EXT4_INODES_PER_GROUP (sb);
@@ -860,6 +860,7 @@ int ext4_mark_inode_used(struct super_block *sb, int ino) err =ext4_handle_dirty_metadata (NULL ,NULL , group_desc_bh);sync_dirty_buffer (group_desc_bh); out: +brelse (inode_bitmap_bh);return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 309/695 ext4: avoid potential buffer_head leak in __ext4_new_inode()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kemeng Shi <[email protected]>
[ Upstream commit 227d31b9214d1b9513383cf6c7180628d4b3b61f ]
If a group is marked EXT4_GROUP_INFO_IBITMAP_CORRUPT after it's inode bitmap buffer_head was successfully verified, then __ext4_new_inode() will get a valid inode_bitmap_bh of a corrupted group from ext4_read_inode_bitmap() in which case inode_bitmap_bh misses a release. Hnadle "IS_ERR(inode_bitmap_bh)" and group corruption separately like how ext4_free_inode() does to avoid buffer_head leak.
--- fs/ext4/ialloc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/ext4/ialloc.c +4 -3
@@ -1054,12 +1054,13 @@ struct inode *__ext4_new_inode(struct mnt_idmap *idmap,brelse (inode_bitmap_bh); inode_bitmap_bh =ext4_read_inode_bitmap (sb, group);/* Skip groups with suspicious inode tables */ -if (((!(sbi->s_mount_state &EXT4_FC_REPLAY )) - &&EXT4_MB_GRP_IBITMAP_CORRUPT (grp)) || -IS_ERR (inode_bitmap_bh)) { +if (IS_ERR (inode_bitmap_bh)) { inode_bitmap_bh =NULL ; goto next_group; } +if (!(sbi->s_mount_state &EXT4_FC_REPLAY ) && +EXT4_MB_GRP_IBITMAP_CORRUPT (grp)) + goto next_group; repeat_in_this_group: ret2 =find_inode_bit (sb, group, inode_bitmap_bh, &ino);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 310/695 ext4: avoid negative min_clusters in find_group_orlov()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kemeng Shi <[email protected]>
[ Upstream commit bb0a12c3439b10d88412fd3102df5b9a6e3cd6dc ]
min_clusters is signed integer and will be converted to unsigned integer when compared with unsigned number stats.free_clusters. If min_clusters is negative, it will be converted to a huge unsigned value in which case all groups may not meet the actual desired free clusters.
Set negative min_clusters to 0 to avoid unexpected behavior.
--- fs/ext4/ialloc.c | 2 ++ 1 file changed, 2 insertions(+)
fs/ext4/ialloc.c +2 -0
@@ -514,6 +514,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,if (min_inodes <1 ) min_inodes =1 ; min_clusters = avefreec -EXT4_CLUSTERS_PER_GROUP (sb)*flex_size /4 ; +if (min_clusters <0 ) + min_clusters =0 ;/* * Start looking in the flex group where we last allocated an
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 311/695 ext4: return error on ext4_find_inline_entry
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thadeu Lima de Souza Cascardo <[email protected]>
[ Upstream commit 4d231b91a944f3cab355fce65af5871fb5d7735b ]
In case of errors when reading an inode from disk or traversing inline directory entries, return an error-encoded ERR_PTR instead of returning NULL. ext4_find_inline_entry only caller, __ext4_find_entry already returns such encoded errors.
Stable-dep-of: c6b72f5d82b1 ("ext4: avoid OOB when system.data xattr changes underneath the filesystem")
--- fs/ext4/inline.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
fs/ext4/inline.c +7 -3
@@ -1669,8 +1669,9 @@ struct buffer_head *ext4_find_inline_entry(struct inode *dir,void *inline_start;int inline_size; -if (ext4_get_inode_loc (dir, &iloc)) -return NULL ; + ret =ext4_get_inode_loc (dir, &iloc); +if (ret) +return ERR_PTR (ret);down_read (&EXT4_I (dir)->xattr_sem);if (!ext4_has_inline_data (dir)) {
@@ -1701,7 +1702,10 @@ struct buffer_head *ext4_find_inline_entry(struct inode *dir, out:brelse (iloc.bh); - iloc.bh =NULL ; +if (ret <0 ) + iloc.bh =ERR_PTR (ret); +else + iloc.bh =NULL ; out_find:up_read (&EXT4_I (dir)->xattr_sem);return iloc.bh;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 312/695 ext4: avoid OOB when system.data xattr changes underneath the filesystem
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thadeu Lima de Souza Cascardo <[email protected]>
[ Upstream commit c6b72f5d82b1017bad80f9ebf502832fc321d796 ]
When looking up for an entry in an inlined directory, if e_value_offs is changed underneath the filesystem by some change in the block device, it will lead to an out-of-bounds access that KASAN detects as an UAF.
EXT4-fs (loop0): mounted filesystem 00000000-0000-0000-0000-000000000000 r/w without journal. Quota mode: none.
loop0: detected capacity change from 2048 to 2047
==================================================================
BUG: KASAN: use-after-free in ext4_search_dir+0xf2/0x1c0 fs/ext4/namei.c:1500 Read of size 1 at addr ffff88803e91130f by task syz-executor269/5103 CPU: 0 UID: 0 PID: 5103 Comm: syz-executor269 Not tainted 6.11.0-rc4-syzkaller #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014 Call Trace: <TASK> __dump_stack lib/dump_stack.c:93 [inline] dump_stack_lvl+0x241/0x360 lib/dump_stack.c:119 print_address_description mm/kasan/report.c:377 [inline] print_report+0x169/0x550 mm/kasan/report.c:488 kasan_report+0x143/0x180 mm/kasan/report.c:601 ext4_search_dir+0xf2/0x1c0 fs/ext4/namei.c:1500 ext4_find_inline_entry+0x4be/0x5e0 fs/ext4/inline.c:1697 __ext4_find_entry+0x2b4/0x1b30 fs/ext4/namei.c:1573 ext4_lookup_entry fs/ext4/namei.c:1727 [inline] ext4_lookup+0x15f/0x750 fs/ext4/namei.c:1795 lookup_one_qstr_excl+0x11f/0x260 fs/namei.c:1633 filename_create+0x297/0x540 fs/namei.c:3980 do_symlinkat+0xf9/0x3a0 fs/namei.c:4587 __do_sys_symlinkat fs/namei.c:4610 [inline] __se_sys_symlinkat fs/namei.c:4607 [inline] __x64_sys_symlinkat+0x95/0xb0 fs/namei.c:4607 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf3/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x77/0x7f RIP: 0033:0x7f3e73ced469 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 21 18 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007fff4d40c258 EFLAGS: 00000246 ORIG_RAX: 000000000000010a RAX: ffffffffffffffda RBX: 0032656c69662f2e RCX: 00007f3e73ced469 RDX: 0000000020000200 RSI: 00000000ffffff9c RDI: 00000000200001c0 RBP: 0000000000000000 R08: 00007fff4d40c290 R09: 00007fff4d40c290 R10: 0023706f6f6c2f76 R11: 0000000000000246 R12: 00007fff4d40c27c R13: 0000000000000003 R14: 431bde82d7b634db R15: 00007fff4d40c2b0 </TASK>
Calling ext4_xattr_ibody_find right after reading the inode with ext4_get_inode_loc will lead to a check of the validity of the xattrs, avoiding this problem.
--- fs/ext4/inline.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-)
fs/ext4/inline.c +21 -10
@@ -1664,25 +1664,36 @@ struct buffer_head *ext4_find_inline_entry(struct inode *dir,struct ext4_dir_entry_2 **res_dir, int *has_inline_data) { + struct ext4_xattr_ibody_find is = { + .s = { .not_found = -ENODATA , }, + }; +struct ext4_xattr_info i = { + .name_index =EXT4_XATTR_INDEX_SYSTEM , + .name =EXT4_XATTR_SYSTEM_DATA , + };int ret; -struct ext4_iloc iloc;void *inline_start;int inline_size; - ret =ext4_get_inode_loc (dir, &iloc); + ret =ext4_get_inode_loc (dir, &is.iloc);if (ret)return ERR_PTR (ret);down_read (&EXT4_I (dir)->xattr_sem); + + ret =ext4_xattr_ibody_find (dir, &i, &is); +if (ret) + goto out; +if (!ext4_has_inline_data (dir)) { *has_inline_data =0 ; goto out; } - inline_start = (void *)ext4_raw_inode (&iloc)->i_block + + inline_start = (void *)ext4_raw_inode (&is.iloc)->i_block +EXT4_INLINE_DOTDOT_SIZE ; inline_size =EXT4_MIN_INLINE_DATA_SIZE -EXT4_INLINE_DOTDOT_SIZE ; - ret =ext4_search_dir (iloc.bh, inline_start, inline_size, + ret =ext4_search_dir (is.iloc.bh, inline_start, inline_size, dir, fname,0 , res_dir);if (ret ==1 ) goto out_find;
@@ -1692,23 +1703,23 @@ struct buffer_head *ext4_find_inline_entry(struct inode *dir,if (ext4_get_inline_size (dir) ==EXT4_MIN_INLINE_DATA_SIZE ) goto out; - inline_start =ext4_get_inline_xattr_pos (dir, &iloc); + inline_start =ext4_get_inline_xattr_pos (dir, &is.iloc); inline_size =ext4_get_inline_size (dir) -EXT4_MIN_INLINE_DATA_SIZE ; - ret =ext4_search_dir (iloc.bh, inline_start, inline_size, + ret =ext4_search_dir (is.iloc.bh, inline_start, inline_size, dir, fname,0 , res_dir);if (ret ==1 ) goto out_find; out: -brelse (iloc.bh); +brelse (is.iloc.bh);if (ret <0 ) - iloc.bh =ERR_PTR (ret); + is.iloc.bh =ERR_PTR (ret);else - iloc.bh =NULL ; + is.iloc.bh =NULL ; out_find:up_read (&EXT4_I (dir)->xattr_sem); -return iloc.bh; +return is.iloc.bh; } int ext4_delete_inline_entry(handle_t *handle,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 313/695 ext4: check stripe size compatibility on remount as well
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ojaswin Mujoo <[email protected]>
[ Upstream commit ee85e0938aa8f9846d21e4d302c3cf6a2a75110d ]
We disable stripe size in __ext4_fill_super if it is not a multiple of the cluster ratio however this check is missed when trying to remount. This can leave us with cases where stripe < cluster_ratio after remount:set making EXT4_B2C(sbi->s_stripe) become 0 that can cause some unforeseen bugs like divide by 0.
Fix that by adding the check in remount path as well.
--- fs/ext4/super.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-)
fs/ext4/super.c +22 -7
@@ -5165,6 +5165,18 @@ static int ext4_block_group_meta_init(struct super_block *sb, int silent)return 0 ; } +/* +* It's hard to get stripe aligned blocks if stripe is not aligned with +* cluster, just disable stripe and alert user to simplify code and avoid +* stripe aligned allocation which will rarely succeed. +*/ +static bool ext4_is_stripe_incompatible (struct super_block *sb,unsigned long stripe) +{ +struct ext4_sb_info *sbi =EXT4_SB (sb); +return (stripe >0 && sbi->s_cluster_ratio >1 && + stripe % sbi->s_cluster_ratio !=0 ); +} +static int __ext4_fill_super (struct fs_context *fc,struct super_block *sb) {struct ext4_super_block *es =NULL ;
@@ -5272,13 +5284,7 @@ static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb) goto failed_mount3; sbi->s_stripe =ext4_get_stripe_size (sbi); -/* -* It's hard to get stripe aligned blocks if stripe is not aligned with -* cluster, just disable stripe and alert user to simpfy code and avoid -* stripe aligned allocation which will rarely successes. -*/ -if (sbi->s_stripe >0 && sbi->s_cluster_ratio >1 && - sbi->s_stripe % sbi->s_cluster_ratio !=0 ) { +if (ext4_is_stripe_incompatible (sb, sbi->s_stripe)) { ext4_msg(sb, KERN_WARNING, "stripe (%lu) is not aligned with cluster size (%u), " "stripe is disabled",
@@ -6441,6 +6447,15 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb) } +if ((ctx->spec & EXT4_SPEC_s_stripe) && +ext4_is_stripe_incompatible (sb, ctx->s_stripe)) { +ext4_msg (sb,KERN_WARNING , +"stripe (%lu) is not aligned with cluster size (%u), " +"stripe is disabled" , + ctx->s_stripe, sbi->s_cluster_ratio); + ctx->s_stripe =0 ; + } +/* * Changing the DIOREAD_NOLOCK or DELALLOC mount options may cause * two calls to ext4_should_dioread_nolock() to return inconsistent
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 314/695 sched/numa: Fix the vma scan starving issue
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yujie Liu <[email protected]>
[ Upstream commit f22cde4371f3c624e947a35b075c06c771442a43 ]
Problem statement:
Since commit fc137c0ddab2 ("sched/numa: enhance vma scanning logic"), the Numa vma scan overhead has been reduced a lot. Meanwhile, the reducing of the vma scan might create less Numa page fault information. The insufficient information makes it harder for the Numa balancer to make decision. Later, commit b7a5b537c55c08 ("sched/numa: Complete scanning of partial VMAs regardless of PID activity") and commit 84db47ca7146d7 ("sched/numa: Fix mm numa_scan_seq based unconditional scan") are found to bring back part of the performance.
Recently when running SPECcpu omnetpp_r on a 320 CPUs/2 Sockets system, a long duration of remote Numa node read was observed by PMU events: A few cores having ~500MB/s remote memory access for ~20 seconds. It causes high core-to-core variance and performance penalty. After the investigation, it is found that many vmas are skipped due to the active PID check. According to the trace events, in most cases, vma_is_accessed() returns false because the history access info stored in pids_active array has been cleared.
Proposal:
The main idea is to adjust vma_is_accessed() to let it return true easier. Thus compare the diff between mm->numa_scan_seq and vma->numab_state->prev_scan_seq. If the diff has exceeded the threshold, scan the vma.
This patch especially helps the cases where there are small number of threads, like the process-based SPECcpu. Without this patch, if the SPECcpu process access the vma at the beginning, then sleeps for a long time, the pid_active array will be cleared. A a result, if this process is woken up again, it never has a chance to set prot_none anymore. Because only the first 2 times of access is granted for vma scan:
(current->mm->numa_scan_seq) - vma->numab_state->start_scan_seq) < 2 to be worse, no other threads within the task can help set the prot_none. This causes information lost.
Raghavendra helped test current patch and got the positive result on the AMD platform:
autonumabench NUMA01
base patched Amean syst-NUMA01 194.05 ( 0.00%) 165.11 * 14.92%* Amean elsp-NUMA01 324.86 ( 0.00%) 315.58 * 2.86%*
Duration User 380345.36 368252.04
Duration System 1358.89 1156.23 Duration Elapsed 2277.45 2213.25
autonumabench NUMA02
Amean syst-NUMA02 1.12 ( 0.00%) 1.09 * 2.93%* Amean elsp-NUMA02 3.50 ( 0.00%) 3.56 * -1.84%*
Duration User 1513.23 1575.48
Duration System 8.33 8.13
Duration Elapsed 28.59 29.71
kernbench
Amean user-256 22935.42 ( 0.00%) 22535.19 * 1.75%* Amean syst-256 7284.16 ( 0.00%) 7608.72 * -4.46%* Amean elsp-256 159.01 ( 0.00%) 158.17 * 0.53%*
Duration User 68816.41 67615.74 Duration System 21873.94 22848.08
Duration Elapsed 506.66 504.55
Intel 256 CPUs/2 Sockets:
autonuma benchmark also shows improvements:
v6.10-rc5 v6.10-rc5
+patch
Amean syst-NUMA01 245.85 ( 0.00%) 230.84 * 6.11%*
Amean syst-NUMA01_THREADLOCAL 205.27 ( 0.00%) 191.86 * 6.53%*
Amean syst-NUMA02 18.57 ( 0.00%) 18.09 * 2.58%*
Amean syst-NUMA02_SMT 2.63 ( 0.00%) 2.54 * 3.47%*
Amean elsp-NUMA01 517.17 ( 0.00%) 526.34 * -1.77%*
Amean elsp-NUMA01_THREADLOCAL 99.92 ( 0.00%) 100.59 * -0.67%*
Amean elsp-NUMA02 15.81 ( 0.00%) 15.72 * 0.59%*
Amean elsp-NUMA02_SMT 13.23 ( 0.00%) 12.89 * 2.53%* v6.10-rc5 v6.10-rc5
+patch
Duration User 1064010.16 1075416.23
Duration System 3307.64 3104.66
Duration Elapsed 4537.54 4604.73The SPECcpu remote node access issue disappears with the patch applied.
--- kernel/sched/fair.c | 9 +++++++++ 1 file changed, 9 insertions(+)
kernel/sched/fair.c +9 -0
@@ -3188,6 +3188,15 @@ static bool vma_is_accessed(struct mm_struct *mm, struct vm_area_struct *vma)return true; } +/* +* This vma has not been accessed for a while, and if the number +* the threads in the same process is low, which means no other +* threads can help scan this vma, force a vma scan. +*/ +if (READ_ONCE (mm->numa_scan_seq) > + (vma->numab_state->prev_scan_seq +get_nr_threads (current))) +return true; +return false; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 315/695 nilfs2: fix potential null-ptr-deref in nilfs_btree_insert()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
[ Upstream commit 9403001ad65ae4f4c5de368bdda3a0636b51d51a ]
Patch series "nilfs2: fix potential issues with empty b-tree nodes".
This series addresses three potential issues with empty b-tree nodes that can occur with corrupted filesystem images, including one recently discovered by syzbot.
This patch (of 3):
If a b-tree is broken on the device, and the b-tree height is greater than 2 (the level of the root node is greater than 1) even if the number of child nodes of the b-tree root is 0, a NULL pointer dereference occurs in nilfs_btree_prepare_insert(), which is called from nilfs_btree_insert().
This is because, when the number of child nodes of the b-tree root is 0, nilfs_btree_do_lookup() does not set the block buffer head in any of path[x].bp_bh, leaving it as the initial value of NULL, but if the level of the b-tree root node is greater than 1, nilfs_btree_get_nonroot_node(), which accesses the buffer memory of path[x].bp_bh, is called.
Fix this issue by adding a check to nilfs_btree_root_broken(), which performs sanity checks when reading the root node from the device, to detect this inconsistency.
Thanks to Lizhi Xu for trying to solve the bug and clarifying the cause early on.
--- fs/nilfs2/btree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/nilfs2/btree.c +2 -1
@@ -381,7 +381,8 @@ static int nilfs_btree_root_broken(const struct nilfs_btree_node *node,if (unlikely (level <NILFS_BTREE_LEVEL_NODE_MIN || level >=NILFS_BTREE_LEVEL_MAX || nchildren <0 || - nchildren >NILFS_BTREE_ROOT_NCHILDREN_MAX )) { + nchildren >NILFS_BTREE_ROOT_NCHILDREN_MAX || + (nchildren ==0 && level >NILFS_BTREE_LEVEL_NODE_MIN ))) {nilfs_crit (inode->i_sb,"bad btree root (ino=%lu): level = %d, flags = 0x%x, nchildren = %d" , inode->i_ino, level, flags, nchildren);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 316/695 nilfs2: determine empty node blocks as corrupted
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
[ Upstream commit 111b812d3662f3a1b831d19208f83aa711583fe6 ]
Due to the nature of b-trees, nilfs2 itself and admin tools such as mkfs.nilfs2 will never create an intermediate b-tree node block with 0 child nodes, nor will they delete (key, pointer)-entries that would result in such a state. However, it is possible that a b-tree node block is corrupted on the backing device and is read with 0 child nodes.
Because operation is not guaranteed if the number of child nodes is 0 for intermediate node blocks other than the root node, modify nilfs_btree_node_broken(), which performs sanity checks when reading a b-tree node block, so that such cases will be judged as metadata corruption.
--- fs/nilfs2/btree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nilfs2/btree.c +1 -1
@@ -350,7 +350,7 @@ static int nilfs_btree_node_broken(const struct nilfs_btree_node *node,if (unlikely (level <NILFS_BTREE_LEVEL_NODE_MIN || level >=NILFS_BTREE_LEVEL_MAX || (flags &NILFS_BTREE_NODE_ROOT ) || - nchildren <0 || + nchildren <=0 || nchildren >NILFS_BTREE_NODE_NCHILDREN_MAX (size))) { nilfs_crit(inode->i_sb, "bad btree node (ino=%lu, blocknr=%llu): level = %d, flags = 0x%x, nchildren = %d",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 317/695 nilfs2: fix potential oob read in nilfs_btree_check_delete()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryusuke Konishi <[email protected]>
[ Upstream commit f9c96351aa6718b42a9f42eaf7adce0356bdb5e8 ]
The function nilfs_btree_check_delete(), which checks whether degeneration to direct mapping occurs before deleting a b-tree entry, causes memory access outside the block buffer when retrieving the maximum key if the root node has no entries.
This does not usually happen because b-tree mappings with 0 child nodes are never created by mkfs.nilfs2 or nilfs2 itself. However, it can happen if the b-tree root node read from a device is configured that way, so fix this potential issue by adding a check for that case.
--- fs/nilfs2/btree.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/nilfs2/btree.c +5 -2
@@ -1659,13 +1659,16 @@ static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)int nchildren, ret; root =nilfs_btree_get_root (btree); + nchildren =nilfs_btree_node_get_nchildren (root); +if (unlikely (nchildren ==0 )) +return 0 ; +switch (nilfs_btree_height (btree)) {case 2 : bh =NULL ; node = root;break ;case 3 : - nchildren =nilfs_btree_node_get_nchildren (root);if (nchildren >1 )return 0 ; ptr = nilfs_btree_node_get_ptr(root, nchildren - 1,
@@ -1674,12 +1677,12 @@ static int nilfs_btree_check_delete(struct nilfs_bmap *btree, __u64 key)if (ret <0 )return ret; node = (struct nilfs_btree_node *)bh->b_data; + nchildren =nilfs_btree_node_get_nchildren (node);break ;default :return 0 ; } - nchildren =nilfs_btree_node_get_nchildren (node); maxkey =nilfs_btree_node_get_key (node, nchildren -1 ); nextmaxkey = (nchildren >1 ) ?nilfs_btree_node_get_key (node, nchildren -2 ) :0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 318/695 sched/pelt: Use rq_clock_task() for hw_pressure
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Yu <[email protected]>
[ Upstream commit 84d265281d6cea65353fc24146280e0d86ac50cb ]
commit 97450eb90965 ("sched/pelt: Remove shift of thermal clock") removed the decay_shift for hw_pressure. This commit uses the sched_clock_task() in sched_tick() while it replaces the sched_clock_task() with rq_clock_pelt() in __update_blocked_others(). This could bring inconsistence. One possible scenario I can think of is in ___update_load_sum():
u64 delta = now - sa->last_update_time
'now' could be calculated by rq_clock_pelt() from __update_blocked_others(), and last_update_time was calculated by rq_clock_task() previously from sched_tick(). Usually the former chases after the latter, it cause a very large 'delta' and brings unexpected behavior.
--- kernel/sched/fair.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
kernel/sched/fair.c +2 -1
@@ -9365,9 +9365,10 @@ static bool __update_blocked_others(struct rq *rq, bool *done) hw_pressure =arch_scale_hw_pressure (cpu_of (rq)); +/* hw_pressure doesn't care about invariance */ decayed =update_rt_rq_load_avg (now, rq, curr_class == &rt_sched_class) |update_dl_rq_load_avg (now, rq, curr_class == &dl_sched_class) | -update_hw_load_avg (now, rq, hw_pressure) | +update_hw_load_avg (rq_clock_task (rq), rq, hw_pressure) |update_irq_load_avg (rq,0 );if (others_have_blocked (rq))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 319/695 bpf: Fix bpf_strtol and bpf_strtoul helpers for 32bit
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit cfe69c50b05510b24e26ccb427c7cc70beafd6c1 ]
The bpf_strtol() and bpf_strtoul() helpers are currently broken on 32bit:
The argument type ARG_PTR_TO_LONG is BPF-side "long", not kernel-side "long" and therefore always considered fixed 64bit no matter if 64 or 32bit underlying architecture.
This contract breaks in case of the two mentioned helpers since their BPF_CALL definition for the helpers was added with {unsigned,}long *res. Meaning, the transition from BPF-side "long" (BPF program) to kernel-side "long" (BPF helper) breaks here.
Both helpers call __bpf_strtoll() with "long long" correctly, but later assigning the result into 32-bit "*(long *)" on 32bit architectures. From a BPF program point of view, this means upper bits will be seen as uninitialised.
Therefore, fix both BPF_CALL signatures to {s,u}64 types to fix this situation.
Now, changing also uapi/bpf.h helper documentation which generates bpf_helper_defs.h for BPF programs is tricky: Changing signatures there to __{s,u}64 would trigger compiler warnings (incompatible pointer types passing 'long *' to parameter of type '__s64 *' (aka 'long long *')) for existing BPF programs.
Leaving the signatures as-is would be fine as from BPF program point of view it is still BPF-side "long" and thus equivalent to __{s,u}64 on 64 or 32bit underlying architectures.
Note that bpf_strtol() and bpf_strtoul() are the only helpers with this issue.
--- kernel/bpf/helpers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/bpf/helpers.c +2 -2
@@ -517,7 +517,7 @@ static int __bpf_strtoll(const char *buf, size_t buf_len, u64 flags, } BPF_CALL_4(bpf_strtol, const char *, buf, size_t, buf_len, u64, flags, - long *, res) + s64 *, res) {long long _res;int err;
@@ -542,7 +542,7 @@ const struct bpf_func_proto bpf_strtol_proto = { }; BPF_CALL_4(bpf_strtoul, const char *, buf, size_t, buf_len, u64, flags, - unsigned long *, res) + u64 *, res) {unsigned long long _res;bool is_negative;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 320/695 bpf: Fix helper writes to read-only maps
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 32556ce93bc45c730829083cb60f95a2728ea48b ]
Lonial found an issue that despite user- and BPF-side frozen BPF map (like in case of .rodata), it was still possible to write into it from a BPF program side through specific helpers having ARG_PTR_TO_{LONG,INT} as arguments.
In check_func_arg() when the argument is as mentioned, the meta->raw_mode is never set. Later, check_helper_mem_access(), under the case of PTR_TO_MAP_VALUE as register base type, it assumes BPF_READ for the subsequent call to check_map_access_type() and given the BPF map is read-only it succeeds.
The helpers really need to be annotated as ARG_PTR_TO_{LONG,INT} | MEM_UNINIT when results are written into them as opposed to read out of them. The latter indicates that it's okay to pass a pointer to uninitialized memory as the memory is written to anyway.
However, ARG_PTR_TO_{LONG,INT} is a special case of ARG_PTR_TO_FIXED_SIZE_MEM just with additional alignment requirement. So it is better to just get rid of the ARG_PTR_TO_{LONG,INT} special cases altogether and reuse the fixed size memory types. For this, add MEM_ALIGNED to additionally ensure alignment given these helpers write directly into the args via *<ptr> = val. The .arg*_size has been initialized reflecting the actual sizeof(*<ptr>).
MEM_ALIGNED can only be used in combination with MEM_FIXED_SIZE annotated argument types, since in !MEM_FIXED_SIZE cases the verifier does not know the buffer size a priori and therefore cannot blindly write *<ptr> = val.
--- include/linux/bpf.h | 7 +++++-- kernel/bpf/helpers.c | 6 ++++-- kernel/bpf/syscall.c | 3 ++- kernel/bpf/verifier.c | 41 +++++----------------------------------- kernel/trace/bpf_trace.c | 6 ++++-- net/core/filter.c | 6 ++++-- 6 files changed, 24 insertions(+), 45 deletions(-)
include/linux/bpf.h +5 -2
@@ -694,6 +694,11 @@ enum bpf_type_flag {/* DYNPTR points to xdp_buff */ DYNPTR_TYPE_XDP =BIT (16 +BPF_BASE_TYPE_BITS ), +/* Memory must be aligned on some architectures, used in combination with +* MEM_FIXED_SIZE. +*/ +MEM_ALIGNED =BIT (17 +BPF_BASE_TYPE_BITS ), + __BPF_TYPE_FLAG_MAX, __BPF_TYPE_LAST_FLAG = __BPF_TYPE_FLAG_MAX - 1, };
@@ -731,8 +736,6 @@ enum bpf_arg_type {ARG_ANYTHING ,/* any (initialized) argument is ok */ ARG_PTR_TO_SPIN_LOCK ,/* pointer to bpf_spin_lock */ ARG_PTR_TO_SOCK_COMMON ,/* pointer to sock_common */ -ARG_PTR_TO_INT ,/* pointer to int */ -ARG_PTR_TO_LONG ,/* pointer to long */ ARG_PTR_TO_SOCKET ,/* pointer to bpf_sock (fullsock) */ ARG_PTR_TO_BTF_ID ,/* pointer to in-kernel struct */ ARG_PTR_TO_RINGBUF_MEM, /* pointer to dynamically reserved ringbuf memory */
kernel/bpf/helpers.c +4 -2
@@ -538,7 +538,8 @@ const struct bpf_func_proto bpf_strtol_proto = { .arg1_type = ARG_PTR_TO_MEM | MEM_RDONLY, .arg2_type = ARG_CONST_SIZE, .arg3_type = ARG_ANYTHING, - .arg4_type = ARG_PTR_TO_LONG, + .arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg4_size = sizeof(s64), }; BPF_CALL_4(bpf_strtoul, const char *, buf, size_t, buf_len, u64, flags,
@@ -566,7 +567,8 @@ const struct bpf_func_proto bpf_strtoul_proto = { .arg1_type = ARG_PTR_TO_MEM | MEM_RDONLY, .arg2_type = ARG_CONST_SIZE, .arg3_type = ARG_ANYTHING, - .arg4_type = ARG_PTR_TO_LONG, + .arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg4_size = sizeof(u64), }; BPF_CALL_3(bpf_strncmp, const char *, s1, u32, s1_sz, const char *, s2)
kernel/bpf/syscall.c +2 -1
@@ -5952,7 +5952,8 @@ static const struct bpf_func_proto bpf_kallsyms_lookup_name_proto = { .arg1_type = ARG_PTR_TO_MEM, .arg2_type = ARG_CONST_SIZE_OR_ZERO, .arg3_type = ARG_ANYTHING, - .arg4_type = ARG_PTR_TO_LONG, + .arg4_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg4_size = sizeof(u64), }; static const struct bpf_func_proto *
kernel/bpf/verifier.c +5 -36
71 lines not on this page · raw message
kernel/trace/bpf_trace.c +4 -2
@@ -1226,7 +1226,8 @@ static const struct bpf_func_proto bpf_get_func_arg_proto = { .ret_type = RET_INTEGER, .arg1_type = ARG_PTR_TO_CTX, .arg2_type = ARG_ANYTHING, - .arg3_type = ARG_PTR_TO_LONG, + .arg3_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg3_size = sizeof(u64), }; BPF_CALL_2(get_func_ret, void *, ctx, u64 *, value)
@@ -1242,7 +1243,8 @@ static const struct bpf_func_proto bpf_get_func_ret_proto = { .func = get_func_ret, .ret_type = RET_INTEGER, .arg1_type = ARG_PTR_TO_CTX, - .arg2_type = ARG_PTR_TO_LONG, + .arg2_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg2_size = sizeof(u64), }; BPF_CALL_1(get_func_arg_cnt, void *, ctx)
net/core/filter.c +4 -2
@@ -6346,7 +6346,8 @@ static const struct bpf_func_proto bpf_skb_check_mtu_proto = { .ret_type = RET_INTEGER, .arg1_type = ARG_PTR_TO_CTX, .arg2_type = ARG_ANYTHING, - .arg3_type = ARG_PTR_TO_INT, + .arg3_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg3_size = sizeof(u32), .arg4_type = ARG_ANYTHING, .arg5_type = ARG_ANYTHING, };
@@ -6357,7 +6358,8 @@ static const struct bpf_func_proto bpf_xdp_check_mtu_proto = { .ret_type = RET_INTEGER, .arg1_type = ARG_PTR_TO_CTX, .arg2_type = ARG_ANYTHING, - .arg3_type = ARG_PTR_TO_INT, + .arg3_type = ARG_PTR_TO_FIXED_SIZE_MEM | MEM_UNINIT | MEM_ALIGNED, + .arg3_size = sizeof(u32), .arg4_type = ARG_ANYTHING, .arg5_type = ARG_ANYTHING, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 321/695 bpf: Improve check_raw_mode_ok test for MEM_UNINIT-tagged types
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 18752d73c1898fd001569195ba4b0b8c43255f4a ]
When checking malformed helper function signatures, also take other argument types into account aside from just ARG_PTR_TO_UNINIT_MEM.
This concerns (formerly) ARG_PTR_TO_{INT,LONG} given uninitialized memory can be passed there, too.
The func proto sanity check goes back to commit 435faee1aae9 ("bpf, verifier:
add ARG_PTR_TO_RAW_STACK type"), and its purpose was to detect wrong func protos which had more than just one MEM_UNINIT-tagged type as arguments.
The reason more than one is currently not supported is as we mark stack slots with STACK_MISC in check_helper_call() in case of raw mode based on meta.access_size to allow uninitialized stack memory to be passed to helpers when they just write into the buffer.
Probing for base type as well as MEM_UNINIT tagging ensures that other types do not get missed (as it used to be the case for ARG_PTR_TO_{INT,LONG}).
--- kernel/bpf/verifier.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
kernel/bpf/verifier.c +11 -5
@@ -8170,6 +8170,12 @@ static bool arg_type_is_mem_size(enum bpf_arg_type type) type ==ARG_CONST_SIZE_OR_ZERO ; } +static bool arg_type_is_raw_mem (enum bpf_arg_type type) +{ +return base_type (type) ==ARG_PTR_TO_MEM && + type &MEM_UNINIT ; +} +static bool arg_type_is_release (enum bpf_arg_type type) {return type &OBJ_RELEASE ;
@@ -9212,15 +9218,15 @@ static bool check_raw_mode_ok(const struct bpf_func_proto *fn) {int count =0 ; -if (fn->arg1_type ==ARG_PTR_TO_UNINIT_MEM ) +if (arg_type_is_raw_mem (fn->arg1_type)) count++; -if (fn->arg2_type ==ARG_PTR_TO_UNINIT_MEM ) +if (arg_type_is_raw_mem (fn->arg2_type)) count++; -if (fn->arg3_type ==ARG_PTR_TO_UNINIT_MEM ) +if (arg_type_is_raw_mem (fn->arg3_type)) count++; -if (fn->arg4_type ==ARG_PTR_TO_UNINIT_MEM ) +if (arg_type_is_raw_mem (fn->arg4_type)) count++; -if (fn->arg5_type ==ARG_PTR_TO_UNINIT_MEM ) +if (arg_type_is_raw_mem (fn->arg5_type)) count++;/* We only support one arg being in raw mode at the moment,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 322/695 bpf: Zero former ARG_PTR_TO_{LONG,INT} args in case of error
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Borkmann <[email protected]>
[ Upstream commit 4b3786a6c5397dc220b1483d8e2f4867743e966f ]
For all non-tracing helpers which formerly had ARG_PTR_TO_{LONG,INT} as input arguments, zero the value for the case of an error as otherwise it could leak memory. For tracing, it is not needed given CAP_PERFMON can already read all kernel memory anyway hence bpf_get_func_arg() and bpf_get_func_ret() is skipped in here.
Also, the MTU helpers mtu_len pointer value is being written but also read. Technically, the MEM_UNINIT should not be there in order to always force init. Removing MEM_UNINIT needs more verifier rework though: MEM_UNINIT right now implies two things actually: i) write into memory, ii) memory does not have to be initialized. If we lift MEM_UNINIT, it then becomes: i) read into memory, ii) memory must be initialized. This means that for bpf_*_check_mtu() we're readding the issue we're trying to fix, that is, it would then be able to write back into things like .rodata BPF maps. Follow-up work will rework the MEM_UNINIT semantics such that the intent can be better expressed. For now just clear the *mtu_len on error path which can be lifted later again.
--- kernel/bpf/helpers.c | 2 ++ kernel/bpf/syscall.c | 1 + net/core/filter.c | 44 +++++++++++++++++++++++--------------------- 3 files changed, 26 insertions(+), 21 deletions(-)
kernel/bpf/helpers.c +2 -0
@@ -522,6 +522,7 @@ BPF_CALL_4(bpf_strtol, const char *, buf, size_t, buf_len, u64, flags,long long _res;int err; + *res =0 ; err =__bpf_strtoll (buf, buf_len, flags, &_res);if (err <0 )return err;
@@ -549,6 +550,7 @@ BPF_CALL_4(bpf_strtoul, const char *, buf, size_t, buf_len, u64, flags,bool is_negative;int err; + *res =0 ; err =__bpf_strtoull (buf, buf_len, flags, &_res, &is_negative);if (err <0 )return err;
kernel/bpf/syscall.c +1 -0
@@ -5932,6 +5932,7 @@ static const struct bpf_func_proto bpf_sys_close_proto = { BPF_CALL_4(bpf_kallsyms_lookup_name, const char *, name, int, name_sz, int, flags, u64 *, res) { + *res =0 ;if (flags)return -EINVAL ;
net/core/filter.c +23 -21
87 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 323/695 perf scripts python cs-etm: Restore first sample log in verbose mode
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit ae8e4f4048b839c1cb333d9e3d20e634b430139e ]
The linked commit moved the early return on the first sample to before the verbose log, so move the log earlier too. Now the first sample is also logged and not skipped.
--- tools/perf/scripts/python/arm-cs-trace-disasm.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
tools/perf/scripts/python/arm-cs-trace-disasm.py +4 -5
@@ -192,17 +192,16 @@ def process_event(param_dict): ip = sample["ip"] addr = sample["addr"] + if (options.verbose == True): + print("Event type: %s" % name) + print_sample(sample) + # Initialize CPU data if it's empty, and directly return back # if this is the first tracing event for this CPU. if (cpu_data.get(str(cpu) + 'addr') == None): cpu_data[str(cpu) + 'addr'] = addr return - - if (options.verbose == True): - print("Event type: %s" % name) - print_sample(sample) - # If cannot find dso so cannot dump assembler, bail out if (dso == '[unknown]'): return
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 324/695 perf bpf: Move BPF disassembly routines to separate file to avoid clash with capstone bpf headers
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit ea59b70a8418a313d6f2ab48a957de015fc33018 ]
There is a clash of the libbpf and capstone libraries, that ends up with:
In file included from /usr/include/capstone/capstone.h:325,
from util/disasm.c:1513:
/usr/include/capstone/bpf.h:94:14: error: ‘bpf_insn’ defined as wrong kind of tag
94 | typedef enum bpf_insn {So far we're just trying to avoid this by not having both headers included in the same .c or .h file, do it one more time by moving the BPF diassembly routines from util/disasm.c to util/disasm_bpf.c.
This is only being hit when building with BUILD_NONDISTRO=1, i.e. building with binutils-devel, that isn't the in the default build due to a licencing clash. We need to reimplement what is now isolated in util/disasm_bpf.c using some other library to have BPF annotation feature that now only is available with BUILD_NONDISTRO=1.
--- tools/perf/util/Build | 1 + tools/perf/util/disasm.c | 187 +-------------------------------- tools/perf/util/disasm_bpf.c | 195 +++++++++++++++++++++++++++++++++++ tools/perf/util/disasm_bpf.h | 12 +++ 4 files changed, 209 insertions(+), 186 deletions(-) create mode 100644 tools/perf/util/disasm_bpf.c create mode 100644 tools/perf/util/disasm_bpf.h
tools/perf/util/Build +1 -0
@@ -13,6 +13,7 @@ perf-util-y += copyfile.o perf-util-y += ctype.o perf-util-y += db-export.o perf-util-y += disasm.o +perf-util-y += disasm_bpf.o perf-util-y += env.o perf-util-y += event.o perf-util-y += evlist.o
tools/perf/util/disasm.c +1 -186
199 lines not on this page · raw message
tools/perf/util/disasm_bpf.c new file +195 -0
195 lines not on this page · raw message
tools/perf/util/disasm_bpf.h new file +12 -0
@@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#ifndef __PERF_DISASM_BPF_H +#define __PERF_DISASM_BPF_H + +struct symbol ; +struct annotate_args ; + +int symbol__disassemble_bpf (struct symbol *sym,struct annotate_args *args); +int symbol__disassemble_bpf_image (struct symbol *sym,struct annotate_args *args); + +#endif /* __PERF_DISASM_BPF_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 325/695 perf mem: Free the allocated sort string, fixing a leak
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 3da209bb1177462b6fe8e3021a5527a5a49a9336 ]
The get_sort_order() returns either a new string (from strdup) or NULL but it never gets freed.
--- tools/perf/builtin-mem.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/builtin-mem.c +1 -0
@@ -372,6 +372,7 @@ static int report_events(int argc, const char **argv, struct perf_mem *mem) rep_argv[i] = argv[j]; ret =cmd_report (i, rep_argv); +free (new_sort_order);free (rep_argv);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 326/695 perf callchain: Fix stitch LBR memory leaks
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 599c19397b17d197fc1184bbc950f163a292efc9 ]
The 'struct callchain_cursor_node' has a 'struct map_symbol' whose maps and map members are reference counted. Ensure these values use a _get routine to increment the reference counts and use map_symbol__exit() to release the reference counts.
Do similar for 'struct thread's prev_lbr_cursor, but save the size of the prev_lbr_cursor array so that it may be iterated.
Ensure that when stitch_nodes are placed on the free list the map_symbols are exited.
Fix resolve_lbr_callchain_sample() by replacing list_replace_init() to list_splice_init(), so the whole list is moved and nodes aren't leaked.
A reproduction of the memory leaks is possible with a leak sanitizer build in the perf report command of:
``` $ perf record -e cycles --call-graph lbr perf test -w thloop $ perf report --stitch-lbr ```
--- tools/perf/util/machine.c | 17 +++++++++++++++-- tools/perf/util/thread.c | 4 ++++ tools/perf/util/thread.h | 1 + 3 files changed, 20 insertions(+), 2 deletions(-)
tools/perf/util/machine.c +15 -2
@@ -2270,8 +2270,12 @@ static void save_lbr_cursor_node(struct thread *thread, cursor->curr = cursor->first; else cursor->curr = cursor->curr->next; + +map_symbol__exit (&lbr_stitch->prev_lbr_cursor[idx].ms);memcpy (&lbr_stitch->prev_lbr_cursor[idx], cursor->curr,sizeof (struct callchain_cursor_node )); + lbr_stitch->prev_lbr_cursor[idx].ms.maps =maps__get (cursor->curr->ms.maps); + lbr_stitch->prev_lbr_cursor[idx].ms.map =map__get (cursor->curr->ms.map); lbr_stitch->prev_lbr_cursor[idx].valid = true; cursor->pos++;
@@ -2482,6 +2486,9 @@ static bool has_stitched_lbr(struct thread *thread,memcpy (&stitch_node->cursor, &lbr_stitch->prev_lbr_cursor[i],sizeof (struct callchain_cursor_node )); + stitch_node->cursor.ms.maps =maps__get (lbr_stitch->prev_lbr_cursor[i].ms.maps); + stitch_node->cursor.ms.map =map__get (lbr_stitch->prev_lbr_cursor[i].ms.map); +if (callee)list_add (&stitch_node->node, &lbr_stitch->lists);else
@@ -2505,6 +2512,8 @@ static bool alloc_lbr_stitch(struct thread *thread, unsigned int max_lbr)if (!thread__lbr_stitch (thread)->prev_lbr_cursor) goto free_lbr_stitch; +thread__lbr_stitch (thread)->prev_lbr_cursor_size = max_lbr +1 ; +INIT_LIST_HEAD (&thread__lbr_stitch (thread)->lists);INIT_LIST_HEAD (&thread__lbr_stitch (thread)->free_lists);
@@ -2560,8 +2569,12 @@ static int resolve_lbr_callchain_sample(struct thread *thread, max_lbr, callee);if (!stitched_lbr && !list_empty (&lbr_stitch->lists)) { -list_replace_init (&lbr_stitch->lists, - &lbr_stitch->free_lists); +struct stitch_list *stitch_node; + +list_for_each_entry (stitch_node, &lbr_stitch->lists, node) +map_symbol__exit (&stitch_node->cursor.ms); + +list_splice_init (&lbr_stitch->lists, &lbr_stitch->free_lists); }memcpy (&lbr_stitch->prev_sample, sample,sizeof (*sample)); }
tools/perf/util/thread.c +4 -0
@@ -476,6 +476,7 @@ void thread__free_stitch_list(struct thread *thread)return ;list_for_each_entry_safe (pos, tmp, &lbr_stitch->lists, node) { +map_symbol__exit (&pos->cursor.ms);list_del_init (&pos->node);free (pos); }
@@ -485,6 +486,9 @@ void thread__free_stitch_list(struct thread *thread)free (pos); } +for (unsigned int i =0 ; i < lbr_stitch->prev_lbr_cursor_size; i++) +map_symbol__exit (&lbr_stitch->prev_lbr_cursor[i].ms); +zfree (&lbr_stitch->prev_lbr_cursor);free (thread__lbr_stitch (thread));thread__set_lbr_stitch (thread,NULL );
tools/perf/util/thread.h +1 -0
@@ -26,6 +26,7 @@ struct lbr_stitch {struct list_head free_lists;struct perf_sample prev_sample;struct callchain_cursor_node *prev_lbr_cursor; +unsigned int prev_lbr_cursor_size; };DECLARE_RC_STRUCT (thread) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 327/695 perf lock contention: Change stack_id type to s32
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 040c0f887fdcfe747a3f63c94e9cd29e9ed0b872 ]
The bpf_get_stackid() helper returns a signed type to check whether it failed to get a stacktrace or not. But it saved the result in u32 and checked if the value is negative.
376 if (needs_callstack) {
377 pelem->stack_id = bpf_get_stackid(ctx, &stacks,
378 BPF_F_FAST_STACK_CMP | stack_skip); --> 379 if (pelem->stack_id < 0)
./tools/perf/util/bpf_skel/lock_contention.bpf.c:379 contention_begin()
warn: unsigned 'pelem->stack_id' is never less than zero.
Let's change the type to s32 instead.
--- tools/perf/util/bpf_skel/lock_data.h | 4 ++-- tools/perf/util/bpf_skel/vmlinux/vmlinux.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-)
tools/perf/util/bpf_skel/lock_data.h +2 -2
@@ -7,11 +7,11 @@ struct tstamp_data {u64 timestamp;u64 lock;u32 flags; -u32 stack_id; +s32 stack_id; };struct contention_key { -u32 stack_id; +s32 stack_id;u32 pid;u64 lock_addr_or_cgroup; };
tools/perf/util/bpf_skel/vmlinux/vmlinux.h +1 -0
@@ -15,6 +15,7 @@typedef __u8 u8 ;typedef __u32 u32 ; +typedef __s32 s32 ;typedef __u64 u64 ;typedef __s64 s64 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 328/695 perf vendor events: SKX, CLX, SNR uncore cache event fixes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 7a75c6c23a2ea8dd22d90805b3a42bd65c53830e ]
Cache home agent (CHA) events were setting the low rather than high config1 bits. SNR was using CLX CHA events, however its CHA is similar to ICX so remove the events.
Incorporate the updates in:
https://github.com/intel/perfmon/pull/215
https://github.com/intel/perfmon/pull/216
--- .../arch/x86/cascadelakex/uncore-cache.json | 60 +++++++++---------- .../arch/x86/skylakex/uncore-cache.json | 60 +++++++++---------- .../arch/x86/snowridgex/uncore-cache.json | 57 ------------------ 3 files changed, 60 insertions(+), 117 deletions(-)
tools/perf/pmu-events/arch/x86/cascadelakex/uncore-cache.json +30 -30
@@ -4577,7 +4577,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_HIT_CRD", - "Filter": "config1=0x40233", + "Filter": "config1=0x4023300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : CRds issued by iA Cores that Hit the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -4588,7 +4588,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_HIT_DRD", - "Filter": "config1=0x40433", + "Filter": "config1=0x4043300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : DRds issued by iA Cores that Hit the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -4599,7 +4599,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_HIT_LlcPrefCRD", - "Filter": "config1=0x4b233", + "Filter": "config1=0x4b23300000000", "PerPkg": "1", "UMask": "0x11", "Unit": "CHA"
@@ -4609,7 +4609,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_HIT_LlcPrefDRD", - "Filter": "config1=0x4b433", + "Filter": "config1=0x4b43300000000", "PerPkg": "1", "UMask": "0x11", "Unit": "CHA"
@@ -4619,7 +4619,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_HIT_LlcPrefRFO", - "Filter": "config1=0x4b033", + "Filter": "config1=0x4b03300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : LLCPrefRFO issued by iA Cores that hit the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -4630,7 +4630,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_HIT_RFO", - "Filter": "config1=0x40033", + "Filter": "config1=0x4003300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : RFOs issued by iA Cores that Hit the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -4651,7 +4651,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_CRD", - "Filter": "config1=0x40233", + "Filter": "config1=0x4023300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : CRds issued by iA Cores that Missed the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -4662,7 +4662,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_DRD", - "Filter": "config1=0x40433", + "Filter": "config1=0x4043300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : DRds issued by iA Cores that Missed the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -4673,7 +4673,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_LlcPrefCRD", - "Filter": "config1=0x4b233", + "Filter": "config1=0x4b23300000000", "PerPkg": "1", "UMask": "0x21", "Unit": "CHA"
@@ -4683,7 +4683,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_LlcPrefDRD", - "Filter": "config1=0x4b433", + "Filter": "config1=0x4b43300000000", "PerPkg": "1", "UMask": "0x21", "Unit": "CHA"
@@ -4693,7 +4693,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_LlcPrefRFO", - "Filter": "config1=0x4b033", + "Filter": "config1=0x4b03300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : LLCPrefRFO issued by iA Cores that missed the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -4704,7 +4704,7 @@ "Counter": "0,1,2,3", "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IA_MISS_RFO", - "Filter": "config1=0x40033", + "Filter": "config1=0x4003300000000", "PerPkg": "1", "PublicDescription": "TOR Inserts : RFOs issued by iA Cores that Missed the LLC : Counts the number of entries successfully inserted into the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -4747,7 +4747,7 @@ "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IO_MISS_ITOM", "Experimental": "1", - "Filter": "config1=0x49033", + "Filter": "config1=0x4903300000000", "PerPkg": "1", "PublicDescription": "Counts the number of entries successfully inserted into the TOR that are generated from local IO ItoM requests that miss the LLC. An ItoM request is used by IIO to request a data write without first reading the data for ownership.", "UMask": "0x24",
@@ -4759,7 +4759,7 @@ "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IO_MISS_RDCUR", "Experimental": "1", - "Filter": "config1=0x43C33", + "Filter": "config1=0x43c3300000000", "PerPkg": "1", "PublicDescription": "Counts the number of entries successfully inserted into the TOR that are generated from local IO RdCur requests and miss the LLC. A RdCur request is used by IIO to read data without changing state.", "UMask": "0x24",
@@ -4771,7 +4771,7 @@ "EventCode": "0x35", "EventName": "UNC_CHA_TOR_INSERTS.IO_MISS_RFO", "Experimental": "1", - "Filter": "config1=0x40033", + "Filter": "config1=0x4003300000000", "PerPkg": "1", "PublicDescription": "Counts the number of entries successfully inserted into the TOR that are generated from local IO RFO requests that miss the LLC. A read for ownership (RFO) requests a cache line to be cached in E state with the intent to modify.", "UMask": "0x24",
@@ -4999,7 +4999,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_HIT_CRD", - "Filter": "config1=0x40233", + "Filter": "config1=0x4023300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : CRds issued by iA Cores that Hit the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -5010,7 +5010,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_HIT_DRD", - "Filter": "config1=0x40433", + "Filter": "config1=0x4043300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : DRds issued by iA Cores that Hit the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -5021,7 +5021,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_HIT_LlcPrefCRD", - "Filter": "config1=0x4b233", + "Filter": "config1=0x4b23300000000", "PerPkg": "1", "UMask": "0x11", "Unit": "CHA"
@@ -5031,7 +5031,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_HIT_LlcPrefDRD", - "Filter": "config1=0x4b433", + "Filter": "config1=0x4b43300000000", "PerPkg": "1", "UMask": "0x11", "Unit": "CHA"
@@ -5041,7 +5041,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_HIT_LlcPrefRFO", - "Filter": "config1=0x4b033", + "Filter": "config1=0x4b03300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : LLCPrefRFO issued by iA Cores that hit the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -5052,7 +5052,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_HIT_RFO", - "Filter": "config1=0x40033", + "Filter": "config1=0x4003300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : RFOs issued by iA Cores that Hit the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x11",
@@ -5073,7 +5073,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_CRD", - "Filter": "config1=0x40233", + "Filter": "config1=0x4023300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : CRds issued by iA Cores that Missed the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -5084,7 +5084,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_DRD", - "Filter": "config1=0x40433", + "Filter": "config1=0x4043300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : DRds issued by iA Cores that Missed the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -5095,7 +5095,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_LlcPrefCRD", - "Filter": "config1=0x4b233", + "Filter": "config1=0x4b23300000000", "PerPkg": "1", "UMask": "0x21", "Unit": "CHA"
@@ -5105,7 +5105,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_LlcPrefDRD", - "Filter": "config1=0x4b433", + "Filter": "config1=0x4b43300000000", "PerPkg": "1", "UMask": "0x21", "Unit": "CHA"
@@ -5115,7 +5115,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_LlcPrefRFO", - "Filter": "config1=0x4b033", + "Filter": "config1=0x4b03300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : LLCPrefRFO issued by iA Cores that missed the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -5126,7 +5126,7 @@ "Counter": "0", "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IA_MISS_RFO", - "Filter": "config1=0x40033", + "Filter": "config1=0x4003300000000", "PerPkg": "1", "PublicDescription": "TOR Occupancy : RFOs issued by iA Cores that Missed the LLC : For each cycle, this event accumulates the number of valid entries in the TOR that match qualifications specified by the subevent. Does not include addressless requests such as locks and interrupts.", "UMask": "0x21",
@@ -5171,7 +5171,7 @@ "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IO_MISS_ITOM", "Experimental": "1", - "Filter": "config1=0x49033", + "Filter": "config1=0x4903300000000", "PerPkg": "1", "PublicDescription": "For each cycle, this event accumulates the number of valid entries in the TOR that are generated from local IO ItoM requests that miss the LLC. An ItoM is used by IIO to request a data write without first reading the data for ownership.", "UMask": "0x24",
@@ -5183,7 +5183,7 @@ "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IO_MISS_RDCUR", "Experimental": "1", - "Filter": "config1=0x43C33", + "Filter": "config1=0x43c3300000000", "PerPkg": "1", "PublicDescription": "For each cycle, this event accumulates the number of valid entries in the TOR that are generated from local IO RdCur requests that miss the LLC. A RdCur request is used by IIO to read data without changing state.", "UMask": "0x24",
@@ -5195,7 +5195,7 @@ "EventCode": "0x36", "EventName": "UNC_CHA_TOR_OCCUPANCY.IO_MISS_RFO", "Experimental": "1", - "Filter": "config1=0x40033", + "Filter": "config1=0x4003300000000", "PerPkg": "1", "PublicDescription": "For each cycle, this event accumulates the number of valid entries in the TOR that are generated from local IO RFO requests that miss the LLC. A read for ownership (RFO) requests data to be cached in E state with the intent to modify.", "UMask": "0x24",
tools/perf/pmu-events/arch/x86/skylakex/uncore-cache.json +30 -30
240 lines not on this page · raw message
tools/perf/pmu-events/arch/x86/snowridgex/uncore-cache.json +0 -57
61 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 329/695 perf inject: Fix leader sampling inserting additional samples
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 79bcd34e0f3da39fda841406ccc957405e724852 ]
The processing of leader samples would turn an individual sample with a group of read values into multiple samples. 'perf inject' would pass through the additional samples increasing the output data file size:
$ perf record -g -e "{instructions,cycles}:S" -o perf.orig.data true
$ perf script -D -i perf.orig.data | sed -e 's/perf.orig.data/perf.data/g' > orig.txt
$ perf inject -i perf.orig.data -o perf.new.data
$ perf script -D -i perf.new.data | sed -e 's/perf.new.data/perf.data/g' > new.txt
$ diff -u orig.txt new.txt
--- orig.txt 2024-07-29 14:29:40.606576769 -0700
+++ new.txt 2024-07-29 14:30:04.142737434 -0700
...
[email protected] [0x30]: event: 3
[email protected] [0xd0]: event: 9
+.
+. ... raw event: size 208 bytes
+. 0000: 09 00 00 00 01 00 d0 00 fc 72 01 86 ff ff ff ff .........r......
+. 0010: 74 7d 2c 00 74 7d 2c 00 fb c3 79 f9 ba d5 05 00 t},.t},...y.....
+. 0020: e6 cb 1a 00 00 00 00 00 01 00 00 00 00 00 00 00 ................
+. 0030: 02 00 00 00 00 00 00 00 76 01 00 00 00 00 00 00 ........v.......
+. 0040: e6 cb 1a 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+. 0050: 62 18 00 00 00 00 00 00 f6 cb 1a 00 00 00 00 00 b...............
+. 0060: 00 00 00 00 00 00 00 00 0c 00 00 00 00 00 00 00 ................
+. 0070: 80 ff ff ff ff ff ff ff fc 72 01 86 ff ff ff ff .........r......
+. 0080: f3 0e 6e 85 ff ff ff ff 0c cb 7f 85 ff ff ff ff ..n.............
+. 0090: bc f2 87 85 ff ff ff ff 44 af 7f 85 ff ff ff ff ........D.......
+. 00a0: bd be 7f 85 ff ff ff ff 26 d0 7f 85 ff ff ff ff ........&.......
+. 00b0: 6d a4 ff 85 ff ff ff ff ea 00 20 86 ff ff ff ff m......... .....
+. 00c0: 00 fe ff ff ff ff ff ff 57 14 4f 43 fc 7e 00 00 ........W.OC.~..
+
+1642373909693435 0xc550 [0xd0]: PERF_RECORD_SAMPLE(IP, 0x1): 2915700/2915700: 0xffffffff860172fc period: 1 addr: 0
+... FP chain: nr:12
+..... 0: ffffffffffffff80
+..... 1: ffffffff860172fc
+..... 2: ffffffff856e0ef3
+..... 3: ffffffff857fcb0c
+..... 4: ffffffff8587f2bc
+..... 5: ffffffff857faf44
+..... 6: ffffffff857fbebd
+..... 7: ffffffff857fd026
+..... 8: ffffffff85ffa46d
+..... 9: ffffffff862000ea
+..... 10: fffffffffffffe00
+..... 11: 00007efc434f1457
+... sample_read:
+.... group nr 2
+..... id 00000000001acbe6, value 0000000000000176, lost 0
+..... id 00000000001acbf6, value 0000000000001862, lost 0
+
[email protected] [0x30]: event: 3
...This behavior is incorrect as in the case above 'perf inject' should have done nothing. Fix this behavior by disabling separating samples for a tool that requests it. Only request this for perf inject so as to not affect other perf tools. With the patch and the test above there are no differences between the orig.txt and new.txt.
--- tools/perf/builtin-inject.c | 1 + tools/perf/util/session.c | 3 +++ tools/perf/util/tool.h | 1 + 3 files changed, 5 insertions(+)
tools/perf/builtin-inject.c +1 -0
@@ -2204,6 +2204,7 @@ int cmd_inject(int argc, const char **argv) .finished_init = perf_event__repipe_op2_synth, .compressed = perf_event__repipe_op4_synth, .auxtrace = perf_event__repipe_auxtrace, + .dont_split_sample_group = true, }, .input_name = "-", .samples = LIST_HEAD_INIT(inject.samples),
tools/perf/util/session.c +3 -0
@@ -1511,6 +1511,9 @@ static int deliver_sample_group(struct evlist *evlist,int ret = -EINVAL ;struct sample_read_value *v = sample->read.group.values; +if (tool->dont_split_sample_group) +return deliver_sample_value (evlist, tool, event, sample, v, machine); +sample_read_group__for_each (v, sample->read.group.nr, read_format) { ret =deliver_sample_value (evlist, tool, event, sample, v, machine);
tools/perf/util/tool.h +1 -0
@@ -85,6 +85,7 @@ struct perf_tool {bool namespace_events;bool cgroup_events;bool no_warn; +bool dont_split_sample_group;enum show_feature_header show_feat_hdr; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 330/695 perf report: Fix --total-cycles --stdio output error
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
[ Upstream commit 3ef44458071a19e5b5832cdfe6f75273aa521b6e ]
The --total-cycles may output wrong information with the --stdio.
For example:
# perf record -e "{cycles,instructions}",cache-misses -b sleep 1
# perf report --total-cycles --stdioThe total cycles output of {cycles,instructions} and cache-misses are almost the same.
# Samples: 938 of events 'anon group { cycles, instructions }' # Event count (approx.): 938
#
# Sampled Cycles% Sampled Cycles Avg Cycles% Avg Cycles [Program Block Range]
# ............... .............. ........... .......... ..................................................>
#
11.19% 2.6K 0.10% 21 [perf_iterate_ctx+48 -> >
5.79% 1.4K 0.45% 97 [__intel_pmu_enable_all.constprop.0+80 -> __intel_>
5.11% 1.2K 0.33% 71 [native_write_msr+0 ->> # Samples: 293 of event 'cache-misses'
# Event count (approx.): 293
#
# Sampled Cycles% Sampled Cycles Avg Cycles% Avg Cycles [Program Block Range]
# ............... .............. ........... .......... ..................................................>
#
11.19% 2.6K 0.13% 21 [perf_iterate_ctx+48 -> >
5.79% 1.4K 0.59% 97 [__intel_pmu_enable_all.constprop.0+80 -> __intel_>
5.11% 1.2K 0.43% 71 [native_write_msr+0 ->>With the symbol_conf.event_group, the 'perf report' should only report the block information of the leader event in a group.
However, the current implementation retrieves the next event's block information, rather than the next group leader's block information.
Make sure the index is updated even if the event is skipped.
With the patch,
# Samples: 293 of event 'cache-misses'
# Event count (approx.): 293
#
# Sampled Cycles% Sampled Cycles Avg Cycles% Avg Cycles [Program Block Range]
# ............... .............. ........... .......... ..................................................>
#
37.98% 9.0K 4.05% 299 [perf_event_addr_filters_exec+0 -> perf_event_a>
11.19% 2.6K 0.28% 21 [perf_iterate_ctx+48 -> >
5.79% 1.4K 1.32% 97 [__intel_pmu_enable_all.constprop.0+80 -> __intel_>--- tools/perf/builtin-report.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/builtin-report.c +2 -1
@@ -565,6 +565,7 @@ static int evlist__tty_browse_hists(struct evlist *evlist, struct report *rep, cstruct hists *hists =evsel__hists (pos);const char *evname =evsel__name (pos); + i++;if (symbol_conf.event_group && !evsel__is_group_leader (pos))continue ;
@@ -574,7 +575,7 @@ static int evlist__tty_browse_hists(struct evlist *evlist, struct report *rep, chists__fprintf_nr_sample_events (hists, rep, evname, stdout);if (rep->total_cycles_mode) { -report__browse_block_hists (&rep->block_reports[i++].hist, +report__browse_block_hists (&rep->block_reports[i -1 ].hist, rep->min_percent, pos,NULL );continue ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 331/695 perf build: Fix up broken capstone feature detection fast path
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit 4c55560f23d19051adc7e76818687a88448bef83 ]
The capstone devel headers define 'struct bpf_insn' in a way that clashes with what is in the libbpf devel headers, so we so far need to avoid including both.
This is happening on the tools/build/feature/test-all.c file, where we try building all the expected set of libraries to be normally available on a system:
⬢[acme@toolbox perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-all.make.output In file included from test-bpf.c:3,
from test-all.c:150:
/home/acme/git/perf-tools-next/tools/include/uapi/linux/bpf.h:77:8: error: ‘bpf_insn’ defined as wrong kind of tag
77 | struct bpf_insn {
| ^~~~~~~~ ⬢[acme@toolbox perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-all.make.output
When doing so there is a trick where we define main to be main_test_libcapstone, then include the individual tools/build/feture/test-libcapstone.c capability query test, and then we undef 'main' because we'll do it all over again with the next expected library to be tested (at this time 'lzma').
To complete this mechanism we need to, in test-all.c 'main' routine, to call main_test_libcapstone(), which isn't being done, so the effect of adding references to capstone in test-all.c are not achieved.
The only thing that is happening is that test-all.c is failing to build and thus all the tests will have to be done individually, which nullifies the test-all.c single build speedup.
So lets remove references to capstone from test-all.c to see if this makes it build again so that we get faster builds or go on fixing up whatever is preventing us to get that benefit.
Nothing: after this fix we get a clean test-all.c build and get the build speedup back:
⬢[acme@toolbox perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-all.make.output ⬢[acme@toolbox perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-all.
test-all.bin test-all.d test-all.make.output
⬢[acme@toolbox perf-tools-next]$ cat /tmp/build/perf-tools-next/feature/test-all.make.output ⬢[acme@toolbox perf-tools-next]$ ldd /tmp/build/perf-tools-next/feature/test-all.bin
linux-vdso.so.1 (0x00007f13277a1000)
libpython3.12.so.1.0 => /lib64/libpython3.12.so.1.0 (0x00007f1326e00000) libm.so.6 => /lib64/libm.so.6 (0x00007f13274be000)
libtraceevent.so.1 => /lib64/libtraceevent.so.1 (0x00007f1327496000) libtracefs.so.1 => /lib64/libtracefs.so.1 (0x00007f132746f000) libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007f1326800000) libunwind-x86_64.so.8 => /lib64/libunwind-x86_64.so.8 (0x00007f1327452000) libunwind.so.8 => /lib64/libunwind.so.8 (0x00007f1327436000) liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f1327403000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007f1326d6f000)
libz.so.1 => /lib64/libz.so.1 (0x00007f13273e2000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007f1326d53000)
libnuma.so.1 => /lib64/libnuma.so.1 (0x00007f13273d4000)
libslang.so.2 => /lib64/libslang.so.2 (0x00007f1326400000) libperl.so.5.38 => /lib64/libperl.so.5.38 (0x00007f1326000000) libc.so.6 => /lib64/libc.so.6 (0x00007f1325e0f000)
libzstd.so.1 => /lib64/libzstd.so.1 (0x00007f1326741000) /lib64/ld-linux-x86-64.so.2 (0x00007f13277a3000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f1326d3f000)
libcrypt.so.2 => /lib64/libcrypt.so.2 (0x00007f1326d07000)
⬢[acme@toolbox perf-tools-next]$
And when having capstone-devel installed we get it detected and linked with perf, allowing us to benefit from the features that it enables:
⬢[acme@toolbox perf-tools-next]$ rpm -q capstone-devel capstone-devel-5.0.1-3.fc40.x86_64
⬢[acme@toolbox perf-tools-next]$ ldd /tmp/build/perf-tools-next/perf | grep capstone
libcapstone.so.5 => /lib64/libcapstone.so.5 (0x00007fe6a5c00000)
⬢[acme@toolbox perf-tools-next]$ /tmp/build/perf-tools-next/perf -vv | grep cap
libcapstone: [ on ] # HAVE_LIBCAPSTONE_SUPPORT
⬢[acme@toolbox perf-tools-next]$
--- tools/build/feature/test-all.c | 4 ---- 1 file changed, 4 deletions(-)
tools/build/feature/test-all.c +0 -4
@@ -134,10 +134,6 @@#undef main#endif -#define main main_test_libcapstone -# include "test-libcapstone.c" -#undef main -#define main main_test_lzma# include "test-lzma.c" #undef main
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 332/695 perf sched timehist: Fix missing free of session in perf_sched__timehist()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Jihong <[email protected]>
[ Upstream commit 6bdf5168b6fb19541b0c1862bdaa596d116c7bfb ]
When perf_time__parse_str() fails in perf_sched__timehist(), need to free session that was previously created, fix it.
--- tools/perf/builtin-sched.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/builtin-sched.c +2 -1
@@ -3121,7 +3121,8 @@ static int perf_sched__timehist(struct perf_sched *sched)if (perf_time__parse_str (&sched->ptime, sched->time_str) !=0 ) {pr_err ("Invalid time string\n" ); -return -EINVAL ; + err = -EINVAL ; + goto out; }if (timehist_check_attr (sched, evlist) !=0 )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 333/695 perf stat: Display iostat headers correctly
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yicong Yang <[email protected]>
[ Upstream commit 2615639352420e6e3115952c5b8f46846e1c6d0e ]
Currently we'll only print metric headers for metric leader in aggregration mode. This will make perf iostat header not shown since it'll aggregrated globally but don't have metric events:
root@ubuntu204:/home/yang/linux/tools/perf# ./perf stat --iostat --timeout 1000
Performance counter stats for 'system wide':
port
0000:00 0 0 0 0
0000:80 0 0 0 0
[...]Fix this by excluding the iostat in the check of printing metric headers. Then we can see the headers:
root@ubuntu204:/home/yang/linux/tools/perf# ./perf stat --iostat --timeout 1000
Performance counter stats for 'system wide':
port Inbound Read(MB) Inbound Write(MB) Outbound Read(MB) Outbound Write(MB)
0000:00 0 0 0 0
0000:80 0 0 0 0
[...]--- tools/perf/util/stat-display.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/util/stat-display.c +2 -1
@@ -1237,7 +1237,8 @@ static void print_metric_headers(struct perf_stat_config *config,/* Print metrics headers only */ evlist__for_each_entry (evlist, counter) { -if (config->aggr_mode !=AGGR_NONE && counter->metric_leader != counter) +if (!config->iostat_run && + config->aggr_mode !=AGGR_NONE && counter->metric_leader != counter)continue ; os.evsel = counter;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 334/695 perf dwarf-aux: Check allowed location expressions when collecting variables
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit e8bb03ed6850c6ed4ce2f1600ea73401fc2ebd95 ]
It missed to call check_allowed_ops() in __die_collect_vars_cb() so it can take variables with complex location expression incorrectly.
For example, I found some variable has this expression.
015d8df8 ffffffff81aacfb3 (base address)
015d8e01 v000000000000004 v000000000000000 views at 015d8df2 for:
ffffffff81aacfb3 ffffffff81aacfd2 (DW_OP_fbreg: -176; DW_OP_deref;
DW_OP_plus_uconst: 332; DW_OP_deref_size: 4;
DW_OP_lit1; DW_OP_shra; DW_OP_const1u: 64;
DW_OP_minus; DW_OP_stack_value)
015d8e14 v000000000000000 v000000000000000 views at 015d8df4 for:
ffffffff81aacfd2 ffffffff81aacfd7 (DW_OP_reg3 (rbx))
015d8e19 v000000000000000 v000000000000000 views at 015d8df6 for:
ffffffff81aacfd7 ffffffff81aad020 (DW_OP_fbreg: -176; DW_OP_deref;
DW_OP_plus_uconst: 332; DW_OP_deref_size: 4;
DW_OP_lit1; DW_OP_shra; DW_OP_const1u: 64;
DW_OP_minus; DW_OP_stack_value)
015d8e2c <End of list>It looks like '((int *)(-176(%rbp) + 332) >> 1) - 64' but the current code thought it's just -176(%rbp) and processed the variable incorrectly. It should reject such a complex expression if check_allowed_ops() doesn't like it. :)
--- tools/perf/util/dwarf-aux.c | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/dwarf-aux.c +3 -0
@@ -1598,6 +1598,9 @@ static int __die_collect_vars_cb(Dwarf_Die *die_mem, void *arg)if (dwarf_getlocations (&attr,0 , &base, &start, &end, &ops, &nops) <=0 )return DIE_FIND_CB_SIBLING ; +if (!check_allowed_ops (ops, nops)) +return DIE_FIND_CB_SIBLING ; +if (die_get_real_type (die_mem, &type_die) ==NULL )return DIE_FIND_CB_SIBLING ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 335/695 perf annotate-data: Fix off-by-one in location range check
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 3ab0b8b238b5130ae3fa37ddaa329fc0e93b6b9a ]
The location list will have entries with half-open addressing like [start, end) which means it doesn't include the end address. So it should skip entries at the end address and match to the next entry.
An example location list looks like this (from readelf -wo):
00237876 ffffffff8110d32b (base address)
0023787f v000000000000000 v000000000000002 views at 00237868 for:
ffffffff8110d32b ffffffff8110d4eb (DW_OP_reg3 (rbx)) <<<--- 1
00237885 v000000000000002 v000000000000000 views at 0023786a for:
ffffffff8110d4eb ffffffff8110d50b (DW_OP_reg14 (r14)) <<<--- 2
0023788c v000000000000000 v000000000000001 views at 0023786c for:
ffffffff8110d50b ffffffff8110d7c4 (DW_OP_reg3 (rbx))
00237893 v000000000000000 v000000000000000 views at 0023786e for:
ffffffff8110d806 ffffffff8110d854 (DW_OP_reg3 (rbx))
0023789a v000000000000000 v000000000000000 views at 00237870 for:
ffffffff8110d876 ffffffff8110d88e (DW_OP_reg3 (rbx))The first entry at 0023787f has [8110d32b, 8110d4eb) (omitting the ffffffff at the beginning), and the second one has [8110d4eb, 8110d50b).
--- tools/perf/util/annotate-data.c | 2 +- tools/perf/util/dwarf-aux.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/annotate-data.c +1 -1
@@ -104,7 +104,7 @@ static void pr_debug_location(Dwarf_Die *die, u64 pc, int reg)return ;while ((off =dwarf_getlocations (&attr, off, &base, &start, &end, &ops, &nops)) >0 ) { -if (reg !=DWARF_REG_PC && end < pc) +if (reg !=DWARF_REG_PC && end <= pc)continue ;if (reg !=DWARF_REG_PC && start > pc)break ;
tools/perf/util/dwarf-aux.c +1 -1
@@ -1444,7 +1444,7 @@ static int __die_find_var_reg_cb(Dwarf_Die *die_mem, void *arg)while ((off =dwarf_getlocations (&attr, off, &base, &start, &end, &ops, &nops)) >0 ) {/* Assuming the location list is sorted by address */ -if (end < data->pc) +if (end <= data->pc)continue ;if (start > data->pc)break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 336/695 perf dwarf-aux: Handle bitfield members from pointer access
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit a11b4222bb579dcf9646f3c4ecd2212ae762a2c8 ]
The __die_find_member_offset_cb() missed to handle bitfield members which don't have DW_AT_data_member_location. Like in adding member types in __add_member_cb() it should fallback to check the bit offset when it resolves the member type for an offset.
--- tools/perf/util/dwarf-aux.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
tools/perf/util/dwarf-aux.c +9 -2
@@ -1977,8 +1977,15 @@ static int __die_find_member_offset_cb(Dwarf_Die *die_mem, void *arg)return DIE_FIND_CB_SIBLING ;/* Unions might not have location */ -if (die_get_data_member_location (die_mem, &loc) <0 ) - loc =0 ; +if (die_get_data_member_location (die_mem, &loc) <0 ) { +Dwarf_Attribute attr; + +if (dwarf_attr_integrate (die_mem, DW_AT_data_bit_offset, &attr) && +dwarf_formudata (&attr, &loc) ==0 ) + loc /=8 ; +else + loc =0 ; + }if (offset == loc)return DIE_FIND_CB_END ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 337/695 perf hist: Dont set hpp_fmt_value for members in --no-group
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
[ Upstream commit 4f3affe0abf5d5910dc469a1f63257629605d3c3 ]
Perf crashes as below when applying --no-group
# perf record -e "{cache-misses,branches"} -b sleep 1
# perf report --stdio --no-group
free(): invalid next size (fast)
Aborted (core dumped)
#In the __hpp__fmt(), only 1 hpp_fmt_value is allocated for the current event when --no-group is applied.
However, the current implementation tries to assign the hists from all members to the hpp_fmt_value, which exceeds the allocated memory.
--- tools/perf/ui/hist.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
tools/perf/ui/hist.c +5 -5
@@ -62,7 +62,7 @@ static int __hpp__fmt(struct perf_hpp *hpp, struct hist_entry *he,struct evsel *pos;char *buf = hpp->buf;size_t size = hpp->size; -int i, nr_members =1 ; +int i =0 , nr_members =1 ;struct hpp_fmt_value *values;if (evsel__is_group_event (evsel))
@@ -72,16 +72,16 @@ static int __hpp__fmt(struct perf_hpp *hpp, struct hist_entry *he,if (values ==NULL )return 0 ; - i =0 ; -for_each_group_evsel (pos, evsel) - values[i++].hists =evsel__hists (pos); - + values[0 ].hists =evsel__hists (evsel); values[0 ].val =get_field (he); values[0 ].samples = he->stat.nr_events;if (evsel__is_group_event (evsel)) {struct hist_entry *pair; +for_each_group_member (pos, evsel) + values[++i].hists =evsel__hists (pos); +list_for_each_entry (pair, &he->pairs.head, pairs.node) {for (i =0 ; i < nr_members; i++) {if (values[i].hists != pair->hists)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 338/695 perf sched timehist: Fixed timestamp error when unable to confirm event sched_in time
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Jihong <[email protected]>
[ Upstream commit 39c243411bdb8fb35777adf49ee32549633c4e12 ]
If sched_in event for current task is not recorded, sched_in timestamp will be set to end_time of time window interest, causing an error in timestamp show. In this case, we choose to ignore this event.
Test scenario:
perf[1229608] does not record the first sched_in event, run time and sch delay are both 0
# perf sched timehist
Samples of sched_switch event do not have callchains.
time cpu task name wait time sch delay run time
[tid/pid] (msec) (msec) (msec)
--------------- ------ ------------------------------ --------- --------- ---------
2090450.763231 [0000] perf[1229608] 0.000 0.000 0.000
2090450.763235 [0000] migration/0[15] 0.000 0.001 0.003
2090450.763263 [0001] perf[1229608] 0.000 0.000 0.000
2090450.763268 [0001] migration/1[21] 0.000 0.001 0.004
2090450.763302 [0002] perf[1229608] 0.000 0.000 0.000
2090450.763309 [0002] migration/2[27] 0.000 0.001 0.007
2090450.763338 [0003] perf[1229608] 0.000 0.000 0.000
2090450.763343 [0003] migration/3[33] 0.000 0.001 0.004Before:
arbitrarily specify a time window of interest, timestamp will be set to an incorrect value
# perf sched timehist --time 100,200
Samples of sched_switch event do not have callchains.
time cpu task name wait time sch delay run time
[tid/pid] (msec) (msec) (msec)
--------------- ------ ------------------------------ --------- --------- ---------
200.000000 [0000] perf[1229608] 0.000 0.000 0.000
200.000000 [0001] perf[1229608] 0.000 0.000 0.000
200.000000 [0002] perf[1229608] 0.000 0.000 0.000
200.000000 [0003] perf[1229608] 0.000 0.000 0.000
200.000000 [0004] perf[1229608] 0.000 0.000 0.000
200.000000 [0005] perf[1229608] 0.000 0.000 0.000
200.000000 [0006] perf[1229608] 0.000 0.000 0.000
200.000000 [0007] perf[1229608] 0.000 0.000 0.000After:
# perf sched timehist --time 100,200
Samples of sched_switch event do not have callchains.
time cpu task name wait time sch delay run time
[tid/pid] (msec) (msec) (msec)
--------------- ------ ------------------------------ --------- --------- ------------ tools/perf/builtin-sched.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/builtin-sched.c +4 -1
@@ -2683,9 +2683,12 @@ static int timehist_sched_change_event(struct perf_tool *tool,* - previous sched event is out of window - we are done * - sample time is beyond window user cares about - reset it * to close out stats for time window interest +* - If tprev is 0, that is, sched_in event for current task is +* not recorded, cannot determine whether sched_in event is +* within time window interest - ignore it */ if (ptime->end) { -if (tprev > ptime->end) +if (!tprev || tprev > ptime->end) goto out;if (t > ptime->end)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 339/695 perf time-utils: Fix 32-bit nsec parsing
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 38e2648a81204c9fc5b4c87a8ffce93a6ed91b65 ]
The "time utils" test fails in 32-bit builds:
...
parse_nsec_time("18446744073.709551615")
Failed. ptime 4294967295709551615 expected 18446744073709551615
...
Switch strtoul to strtoull as an unsigned long in 32-bit build isn't 64-bits.
--- tools/perf/util/time-utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/time-utils.c +2 -2
@@ -20,7 +20,7 @@ int parse_nsec_time(const char *str, u64 *ptime)u64 time_sec, time_nsec;char *end; - time_sec =strtoul (str, &end,10 ); + time_sec =strtoull (str, &end,10 );if (*end !='.' && *end !='\0' )return -1 ;
@@ -38,7 +38,7 @@ int parse_nsec_time(const char *str, u64 *ptime)for (i =strlen (nsec_buf); i <9 ; i++) nsec_buf[i] ='0' ; - time_nsec =strtoul (nsec_buf, &end,10 ); + time_nsec =strtoull (nsec_buf, &end,10 );if (*end !='\0' )return -1 ; }else
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 340/695 perf mem: Check mem_events for all eligible PMUs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
[ Upstream commit 6e05d28ff232cf445cc6ae59336b7f2081ef9b96 ]
The current perf_pmu__mem_events_init() only checks the availability of the mem_events for the first eligible PMU. It works for non-hybrid machines and hybrid machines that have the same mem_events.
However, it may bring issues if a hybrid machine has a different mem_events on different PMU, e.g., Alder Lake and Raptor Lake. A mem-loads-aux event is only required for the p-core. The mem_events on both e-core and p-core should be checked and marked.
The issue was not found, because it's hidden by another bug, which only records the mem-events for the e-core. The wrong check for the p-core events didn't yell.
--- tools/perf/builtin-c2c.c | 2 +- tools/perf/builtin-mem.c | 2 +- tools/perf/util/mem-events.c | 14 +++++++++++++- tools/perf/util/mem-events.h | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-)
tools/perf/builtin-c2c.c +1 -1
@@ -3266,7 +3266,7 @@ static int perf_c2c__record(int argc, const char **argv)return -1 ; } -if (perf_pmu__mem_events_init (pmu)) { +if (perf_pmu__mem_events_init ()) {pr_err ("failed: memory events not supported\n" );return -1 ; }
tools/perf/builtin-mem.c +1 -1
@@ -97,7 +97,7 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)return -1 ; } -if (perf_pmu__mem_events_init (pmu)) { +if (perf_pmu__mem_events_init ()) {pr_err ("failed: memory events not supported\n" );return -1 ; }
tools/perf/util/mem-events.c +13 -1
@@ -192,7 +192,7 @@ static bool perf_pmu__mem_events_supported(const char *mnt, struct perf_pmu *pmureturn !stat (path, &st); } -int perf_pmu__mem_events_init (struct perf_pmu *pmu) +static int __perf_pmu__mem_events_init (struct perf_pmu *pmu) {const char *mnt =sysfs__mount ();bool found = false;
@@ -219,6 +219,18 @@ int perf_pmu__mem_events_init(struct perf_pmu *pmu)return found ?0 : -ENOENT ; } +int perf_pmu__mem_events_init (void ) +{ +struct perf_pmu *pmu =NULL ; + +while ((pmu =perf_pmus__scan_mem (pmu)) !=NULL ) { +if (__perf_pmu__mem_events_init (pmu)) +return -ENOENT ; + } + +return 0 ; +} +void perf_pmu__mem_events_list (struct perf_pmu *pmu) {int j;
tools/perf/util/mem-events.h +1 -1
@@ -30,7 +30,7 @@ extern unsigned int perf_mem_events__loads_ldlat;extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ];int perf_pmu__mem_events_parse (struct perf_pmu *pmu,const char *str); -int perf_pmu__mem_events_init (struct perf_pmu *pmu); +int perf_pmu__mem_events_init (void );struct perf_mem_event *perf_pmu__mem_events_ptr (struct perf_pmu *pmu,int i);struct perf_pmu *perf_mem_events_find_pmu (void );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 341/695 perf mem: Fix missed p-core mem events on ADL and RPL
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kan Liang <[email protected]>
[ Upstream commit 5ad7db2c3f941cde3045ce38a9c4c40b0c7d56b9 ]
The p-core mem events are missed when launching 'perf mem record' on ADL and RPL.
root@number:~# perf mem record sleep 1 Memory events are enabled on a subset of CPUs: 16-27 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.032 MB perf.data ] root@number:~# perf evlist cpu_atom/mem-loads,ldlat=30/P cpu_atom/mem-stores/P dummy:u
A variable 'record' in the 'struct perf_mem_event' is to indicate whether a mem event in a mem_events[] should be recorded. The current code only configure the variable for the first eligible PMU.
It's good enough for a non-hybrid machine or a hybrid machine which has the same mem_events[].
However, if a different mem_events[] is used for different PMUs on a hybrid machine, e.g., ADL or RPL, the 'record' for the second PMU never get a chance to be set.
The mem_events[] of the second PMU are always ignored.
'perf mem' doesn't support the per-PMU configuration now. A per-PMU mem_events[] 'record' variable doesn't make sense. Make it global.
That could also avoid searching for the per-PMU mem_events[] via perf_pmu__mem_events_ptr every time.
Committer testing:
root@number:~# perf evlist -g
cpu_atom/mem-loads,ldlat=30/P
cpu_atom/mem-stores/P
{cpu_core/mem-loads-aux/,cpu_core/mem-loads,ldlat=30/}
cpu_core/mem-stores/P
dummy:u
root@number:~#The :S for '{cpu_core/mem-loads-aux/,cpu_core/mem-loads,ldlat=30/}' is not being added by 'perf evlist -g', to be checked.
--- tools/perf/builtin-c2c.c | 12 ++++-------- tools/perf/builtin-mem.c | 17 ++++++----------- tools/perf/util/mem-events.c | 6 ++++-- tools/perf/util/mem-events.h | 2 +- 4 files changed, 15 insertions(+), 22 deletions(-)
tools/perf/builtin-c2c.c +4 -8
@@ -3290,19 +3290,15 @@ static int perf_c2c__record(int argc, const char **argv)* PERF_MEM_EVENTS__LOAD_STORE if it is supported. */ if (e->tag) { - e->record = true; + perf_mem_record[PERF_MEM_EVENTS__LOAD_STORE ] = true; rec_argv[i++] ="-W" ; }else { - e =perf_pmu__mem_events_ptr (pmu,PERF_MEM_EVENTS__LOAD ); - e->record = true; - - e =perf_pmu__mem_events_ptr (pmu,PERF_MEM_EVENTS__STORE ); - e->record = true; + perf_mem_record[PERF_MEM_EVENTS__LOAD ] = true; + perf_mem_record[PERF_MEM_EVENTS__STORE ] = true; } } - e =perf_pmu__mem_events_ptr (pmu,PERF_MEM_EVENTS__LOAD ); -if (e->record) +if (perf_mem_record[PERF_MEM_EVENTS__LOAD ]) rec_argv[i++] ="-W" ; rec_argv[i++] ="-d" ;
tools/perf/builtin-mem.c +6 -11
@@ -126,22 +126,17 @@ static int __cmd_record(int argc, const char **argv, struct perf_mem *mem)if (e->tag && (mem->operation &MEM_OPERATION_LOAD ) && (mem->operation &MEM_OPERATION_STORE )) { - e->record = true; + perf_mem_record[PERF_MEM_EVENTS__LOAD_STORE ] = true; rec_argv[i++] ="-W" ; }else { -if (mem->operation &MEM_OPERATION_LOAD ) { - e =perf_pmu__mem_events_ptr (pmu,PERF_MEM_EVENTS__LOAD ); - e->record = true; - } +if (mem->operation &MEM_OPERATION_LOAD ) + perf_mem_record[PERF_MEM_EVENTS__LOAD ] = true; -if (mem->operation &MEM_OPERATION_STORE ) { - e =perf_pmu__mem_events_ptr (pmu,PERF_MEM_EVENTS__STORE ); - e->record = true; - } +if (mem->operation &MEM_OPERATION_STORE ) + perf_mem_record[PERF_MEM_EVENTS__STORE ] = true; } - e =perf_pmu__mem_events_ptr (pmu,PERF_MEM_EVENTS__LOAD ); -if (e->record) +if (perf_mem_record[PERF_MEM_EVENTS__LOAD ]) rec_argv[i++] ="-W" ; rec_argv[i++] ="-d" ;
tools/perf/util/mem-events.c +4 -2
@@ -29,6 +29,8 @@ struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX] = { };#undef E +bool perf_mem_record[PERF_MEM_EVENTS__MAX ] = {0 }; +static char mem_loads_name[100 ];static char mem_stores_name[100 ];
@@ -163,7 +165,7 @@ int perf_pmu__mem_events_parse(struct perf_pmu *pmu, const char *str)continue ;if (strstr (e->tag, tok)) - e->record = found = true; + perf_mem_record[j] = found = true; } tok =strtok_r (NULL ,"," , &saveptr);
@@ -261,7 +263,7 @@ int perf_mem_events__record_args(const char **rec_argv, int *argv_nr)for (int j =0 ; j <PERF_MEM_EVENTS__MAX ; j++) { e =perf_pmu__mem_events_ptr (pmu, j); -if (!e->record) +if (!perf_mem_record[j])continue ;if (!e->supported) {
tools/perf/util/mem-events.h +1 -1
@@ -6,7 +6,6 @@#include <linux/types.h> struct perf_mem_event { -bool record;bool supported;bool ldlat;u32 aux_event;
@@ -28,6 +27,7 @@ struct perf_pmu;extern unsigned int perf_mem_events__loads_ldlat;extern struct perf_mem_event perf_mem_events[PERF_MEM_EVENTS__MAX ]; +extern bool perf_mem_record[PERF_MEM_EVENTS__MAX ];int perf_pmu__mem_events_parse (struct perf_pmu *pmu,const char *str);int perf_pmu__mem_events_init (void );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 342/695 clk: imx: clk-audiomix: Correct parent clock for earc_phy and audpll
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit d40371a1c963db688b37826adaf5ffdafb0862a1 ]
According to Reference Manual of i.MX8MP
The parent clock of "earc_phy" is "sai_pll_out_div2", The parent clock of "audpll" is "osc_24m".
Add CLK_GATE_PARENT() macro for usage of specifying parent clock.
--- drivers/clk/imx/clk-imx8mp-audiomix.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-imx8mp-audiomix.c +11 -2
@@ -154,6 +154,15 @@ static const struct clk_parent_data clk_imx8mp_audiomix_pll_bypass_sels[] = { PDM_SEL, 2, 0 \ } +#define CLK_GATE_PARENT (gname, cname, pname) \ + { \ + gname"_cg", \ + IMX8MP_CLK_AUDIOMIX_##cname, \ + { .fw_name = pname, .name = pname }, NULL, 1, \ + CLKEN0 + 4 * !!(IMX8MP_CLK_AUDIOMIX_##cname / 32), \ + 1, IMX8MP_CLK_AUDIOMIX_##cname % 32 \ + } +struct clk_imx8mp_audiomix_sel {const char *name;int clkid;
@@ -171,14 +180,14 @@ static struct clk_imx8mp_audiomix_sel sels[] = {CLK_GATE ("earc" ,EARC_IPG ),CLK_GATE ("ocrama" ,OCRAMA_IPG ),CLK_GATE ("aud2htx" ,AUD2HTX_IPG ), -CLK_GATE ("earc_phy" ,EARC_PHY ), +CLK_GATE_PARENT ("earc_phy" ,EARC_PHY ,"sai_pll_out_div2" ),CLK_GATE ("sdma2" ,SDMA2_ROOT ),CLK_GATE ("sdma3" ,SDMA3_ROOT ),CLK_GATE ("spba2" ,SPBA2_ROOT ),CLK_GATE ("dsp" ,DSP_ROOT ),CLK_GATE ("dspdbg" ,DSPDBG_ROOT ),CLK_GATE ("edma" ,EDMA_ROOT ), -CLK_GATE ("audpll" ,AUDPLL_ROOT ), +CLK_GATE_PARENT ("audpll" ,AUDPLL_ROOT ,"osc_24m" ),CLK_GATE ("mu2" ,MU2_ROOT ),CLK_GATE ("mu3" ,MU3_ROOT ), CLK_PDM,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 343/695 clk: imx: imx6ul: fix default parent for enet*_ref_sel
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastien Laveze <[email protected]>
[ Upstream commit e52fd71333b4ed78fd5bb43094bdc46476614d25 ]
The clk_set_parent for "enet1_ref_sel" and "enet2_ref_sel" are incorrect, therefore the original requirements to have "enet_clk_ref" as output sourced by iMX ENET PLL as a default config is not met.
Only "enet[1,2]_ref_125m" "enet[1,2]_ref_pad" are possible parents for "enet1_ref_sel" and "enet2_ref_sel".
This was observed as a regression using a custom device tree which was expecting this default config.
This can be fixed at the device tree level but having a default config matching the original behavior (before refclock mux) will avoid breaking existing configs.
--- drivers/clk/imx/clk-imx6ul.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-imx6ul.c +2 -2
@@ -542,8 +542,8 @@ static void __init imx6ul_clocks_init(struct device_node *ccm_node)clk_set_parent (hws[IMX6UL_CLK_ENFC_SEL ]->clk, hws[IMX6UL_CLK_PLL2_PFD2 ]->clk); -clk_set_parent (hws[IMX6UL_CLK_ENET1_REF_SEL ]->clk, hws[IMX6UL_CLK_ENET_REF ]->clk); -clk_set_parent (hws[IMX6UL_CLK_ENET2_REF_SEL ]->clk, hws[IMX6UL_CLK_ENET2_REF ]->clk); +clk_set_parent (hws[IMX6UL_CLK_ENET1_REF_SEL ]->clk, hws[IMX6UL_CLK_ENET1_REF_125M ]->clk); +clk_set_parent (hws[IMX6UL_CLK_ENET2_REF_SEL ]->clk, hws[IMX6UL_CLK_ENET2_REF_125M ]->clk);imx_register_uart_clocks (); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 344/695 clk: imx: composite-8m: Enable gate clk with mcore_booted
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 8f32e9dd0916eb3fd4bcf550ed1d04542a65cb9e ]
Bootloader might disable some CCM ROOT Slices. So if mcore_booted set with display CCM ROOT disabled by Bootloader, kernel display BLK CTRL driver imx8m_blk_ctrl_driver_init may hang the system because the BUS clk is disabled.
Add back gate ops, but with disable doing nothing, then the CCM ROOT will be enabled when used.
--- drivers/clk/imx/clk-composite-8m.c | 53 +++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 11 deletions(-)
drivers/clk/imx/clk-composite-8m.c +42 -11
@@ -204,6 +204,34 @@ static const struct clk_ops imx8m_clk_composite_mux_ops = { .determine_rate = imx8m_clk_composite_mux_determine_rate, }; +static int imx8m_clk_composite_gate_enable (struct clk_hw *hw) +{ +struct clk_gate *gate =to_clk_gate (hw); +unsigned long flags; +u32 val; + +spin_lock_irqsave (gate->lock, flags); + + val =readl (gate->reg); + val |=BIT (gate->bit_idx); +writel (val, gate->reg); + +spin_unlock_irqrestore (gate->lock, flags); + +return 0 ; +} + +static void imx8m_clk_composite_gate_disable (struct clk_hw *hw) +{ +/* composite clk requires the disable hook */ +} + +static const struct clk_ops imx8m_clk_composite_gate_ops = { + .enable = imx8m_clk_composite_gate_enable, + .disable = imx8m_clk_composite_gate_disable, + .is_enabled = clk_gate_is_enabled, +}; + struct clk_hw *__imx8m_clk_hw_composite(const char *name, const char * const *parent_names, int num_parents, void __iomem *reg,
@@ -217,6 +245,7 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name,struct clk_mux *mux;const struct clk_ops *divider_ops;const struct clk_ops *mux_ops; +const struct clk_ops *gate_ops; mux =kzalloc (sizeof (*mux),GFP_KERNEL );if (!mux)
@@ -257,20 +286,22 @@ struct clk_hw *__imx8m_clk_hw_composite(const char *name, div->flags =CLK_DIVIDER_ROUND_CLOSEST ;/* skip registering the gate ops if M4 is enabled */ -if (!mcore_booted) { - gate =kzalloc (sizeof (*gate),GFP_KERNEL ); -if (!gate) - goto free_div; - - gate_hw = &gate->hw; - gate->reg = reg; - gate->bit_idx =PCG_CGC_SHIFT ; - gate->lock = &imx_ccm_lock; - } + gate =kzalloc (sizeof (*gate),GFP_KERNEL ); +if (!gate) + goto free_div; + + gate_hw = &gate->hw; + gate->reg = reg; + gate->bit_idx =PCG_CGC_SHIFT ; + gate->lock = &imx_ccm_lock; +if (!mcore_booted) + gate_ops = &clk_gate_ops; +else + gate_ops = &imx8m_clk_composite_gate_ops; hw =clk_hw_register_composite (NULL , name, parent_names, num_parents, mux_hw, mux_ops, div_hw, - divider_ops, gate_hw, &clk_gate_ops, flags); + divider_ops, gate_hw, gate_ops, flags);if (IS_ERR (hw)) goto free_gate;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 345/695 clk: imx: composite-93: keep root clock on when mcore enabled
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jacky Bai <[email protected]>
[ Upstream commit d342df11726bfac9c3a9d2037afa508ac0e9e44e ]
Previously we assumed that the root clock slice is enabled by default when kernel boot up. But the bootloader may disable the clocks before jump into kernel. The gate ops should be registered rather than NULL to make sure the disabled clock can be enabled when kernel boot up. Refine the code to skip disable the clock if mcore booted.
--- drivers/clk/imx/clk-composite-93.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/clk/imx/clk-composite-93.c +8 -7
@@ -76,6 +76,13 @@ static int imx93_clk_composite_gate_enable(struct clk_hw *hw)static void imx93_clk_composite_gate_disable (struct clk_hw *hw) { +/* +* Skip disable the root clock gate if mcore enabled. +* The root clock may be used by the mcore. +*/ +if (mcore_booted) +return ; +imx93_clk_composite_gate_endisable (hw,0 ); }
@@ -222,7 +229,7 @@ struct clk_hw *imx93_clk_composite_flags(const char *name, const char * const *p hw =clk_hw_register_composite (NULL , name, parent_names, num_parents, mux_hw, &clk_mux_ro_ops, div_hw, &clk_divider_ro_ops,NULL ,NULL , flags); - }else if (!mcore_booted) { + }else { gate =kzalloc (sizeof (*gate),GFP_KERNEL );if (!gate) goto fail;
@@ -238,12 +245,6 @@ struct clk_hw *imx93_clk_composite_flags(const char *name, const char * const *p &imx93_clk_composite_divider_ops, gate_hw, &imx93_clk_composite_gate_ops, flags | CLK_SET_RATE_NO_REPARENT); - }else { - hw =clk_hw_register_composite (NULL , name, parent_names, num_parents, - mux_hw, &imx93_clk_composite_mux_ops, div_hw, - &imx93_clk_composite_divider_ops,NULL , - &imx93_clk_composite_gate_ops, - flags |CLK_SET_RATE_NO_REPARENT ); }if (IS_ERR (hw))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 346/695 clk: imx: composite-7ulp: Check the PCC present bit
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ye Li <[email protected]>
[ Upstream commit 4717ccadb51e2630790dddd222830702de17f090 ]
When some module is disabled by fuse, its PCC PR bit is default 0 and PCC is not operational. Any write to this PCC will cause SError.
--- drivers/clk/imx/clk-composite-7ulp.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/clk/imx/clk-composite-7ulp.c +7 -0
@@ -14,6 +14,7 @@#include "../clk-fractional-divider.h" #include "clk.h" +#define PCG_PR_MASK BIT(31)#define PCG_PCS_SHIFT 24#define PCG_PCS_MASK 0x7#define PCG_CGC_SHIFT 30
@@ -78,6 +79,12 @@ static struct clk_hw *imx_ulp_clk_hw_composite(const char *name,struct clk_hw *hw;u32 val; + val =readl (reg); +if (!(val &PCG_PR_MASK )) { +pr_info ("PCC PR is 0 for clk:%s, bypass\n" , name); +return 0 ; + } +if (mux_present) { mux =kzalloc (sizeof (*mux),GFP_KERNEL );if (!mux)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 347/695 clk: imx: fracn-gppll: fix fractional part of PLL getting lost
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengfei Li <[email protected]>
[ Upstream commit 7622f888fca125ae46f695edf918798ebc0506c5 ]
Fractional part of PLL gets lost after re-enabling the PLL. the MFN can NOT be automatically loaded when doing frac PLL enable/disable, So when re-enable PLL, configure mfn explicitly.
--- drivers/clk/imx/clk-fracn-gppll.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/imx/clk-fracn-gppll.c +4 -0
@@ -291,6 +291,10 @@ static int clk_fracn_gppll_prepare(struct clk_hw *hw)if (val &POWERUP_MASK )return 0 ; +if (pll->flags &CLK_FRACN_GPPLL_FRACN ) +writel_relaxed (readl_relaxed (pll->base +PLL_NUMERATOR ), + pll->base +PLL_NUMERATOR ); + val |=CLKMUX_BYPASS ;writel_relaxed (val, pll->base +PLL_CTRL );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 348/695 clk: imx: imx8mp: fix clock tree update of TF-A managed clocks
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Wang <[email protected]>
[ Upstream commit 3d29036853b9cb07ac49e8261fca82a940be5c41 ]
On the i.MX8M*, the TF-A exposes a SiP (Silicon Provider) service for DDR frequency scaling. The imx8m-ddrc-devfreq driver calls the SiP and then does clk_set_parent on the DDR muxes to synchronize the clock tree.
since commit 936c383673b9 ("clk: imx: fix composite peripheral flags"), these TF-A managed muxes have SET_PARENT_GATE set, which results in imx8m-ddrc-devfreq's clk_set_parent after SiP failing with -EBUSY:
clk_set_parent(dram_apb_src, sys1_pll_40m);(busfreq-imx8mq.c)
commit 926bf91248dd
("clk: imx8m: fix clock tree update of TF-A managed clocks") adds this method and enables 8mm, 8mn and 8mq. i.MX8MP also needs it.
This is safe to do, because updating the Linux clock tree to reflect reality will always be glitch-free.
Another reason to this patch is that powersave image BT music requires dram to be 400MTS, so clk_set_parent(dram_alt_src, sys1_pll_800m); is required. Without this patch, it will not succeed.
--- drivers/clk/imx/clk-imx8mp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-imx8mp.c +2 -2
@@ -551,8 +551,8 @@ static int imx8mp_clocks_probe(struct platform_device *pdev) hws[IMX8MP_CLK_IPG_ROOT ] =imx_clk_hw_divider2 ("ipg_root" ,"ahb_root" , ccm_base +0x9080 ,0 ,1 ); - hws[IMX8MP_CLK_DRAM_ALT ] =imx8m_clk_hw_composite ("dram_alt" , imx8mp_dram_alt_sels, ccm_base +0xa000 ); - hws[IMX8MP_CLK_DRAM_APB ] =imx8m_clk_hw_composite_critical ("dram_apb" , imx8mp_dram_apb_sels, ccm_base +0xa080 ); + hws[IMX8MP_CLK_DRAM_ALT ] =imx8m_clk_hw_fw_managed_composite ("dram_alt" , imx8mp_dram_alt_sels, ccm_base +0xa000 ); + hws[IMX8MP_CLK_DRAM_APB ] =imx8m_clk_hw_fw_managed_composite_critical ("dram_apb" , imx8mp_dram_apb_sels, ccm_base +0xa080 ); hws[IMX8MP_CLK_VPU_G1 ] =imx8m_clk_hw_composite ("vpu_g1" , imx8mp_vpu_g1_sels, ccm_base +0xa100 ); hws[IMX8MP_CLK_VPU_G2 ] =imx8m_clk_hw_composite ("vpu_g2" , imx8mp_vpu_g2_sels, ccm_base +0xa180 ); hws[IMX8MP_CLK_CAN1 ] =imx8m_clk_hw_composite ("can1" , imx8mp_can1_sels, ccm_base +0xa200 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 349/695 clk: imx: imx8qxp: Register dc0_bypass0_clk before disp clk
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit e61352d5ecdc0da2e7253121c15d9a3e040f78a1 ]
The initialization order of SCU clocks affects the sequence of SCU clock resume. If there are no other effects, the earlier the initialization, the earlier the resume. During SCU clock resume, the clock rate is restored. As SCFW guidelines, configure the parent clock rate before configuring the child rate.
--- drivers/clk/imx/clk-imx8qxp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-imx8qxp.c +2 -2
@@ -206,11 +206,11 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)imx_clk_scu ("usb3_lpm_div" ,IMX_SC_R_USB_2 ,IMX_SC_PM_CLK_MISC );/* Display controller SS */ -imx_clk_scu2 ("dc0_disp0_clk" , dc0_sels,ARRAY_SIZE (dc0_sels),IMX_SC_R_DC_0 ,IMX_SC_PM_CLK_MISC0 ); -imx_clk_scu2 ("dc0_disp1_clk" , dc0_sels,ARRAY_SIZE (dc0_sels),IMX_SC_R_DC_0 ,IMX_SC_PM_CLK_MISC1 );imx_clk_scu ("dc0_pll0_clk" ,IMX_SC_R_DC_0_PLL_0 ,IMX_SC_PM_CLK_PLL );imx_clk_scu ("dc0_pll1_clk" ,IMX_SC_R_DC_0_PLL_1 ,IMX_SC_PM_CLK_PLL );imx_clk_scu ("dc0_bypass0_clk" ,IMX_SC_R_DC_0_VIDEO0 ,IMX_SC_PM_CLK_BYPASS ); +imx_clk_scu2 ("dc0_disp0_clk" , dc0_sels,ARRAY_SIZE (dc0_sels),IMX_SC_R_DC_0 ,IMX_SC_PM_CLK_MISC0 ); +imx_clk_scu2 ("dc0_disp1_clk" , dc0_sels,ARRAY_SIZE (dc0_sels),IMX_SC_R_DC_0 ,IMX_SC_PM_CLK_MISC1 );imx_clk_scu ("dc0_bypass1_clk" ,IMX_SC_R_DC_0_VIDEO1 ,IMX_SC_PM_CLK_BYPASS );imx_clk_scu2 ("dc1_disp0_clk" , dc1_sels,ARRAY_SIZE (dc1_sels),IMX_SC_R_DC_1 ,IMX_SC_PM_CLK_MISC0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 350/695 clk: imx: imx8qxp: Parent should be initialized earlier than the clock
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 766c386c16c9899461b83573a06380d364c6e261 ]
The initialization order of SCU clocks affects the sequence of SCU clock resume. If there are no other effects, the earlier the initialization, the earlier the resume. During SCU clock resume, the clock rate is restored. As SCFW guidelines, configure the parent clock rate before configuring the child rate.
--- drivers/clk/imx/clk-imx8qxp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/clk/imx/clk-imx8qxp.c +3 -3
@@ -170,8 +170,8 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)imx_clk_scu ("pwm_clk" ,IMX_SC_R_LCD_0_PWM_0 ,IMX_SC_PM_CLK_PER );imx_clk_scu ("elcdif_pll" ,IMX_SC_R_ELCDIF_PLL ,IMX_SC_PM_CLK_PLL );imx_clk_scu2 ("lcd_clk" , lcd_sels,ARRAY_SIZE (lcd_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_PER ); -imx_clk_scu2 ("lcd_pxl_clk" , lcd_pxl_sels,ARRAY_SIZE (lcd_pxl_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_MISC0 );imx_clk_scu ("lcd_pxl_bypass_div_clk" ,IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_BYPASS ); +imx_clk_scu2 ("lcd_pxl_clk" , lcd_pxl_sels,ARRAY_SIZE (lcd_pxl_sels),IMX_SC_R_LCD_0 ,IMX_SC_PM_CLK_MISC0 );/* Audio SS */ imx_clk_scu ("audio_pll0_clk" ,IMX_SC_R_AUDIO_PLL_0 ,IMX_SC_PM_CLK_PLL );
@@ -213,11 +213,11 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)imx_clk_scu2 ("dc0_disp1_clk" , dc0_sels,ARRAY_SIZE (dc0_sels),IMX_SC_R_DC_0 ,IMX_SC_PM_CLK_MISC1 );imx_clk_scu ("dc0_bypass1_clk" ,IMX_SC_R_DC_0_VIDEO1 ,IMX_SC_PM_CLK_BYPASS ); -imx_clk_scu2 ("dc1_disp0_clk" , dc1_sels,ARRAY_SIZE (dc1_sels),IMX_SC_R_DC_1 ,IMX_SC_PM_CLK_MISC0 ); -imx_clk_scu2 ("dc1_disp1_clk" , dc1_sels,ARRAY_SIZE (dc1_sels),IMX_SC_R_DC_1 ,IMX_SC_PM_CLK_MISC1 );imx_clk_scu ("dc1_pll0_clk" ,IMX_SC_R_DC_1_PLL_0 ,IMX_SC_PM_CLK_PLL );imx_clk_scu ("dc1_pll1_clk" ,IMX_SC_R_DC_1_PLL_1 ,IMX_SC_PM_CLK_PLL );imx_clk_scu ("dc1_bypass0_clk" ,IMX_SC_R_DC_1_VIDEO0 ,IMX_SC_PM_CLK_BYPASS ); +imx_clk_scu2 ("dc1_disp0_clk" , dc1_sels,ARRAY_SIZE (dc1_sels),IMX_SC_R_DC_1 ,IMX_SC_PM_CLK_MISC0 ); +imx_clk_scu2 ("dc1_disp1_clk" , dc1_sels,ARRAY_SIZE (dc1_sels),IMX_SC_R_DC_1 ,IMX_SC_PM_CLK_MISC1 );imx_clk_scu ("dc1_bypass1_clk" ,IMX_SC_R_DC_1_VIDEO1 ,IMX_SC_PM_CLK_BYPASS );/* MIPI-LVDS SS */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 351/695 quota: avoid missing put_quota_format when DQUOT_SUSPENDED is passed
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kemeng Shi <[email protected]>
[ Upstream commit d16a5f852025be546b6e4ceef15899db3490f4d7 ]
Avoid missing put_quota_format when DQUOT_SUSPENDED is passed to dquot_load_quota_sb.
--- fs/quota/dquot.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/quota/dquot.c +2 -1
@@ -2406,7 +2406,7 @@ static int vfs_setup_quota_inode(struct inode *inode, int type)int dquot_load_quota_sb (struct super_block *sb,int type,int format_id,unsigned int flags) { -struct quota_format_type *fmt =find_quota_format (format_id); +struct quota_format_type *fmt;struct quota_info *dqopt =sb_dqopt (sb);int error;
@@ -2416,6 +2416,7 @@ int dquot_load_quota_sb(struct super_block *sb, int type, int format_id,if (WARN_ON_ONCE (flags &DQUOT_SUSPENDED ))return -EINVAL ; + fmt =find_quota_format (format_id);if (!fmt)return -ESRCH ; if (!sb->dq_op || !sb->s_qcop ||
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 352/695 remoteproc: imx_rproc: Correct ddr alias for i.MX8M
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit c901f817792822eda9cec23814a4621fa3e66695 ]
The DDR Alias address should be 0x40000000 according to RM, so correct it.
--- drivers/remoteproc/imx_rproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/remoteproc/imx_rproc.c +1 -1
@@ -210,7 +210,7 @@ static const struct imx_rproc_att imx_rproc_att_imx8mq[] = {/* QSPI Code - alias */ { 0x08000000, 0x08000000, 0x08000000, 0 },/* DDR (Code) - alias */ - { 0x10000000, 0x80000000, 0x0FFE0000, 0 }, + { 0x10000000, 0x40000000, 0x0FFE0000, 0 },/* TCML */ { 0x1FFE0000, 0x007E0000, 0x00020000, ATT_OWN | ATT_IOMEM}, /* TCMU */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 353/695 remoteproc: imx_rproc: Initialize workqueue earlier
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 858e57c1d3dd7b92cc0fa692ba130a0a5d57e49d ]
Initialize workqueue before requesting mailbox channel, otherwise if mailbox interrupt comes before workqueue ready, the imx_rproc_rx_callback will trigger issue.
--- drivers/remoteproc/imx_rproc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/remoteproc/imx_rproc.c +2 -2
@@ -1076,6 +1076,8 @@ static int imx_rproc_probe(struct platform_device *pdev)return -ENOMEM ; } +INIT_WORK (&priv->rproc_work, imx_rproc_vq_work); + ret =imx_rproc_xtr_mbox_init (rproc);if (ret) goto err_put_wkq;
@@ -1094,8 +1096,6 @@ static int imx_rproc_probe(struct platform_device *pdev)if (ret) goto err_put_scu; -INIT_WORK (&priv->rproc_work, imx_rproc_vq_work); -if (rproc->state !=RPROC_DETACHED ) rproc->auto_boot =of_property_read_bool (np,"fsl,auto-boot" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 354/695 clk: rockchip: Set parent rate for DCLK_VOP clock on RK3228
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Karlman <[email protected]>
[ Upstream commit 1d34b9757523c1ad547bd6d040381f62d74a3189 ]
Similar to DCLK_LCDC on RK3328, the DCLK_VOP on RK3228 is typically parented by the hdmiphy clk and it is expected that the DCLK_VOP and hdmiphy clk rate are kept in sync.
Use CLK_SET_RATE_PARENT and CLK_SET_RATE_NO_REPARENT flags, same as used on RK3328, to make full use of all possible supported display modes.
--- drivers/clk/rockchip/clk-rk3228.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/rockchip/clk-rk3228.c +1 -1
@@ -409,7 +409,7 @@ static struct rockchip_clk_branch rk3228_clk_branches[] __initdata = { RK2928_CLKSEL_CON(29), 0, 3, DFLAGS),DIV (0 ,"sclk_vop_pre" ,"sclk_vop_src" ,0 ,RK2928_CLKSEL_CON (27 ),8 ,8 ,DFLAGS ), -MUX (DCLK_VOP ,"dclk_vop" , mux_dclk_vop_p,0 , +MUX (DCLK_VOP ,"dclk_vop" , mux_dclk_vop_p,CLK_SET_RATE_PARENT |CLK_SET_RATE_NO_REPARENT ,RK2928_CLKSEL_CON (27 ),1 ,1 ,MFLAGS ), FACTOR(0, "xin12m", "xin24m", 0, 1, 2),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 355/695 clk: qcom: dispcc-sm8550: fix several supposed typos
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 7b6a4b907297b28727933493b9e0c95494504634 ]
Fix seveal odd-looking places in SM8550's dispcc driver:
- duplicate entries in disp_cc_parent_map_4 and disp_cc_parent_map_5
- using &disp_cc_mdss_dptx0_link_div_clk_src as a source for disp_cc_mdss_dptx1_usb_router_link_intf_clk
The SM8650 driver has been used as a reference.
--- drivers/clk/qcom/dispcc-sm8550.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/dispcc-sm8550.c +2 -2
@@ -196,7 +196,7 @@ static const struct clk_parent_data disp_cc_parent_data_3[] = {static const struct parent_map disp_cc_parent_map_4[] = { {P_BI_TCXO ,0 }, {P_DP0_PHY_PLL_LINK_CLK ,1 }, - {P_DP1_PHY_PLL_VCO_DIV_CLK ,2 }, + {P_DP0_PHY_PLL_VCO_DIV_CLK ,2 }, {P_DP3_PHY_PLL_VCO_DIV_CLK ,3 }, {P_DP1_PHY_PLL_VCO_DIV_CLK ,4 }, {P_DP2_PHY_PLL_VCO_DIV_CLK ,6 },
@@ -213,7 +213,7 @@ static const struct clk_parent_data disp_cc_parent_data_4[] = {static const struct parent_map disp_cc_parent_map_5[] = { {P_BI_TCXO ,0 }, - {P_DSI0_PHY_PLL_OUT_BYTECLK ,4 }, + {P_DSI0_PHY_PLL_OUT_BYTECLK ,2 }, {P_DSI1_PHY_PLL_OUT_BYTECLK ,4 }, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 356/695 clk: qcom: dispcc-sm8550: use rcg2_ops for mdss_dptx1_aux_clk_src
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit cb4c00698f2f27d99a69adcce659370ca286cf2a ]
clk_dp_ops should only be used for DisplayPort pixel clocks. Use clk_rcg2_ops for disp_cc_mdss_dptx1_aux_clk_src.
--- drivers/clk/qcom/dispcc-sm8550.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/dispcc-sm8550.c +1 -1
@@ -400,7 +400,7 @@ static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = { .parent_data = disp_cc_parent_data_0, .num_parents = ARRAY_SIZE(disp_cc_parent_data_0), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_dp_ops, + .ops = &clk_rcg2_ops, }, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 357/695 clk: qcom: dispcc-sm8650: Update the GDSC flags
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 7de10ddbdb9d03651cff5fbdc8cf01837c698526 ]
Add missing POLL_CFG_GDSCR to the MDSS GDSC flags.
--- drivers/clk/qcom/dispcc-sm8550.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/dispcc-sm8550.c +2 -2
@@ -1611,7 +1611,7 @@ static struct gdsc mdss_gdsc = { .name = "mdss_gdsc", }, .pwrsts = PWRSTS_OFF_ON, - .flags = HW_CTRL | RETAIN_FF_ENABLE, + .flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE, }; static struct gdsc mdss_int2_gdsc = {
@@ -1620,7 +1620,7 @@ static struct gdsc mdss_int2_gdsc = { .name = "mdss_int2_gdsc", }, .pwrsts = PWRSTS_OFF_ON, - .flags = HW_CTRL | RETAIN_FF_ENABLE, + .flags = POLL_CFG_GDSCR | HW_CTRL | RETAIN_FF_ENABLE, }; static struct clk_regmap *disp_cc_sm8550_clocks[] = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 358/695 clk: qcom: dispcc-sm8550: use rcg2_shared_ops for ESC RCGs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit c8bee3ff6c9220092b646ff929f9c832c1adab6d ]
Follow the recommendations and park disp_cc_mdss_esc[01]_clk_src to the XO instead of disabling the clocks by using the clk_rcg2_shared_ops.
--- drivers/clk/qcom/dispcc-sm8550.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/dispcc-sm8550.c +2 -2
@@ -562,7 +562,7 @@ static struct clk_rcg2 disp_cc_mdss_esc0_clk_src = { .parent_data = disp_cc_parent_data_5, .num_parents = ARRAY_SIZE(disp_cc_parent_data_5), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, };
@@ -577,7 +577,7 @@ static struct clk_rcg2 disp_cc_mdss_esc1_clk_src = { .parent_data = disp_cc_parent_data_5, .num_parents = ARRAY_SIZE(disp_cc_parent_data_5), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 359/695 leds: bd2606mvv: Fix device child node usage in bd2606mvv_probe()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
[ Upstream commit ffbf1fcb421429916a861cfc25dfe0c6387dda75 ]
The current implementation accesses the child fwnode handle outside of fwnode_for_each_available_child_node() without incrementing its refcount. Add the missing call to fwnode_handle_get(child).
The cleanup process where child is accessed is not right either because a single call to fwnode_handle_put() is carried out in case of an error, ignoring unasigned nodes at the point when the error happens. Keep child inside of the first loop, and use the helper pointer that receives references via fwnode_handle_get() to handle the child nodes within the second loop.
Moreover, the iterated nodes are direct children of the device node, and the device_for_each_child_node() macro accounts for child node availability. By restricting child to live within that loop, the scoped version of it can be used to simplify the error handling.
fwnode_for_each_available_child_node() is meant to access the child nodes of an fwnode, and therefore not direct child nodes of the device node.
Use device_for_each_child_node_scoped() to indicate device's direct child nodes.
--- drivers/leds/leds-bd2606mvv.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)
drivers/leds/leds-bd2606mvv.c +10 -13
@@ -69,16 +69,14 @@ static const struct regmap_config bd2606mvv_regmap = {static int bd2606mvv_probe (struct i2c_client *client) { -struct fwnode_handle *np, *child;struct device *dev = &client->dev;struct bd2606mvv_priv *priv;struct fwnode_handle *led_fwnodes[BD2606_MAX_LEDS ] = {0 };int active_pairs[BD2606_MAX_LEDS /2 ] = {0 };int err, reg; -int i; +int i, j; - np =dev_fwnode (dev); -if (!np) +if (!dev_fwnode (dev))return -ENODEV ; priv =devm_kzalloc (dev,sizeof (*priv),GFP_KERNEL );
@@ -94,20 +92,18 @@ static int bd2606mvv_probe(struct i2c_client *client)i2c_set_clientdata (client, priv); -fwnode_for_each_available_child_node (np, child) { +device_for_each_child_node_scoped (dev, child) {struct bd2606mvv_led *led; err =fwnode_property_read_u32 (child,"reg" , ®); -if (err) { -fwnode_handle_put (child); +if (err)return err; - } -if (reg <0 || reg >=BD2606_MAX_LEDS || led_fwnodes[reg]) { -fwnode_handle_put (child); + +if (reg <0 || reg >=BD2606_MAX_LEDS || led_fwnodes[reg])return -EINVAL ; - } + led = &priv->leds[reg]; - led_fwnodes[reg] = child; + led_fwnodes[reg] =fwnode_handle_get (child); active_pairs[reg /2 ]++; led->priv = priv; led->led_no = reg;
@@ -130,7 +126,8 @@ static int bd2606mvv_probe(struct i2c_client *client) &priv->leds[i].ldev, &init_data);if (err <0 ) { -fwnode_handle_put (child); +for (j = i; j <BD2606_MAX_LEDS ; j++) +fwnode_handle_put (led_fwnodes[j]);return dev_err_probe (dev, err,"couldn't register LED %s\n" , priv->leds[i].ldev.name);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 360/695 pinctrl: renesas: rzg2l: Return -EINVAL if the pin doesnt support PIN_CFG_OEN
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lad Prabhakar <[email protected]>
[ Upstream commit d56abfed1c02814b5ee96b0ed1f989ea9d7f6cbb ]
Update the rzg2l_pinctrl_pinconf_get() function to return -EINVAL for PIN_CONFIG_OUTPUT_ENABLE config if the pin doesn't support the PIN_CFG_OEN configuration.
-EINVAL is a valid error when dumping the pin configurations. Returning -EOPNOTSUPP for a pin that does not support PIN_CFG_OEN resulted in the message 'ERROR READING CONFIG SETTING 16' being printed during dumping pinconf-pins.
For consistency do similar change in rzg2l_pinctrl_pinconf_set() for PIN_CONFIG_OUTPUT_ENABLE config.
--- drivers/pinctrl/renesas/pinctrl-rzg2l.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/pinctrl/renesas/pinctrl-rzg2l.c +6 -2
@@ -1261,7 +1261,9 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,break ;case PIN_CONFIG_OUTPUT_ENABLE : -if (!pctrl->data->oen_read || !(cfg &PIN_CFG_OEN )) +if (!(cfg &PIN_CFG_OEN )) +return -EINVAL ; +if (!pctrl->data->oen_read)return -EOPNOTSUPP ; arg = pctrl->data->oen_read (pctrl, _pin);if (!arg)
@@ -1402,7 +1404,9 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,case PIN_CONFIG_OUTPUT_ENABLE : arg =pinconf_to_config_argument (_configs[i]); -if (!pctrl->data->oen_write || !(cfg &PIN_CFG_OEN )) +if (!(cfg &PIN_CFG_OEN )) +return -EINVAL ; +if (!pctrl->data->oen_write)return -EOPNOTSUPP ; ret = pctrl->data->oen_write (pctrl, _pin, !!arg);if (ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 361/695 pinctrl: ti: ti-iodelay: Fix some error handling paths
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit a9f2b249adeef2b9744a884355fa8f5e581d507f ]
In the probe, if an error occurs after the ti_iodelay_pinconf_init_dev() call, it is likely that ti_iodelay_pinconf_deinit_dev() should be called, as already done in the remove function.
Also in ti_iodelay_pinconf_init_dev(), if an error occurs after the first regmap_update_bits() call, it is also likely that the deinit() function should be called.
The easier way to fix it is to add a devm_add_action_or_reset() at the rigtht place to have ti_iodelay_pinconf_deinit_dev() called when needed.
Doing so, the .remove() function can be removed, and the associated platform_set_drvdata() call in the probe as well.
--- drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 52 ++++++++++--------------- 1 file changed, 21 insertions(+), 31 deletions(-)
drivers/pinctrl/ti/pinctrl-ti-iodelay.c +21 -31
@@ -273,6 +273,22 @@ static int ti_iodelay_pinconf_set(struct ti_iodelay_device *iod,return r; } +/** +* ti_iodelay_pinconf_deinit_dev() - deinit the iodelay device +* @data: IODelay device +* +* Deinitialize the IODelay device (basically just lock the region back up. +*/ +static void ti_iodelay_pinconf_deinit_dev (void *data) +{ +struct ti_iodelay_device *iod = data; +const struct ti_iodelay_reg_data *reg = iod->reg_data; + +/* lock the iodelay region back again */ +regmap_update_bits (iod->regmap, reg->reg_global_lock_offset, + reg->global_lock_mask, reg->global_lock_val); +} +/** * ti_iodelay_pinconf_init_dev() - Initialize IODelay device * @iod: iodelay device
@@ -295,6 +311,11 @@ static int ti_iodelay_pinconf_init_dev(struct ti_iodelay_device *iod)if (r)return r; + r =devm_add_action_or_reset (iod->dev, ti_iodelay_pinconf_deinit_dev, + iod); +if (r) +return r; +/* Read up Recalibration sequence done by bootloader */ r =regmap_read (iod->regmap, reg->reg_refclk_offset, &val);if (r)
@@ -353,21 +374,6 @@ static int ti_iodelay_pinconf_init_dev(struct ti_iodelay_device *iod)return 0 ; } -/** -* ti_iodelay_pinconf_deinit_dev() - deinit the iodelay device -* @iod: IODelay device -* -* Deinitialize the IODelay device (basically just lock the region back up. -*/ -static void ti_iodelay_pinconf_deinit_dev (struct ti_iodelay_device *iod) -{ -const struct ti_iodelay_reg_data *reg = iod->reg_data; - -/* lock the iodelay region back again */ -regmap_update_bits (iod->regmap, reg->reg_global_lock_offset, - reg->global_lock_mask, reg->global_lock_val); -} -/** * ti_iodelay_get_pingroup() - Find the group mapped by a group selector * @iod: iodelay device
@@ -877,27 +883,11 @@ static int ti_iodelay_probe(struct platform_device *pdev)return ret; } -platform_set_drvdata (pdev, iod); -return pinctrl_enable (iod->pctl); } -/** -* ti_iodelay_remove() - standard remove -* @pdev: platform device -*/ -static void ti_iodelay_remove (struct platform_device *pdev) -{ -struct ti_iodelay_device *iod =platform_get_drvdata (pdev); - -ti_iodelay_pinconf_deinit_dev (iod); - -/* Expect other allocations to be freed by devm */ -} -static struct platform_driver ti_iodelay_driver = { .probe = ti_iodelay_probe, - .remove_new = ti_iodelay_remove, .driver = { .name =DRIVER_NAME , .of_match_table = ti_iodelay_of_match,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 362/695 phy: phy-rockchip-samsung-hdptx: Explicitly include pm_runtime.h
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cristian Ciocaltea <[email protected]>
[ Upstream commit 1b369ff94bc36d2e16c8a91c0ea8ebd329555976 ]
Driver makes use of helpers from pm_runtime.h, but relies on the header file being implicitly included.
Explicitly pull the header in to avoid potential build failures in some configurations.
--- drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c | 1 + 1 file changed, 1 insertion(+)
drivers/phy/rockchip/phy-rockchip-samsung-hdptx.c +1 -0
@@ -15,6 +15,7 @@#include <linux/of_platform.h> #include <linux/phy/phy.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/rational.h> #include <linux/regmap.h> #include <linux/reset.h>
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 363/695 Input: ilitek_ts_i2c - avoid wrong input subsystem sync
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emanuele Ghidoli <[email protected]>
[ Upstream commit 7d0b18cd5dc7429917812963611d961fd93cb44d ]
For different reasons i2c transaction may fail or report id in the message may be wrong. Avoid closing the frame in this case as it will result in all contacts being dropped, indicating that nothing is touching the screen anymore, while usually it is not the case.
--- drivers/input/touchscreen/ilitek_ts_i2c.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/input/touchscreen/ilitek_ts_i2c.c +5 -6
@@ -160,15 +160,14 @@ static int ilitek_process_and_report_v6(struct ilitek_ts_data *ts) error =ilitek_i2c_write_and_read (ts,NULL ,0 ,0 , buf,64 );if (error) {dev_err (dev,"get touch info failed, err:%d\n" , error); - goto err_sync_frame; +return error; } report_max_point = buf[REPORT_COUNT_ADDRESS ];if (report_max_point > ts->max_tp) {dev_err (dev,"FW report max point:%d > panel info. max:%d\n" , report_max_point, ts->max_tp); - error = -EINVAL ; - goto err_sync_frame; +return -EINVAL ; } count =DIV_ROUND_UP (report_max_point, packet_max_point);
@@ -178,7 +177,7 @@ static int ilitek_process_and_report_v6(struct ilitek_ts_data *ts)if (error) {dev_err (dev,"get touch info. failed, cnt:%d, err:%d\n" , count, error); - goto err_sync_frame; +return error; } }
@@ -203,10 +202,10 @@ static int ilitek_process_and_report_v6(struct ilitek_ts_data *ts)ilitek_touch_down (ts, id, x, y); } -err_sync_frame:input_mt_sync_frame (input);input_sync (input); -return error; + +return 0 ; }/* APIs of cmds for ILITEK Touch IC */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 364/695 Input: ilitek_ts_i2c - add report id message validation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emanuele Ghidoli <[email protected]>
[ Upstream commit 208989744a6f01bed86968473312d4e650e600b3 ]
Ensure that the touchscreen response has correct "report id" byte before processing the touch data and discard other messages.
--- drivers/input/touchscreen/ilitek_ts_i2c.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/input/touchscreen/ilitek_ts_i2c.c +7 -0
@@ -37,6 +37,8 @@#define ILITEK_TP_CMD_GET_MCU_VER 0x61#define ILITEK_TP_CMD_GET_IC_MODE 0xC0 +#define ILITEK_TP_I2C_REPORT_ID 0x48 +#define REPORT_COUNT_ADDRESS 61#define ILITEK_SUPPORT_MAX_POINT 40
@@ -163,6 +165,11 @@ static int ilitek_process_and_report_v6(struct ilitek_ts_data *ts)return error; } +if (buf[0 ] !=ILITEK_TP_I2C_REPORT_ID ) { +dev_err (dev,"get touch info failed. Wrong id: 0x%02X\n" , buf[0 ]); +return -EINVAL ; + } + report_max_point = buf[REPORT_COUNT_ADDRESS ];if (report_max_point > ts->max_tp) { dev_err(dev, "FW report max point:%d > panel info. max:%d\n",
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 365/695 drivers: media: dvb-frontends/rtl2832: fix an out-of-bounds write error
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junlin Li <[email protected]>
[ Upstream commit 8ae06f360cfaca2b88b98ca89144548b3186aab1 ]
Ensure index in rtl2832_pid_filter does not exceed 31 to prevent out-of-bounds access.
dev->filters is a 32-bit value, so set_bit and clear_bit functions should only operate on indices from 0 to 31. If index is 32, it will attempt to access a non-existent 33rd bit, leading to out-of-bounds access. Change the boundary check from index > 32 to index >= 32 to resolve this issue.
--- drivers/media/dvb-frontends/rtl2832.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/dvb-frontends/rtl2832.c +1 -1
@@ -983,7 +983,7 @@ static int rtl2832_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, index, pid, onoff, dev->slave_ts);/* skip invalid PIDs (0x2000) */ -if (pid >0x1fff || index >32 ) +if (pid >0x1fff || index >=32 )return 0 ;if (onoff)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 366/695 drivers: media: dvb-frontends/rtl2830: fix an out-of-bounds write error
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junlin Li <[email protected]>
[ Upstream commit 46d7ebfe6a75a454a5fa28604f0ef1491f9d8d14 ]
Ensure index in rtl2830_pid_filter does not exceed 31 to prevent out-of-bounds access.
dev->filters is a 32-bit value, so set_bit and clear_bit functions should only operate on indices from 0 to 31. If index is 32, it will attempt to access a non-existent 33rd bit, leading to out-of-bounds access. Change the boundary check from index > 32 to index >= 32 to resolve this issue.
--- drivers/media/dvb-frontends/rtl2830.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/dvb-frontends/rtl2830.c +1 -1
@@ -609,7 +609,7 @@ static int rtl2830_pid_filter(struct dvb_frontend *fe, u8 index, u16 pid, int on index, pid, onoff);/* skip invalid PIDs (0x2000) */ -if (pid >0x1fff || index >32 ) +if (pid >0x1fff || index >=32 )return 0 ;if (onoff)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 367/695 media: raspberrypi: VIDEO_RASPBERRYPI_PISP_BE should depend on ARCH_BCM2835
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit c8ad75010c5bafe014860f33fc73a887ab561209 ]
Currently, the Raspberry Pi PiSP Backend (BE) ISP is only present on the Broadcom BCM2712-based Raspberry Pi 5. Hence add a dependency on ARCH_BCM2835, to prevent asking the user about this driver when configuring a kernel without Broadcom BCM2835 family support. The dependency can be relaxed if/when the encoder appears on other SoC families.
--- drivers/media/platform/raspberrypi/pisp_be/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/raspberrypi/pisp_be/Kconfig +1 -0
@@ -2,6 +2,7 @@ config VIDEO_RASPBERRYPI_PISP_BE tristate "Raspberry Pi PiSP Backend (BE) ISP driver" depends on V4L_PLATFORM_DRIVERS depends on VIDEO_DEV + depends on ARCH_BCM2835 || COMPILE_TEST select VIDEO_V4L2_SUBDEV_API select MEDIA_CONTROLLER select VIDEOBUF2_DMA_CONTIG
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 368/695 PCI: Wait for Link before restoring Downstream Buses
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit 3e40aa29d47e231a54640addf6a09c1f64c5b63f ]
__pci_reset_bus() calls pci_bridge_secondary_bus_reset() to perform the reset and also waits for the Secondary Bus to become again accessible. __pci_reset_bus() then calls pci_bus_restore_locked() that restores the PCI devices connected to the bus, and if necessary, recursively restores also the subordinate buses and their devices.
The logic in pci_bus_restore_locked() does not take into account that after restoring a device on one level, there might be another Link Downstream that can only start to come up after restore has been performed for its Downstream Port device. That is, the Link may require additional wait until it becomes accessible.
Similarly, pci_slot_restore_locked() lacks wait.
Amend pci_bus_restore_locked() and pci_slot_restore_locked() to wait for the Secondary Bus before recursively performing the restore of that bus.
--- drivers/pci/pci.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/pci/pci.c +6 -2
@@ -5672,8 +5672,10 @@ static void pci_bus_restore_locked(struct pci_bus *bus)list_for_each_entry (dev, &bus->devices, bus_list) {pci_dev_restore (dev); -if (dev->subordinate) +if (dev->subordinate) { +pci_bridge_wait_for_secondary_bus (dev,"bus reset" );pci_bus_restore_locked (dev->subordinate); + } } }
@@ -5707,8 +5709,10 @@ static void pci_slot_restore_locked(struct pci_slot *slot)if (!dev->slot || dev->slot != slot)continue ;pci_dev_restore (dev); -if (dev->subordinate) +if (dev->subordinate) { +pci_bridge_wait_for_secondary_bus (dev,"slot reset" );pci_bus_restore_locked (dev->subordinate); + } } }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 369/695 firewire: core: correct range of block for case of switch statement
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Sakamoto <[email protected]>
[ Upstream commit ebb9d3ca8f7efc1b6a2f1750d1058eda444883d0 ]
A commit d8527cab6c31 ("firewire: cdev: implement new event to notify response subaction with time stamp") adds an additional case, FW_CDEV_EVENT_RESPONSE2, into switch statement in complete_transaction(). However, the range of block is beyond to the case label and reaches neibour default label.
This commit corrects the range of block. Fortunately, it has few impacts in practice since the local variable in the scope under the label is not used in codes under default label.
--- drivers/firewire/core-cdev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firewire/core-cdev.c +1 -1
@@ -599,11 +599,11 @@ static void complete_transaction(struct fw_card *card, int rcode, u32 request_tsqueue_event (client, &e->event, rsp,sizeof (*rsp) + rsp->length,NULL ,0 );break ; + }default :WARN_ON (1 );break ; } - }/* Drop the idr's reference */ client_put (client);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 370/695 PCI: keystone: Fix if-statement expression in ks_pcie_quirk()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 6188a1c762eb9bbd444f47696eda77a5eae6207a ]
This code accidentally uses && where || was intended. It potentially results in a NULL dereference.
Thus, fix the if-statement expression to use the correct condition.
--- drivers/pci/controller/dwc/pci-keystone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/controller/dwc/pci-keystone.c +1 -1
@@ -577,7 +577,7 @@ static void ks_pcie_quirk(struct pci_dev *dev)*/ if (pci_match_id (am6_pci_devids, bridge)) { bridge_dev =pci_get_host_bridge_device (dev); -if (!bridge_dev && !bridge_dev->parent) +if (!bridge_dev || !bridge_dev->parent)return ; ks_pcie =dev_get_drvdata (bridge_dev->parent);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 371/695 media: staging: media: starfive: camss: Drop obsolete return value documentation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 044fcf738a56d915514e2d651333395b3f8daa62 ]
Recently the function stfcamss_remove() was changed to not return a value. Drop the documentation of the return value in the kernel doc.
--- drivers/staging/media/starfive/camss/stf-camss.c | 2 -- 1 file changed, 2 deletions(-)
drivers/staging/media/starfive/camss/stf-camss.c +0 -2
@@ -358,8 +358,6 @@ static int stfcamss_probe(struct platform_device *pdev)/* * stfcamss_remove - Remove STFCAMSS platform device * @pdev: Pointer to STFCAMSS platform device -* -* Always returns 0. */ static void stfcamss_remove (struct platform_device *pdev) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 372/695 clk: qcom: ipq5332: Register gcc_qdss_tsctr_clk_src
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Varadarajan Narayanan <[email protected]>
[ Upstream commit 0e1ac23dfa3f635e486fdeb08206b981cb0a2a6b ]
gcc_qdss_tsctr_clk_src (enabled in the boot loaders and dependent on gpll4_main) was not registered as one of the ipq5332 clocks. Hence clk_disable_unused() disabled 'gpll4_main' assuming there were no consumers for 'gpll4_main' resulting in system freeze or reboots.
--- drivers/clk/qcom/gcc-ipq5332.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/gcc-ipq5332.c +1 -0
@@ -3388,6 +3388,7 @@ static struct clk_regmap *gcc_ipq5332_clocks[] = { [GCC_QDSS_DAP_DIV_CLK_SRC] = &gcc_qdss_dap_div_clk_src.clkr, [GCC_QDSS_ETR_USB_CLK] = &gcc_qdss_etr_usb_clk.clkr, [GCC_QDSS_EUD_AT_CLK] = &gcc_qdss_eud_at_clk.clkr, + [GCC_QDSS_TSCTR_CLK_SRC] = &gcc_qdss_tsctr_clk_src.clkr, [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr, [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr, [GCC_QPIC_IO_MACRO_CLK] = &gcc_qpic_io_macro_clk.clkr,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 373/695 clk: qcom: dispcc-sm8250: use special function for Lucid 5LPE PLL
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 362be5cbaec2a663eb86b7105313368b4a71fc1e ]
According to msm-5.10 the lucid 5lpe PLLs have require slightly different configuration that trion / lucid PLLs, it doesn't set PLL_UPDATE_BYPASS bit. Add corresponding function and use it for the display clock controller on Qualcomm SM8350 platform.
--- drivers/clk/qcom/clk-alpha-pll.c | 52 ++++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 2 ++ drivers/clk/qcom/dispcc-sm8250.c | 9 ++++-- 3 files changed, 61 insertions(+), 2 deletions(-)
drivers/clk/qcom/clk-alpha-pll.c +52 -0
@@ -1832,6 +1832,58 @@ const struct clk_ops clk_alpha_pll_agera_ops = { };EXPORT_SYMBOL_GPL (clk_alpha_pll_agera_ops); +/** +* clk_lucid_5lpe_pll_configure - configure the lucid 5lpe pll +* +* @pll: clk alpha pll +* @regmap: register map +* @config: configuration to apply for pll +*/ +void clk_lucid_5lpe_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config) +{ +/* +* If the bootloader left the PLL enabled it's likely that there are +* RCGs that will lock up if we disable the PLL below. +*/ +if (trion_pll_is_enabled (pll, regmap)) { +pr_debug ("Lucid 5LPE PLL is already enabled, skipping configuration\n" ); +return ; + } + +clk_alpha_pll_write_config (regmap,PLL_L_VAL (pll), config->l); +regmap_write (regmap,PLL_CAL_L_VAL (pll),TRION_PLL_CAL_VAL ); +clk_alpha_pll_write_config (regmap,PLL_ALPHA_VAL (pll), config->alpha); +clk_alpha_pll_write_config (regmap,PLL_CONFIG_CTL (pll), + config->config_ctl_val); +clk_alpha_pll_write_config (regmap,PLL_CONFIG_CTL_U (pll), + config->config_ctl_hi_val); +clk_alpha_pll_write_config (regmap,PLL_CONFIG_CTL_U1 (pll), + config->config_ctl_hi1_val); +clk_alpha_pll_write_config (regmap,PLL_USER_CTL (pll), + config->user_ctl_val); +clk_alpha_pll_write_config (regmap,PLL_USER_CTL_U (pll), + config->user_ctl_hi_val); +clk_alpha_pll_write_config (regmap,PLL_USER_CTL_U1 (pll), + config->user_ctl_hi1_val); +clk_alpha_pll_write_config (regmap,PLL_TEST_CTL (pll), + config->test_ctl_val); +clk_alpha_pll_write_config (regmap,PLL_TEST_CTL_U (pll), + config->test_ctl_hi_val); +clk_alpha_pll_write_config (regmap,PLL_TEST_CTL_U1 (pll), + config->test_ctl_hi1_val); + +/* Disable PLL output */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Set operation mode to OFF */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_STANDBY ); + +/* Place the PLL in STANDBY mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +} +EXPORT_SYMBOL_GPL (clk_lucid_5lpe_pll_configure); +static int alpha_pll_lucid_5lpe_enable (struct clk_hw *hw) {struct clk_alpha_pll *pll =to_clk_alpha_pll (hw);
drivers/clk/qcom/clk-alpha-pll.h +2 -0
@@ -208,6 +208,8 @@ void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap,const struct alpha_pll_config *config); +void clk_lucid_5lpe_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config);void clk_lucid_evo_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap,const struct alpha_pll_config *config); void clk_lucid_ole_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
drivers/clk/qcom/dispcc-sm8250.c +7 -2
@@ -1357,8 +1357,13 @@ static int disp_cc_sm8250_probe(struct platform_device *pdev) disp_cc_sm8250_clocks[DISP_CC_MDSS_EDP_GTC_CLK_SRC ] =NULL ; } -clk_lucid_pll_configure (&disp_cc_pll0, regmap, &disp_cc_pll0_config); -clk_lucid_pll_configure (&disp_cc_pll1, regmap, &disp_cc_pll1_config); +if (of_device_is_compatible (pdev->dev.of_node,"qcom,sm8350-dispcc" )) { +clk_lucid_5lpe_pll_configure (&disp_cc_pll0, regmap, &disp_cc_pll0_config); +clk_lucid_5lpe_pll_configure (&disp_cc_pll1, regmap, &disp_cc_pll1_config); + }else { +clk_lucid_pll_configure (&disp_cc_pll0, regmap, &disp_cc_pll0_config); +clk_lucid_pll_configure (&disp_cc_pll1, regmap, &disp_cc_pll1_config); + }/* Enable clock gating for MDP clocks */ regmap_update_bits (regmap,0x8000 ,0x10 ,0x10 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 374/695 leds: pca995x: Use device_for_each_child_node() to access device child nodes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
[ Upstream commit 6eefd65ba6ae29ab801f6461e59c10f93dd496f8 ]
The iterated nodes are direct children of the device node, and the device_for_each_child_node() macro accounts for child node availability.
fwnode_for_each_available_child_node() is meant to access the child nodes of an fwnode, and therefore not direct child nodes of the device node.
Use device_for_each_child_node() to indicate device's direct child nodes.
Stable-dep-of: 82c5ada1f9d0 ("leds: pca995x: Fix device child node usage in pca995x_probe()")
--- drivers/leds/leds-pca995x.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-)
drivers/leds/leds-pca995x.c +5 -10
@@ -102,7 +102,7 @@ static const struct regmap_config pca995x_regmap = {static int pca995x_probe (struct i2c_client *client) {struct fwnode_handle *led_fwnodes[PCA995X_MAX_OUTPUTS ] = {0 }; -struct fwnode_handle *np, *child; +struct fwnode_handle *child;struct device *dev = &client->dev;struct pca995x_chip *chip;struct pca995x_led *led;
@@ -110,8 +110,7 @@ static int pca995x_probe(struct i2c_client *client) btype = (unsigned long )device_get_match_data (&client->dev); - np =dev_fwnode (dev); -if (!np) +if (!dev_fwnode (dev))return -ENODEV ; chip =devm_kzalloc (dev,sizeof (*chip),GFP_KERNEL );
@@ -125,17 +124,13 @@ static int pca995x_probe(struct i2c_client *client)i2c_set_clientdata (client, chip); -fwnode_for_each_available_child_node (np, child) { +device_for_each_child_node (dev, child) { ret =fwnode_property_read_u32 (child,"reg" , ®); -if (ret) { -fwnode_handle_put (child); +if (ret)return ret; - } -if (reg <0 || reg >=PCA995X_MAX_OUTPUTS || led_fwnodes[reg]) { -fwnode_handle_put (child); +if (reg <0 || reg >=PCA995X_MAX_OUTPUTS || led_fwnodes[reg])return -EINVAL ; - } led = &chip->leds[reg]; led_fwnodes[reg] = child;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 375/695 leds: pca995x: Fix device child node usage in pca995x_probe()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Javier Carrasco <[email protected]>
[ Upstream commit 82c5ada1f9d05902a4ccb926c7ce34e2fe699283 ]
The current implementation accesses the child fwnode handle outside of device_for_each_child_node() without incrementing its refcount.
Add the missing call to fwnode_handle_get(child).
The cleanup process where child is accessed is not right either because a single call to fwnode_handle_put() is carried out in case of an error, ignoring unasigned nodes at the point when the error happens.
Keep child inside of the first loop, and use the helper pointer that receives references via fwnode_handle_get() to handle the child nodes within the second loop. Keeping child inside the first node has also the advantage that the scoped version of the loop can be used.
--- drivers/leds/leds-pca995x.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/leds/leds-pca995x.c +5 -5
@@ -102,11 +102,10 @@ static const struct regmap_config pca995x_regmap = {static int pca995x_probe (struct i2c_client *client) {struct fwnode_handle *led_fwnodes[PCA995X_MAX_OUTPUTS ] = {0 }; -struct fwnode_handle *child;struct device *dev = &client->dev;struct pca995x_chip *chip;struct pca995x_led *led; -int i, btype, reg, ret; +int i, j, btype, reg, ret; btype = (unsigned long )device_get_match_data (&client->dev);
@@ -124,7 +123,7 @@ static int pca995x_probe(struct i2c_client *client)i2c_set_clientdata (client, chip); -device_for_each_child_node (dev, child) { +device_for_each_child_node_scoped (dev, child) { ret =fwnode_property_read_u32 (child,"reg" , ®);if (ret)return ret;
@@ -133,7 +132,7 @@ static int pca995x_probe(struct i2c_client *client)return -EINVAL ; led = &chip->leds[reg]; - led_fwnodes[reg] = child; + led_fwnodes[reg] =fwnode_handle_get (child); led->chip = chip; led->led_no = reg; led->ldev.brightness_set_blocking = pca995x_brightness_set;
@@ -152,7 +151,8 @@ static int pca995x_probe(struct i2c_client *client) &chip->leds[i].ldev, &init_data);if (ret <0 ) { -fwnode_handle_put (child); +for (j = i; j <PCA995X_MAX_OUTPUTS ; j++) +fwnode_handle_put (led_fwnodes[j]);return dev_err_probe (dev, ret,"Could not register LED %s\n" , chip->leds[i].ldev.name);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 376/695 x86/PCI: Check pcie_find_root_port() return for NULL
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Samasth Norway Ananda <[email protected]>
[ Upstream commit dbc3171194403d0d40e4bdeae666f6e76e428b53 ]
If pcie_find_root_port() is unable to locate a Root Port, it will return NULL. Check the pointer for NULL before dereferencing it.
This particular case is in a quirk for devices that are always below a Root Port, so this won't avoid a problem and doesn't need to be backported, but check as a matter of style and to prevent copy/paste mistakes.
--- arch/x86/pci/fixup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/pci/fixup.c +2 -2
@@ -980,7 +980,7 @@ static void amd_rp_pme_suspend(struct pci_dev *dev)return ; rp =pcie_find_root_port (dev); -if (!rp->pm_cap) +if (!rp || !rp->pm_cap)return ; rp->pme_support &= ~((PCI_PM_CAP_PME_D3hot|PCI_PM_CAP_PME_D3cold) >>
@@ -994,7 +994,7 @@ static void amd_rp_pme_resume(struct pci_dev *dev)u16 pmc; rp =pcie_find_root_port (dev); -if (!rp->pm_cap) +if (!rp || !rp->pm_cap)return ;pci_read_config_word (rp, rp->pm_cap +PCI_PM_PMC , &pmc);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 377/695 nvdimm: Fix devs leaks in scan_labels()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Zhijian <[email protected]>
[ Upstream commit 62c2aa6b1f565d2fc1ec11a6e9e8336ce37a6426 ]
scan_labels() leaks memory when label scanning fails and it falls back to just creating a default "seed" namespace for userspace to configure. Root can force the kernel to leak memory.
Allocate the minimum resources unconditionally and release them when unneeded to avoid the memory leak.
A kmemleak reports:
unreferenced object 0xffff88800dda1980 (size 16):
comm "kworker/u10:5", pid 69, jiffies 4294671781 hex dump (first 16 bytes):
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace (crc 0):
[<00000000c5dea560>] __kmalloc+0x32c/0x470
[<000000009ed43c83>] nd_region_register_namespaces+0x6fb/0x1120 [libnvdimm]
[<000000000e07a65c>] nd_region_probe+0xfe/0x210 [libnvdimm]
[<000000007b79ce5f>] nvdimm_bus_probe+0x7a/0x1e0 [libnvdimm]
[<00000000a5f3da2e>] really_probe+0xc6/0x390
[<00000000129e2a69>] __driver_probe_device+0x78/0x150
[<000000002dfed28b>] driver_probe_device+0x1e/0x90
[<00000000e7048de2>] __device_attach_driver+0x85/0x110
[<0000000032dca295>] bus_for_each_drv+0x85/0xe0
[<00000000391c5a7d>] __device_attach+0xbe/0x1e0
[<0000000026dabec0>] bus_probe_device+0x94/0xb0
[<00000000c590d936>] device_add+0x656/0x870
[<000000003d69bfaa>] nd_async_device_register+0xe/0x50 [libnvdimm]
[<000000003f4c52a4>] async_run_entry_fn+0x2e/0x110
[<00000000e201f4b0>] process_one_work+0x1ee/0x600
[<000000006d90d5a9>] worker_thread+0x183/0x350--- drivers/nvdimm/namespace_devs.c | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-)
drivers/nvdimm/namespace_devs.c +17 -17
@@ -1937,12 +1937,16 @@ static int cmp_dpa(const void *a, const void *b)static struct device **scan_labels (struct nd_region *nd_region) {int i, count =0 ; -struct device *dev, **devs =NULL ; +struct device *dev, **devs;struct nd_label_ent *label_ent, *e;struct nd_mapping *nd_mapping = &nd_region->mapping[0 ];struct nvdimm_drvdata *ndd =to_ndd (nd_mapping);resource_size_t map_end = nd_mapping->start + nd_mapping->size -1 ; + devs =kcalloc (2 ,sizeof (dev),GFP_KERNEL ); +if (!devs) +return NULL ; +/* "safe" because create_namespace_pmem() might list_move() label_ent */ list_for_each_entry_safe (label_ent, e, &nd_mapping->labels, list) {struct nd_namespace_label *nd_label = label_ent->label;
@@ -1961,12 +1965,14 @@ static struct device **scan_labels(struct nd_region *nd_region) goto err;if (i < count)continue ; - __devs =kcalloc (count +2 ,sizeof (dev),GFP_KERNEL ); -if (!__devs) - goto err; -memcpy (__devs, devs,sizeof (dev) * count); -kfree (devs); - devs = __devs; +if (count) { + __devs =kcalloc (count +2 ,sizeof (dev),GFP_KERNEL ); +if (!__devs) + goto err; +memcpy (__devs, devs,sizeof (dev) * count); +kfree (devs); + devs = __devs; + } dev =create_namespace_pmem (nd_region, nd_mapping, nd_label);if (IS_ERR (dev)) {
@@ -1993,11 +1999,6 @@ static struct device **scan_labels(struct nd_region *nd_region)/* Publish a zero-sized namespace for userspace to configure. */ nd_mapping_free_labels (nd_mapping); - - devs =kcalloc (2 ,sizeof (dev),GFP_KERNEL ); -if (!devs) - goto err; - nspm =kzalloc (sizeof (*nspm),GFP_KERNEL );if (!nspm) goto err;
@@ -2036,11 +2037,10 @@ static struct device **scan_labels(struct nd_region *nd_region)return devs; err: -if (devs) { -for (i =0 ; devs[i]; i++) -namespace_pmem_release (devs[i]); -kfree (devs); - } +for (i =0 ; devs[i]; i++) +namespace_pmem_release (devs[i]); +kfree (devs); +return NULL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 378/695 PCI: xilinx-nwl: Fix register misspelling
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Anderson <[email protected]>
[ Upstream commit a437027ae1730b8dc379c75fa0dd7d3036917400 ]
MSIC -> MISC
--- drivers/pci/controller/pcie-xilinx-nwl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/pci/controller/pcie-xilinx-nwl.c +6 -6
@@ -80,8 +80,8 @@#define MSGF_MISC_SR_NON_FATAL_DEV BIT(22)#define MSGF_MISC_SR_FATAL_DEV BIT(23)#define MSGF_MISC_SR_LINK_DOWN BIT(24) -#define MSGF_MSIC_SR_LINK_AUTO_BWIDTH BIT(25) -#define MSGF_MSIC_SR_LINK_BWIDTH BIT(26) +#define MSGF_MISC_SR_LINK_AUTO_BWIDTH BIT(25) +#define MSGF_MISC_SR_LINK_BWIDTH BIT(26)#define MSGF_MISC_SR_MASKALL (MSGF_MISC_SR_RXMSG_AVAIL | \ MSGF_MISC_SR_RXMSG_OVER | \
@@ -96,8 +96,8 @@ MSGF_MISC_SR_NON_FATAL_DEV | \ MSGF_MISC_SR_FATAL_DEV | \ MSGF_MISC_SR_LINK_DOWN | \ - MSGF_MSIC_SR_LINK_AUTO_BWIDTH | \ - MSGF_MSIC_SR_LINK_BWIDTH) + MSGF_MISC_SR_LINK_AUTO_BWIDTH | \ + MSGF_MISC_SR_LINK_BWIDTH)/* Legacy interrupt status mask bits */ #define MSGF_LEG_SR_INTA BIT(0)
@@ -299,10 +299,10 @@ static irqreturn_t nwl_pcie_misc_handler(int irq, void *data)if (misc_stat &MSGF_MISC_SR_FATAL_DEV )dev_err (dev,"Fatal Error Detected\n" ); -if (misc_stat &MSGF_MSIC_SR_LINK_AUTO_BWIDTH ) +if (misc_stat &MSGF_MISC_SR_LINK_AUTO_BWIDTH )dev_info (dev,"Link Autonomous Bandwidth Management Status bit set\n" ); -if (misc_stat &MSGF_MSIC_SR_LINK_BWIDTH ) +if (misc_stat &MSGF_MISC_SR_LINK_BWIDTH )dev_info (dev,"Link Bandwidth Management Status bit set\n" );/* Clear misc interrupt status */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 379/695 PCI: xilinx-nwl: Clean up clock on probe failure/removal
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sean Anderson <[email protected]>
[ Upstream commit cfd67903977b13f63340a4eb5a1cc890994f2c62 ]
Make sure we turn off the clock on probe failure and device removal.
--- drivers/pci/controller/pcie-xilinx-nwl.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/pci/controller/pcie-xilinx-nwl.c +19 -4
@@ -779,6 +779,7 @@ static int nwl_pcie_probe(struct platform_device *pdev)return -ENODEV ; pcie =pci_host_bridge_priv (bridge); +platform_set_drvdata (pdev, pcie); pcie->dev = dev;
@@ -801,13 +802,13 @@ static int nwl_pcie_probe(struct platform_device *pdev) err =nwl_pcie_bridge_init (pcie);if (err) {dev_err (dev,"HW Initialization failed\n" ); -return err; + goto err_clk; } err =nwl_pcie_init_irq_domain (pcie);if (err) {dev_err (dev,"Failed creating IRQ Domain\n" ); -return err; + goto err_clk; } bridge->sysdata = pcie;
@@ -817,11 +818,24 @@ static int nwl_pcie_probe(struct platform_device *pdev) err =nwl_pcie_enable_msi (pcie);if (err <0 ) {dev_err (dev,"failed to enable MSI support: %d\n" , err); -return err; + goto err_clk; } } -return pci_host_probe (bridge); + err =pci_host_probe (bridge); +if (!err) +return 0 ; + +err_clk: +clk_disable_unprepare (pcie->clk); +return err; +} + +static void nwl_pcie_remove (struct platform_device *pdev) +{ +struct nwl_pcie *pcie =platform_get_drvdata (pdev); + +clk_disable_unprepare (pcie->clk); }static struct platform_driver nwl_pcie_driver = {
@@ -831,5 +845,6 @@ static struct platform_driver nwl_pcie_driver = { .of_match_table = nwl_pcie_of_match, }, .probe = nwl_pcie_probe, + .remove_new = nwl_pcie_remove, };builtin_platform_driver (nwl_pcie_driver);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 380/695 leds: gpio: Set num_leds after allocation
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit 045391a02bd971d431c83ad03f7cc51b6e2fe331 ]
With the new __counted_by annotation, the "num_leds" variable needs to valid for accesses to the "leds" array. This requirement is not met in gpio_leds_create(), since "num_leds" starts at "0", so "leds" index "0" will not be considered valid (num_leds would need to be "1" to access index "0").
Fix this by setting the allocation size after allocation, and then update the final count based on how many were actually added to the array.
--- drivers/leds/leds-gpio.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/leds/leds-gpio.c +6 -3
@@ -150,7 +150,7 @@ static struct gpio_leds_priv *gpio_leds_create(struct device *dev) {struct fwnode_handle *child;struct gpio_leds_priv *priv; -int count, ret; +int count, used, ret; count =device_get_child_node_count (dev);if (!count)
@@ -159,9 +159,11 @@ static struct gpio_leds_priv *gpio_leds_create(struct device *dev) priv =devm_kzalloc (dev,struct_size (priv, leds, count),GFP_KERNEL );if (!priv)return ERR_PTR (-ENOMEM ); + priv->num_leds = count; + used =0 ;device_for_each_child_node (dev, child) { -struct gpio_led_data *led_dat = &priv->leds[priv->num_leds]; +struct gpio_led_data *led_dat = &priv->leds[used];struct gpio_led led = {};/*
@@ -197,8 +199,9 @@ static struct gpio_leds_priv *gpio_leds_create(struct device *dev)/* Set gpiod label to match the corresponding LED name. */ gpiod_set_consumer_name (led_dat->gpiod, led_dat->cdev.dev->kobj.name); - priv->num_leds++; + used++; } + priv->num_leds = used;return priv; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 381/695 media: platform: rzg2l-cru: rzg2l-csi2: Add missing MODULE_DEVICE_TABLE
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit 07668fb0f867388bfdac0b60dbf51a4ad789f8e7 ]
The rzg2l-csi2 driver can be compiled as a module, but lacks MODULE_DEVICE_TABLE() and will therefore not be loaded automatically. Fix this.
--- drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/renesas/rzg2l-cru/rzg2l-csi2.c +1 -0
@@ -865,6 +865,7 @@ static const struct of_device_id rzg2l_csi2_of_table[] = { { .compatible = "renesas,rzg2l-csi2", }, {/* sentinel */ } }; +MODULE_DEVICE_TABLE (of, rzg2l_csi2_of_table);static struct platform_driver rzg2l_csi2_pdrv = { .remove_new = rzg2l_csi2_remove,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 382/695 RDMA/iwcm: Fix WARNING:at_kernel/workqueue.c:#check_flush_dependency
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhu Yanjun <[email protected]>
[ Upstream commit 86dfdd8288907f03c18b7fb462e0e232c4f98d89 ]
In the commit aee2424246f9 ("RDMA/iwcm: Fix a use-after-free related to destroying CM IDs"), the function flush_workqueue is invoked to flush the work queue iwcm_wq.
But at that time, the work queue iwcm_wq was created via the function alloc_ordered_workqueue without the flag WQ_MEM_RECLAIM.
Because the current process is trying to flush the whole iwcm_wq, if iwcm_wq doesn't have the flag WQ_MEM_RECLAIM, verify that the current process is not reclaiming memory or running on a workqueue which doesn't have the flag WQ_MEM_RECLAIM as that can break forward-progress guarantee leading to a deadlock.
The call trace is as below:
[ 125.350876][ T1430] Call Trace: [ 125.356281][ T1430] <TASK> [ 125.361285][ T1430] ? __warn (kernel/panic.c:693) [ 125.367640][ T1430] ? check_flush_dependency (kernel/workqueue.c:3706 (discriminator 9)) [ 125.375689][ T1430] ? report_bug (lib/bug.c:180 lib/bug.c:219) [ 125.382505][ T1430] ? handle_bug (arch/x86/kernel/traps.c:239) [ 125.388987][ T1430] ? exc_invalid_op (arch/x86/kernel/traps.c:260 (discriminator 1)) [ 125.395831][ T1430] ? asm_exc_invalid_op (arch/x86/include/asm/idtentry.h:621) [ 125.403125][ T1430] ? check_flush_dependency (kernel/workqueue.c:3706 (discriminator 9)) [ 125.410984][ T1430] ? check_flush_dependency (kernel/workqueue.c:3706 (discriminator 9)) [ 125.418764][ T1430] __flush_workqueue (kernel/workqueue.c:3970) [ 125.426021][ T1430] ? __pfx___might_resched (kernel/sched/core.c:10151) [ 125.433431][ T1430] ? destroy_cm_id (drivers/infiniband/core/iwcm.c:375) iw_cm [ 125.441209][ T1430] ? __pfx___flush_workqueue (kernel/workqueue.c:3910) [ 125.473900][ T1430] ? _raw_spin_lock_irqsave (arch/x86/include/asm/atomic.h:107 include/linux/atomic/atomic-arch-fallback.h:2170 include/linux/atomic/atomic-instrumented.h:1302 include/asm-generic/qspinlock.h:111 include/linux/spinlock.h:187 include/linux/spinlock_api_smp.h:111 kernel/locking/spinlock.c:162) [ 125.473909][ T1430] ? __pfx__raw_spin_lock_irqsave (kernel/locking/spinlock.c:161) [ 125.482537][ T1430] _destroy_id (drivers/infiniband/core/cma.c:2044) rdma_cm [ 125.495072][ T1430] nvme_rdma_free_queue (drivers/nvme/host/rdma.c:656 drivers/nvme/host/rdma.c:650) nvme_rdma [ 125.505827][ T1430] nvme_rdma_reset_ctrl_work (drivers/nvme/host/rdma.c:2180) nvme_rdma [ 125.505831][ T1430] process_one_work (kernel/workqueue.c:3231) [ 125.515122][ T1430] worker_thread (kernel/workqueue.c:3306 kernel/workqueue.c:3393) [ 125.515127][ T1430] ? __pfx_worker_thread (kernel/workqueue.c:3339) [ 125.531837][ T1430] kthread (kernel/kthread.c:389) [ 125.539864][ T1430] ? __pfx_kthread (kernel/kthread.c:342) [ 125.550628][ T1430] ret_from_fork (arch/x86/kernel/process.c:147) [ 125.558840][ T1430] ? __pfx_kthread (kernel/kthread.c:342) [ 125.558844][ T1430] ret_from_fork_asm (arch/x86/entry/entry_64.S:257) [ 125.566487][ T1430] </TASK> [ 125.566488][ T1430] ---[ end trace 0000000000000000 ]---
--- drivers/infiniband/core/iwcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/iwcm.c +1 -1
@@ -1182,7 +1182,7 @@ static int __init iw_cm_init(void)if (ret)return ret; - iwcm_wq =alloc_ordered_workqueue ("iw_cm_wq" ,0 ); + iwcm_wq =alloc_ordered_workqueue ("iw_cm_wq" ,WQ_MEM_RECLAIM );if (!iwcm_wq) goto err_alloc;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 383/695 pinctrl: single: fix missing error code in pcs_probe()
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Yingliang <[email protected]>
[ Upstream commit cacd8cf79d7823b07619865e994a7916fcc8ae91 ]
If pinctrl_enable() fails in pcs_probe(), it should return the error code.
--- drivers/pinctrl/pinctrl-single.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pinctrl/pinctrl-single.c +2 -1
@@ -1913,7 +1913,8 @@ static int pcs_probe(struct platform_device *pdev)dev_info (pcs->dev,"%i pins, size %u\n" , pcs->desc.npins, pcs->size); -if (pinctrl_enable (pcs->pctl)) + ret =pinctrl_enable (pcs->pctl); +if (ret) goto free;return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 384/695 clk: at91: sama7g5: Allocate only the needed amount of memory for PLLs
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit 2d6e9ee7cb3e79b1713783c633b13af9aeffc90c ]
The maximum number of PLL components on SAMA7G5 is 3 (one fractional part and 2 dividers). Allocate the needed amount of memory for sama7g5_plls 2d array. Previous code used to allocate 7 array entries for each PLL. While at it, replace 3 with PLL_COMPID_MAX in the loop which parses the sama7g5_plls 2d array.
--- drivers/clk/at91/sama7g5.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/clk/at91/sama7g5.c +3 -2
@@ -66,6 +66,7 @@ enum pll_component_id {PLL_COMPID_FRAC ,PLL_COMPID_DIV0 ,PLL_COMPID_DIV1 , + PLL_COMPID_MAX, };/*
@@ -165,7 +166,7 @@ static struct sama7g5_pll {u8 t;u8 eid;u8 safe_div; -} sama7g5_plls[][PLL_ID_MAX] = { +} sama7g5_plls[][PLL_COMPID_MAX] = { [PLL_ID_CPU] = { [PLL_COMPID_FRAC] = { .n = "cpupll_fracck",
@@ -1038,7 +1039,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np) sama7g5_pmc->chws[PMC_MAIN ] = hw;for (i =0 ; i <PLL_ID_MAX ; i++) { -for (j =0 ; j <3 ; j++) { +for (j =0 ; j <PLL_COMPID_MAX ; j++) {struct clk_hw *parent_hw;if (!sama7g5_plls[i][j].n)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 385/695 iommufd/selftest: Fix buffer read overrrun in the dirty test
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
[ Upstream commit 79ea4a496ab5c970a3a793d863ed8893b1af107c ]
test_bit() is used to read the memory storing the bitmap, however test_bit() always uses a unsigned long 8 byte access.
If the bitmap is not an aligned size of 64 bits this will now trigger a KASAN warning reading past the end of the buffer.
Properly round the buffer allocation to an unsigned long size. Continue to copy_from_user() using a byte granularity.
--- drivers/iommu/iommufd/selftest.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/iommu/iommufd/selftest.c +4 -5
@@ -1342,7 +1342,7 @@ static int iommufd_test_dirty(struct iommufd_ucmd *ucmd, unsigned int mockpt_id, unsigned long page_size, void __user *uptr, u32 flags) { - unsigned long bitmap_size, i, max; + unsigned long i, max;struct iommu_test_cmd *cmd = ucmd->cmd;struct iommufd_hw_pagetable *hwpt;struct mock_iommu_domain *mock;
@@ -1363,15 +1363,14 @@ static int iommufd_test_dirty(struct iommufd_ucmd *ucmd, unsigned int mockpt_id, } max = length / page_size; - bitmap_size =DIV_ROUND_UP (max,BITS_PER_BYTE ); - - tmp =kvzalloc (bitmap_size,GFP_KERNEL_ACCOUNT ); + tmp =kvzalloc (DIV_ROUND_UP (max,BITS_PER_LONG ) *sizeof (unsigned long ), +GFP_KERNEL_ACCOUNT );if (!tmp) { rc = -ENOMEM ; goto out_put; } -if (copy_from_user (tmp, uptr, bitmap_size)) { +if (copy_from_user (tmp, uptr,DIV_ROUND_UP (max,BITS_PER_BYTE ))) { rc = -EFAULT ; goto out_free; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 386/695 RDMA/bnxt_re: Fix the table size for PSN/MSN entries
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Selvin Xavier <[email protected]>
[ Upstream commit b930d0bac9c671c053dd66229010ca9298e84aab ]
HW MSN table size is always a power of 2. So the pages should be mapped accordingly.
Use the power of two calculation while get the number of PSN/MSN entries.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +2 -0
@@ -1042,6 +1042,8 @@ static int bnxt_re_init_user_qp(struct bnxt_re_dev *rdev, struct bnxt_re_pd *pd, qplib_qp->sq.max_wqe : ((qplib_qp->sq.max_wqe * qplib_qp->sq.wqe_size) /sizeof (struct bnxt_qplib_sge )); +if (_is_host_msn_table (rdev->qplib_res.dattr->dev_cap_flags2)) + psn_nume =roundup_pow_of_two (psn_nume); bytes += (psn_nume * psn_sz); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 387/695 media: mediatek: vcodec: Fix H264 multi stateless decoder smatch warning
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunfei Dong <[email protected]>
[ Upstream commit 9be85491619f1953b8a29590ca630be571941ffa ]
Fix a smatch static checker warning on vdec_h264_req_multi_if.c. Which leads to a kernel crash when fb is NULL.
--- .../vcodec/decoder/vdec/vdec_h264_req_multi_if.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c +7 -2
@@ -724,11 +724,16 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bsreturn vpu_dec_reset (vpu); fb = inst->ctx->dev->vdec_pdata->get_cap_buffer (inst->ctx); +if (!fb) { +mtk_vdec_err (inst->ctx,"fb buffer is NULL" ); +return -ENOMEM ; + } + src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer); dst_buf_info = container_of(fb, struct mtk_video_dec_buf, frame_buffer); - y_fb_dma = fb ? (u64 )fb->base_y.dma_addr :0 ; - c_fb_dma = fb ? (u64 )fb->base_c.dma_addr :0 ; + y_fb_dma = fb->base_y.dma_addr; + c_fb_dma = fb->base_c.dma_addr;mtk_vdec_debug (inst->ctx,"[h264-dec] [%d] y_dma=%llx c_dma=%llx" , inst->ctx->decoded_frame_cnt, y_fb_dma, c_fb_dma);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 388/695 media: mediatek: vcodec: Fix VP8 stateless decoder smatch warning
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunfei Dong <[email protected]>
[ Upstream commit b113bc7c0e83b32f4dd2d291a2b6c4803e0a2c44 ]
Fix a smatch static checker warning on vdec_vp8_req_if.c. Which leads to a kernel crash when fb is NULL.
--- .../mediatek/vcodec/decoder/vdec/vdec_vp8_req_if.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp8_req_if.c +7 -3
@@ -334,14 +334,18 @@ static int vdec_vp8_slice_decode(void *h_vdec, struct mtk_vcodec_mem *bs, src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer); fb = inst->ctx->dev->vdec_pdata->get_cap_buffer (inst->ctx); - dst_buf_info = container_of(fb, struct mtk_video_dec_buf, frame_buffer); +if (!fb) { +mtk_vdec_err (inst->ctx,"fb buffer is NULL" ); +return -ENOMEM ; + } - y_fb_dma = fb ? (u64 )fb->base_y.dma_addr :0 ; + dst_buf_info = container_of(fb, struct mtk_video_dec_buf, frame_buffer); + y_fb_dma = fb->base_y.dma_addr;if (inst->ctx->q_data[MTK_Q_DATA_DST ].fmt->num_planes ==1 ) c_fb_dma = y_fb_dma + inst->ctx->picinfo.buf_w * inst->ctx->picinfo.buf_h;else - c_fb_dma = fb ? (u64 )fb->base_c.dma_addr :0 ; + c_fb_dma = fb->base_c.dma_addr; inst->vsi->dec.bs_dma = (u64 )bs->dma_addr; inst->vsi->dec.bs_sz = bs->size;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 389/695 media: mediatek: vcodec: Fix H264 stateless decoder smatch warning
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yunfei Dong <[email protected]>
[ Upstream commit 7878d3a385efab560dce793b595447867fb163f2 ]
Fix a smatch static checker warning on vdec_h264_req_if.c. Which leads to a kernel crash when fb is NULL.
--- .../mediatek/vcodec/decoder/vdec/vdec_h264_req_if.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_if.c +7 -2
@@ -347,11 +347,16 @@ static int vdec_h264_slice_decode(void *h_vdec, struct mtk_vcodec_mem *bs,return vpu_dec_reset (vpu); fb = inst->ctx->dev->vdec_pdata->get_cap_buffer (inst->ctx); +if (!fb) { +mtk_vdec_err (inst->ctx,"fb buffer is NULL" ); +return -ENOMEM ; + } + src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer); dst_buf_info = container_of(fb, struct mtk_video_dec_buf, frame_buffer); - y_fb_dma = fb ? (u64 )fb->base_y.dma_addr :0 ; - c_fb_dma = fb ? (u64 )fb->base_c.dma_addr :0 ; + y_fb_dma = fb->base_y.dma_addr; + c_fb_dma = fb->base_c.dma_addr;mtk_vdec_debug (inst->ctx,"+ [%d] FB y_dma=%llx c_dma=%llx va=%p" , inst->num_nalu, y_fb_dma, c_fb_dma, fb);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 390/695 media: imagination: VIDEO_E5010_JPEG_ENC should depend on ARCH_K3
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit afe6ec667e8846c8470d32789cebbc435588972d ]
Currently, the Imagination E5010 JPEG Encoder is only present on Texas Instruments K3 SoCs. Hence add a dependency on ARCH_K3, to prevent asking the user about this driver when configuring a kernel without TI K3 SoC support. The dependency can be relaxed if/when the encoder appears on other SoC families.
--- drivers/media/platform/imagination/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/media/platform/imagination/Kconfig +1 -0
@@ -2,6 +2,7 @@ config VIDEO_E5010_JPEG_ENC tristate "Imagination E5010 JPEG Encoder Driver" depends on VIDEO_DEV + depends on ARCH_K3 || COMPILE_TEST select VIDEOBUF2_DMA_CONTIG select VIDEOBUF2_VMALLOC select V4L2_MEM2MEM_DEV
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 391/695 RDMA/rtrs: Reset hb_missed_cnt after receiving other traffic from peer
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Wang <[email protected]>
[ Upstream commit 3258cbbd86deaa2675e1799bc3d18bd1ef472641 ]
Reset hb_missed_cnt after receiving traffic from other peer, so hb is more robust again high load on host or network.
--- drivers/infiniband/ulp/rtrs/rtrs-clt.c | 3 ++- drivers/infiniband/ulp/rtrs/rtrs-srv.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/ulp/rtrs/rtrs-clt.c +2 -1
@@ -626,6 +626,7 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)*/ if (WARN_ON (wc->wr_cqe->done != rtrs_clt_rdma_done))return ; + clt_path->s.hb_missed_cnt =0 ;rtrs_from_imm (be32_to_cpu (wc->ex.imm_data), &imm_type, &imm_payload); if (imm_type == RTRS_IO_RSP_IMM ||
@@ -643,7 +644,6 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)return rtrs_clt_recv_done (con, wc); }else if (imm_type ==RTRS_HB_ACK_IMM ) {WARN_ON (con->c.cid); - clt_path->s.hb_missed_cnt =0 ; clt_path->s.hb_cur_latency =ktime_sub (ktime_get (), clt_path->s.hb_last_sent);if (clt_path->flags &RTRS_MSG_NEW_RKEY_F )
@@ -670,6 +670,7 @@ static void rtrs_clt_rdma_done(struct ib_cq *cq, struct ib_wc *wc)/* * Key invalidations from server side */ + clt_path->s.hb_missed_cnt =0 ;WARN_ON (!(wc->wc_flags &IB_WC_WITH_INVALIDATE || wc->wc_flags &IB_WC_WITH_IMM ));WARN_ON (wc->wr_cqe->done != rtrs_clt_rdma_done);
drivers/infiniband/ulp/rtrs/rtrs-srv.c +1 -0
@@ -1229,6 +1229,7 @@ static void rtrs_srv_rdma_done(struct ib_cq *cq, struct ib_wc *wc)*/ if (WARN_ON (wc->wr_cqe != &io_comp_cqe))return ; + srv_path->s.hb_missed_cnt =0 ; err =rtrs_post_recv_empty (&con->c, &io_comp_cqe);if (err) {rtrs_err (s,"rtrs_post_recv(), err: %d\n" , err);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 392/695 RDMA/rtrs-clt: Reset cid to con_num - 1 to stay in bounds
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Md Haris Iqbal <[email protected]>
[ Upstream commit 3e4289b29e216a55d08a89e126bc0b37cbad9f38 ]
In the function init_conns(), after the create_con() and create_cm() for loop if something fails. In the cleanup for loop after the destroy tag, we access out of bound memory because cid is set to clt_path->s.con_num.
This commits resets the cid to clt_path->s.con_num - 1, to stay in bounds in the cleanup loop later.
--- drivers/infiniband/ulp/rtrs/rtrs-clt.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/infiniband/ulp/rtrs/rtrs-clt.c +6 -0
@@ -2347,6 +2347,12 @@ static int init_conns(struct rtrs_clt_path *clt_path)if (err) goto destroy; } + +/* +* Set the cid to con_num - 1, since if we fail later, we want to stay in bounds. +*/ + cid = clt_path->s.con_num -1 ; + err =alloc_path_reqs (clt_path);if (err) goto destroy;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 393/695 clk: ti: dra7-atl: Fix leak of of_nodes
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Lechner <[email protected]>
[ Upstream commit 9d6e9f10e2e031fb7bfb3030a7d1afc561a28fea ]
This fix leaking the of_node references in of_dra7_atl_clk_probe().
The docs for of_parse_phandle_with_args() say that the caller must call of_node_put() on the returned node. This adds the missing of_node_put() to fix the leak.
--- drivers/clk/ti/clk-dra7-atl.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/ti/clk-dra7-atl.c +1 -0
@@ -240,6 +240,7 @@ static int of_dra7_atl_clk_probe(struct platform_device *pdev) } clk =of_clk_get_from_provider (&clkspec); +of_node_put (clkspec.np);if (IS_ERR (clk)) {pr_err ("%s: failed to get atl clock %d from provider\n" , __func__, i);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 394/695 clk: starfive: Use pm_runtime_resume_and_get to fix pm_runtime_get_sync() usage
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuntao Liu <[email protected]>
[ Upstream commit 55c312c1b2be6d43e39c280ad6ab4b711e545b89 ]
We need to call pm_runtime_put_noidle() when pm_runtime_get_sync() fails, so use pm_runtime_resume_and_get() instead. this function will handle this.
--- drivers/clk/starfive/clk-starfive-jh7110-vout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/starfive/clk-starfive-jh7110-vout.c +1 -1
@@ -145,7 +145,7 @@ static int jh7110_voutcrg_probe(struct platform_device *pdev)/* enable power domain and clocks */ pm_runtime_enable (priv->dev); - ret =pm_runtime_get_sync (priv->dev); + ret =pm_runtime_resume_and_get (priv->dev);if (ret <0 )return dev_err_probe (priv->dev, ret,"failed to turn on power\n" );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 395/695 clk: rockchip: rk3588: Fix 32k clock name for pmu_24m_32k_100m_src_p
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Shiyan <[email protected]>
[ Upstream commit 0d02e8d284a45bfa8997ebe8764437b8eb6b108b ]
The 32kHz input clock is named "xin32k" in the driver, so the name "32k" appears to be a typo in this case. Lets fix this.
--- drivers/clk/rockchip/clk-rk3588.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/rockchip/clk-rk3588.c +1 -1
@@ -526,7 +526,7 @@ PNAME(pmu_200m_100m_p) = { "clk_pmu1_200m_src", "clk_pmu1_100m_src" };PNAME (pmu_300m_24m_p) = {"clk_300m_src" ,"xin24m" };PNAME (pmu_400m_24m_p) = {"clk_400m_src" ,"xin24m" };PNAME (pmu_100m_50m_24m_src_p) = {"clk_pmu1_100m_src" ,"clk_pmu1_50m_src" ,"xin24m" }; -PNAME (pmu_24m_32k_100m_src_p) = {"xin24m" ,"32k" ,"clk_pmu1_100m_src" }; +PNAME (pmu_24m_32k_100m_src_p) = {"xin24m" ,"xin32k" ,"clk_pmu1_100m_src" };PNAME (hclk_pmu1_root_p) = {"clk_pmu1_200m_src" ,"clk_pmu1_100m_src" ,"clk_pmu1_50m_src" ,"xin24m" };PNAME (hclk_pmu_cm0_root_p) = {"clk_pmu1_400m_src" ,"clk_pmu1_200m_src" ,"clk_pmu1_100m_src" ,"xin24m" };PNAME (mclk_pdm0_p) = {"clk_pmu1_300m_src" ,"clk_pmu1_200m_src" };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 396/695 nfsd: remove unneeded EEXIST error check in nfsd_do_file_acquire
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit 81a95c2b1d605743220f28db04b8da13a65c4059 ]
Given that we do the search and insertion while holding the i_lock, I don't think it's possible for us to get EEXIST here. Remove this case.
--- fs/nfsd/filecache.c | 2 -- 1 file changed, 2 deletions(-)
fs/nfsd/filecache.c +0 -2
@@ -1035,8 +1035,6 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp,if (likely (ret ==0 )) goto open_file; -if (ret == -EEXIST ) - goto retry;trace_nfsd_file_insert_err (rqstp, inode, may_flags, ret); status = nfserr_jukebox; goto construction_err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 397/695 nfsd: fix refcount leak when file is unhashed after being found
In reply to Greg Kroah-Hartman6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit 8a7926176378460e0d91e02b03f0ff20a8709a60 ]
If we wait_for_construction and find that the file is no longer hashed, and we're going to retry the open, the old nfsd_file reference is currently leaked. Put the reference before retrying.
--- fs/nfsd/filecache.c | 1 + 1 file changed, 1 insertion(+)
fs/nfsd/filecache.c +1 -0
@@ -1049,6 +1049,7 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp, status = nfserr_jukebox; goto construction_err; } +nfsd_file_put (nf); open_retry = false;fh_put (fhp); goto retry;
Signature · 1 line
2.43.0
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
My understanding is that the following 4 commits together fix the leaking issue:
nfsd: add list_head nf_gc to struct nfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6
nfsd: fix refcount leak when file is unhashed after being found
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a7926176378460e0d91e02b03f0ff20a8709a60
nfsd: remove unneeded EEXIST error check in nfsd_do_file_acquire
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=81a95c2b1d605743220f28db04b8da13a65c4059
nfsd: count nfsd_file allocations
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=700bb4ff912f954345286e065ff145753a1d5bbe
The first two are essential but it's better to have the last two commits too.
Quoted 39 lines · Greg Kroah-Hartman
6.11-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
[ Upstream commit
8a7926176378460e0d91e02b03f0ff20a8709a60]If we
wait_for_constructionand find that the file is no longer hashed, and we're going to retry the open, the oldnfsd_filereference is currently leaked. Put the reference before retrying.Fixes c6593366c0bf ("nfsd: don't kill nfsd_files because of lease break error")Signed-off-by Jeff Layton <[email protected]>Tested-by Youzhong Yang <[email protected]>Signed-off-by Chuck Lever <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/nfsd/filecache.c | 1 + 1 file changed, 1 insertion(+)fs/nfsd/filecache.c +1
-1@@ -1049,6 +1049,7 @@ nfsd_file_do_acquire(struct svc_rqst *rqstp, struct svc_fh *fhp, status = nfserr_jukebox; goto construction_err; } +nfsd_file_put (nf); open_retry = false;fh_put (fhp); goto retry; --2.43.0
Greg Kroah-Hartman
maintainerRe: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Quoted 8 lines · Youzhong Yang
My understanding is that the following 4 commits together fix the leaking issue:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6nfsd: fix refcount leak when file is unhashed after being found
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a7926176378460e0d91e02b03f0ff20a8709a60
Quoted 7 lines
nfsd: remove unneeded EEXIST error check in
nfsd_do_file_acquire
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=81a95c2b1d605743220f28db04b8da13a65c4059nfsd: count
nfsd_fileallocations
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=700bb4ff912f954345286e065ff145753a1d5bbeThe first two are essential but it's better to have the last two commits too.
So right now only the 2nd and 3rd are in the tree, do we really need the others as well? And if so, why were none of these marked for a stable inclusion?
Can they wait for the next round of releases?
thanks,
greg k-h
Re: [PATCH 6.11 397/695] nfsd: fix refcount leak when file is unhashed after being found
Quoted 16 lines · Greg Kroah-Hartman
Quoted 11 lines · Youzhong Yang
My understanding is that the following 4 commits together fix the leaking issue:
nfsd: add
list_headnf_gcto structnfsd_file
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8e6e2ffa6569a205f1805cbaeca143b556581da6nfsd: fix refcount leak when file is unhashed after being found
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a7926176378460e0d91e02b03f0ff20a8709a60nfsd: remove unneeded EEXIST error check in
nfsd_do_file_acquire
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=81a95c2b1d605743220f28db04b8da13a65c4059
Quoted 8 lines
Quoted 4 lines
nfsd: count
nfsd_fileallocations
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=700bb4ff912f954345286e065ff145753a1d5bbeThe first two are essential but it's better to have the last two commits too.
So right now only the 2nd and 3rd are in the tree, do we really need the others as well? And if so, why were none of these marked for a stable inclusion?
IMO 1/4 and 4/4 are not needed in stable, and that's why we marked them that way.
--
Chuck Lever