6.12.91-rc1 review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 353/666 libbpf: Change log level of BTF loading error message
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ihor Solodrai <[email protected]>
[ Upstream commit 8b334d91834666dbc4c1c0b0abed3f855ed16cf3 ]
Reduce log level of BTF loading error to INFO if BTF is not required.
Andrii says:
Nowadays the expectation is that the BPF program will have a valid .BTF section, so even though .BTF is "optional", I think it's fine to emit a warning for that case (any reasonably recent Clang will produce valid BTF).
Ihor's patch is fixing the situation with an outdated host kernel that doesn't understand BTF. libbpf will try to "upload" the program's BTF, but if that fails and the BPF object doesn't use any features that require having BTF uploaded, then it's just an information message to the user, but otherwise can be ignored.
Stable-dep-of: 380044c40b16 ("libbpf: Prevent double close and leak of btf objects")
--- tools/lib/bpf/libbpf.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
tools/lib/bpf/libbpf.c +5 -4
@@ -3582,11 +3582,12 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj) report:if (err) { btf_mandatory =kernel_needs_btf (obj); -pr_warn ("Error loading .BTF into kernel: %d. %s\n" , err, - btf_mandatory ?"BTF is mandatory, can't proceed." - :"BTF is optional, ignoring." ); -if (!btf_mandatory) +if (btf_mandatory) { +pr_warn ("Error loading .BTF into kernel: %d. BTF is mandatory, can't proceed.\n" , err); + }else { +pr_info ("Error loading .BTF into kernel: %d. BTF is optional, ignoring.\n" , err); err =0 ; + } }return err; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 354/666 libbpf: Stringify errno in log messages in libbpf.c
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mykyta Yatsenko <[email protected]>
[ Upstream commit 271abf041cb354ce99df33ce1f99db79faf90477 ]
Convert numeric error codes into the string representations in log messages in libbpf.c.
Stable-dep-of: 380044c40b16 ("libbpf: Prevent double close and leak of btf objects")
--- tools/lib/bpf/libbpf.c | 356 ++++++++++++++++++----------------------- 1 file changed, 156 insertions(+), 200 deletions(-)
tools/lib/bpf/libbpf.c +156 -200
@@ -1534,11 +1534,8 @@ static int bpf_object__elf_init(struct bpf_object *obj) }else { obj->efile.fd =open (obj->path,O_RDONLY |O_CLOEXEC );if (obj->efile.fd <0 ) { -char errmsg[STRERR_BUFSIZE ], *cp; - err = -errno; - cp =libbpf_strerror_r (err, errmsg,sizeof (errmsg)); -pr_warn ("elf: failed to open %s: %s\n" , obj->path, cp); +pr_warn ("elf: failed to open %s: %s\n" , obj->path,errstr (err));return err; }
@@ -1938,8 +1935,7 @@ bpf_object__init_internal_map(struct bpf_object *obj, enum libbpf_map_type type,if (map->mmaped ==MAP_FAILED ) { err = -errno; map->mmaped =NULL ; -pr_warn ("failed to alloc map '%s' content buffer: %d\n" , - map->name, err); +pr_warn ("failed to alloc map '%s' content buffer: %s\n" , map->name,errstr (err));zfree (&map->real_name);zfree (&map->name);return err;
@@ -2103,7 +2099,7 @@ static int parse_u64(const char *value, __u64 *res) *res =strtoull (value, &value_end,0 );if (errno) { err = -errno; -pr_warn ("failed to parse '%s' as integer: %d\n" , value, err); +pr_warn ("failed to parse '%s': %s\n" , value,errstr (err));return err; }if (*value_end) {
@@ -2269,8 +2265,8 @@ static int bpf_object__read_kconfig_file(struct bpf_object *obj, void *data)while (gzgets (file, buf,sizeof (buf))) { err =bpf_object__process_kconfig_line (obj, buf, data);if (err) { -pr_warn ("error parsing system Kconfig line '%s': %d\n" , - buf, err); +pr_warn ("error parsing system Kconfig line '%s': %s\n" , + buf,errstr (err)); goto out; } }
@@ -2290,15 +2286,15 @@ static int bpf_object__read_kconfig_mem(struct bpf_object *obj, file =fmemopen ((void *)config,strlen (config),"r" );if (!file) { err = -errno; -pr_warn ("failed to open in-memory Kconfig: %d\n" , err); +pr_warn ("failed to open in-memory Kconfig: %s\n" ,errstr (err));return err; }while (fgets (buf,sizeof (buf), file)) { err =bpf_object__process_kconfig_line (obj, buf, data);if (err) { -pr_warn ("error parsing in-memory Kconfig line '%s': %d\n" , - buf, err); +pr_warn ("error parsing in-memory Kconfig line '%s': %s\n" , + buf,errstr (err));break ; } }
@@ -3213,7 +3209,7 @@ static int bpf_object__init_btf(struct bpf_object *obj, err =libbpf_get_error (obj->btf);if (err) { obj->btf =NULL ; -pr_warn ("Error loading ELF section %s: %d.\n" ,BTF_ELF_SEC , err); +pr_warn ("Error loading ELF section %s: %s.\n" ,BTF_ELF_SEC ,errstr (err)); goto out; }/* enforce 8-byte pointers for BPF-targeted BTFs */
@@ -3231,8 +3227,8 @@ static int bpf_object__init_btf(struct bpf_object *obj, obj->btf_ext =btf_ext__new (btf_ext_data->d_buf, btf_ext_data->d_size); err =libbpf_get_error (obj->btf_ext);if (err) { -pr_warn ("Error loading ELF section %s: %d. Ignored and continue.\n" , -BTF_EXT_ELF_SEC , err); +pr_warn ("Error loading ELF section %s: %s. Ignored and continue.\n" , +BTF_EXT_ELF_SEC ,errstr (err)); obj->btf_ext =NULL ; goto out; }
@@ -3324,8 +3320,8 @@ static int btf_fixup_datasec(struct bpf_object *obj, struct btf *btf,if (t->size ==0 ) { err =find_elf_sec_sz (obj, sec_name, &size);if (err || !size) { -pr_debug ("sec '%s': failed to determine size from ELF: size %u, err %d\n" , - sec_name, size, err); +pr_debug ("sec '%s': failed to determine size from ELF: size %u, err %s\n" , + sec_name, size,errstr (err));return -ENOENT ; }
@@ -3479,7 +3475,7 @@ static int bpf_object__load_vmlinux_btf(struct bpf_object *obj, bool force) obj->btf_vmlinux =btf__load_vmlinux_btf (); err =libbpf_get_error (obj->btf_vmlinux);if (err) { -pr_warn ("Error loading vmlinux BTF: %d\n" , err); +pr_warn ("Error loading vmlinux BTF: %s\n" ,errstr (err)); obj->btf_vmlinux =NULL ;return err; }
@@ -3583,9 +3579,11 @@ static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)if (err) { btf_mandatory =kernel_needs_btf (obj);if (btf_mandatory) { -pr_warn ("Error loading .BTF into kernel: %d. BTF is mandatory, can't proceed.\n" , err); +pr_warn ("Error loading .BTF into kernel: %s. BTF is mandatory, can't proceed.\n" , +errstr (err)); }else { -pr_info ("Error loading .BTF into kernel: %d. BTF is optional, ignoring.\n" , err); +pr_info ("Error loading .BTF into kernel: %s. BTF is optional, ignoring.\n" , +errstr (err)); err =0 ; } }
@@ -4797,8 +4795,8 @@ static int bpf_get_map_info_from_fdinfo(int fd, struct bpf_map_info *info) fp =fopen (file,"re" );if (!fp) { err = -errno; -pr_warn ("failed to open %s: %d. No procfs support?\n" , file, - err); +pr_warn ("failed to open %s: %s. No procfs support?\n" , file, +errstr (err));return err; }
@@ -4953,8 +4951,8 @@ static int bpf_object_prepare_token(struct bpf_object *obj) bpffs_fd =open (bpffs_path,O_DIRECTORY ,O_RDWR );if (bpffs_fd <0 ) { err = -errno; -__pr (level,"object '%s': failed (%d) to open BPF FS mount at '%s'%s\n" , - obj->name, err, bpffs_path, +__pr (level,"object '%s': failed (%s) to open BPF FS mount at '%s'%s\n" , + obj->name,errstr (err), bpffs_path, mandatory ?"" :", skipping optional step..." );return mandatory ? err :0 ; }
@@ -4988,7 +4986,6 @@ static int bpf_object_prepare_token(struct bpf_object *obj)static int bpf_object__probe_loading (struct bpf_object *obj) { -char *cp, errmsg[STRERR_BUFSIZE ];struct bpf_insn insns[] = {BPF_MOV64_IMM (BPF_REG_0 ,0 ),BPF_EXIT_INSN (),
@@ -5004,7 +5001,8 @@ bpf_object__probe_loading(struct bpf_object *obj) ret =bump_rlimit_memlock ();if (ret) -pr_warn ("Failed to bump RLIMIT_MEMLOCK (err = %d), you might need to do it explicitly!\n" , ret); +pr_warn ("Failed to bump RLIMIT_MEMLOCK (err = %s), you might need to do it explicitly!\n" , +errstr (ret));/* make sure basic loading works */ ret =bpf_prog_load (BPF_PROG_TYPE_SOCKET_FILTER ,NULL ,"GPL" , insns, insn_cnt, &opts);
@@ -5012,11 +5010,8 @@ bpf_object__probe_loading(struct bpf_object *obj) ret =bpf_prog_load (BPF_PROG_TYPE_TRACEPOINT ,NULL ,"GPL" , insns, insn_cnt, &opts);if (ret <0 ) { ret = errno; - cp =libbpf_strerror_r (ret, errmsg,sizeof (errmsg)); -pr_warn ("Error in %s():%s(%d). Couldn't load trivial BPF " -"program. Make sure your kernel supports BPF " -"(CONFIG_BPF_SYSCALL=y) and/or that RLIMIT_MEMLOCK is " -"set to big enough value.\n" , __func__, cp, ret); +pr_warn ("Error in %s(): %s. Couldn't load trivial BPF program. Make sure your kernel supports BPF (CONFIG_BPF_SYSCALL=y) and/or that RLIMIT_MEMLOCK is set to big enough value.\n" , + __func__,errstr (ret));return -ret; }close (ret);
@@ -5041,7 +5036,6 @@ bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id)static bool map_is_reuse_compat (const struct bpf_map *map,int map_fd) {struct bpf_map_info map_info; -char msg[STRERR_BUFSIZE ];__u32 map_info_len =sizeof (map_info);int err;
@@ -5051,7 +5045,7 @@ static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd) err =bpf_get_map_info_from_fdinfo (map_fd, &map_info);if (err) {pr_warn ("failed to get map info for map FD %d: %s\n" , map_fd, -libbpf_strerror_r (errno, msg,sizeof (msg))); +errstr (err));return false; }
@@ -5076,7 +5070,6 @@ static bool map_is_reuse_compat(const struct bpf_map *map, int map_fd)static int bpf_object__reuse_map (struct bpf_map *map) { -char *cp, errmsg[STRERR_BUFSIZE ];int err, pin_fd; pin_fd =bpf_obj_get (map->pin_path);
@@ -5088,9 +5081,8 @@ bpf_object__reuse_map(struct bpf_map *map)return 0 ; } - cp =libbpf_strerror_r (-err, errmsg,sizeof (errmsg));pr_warn ("couldn't retrieve pinned map '%s': %s\n" , - map->pin_path, cp); + map->pin_path,errstr (err));return err; }
@@ -5116,7 +5108,6 @@ static int bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) { enum libbpf_map_type map_type = map->libbpf_type; -char *cp, errmsg[STRERR_BUFSIZE ];int err, zero =0 ;size_t mmap_sz;
@@ -5131,9 +5122,8 @@ bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) err =bpf_map_update_elem (map->fd, &zero, map->mmaped,0 );if (err) { err = -errno; - cp =libbpf_strerror_r (err, errmsg,sizeof (errmsg));pr_warn ("map '%s': failed to set initial contents: %s\n" , -bpf_map__name (map), cp); +bpf_map__name (map),errstr (err));return err; }
@@ -5142,9 +5132,8 @@ bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) err =bpf_map_freeze (map->fd);if (err) { err = -errno; - cp =libbpf_strerror_r (err, errmsg,sizeof (errmsg));pr_warn ("map '%s': failed to freeze as read-only: %s\n" , -bpf_map__name (map), cp); +bpf_map__name (map),errstr (err));return err; } }
@@ -5170,8 +5159,8 @@ bpf_object__populate_internal_map(struct bpf_object *obj, struct bpf_map *map) mmaped =mmap (map->mmaped, mmap_sz, prot,MAP_SHARED |MAP_FIXED , map->fd,0 );if (mmaped ==MAP_FAILED ) { err = -errno; -pr_warn ("map '%s': failed to re-mmap() contents: %d\n" , -bpf_map__name (map), err); +pr_warn ("map '%s': failed to re-mmap() contents: %s\n" , +bpf_map__name (map),errstr (err));return err; } map->mmaped = mmaped;
@@ -5228,8 +5217,8 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, breturn err; err =bpf_object__create_map (obj, map->inner_map, true);if (err) { -pr_warn ("map '%s': failed to create inner map: %d\n" , - map->name, err); +pr_warn ("map '%s': failed to create inner map: %s\n" , + map->name,errstr (err));return err; } map->inner_map_fd = map->inner_map->fd;
@@ -5283,12 +5272,9 @@ static int bpf_object__create_map(struct bpf_object *obj, struct bpf_map *map, b def->max_entries, &create_attr); }if (map_fd <0 && (create_attr.btf_key_type_id || create_attr.btf_value_type_id)) { -char *cp, errmsg[STRERR_BUFSIZE ]; - err = -errno; - cp =libbpf_strerror_r (err, errmsg,sizeof (errmsg)); -pr_warn ("Error in bpf_create_map_xattr(%s):%s(%d). Retrying without BTF.\n" , - map->name, cp, err); +pr_warn ("Error in bpf_create_map_xattr(%s): %s. Retrying without BTF.\n" , + map->name,errstr (err)); create_attr.btf_fd =0 ; create_attr.btf_key_type_id =0 ; create_attr.btf_value_type_id =0 ;
@@ -5343,8 +5329,8 @@ static int init_map_in_map_slots(struct bpf_object *obj, struct bpf_map *map) }if (err) { err = -errno; -pr_warn ("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %d\n" , - map->name, i, targ_map->name, fd, err); +pr_warn ("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %s\n" , + map->name, i, targ_map->name, fd,errstr (err));return err; } pr_debug("map '%s': slot [%d] set to map '%s' fd=%d\n",
@@ -5376,8 +5362,8 @@ static int init_prog_array_slots(struct bpf_object *obj, struct bpf_map *map) err =bpf_map_update_elem (map->fd, &i, &fd,0 );if (err) { err = -errno; -pr_warn ("map '%s': failed to initialize slot [%d] to prog '%s' fd=%d: %d\n" , - map->name, i, targ_prog->name, fd, err); +pr_warn ("map '%s': failed to initialize slot [%d] to prog '%s' fd=%d: %s\n" , + map->name, i, targ_prog->name, fd,errstr (err));return err; } pr_debug("map '%s': slot [%d] set to prog '%s' fd=%d\n",
@@ -5430,7 +5416,6 @@ static int bpf_object__create_maps(struct bpf_object *obj) {struct bpf_map *map; -char *cp, errmsg[STRERR_BUFSIZE ];unsigned int i, j;int err;bool retried;
@@ -5504,8 +5489,8 @@ bpf_object__create_maps(struct bpf_object *obj)if (map->mmaped ==MAP_FAILED ) { err = -errno; map->mmaped =NULL ; -pr_warn ("map '%s': failed to mmap arena: %d\n" , - map->name, err); +pr_warn ("map '%s': failed to mmap arena: %s\n" , + map->name,errstr (err));return err; }if (obj->arena_data) {
@@ -5527,8 +5512,8 @@ bpf_object__create_maps(struct bpf_object *obj) retried = true; goto retry; } -pr_warn ("map '%s': failed to auto-pin at '%s': %d\n" , - map->name, map->pin_path, err); +pr_warn ("map '%s': failed to auto-pin at '%s': %s\n" , + map->name, map->pin_path,errstr (err)); goto err_out; } }
@@ -5537,8 +5522,7 @@ bpf_object__create_maps(struct bpf_object *obj)return 0 ; err_out: - cp =libbpf_strerror_r (err, errmsg,sizeof (errmsg)); -pr_warn ("map '%s': failed to create: %s(%d)\n" , map->name, cp, err); +pr_warn ("map '%s': failed to create: %s\n" , map->name,errstr (err));pr_perm_msg (err);for (j =0 ; j < i; j++)zclose (obj->maps[j].fd);
@@ -5662,7 +5646,7 @@ static int load_module_btfs(struct bpf_object *obj) }if (err) { err = -errno; -pr_warn ("failed to iterate BTF objects: %d\n" , err); +pr_warn ("failed to iterate BTF objects: %s\n" ,errstr (err));return err; }
@@ -5671,7 +5655,7 @@ static int load_module_btfs(struct bpf_object *obj)if (errno ==ENOENT )continue ;/* expected race: BTF was unloaded */ err = -errno; -pr_warn ("failed to get BTF object #%d FD: %d\n" , id, err); +pr_warn ("failed to get BTF object #%d FD: %s\n" , id,errstr (err));return err; }
@@ -5683,7 +5667,7 @@ static int load_module_btfs(struct bpf_object *obj) err =bpf_btf_get_info_by_fd (fd, &info, &len);if (err) { err = -errno; -pr_warn ("failed to get BTF object #%d info: %d\n" , id, err); +pr_warn ("failed to get BTF object #%d info: %s\n" , id,errstr (err)); goto err_out; }
@@ -5696,8 +5680,8 @@ static int load_module_btfs(struct bpf_object *obj) btf =btf_get_from_fd (fd, obj->btf_vmlinux); err =libbpf_get_error (btf);if (err) { -pr_warn ("failed to load module [%s]'s BTF object #%d: %d\n" , - name, id, err); +pr_warn ("failed to load module [%s]'s BTF object #%d: %s\n" , + name, id,errstr (err)); goto err_out; }
@@ -5926,7 +5910,7 @@ bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) obj->btf_vmlinux_override =btf__parse (targ_btf_path,NULL ); err =libbpf_get_error (obj->btf_vmlinux_override);if (err) { -pr_warn ("failed to parse target BTF: %d\n" , err); +pr_warn ("failed to parse target BTF: %s\n" ,errstr (err));return err; } }
@@ -5986,8 +5970,8 @@ bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) err =record_relo_core (prog, rec, insn_idx);if (err) { -pr_warn ("prog '%s': relo #%d: failed to record relocation: %d\n" , - prog->name, i, err); +pr_warn ("prog '%s': relo #%d: failed to record relocation: %s\n" , + prog->name, i,errstr (err)); goto out; }
@@ -5996,15 +5980,15 @@ bpf_object__relocate_core(struct bpf_object *obj, const char *targ_btf_path) err =bpf_core_resolve_relo (prog, rec, i, obj->btf, cand_cache, &targ_res);if (err) { -pr_warn ("prog '%s': relo #%d: failed to relocate: %d\n" , - prog->name, i, err); +pr_warn ("prog '%s': relo #%d: failed to relocate: %s\n" , + prog->name, i,errstr (err)); goto out; } err =bpf_core_patch_insn (prog->name, insn, insn_idx, rec, i, &targ_res);if (err) { -pr_warn ("prog '%s': relo #%d: failed to patch insn #%u: %d\n" , - prog->name, i, insn_idx, err); +pr_warn ("prog '%s': relo #%d: failed to patch insn #%u: %s\n" , + prog->name, i, insn_idx,errstr (err)); goto out; } }
@@ -6272,8 +6256,8 @@ reloc_prog_func_and_line_info(const struct bpf_object *obj, &main_prog->func_info_rec_size);if (err) {if (err != -ENOENT ) { -pr_warn ("prog '%s': error relocating .BTF.ext function info: %d\n" , - prog->name, err); +pr_warn ("prog '%s': error relocating .BTF.ext function info: %s\n" , + prog->name,errstr (err));return err; }if (main_prog->func_info) {
@@ -6300,8 +6284,8 @@ reloc_prog_func_and_line_info(const struct bpf_object *obj, &main_prog->line_info_rec_size);if (err) {if (err != -ENOENT ) { -pr_warn ("prog '%s': error relocating .BTF.ext line info: %d\n" , - prog->name, err); +pr_warn ("prog '%s': error relocating .BTF.ext line info: %s\n" , + prog->name,errstr (err));return err; }if (main_prog->line_info) {
@@ -7065,8 +7049,8 @@ static int bpf_object__relocate(struct bpf_object *obj, const char *targ_btf_patif (obj->btf_ext) { err =bpf_object__relocate_core (obj, targ_btf_path);if (err) { -pr_warn ("failed to perform CO-RE relocations: %d\n" , - err); +pr_warn ("failed to perform CO-RE relocations: %s\n" , +errstr (err));return err; }bpf_object__sort_relos (obj);
@@ -7110,8 +7094,8 @@ static int bpf_object__relocate(struct bpf_object *obj, const char *targ_btf_pat err =bpf_object__relocate_calls (obj, prog);if (err) { -pr_warn ("prog '%s': failed to relocate calls: %d\n" , - prog->name, err); +pr_warn ("prog '%s': failed to relocate calls: %s\n" , + prog->name,errstr (err));return err; }
@@ -7147,16 +7131,16 @@ static int bpf_object__relocate(struct bpf_object *obj, const char *targ_btf_pat/* Process data relos for main programs */ err =bpf_object__relocate_data (obj, prog);if (err) { -pr_warn ("prog '%s': failed to relocate data references: %d\n" , - prog->name, err); +pr_warn ("prog '%s': failed to relocate data references: %s\n" , + prog->name,errstr (err));return err; }/* Fix up .BTF.ext information, if necessary */ err =bpf_program_fixup_func_info (obj, prog);if (err) { -pr_warn ("prog '%s': failed to perform .BTF.ext fix ups: %d\n" , - prog->name, err); +pr_warn ("prog '%s': failed to perform .BTF.ext fix ups: %s\n" , + prog->name,errstr (err));return err; } }
@@ -7465,7 +7449,6 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog {LIBBPF_OPTS (bpf_prog_load_opts, load_attr);const char *prog_name =NULL ; -char *cp, errmsg[STRERR_BUFSIZE ];size_t log_buf_size =0 ;char *log_buf =NULL , *tmp;bool own_log_buf = true;
@@ -7529,8 +7512,8 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *progif (prog->sec_def && prog->sec_def->prog_prepare_load_fn) { err = prog->sec_def->prog_prepare_load_fn (prog, &load_attr, prog->sec_def->cookie);if (err <0 ) { -pr_warn ("prog '%s': failed to prepare load attributes: %d\n" , - prog->name, err); +pr_warn ("prog '%s': failed to prepare load attributes: %s\n" , + prog->name,errstr (err));return err; } insns = prog->insns;
@@ -7594,9 +7577,8 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *progcontinue ;if (bpf_prog_bind_map (ret, map->fd,NULL )) { - cp =libbpf_strerror_r (errno, errmsg,sizeof (errmsg));pr_warn ("prog '%s': failed to bind map '%s': %s\n" , - prog->name, map->real_name, cp); + prog->name, map->real_name,errstr (errno));/* Don't fail hard if can't bind rodata. */ } }
@@ -7626,8 +7608,7 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog/* post-process verifier log to improve error descriptions */ fixup_verifier_log (prog, log_buf, log_buf_size); - cp =libbpf_strerror_r (errno, errmsg,sizeof (errmsg)); -pr_warn ("prog '%s': BPF program load failed: %s\n" , prog->name, cp); +pr_warn ("prog '%s': BPF program load failed: %s\n" , prog->name,errstr (errno));pr_perm_msg (ret);if (own_log_buf && log_buf && log_buf[0 ] !='\0' ) {
@@ -7920,7 +7901,7 @@ bpf_object__load_progs(struct bpf_object *obj, int log_level) err =bpf_object_load_prog (obj, prog, prog->insns, prog->insns_cnt, obj->license, obj->kern_version, &prog->fd);if (err) { -pr_warn ("prog '%s': failed to load: %d\n" , prog->name, err); +pr_warn ("prog '%s': failed to load: %s\n" , prog->name,errstr (err));return err; } }
@@ -7954,8 +7935,8 @@ static int bpf_object_init_progs(struct bpf_object *obj, const struct bpf_objectif (prog->sec_def->prog_setup_fn) { err = prog->sec_def->prog_setup_fn (prog, prog->sec_def->cookie);if (err <0 ) { -pr_warn ("prog '%s': failed to initialize: %d\n" , - prog->name, err); +pr_warn ("prog '%s': failed to initialize: %s\n" , + prog->name,errstr (err));return err; } }
@@ -8145,7 +8126,7 @@ static int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *ctx) f =fopen ("/proc/kallsyms" ,"re" );if (!f) { err = -errno; -pr_warn ("failed to open /proc/kallsyms: %d\n" , err); +pr_warn ("failed to open /proc/kallsyms: %s\n" ,errstr (err));return err; }
@@ -8622,7 +8603,6 @@ int bpf_object__load(struct bpf_object *obj)static int make_parent_dir (const char *path) { -char *cp, errmsg[STRERR_BUFSIZE ];char *dname, *dir;int err =0 ;
@@ -8636,15 +8616,13 @@ static int make_parent_dir(const char *path)free (dname);if (err) { - cp =libbpf_strerror_r (-err, errmsg,sizeof (errmsg)); -pr_warn ("failed to mkdir %s: %s\n" , path, cp); +pr_warn ("failed to mkdir %s: %s\n" , path,errstr (err)); }return err; }static int check_path (const char *path) { -char *cp, errmsg[STRERR_BUFSIZE ];struct statfs st_fs;char *dname, *dir;int err =0 ;
@@ -8658,8 +8636,7 @@ static int check_path(const char *path) dir =dirname (dname);if (statfs (dir, &st_fs)) { - cp =libbpf_strerror_r (errno, errmsg,sizeof (errmsg)); -pr_warn ("failed to statfs %s: %s\n" , dir, cp); +pr_warn ("failed to statfs %s: %s\n" , dir,errstr (errno)); err = -errno; }free (dname);
@@ -8674,7 +8651,6 @@ static int check_path(const char *path)int bpf_program__pin (struct bpf_program *prog,const char *path) { -char *cp, errmsg[STRERR_BUFSIZE ];int err;if (prog->fd <0 ) {
@@ -8692,8 +8668,7 @@ int bpf_program__pin(struct bpf_program *prog, const char *path)if (bpf_obj_pin (prog->fd, path)) { err = -errno; - cp =libbpf_strerror_r (err, errmsg,sizeof (errmsg)); -pr_warn ("prog '%s': failed to pin at '%s': %s\n" , prog->name, path, cp); +pr_warn ("prog '%s': failed to pin at '%s': %s\n" , prog->name, path,errstr (err));return libbpf_err (err); }
@@ -8724,7 +8699,6 @@ int bpf_program__unpin(struct bpf_program *prog, const char *path)int bpf_map__pin (struct bpf_map *map,const char *path) { -char *cp, errmsg[STRERR_BUFSIZE ];int err;if (map ==NULL ) {
@@ -8783,8 +8757,7 @@ int bpf_map__pin(struct bpf_map *map, const char *path)return 0 ; out_err: - cp =libbpf_strerror_r (-err, errmsg,sizeof (errmsg)); -pr_warn ("failed to pin map: %s\n" , cp); +pr_warn ("failed to pin map: %s\n" ,errstr (err));return libbpf_err (err); }
@@ -9972,8 +9945,8 @@ static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd)memset (&info,0 , info_len); err =bpf_prog_get_info_by_fd (attach_prog_fd, &info, &info_len);if (err) { -pr_warn ("failed bpf_prog_get_info_by_fd for FD %d: %d\n" , - attach_prog_fd, err); +pr_warn ("failed bpf_prog_get_info_by_fd for FD %d: %s\n" , + attach_prog_fd,errstr (err));return err; }
@@ -9985,7 +9958,7 @@ static int libbpf_find_prog_btf_id(const char *name, __u32 attach_prog_fd) btf =btf__load_from_kernel_by_id (info.btf_id); err =libbpf_get_error (btf);if (err) { -pr_warn ("Failed to get BTF %d of the program: %d\n" , info.btf_id, err); +pr_warn ("Failed to get BTF %d of the program: %s\n" , info.btf_id,errstr (err)); goto out; } err =btf__find_by_name_kind (btf, name,BTF_KIND_FUNC );
@@ -10067,8 +10040,8 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attac } err =libbpf_find_prog_btf_id (attach_name, attach_prog_fd);if (err <0 ) { -pr_warn ("prog '%s': failed to find BPF program (FD %d) BTF ID for '%s': %d\n" , - prog->name, attach_prog_fd, attach_name, err); +pr_warn ("prog '%s': failed to find BPF program (FD %d) BTF ID for '%s': %s\n" , + prog->name, attach_prog_fd, attach_name,errstr (err));return err; } *btf_obj_fd =0 ;
@@ -10087,8 +10060,8 @@ static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attac btf_type_id); }if (err) { -pr_warn ("prog '%s': failed to find kernel BTF type ID of '%s': %d\n" , - prog->name, attach_name, err); +pr_warn ("prog '%s': failed to find kernel BTF type ID of '%s': %s\n" , + prog->name, attach_name,errstr (err));return err; }return 0 ;
@@ -10316,14 +10289,14 @@ int bpf_map__set_value_size(struct bpf_map *map, __u32 size) mmap_new_sz =array_map_mmap_sz (size, map->def.max_entries); err =bpf_map_mmap_resize (map, mmap_old_sz, mmap_new_sz);if (err) { -pr_warn ("map '%s': failed to resize memory-mapped region: %d\n" , -bpf_map__name (map), err); +pr_warn ("map '%s': failed to resize memory-mapped region: %s\n" , +bpf_map__name (map),errstr (err));return err; } err =map_btf_datasec_resize (map, size);if (err && err != -ENOENT ) { -pr_warn ("map '%s': failed to adjust resized BTF, clearing BTF key/value info: %d\n" , -bpf_map__name (map), err); +pr_warn ("map '%s': failed to adjust resized BTF, clearing BTF key/value info: %s\n" , +bpf_map__name (map),errstr (err)); map->btf_value_type_id =0 ; map->btf_key_type_id =0 ; }
@@ -10814,7 +10787,6 @@ static void bpf_link_perf_dealloc(struct bpf_link *link)struct bpf_link *bpf_program__attach_perf_event_opts (const struct bpf_program *prog,int pfd,const struct bpf_perf_event_opts *opts) { -char errmsg[STRERR_BUFSIZE ];struct bpf_link_perf *link;int prog_fd, link_fd =-1 , err;bool force_ioctl_attach;
@@ -10849,9 +10821,8 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *p link_fd =bpf_link_create (prog_fd, pfd,BPF_PERF_EVENT , &link_opts);if (link_fd <0 ) { err = -errno; -pr_warn ("prog '%s': failed to create BPF link for perf_event FD %d: %d (%s)\n" , - prog->name, pfd, - err,libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +pr_warn ("prog '%s': failed to create BPF link for perf_event FD %d: %s\n" , + prog->name, pfd,errstr (err)); goto err_out; } link->link.fd = link_fd;
@@ -10865,7 +10836,7 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *pif (ioctl (pfd,PERF_EVENT_IOC_SET_BPF , prog_fd) <0 ) { err = -errno;pr_warn ("prog '%s': failed to attach to perf_event FD %d: %s\n" , - prog->name, pfd,libbpf_strerror_r (err, errmsg,sizeof (errmsg))); + prog->name, pfd,errstr (err));if (err == -EPROTO )pr_warn ("prog '%s': try add PERF_SAMPLE_CALLCHAIN to or remove exclude_callchain_[kernel|user] from pfd %d\n" , prog->name, pfd);
@@ -10876,7 +10847,7 @@ struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *pif (ioctl (pfd,PERF_EVENT_IOC_ENABLE ,0 ) <0 ) { err = -errno;pr_warn ("prog '%s': failed to enable perf_event FD %d: %s\n" , - prog->name, pfd,libbpf_strerror_r (err, errmsg,sizeof (errmsg))); + prog->name, pfd,errstr (err)); goto err_out; }
@@ -10900,22 +10871,19 @@ struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog,*/ static int parse_uint_from_file (const char *file,const char *fmt) { -char buf[STRERR_BUFSIZE ];int err, ret;FILE *f; f =fopen (file,"re" );if (!f) { err = -errno; -pr_debug ("failed to open '%s': %s\n" , file, -libbpf_strerror_r (err, buf,sizeof (buf))); +pr_debug ("failed to open '%s': %s\n" , file,errstr (err));return err; } err =fscanf (f, fmt, &ret);if (err !=1 ) { err = err ==EOF ? -EIO : -errno; -pr_debug ("failed to parse '%s': %s\n" , file, -libbpf_strerror_r (err, buf,sizeof (buf))); +pr_debug ("failed to parse '%s': %s\n" , file,errstr (err));fclose (f);return err; }
@@ -10959,7 +10927,6 @@ static int perf_event_open_probe(bool uprobe, bool retprobe, const char *name, {const size_t attr_sz =sizeof (struct perf_event_attr );struct perf_event_attr attr; -char errmsg[STRERR_BUFSIZE ];int type, pfd;if ((__u64 )ref_ctr_off >= (1ULL <<PERF_UPROBE_REF_CTR_OFFSET_BITS ))
@@ -10972,7 +10939,7 @@ static int perf_event_open_probe(bool uprobe, bool retprobe, const char *name,if (type <0 ) {pr_warn ("failed to determine %s perf type: %s\n" , uprobe ?"uprobe" :"kprobe" , -libbpf_strerror_r (type, errmsg,sizeof (errmsg))); +errstr (type));return type; }if (retprobe) {
@@ -10982,7 +10949,7 @@ static int perf_event_open_probe(bool uprobe, bool retprobe, const char *name,if (bit <0 ) {pr_warn ("failed to determine %s retprobe bit: %s\n" , uprobe ?"uprobe" :"kprobe" , -libbpf_strerror_r (bit, errmsg,sizeof (errmsg))); +errstr (bit));return bit; } attr.config |=1 << bit;
@@ -11111,14 +11078,13 @@ static int perf_event_kprobe_open_legacy(const char *probe_name, bool retprobe, {const size_t attr_sz =sizeof (struct perf_event_attr );struct perf_event_attr attr; -char errmsg[STRERR_BUFSIZE ];int type, pfd, err; err =add_kprobe_event_legacy (probe_name, retprobe, kfunc_name, offset);if (err <0 ) {pr_warn ("failed to add legacy kprobe event for '%s+0x%zx': %s\n" , kfunc_name, offset, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err));return err; } type =determine_kprobe_perf_type_legacy (probe_name, retprobe);
@@ -11126,7 +11092,7 @@ static int perf_event_kprobe_open_legacy(const char *probe_name, bool retprobe, err = type;pr_warn ("failed to determine legacy kprobe event id for '%s+0x%zx': %s\n" , kfunc_name, offset, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err)); goto err_clean_legacy; }
@@ -11142,7 +11108,7 @@ static int perf_event_kprobe_open_legacy(const char *probe_name, bool retprobe,if (pfd <0 ) { err = -errno;pr_warn ("legacy kprobe perf_event_open() failed: %s\n" , -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err)); goto err_clean_legacy; }return pfd;
@@ -11218,7 +11184,6 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog, {DECLARE_LIBBPF_OPTS (bpf_perf_event_opts, pe_opts);enum probe_attach_mode attach_mode; -char errmsg[STRERR_BUFSIZE ];char *legacy_probe =NULL ;struct bpf_link *link;size_t offset;
@@ -11276,7 +11241,7 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,pr_warn ("prog '%s': failed to create %s '%s+0x%zx' perf event: %s\n" , prog->name, retprobe ?"kretprobe" :"kprobe" , func_name, offset, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err)); goto err_out; } link =bpf_program__attach_perf_event_opts (prog, pfd, &pe_opts);
@@ -11286,7 +11251,7 @@ bpf_program__attach_kprobe_opts(const struct bpf_program *prog,pr_warn ("prog '%s': failed to attach to %s '%s+0x%zx': %s\n" , prog->name, retprobe ?"kretprobe" :"kprobe" , func_name, offset, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err)); goto err_clean_legacy; }if (legacy) {
@@ -11422,7 +11387,7 @@ static int libbpf_available_kallsyms_parse(struct kprobe_multi_resolve *res) f =fopen (available_functions_file,"re" );if (!f) { err = -errno; -pr_warn ("failed to open %s: %d\n" , available_functions_file, err); +pr_warn ("failed to open %s: %s\n" , available_functions_file,errstr (err));return err; }
@@ -11497,7 +11462,7 @@ static int libbpf_available_kprobes_parse(struct kprobe_multi_resolve *res) f =fopen (available_path,"re" );if (!f) { err = -errno; -pr_warn ("failed to open %s: %d\n" , available_path, err); +pr_warn ("failed to open %s: %s\n" , available_path,errstr (err));return err; }
@@ -11543,7 +11508,6 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, };enum bpf_attach_type attach_type;struct bpf_link *link =NULL ; -char errmsg[STRERR_BUFSIZE ];const unsigned long *addrs;int err, link_fd, prog_fd;bool retprobe, session;
@@ -11611,7 +11575,7 @@ bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog,if (link_fd <0 ) { err = -errno;pr_warn ("prog '%s': failed to attach: %s\n" , - prog->name,libbpf_strerror_r (err, errmsg,sizeof (errmsg))); + prog->name,errstr (err)); goto error; } link->fd = link_fd;
@@ -11804,15 +11768,15 @@ static int perf_event_uprobe_open_legacy(const char *probe_name, bool retprobe, err =add_uprobe_event_legacy (probe_name, retprobe, binary_path, offset);if (err <0 ) { -pr_warn ("failed to add legacy uprobe event for %s:0x%zx: %d\n" , - binary_path, (size_t )offset, err); +pr_warn ("failed to add legacy uprobe event for %s:0x%zx: %s\n" , + binary_path, (size_t )offset,errstr (err));return err; } type =determine_uprobe_perf_type_legacy (probe_name, retprobe);if (type <0 ) { err = type; -pr_warn ("failed to determine legacy uprobe event id for %s:0x%zx: %d\n" , - binary_path, offset, err); +pr_warn ("failed to determine legacy uprobe event id for %s:0x%zx: %s\n" , + binary_path, offset,errstr (err)); goto err_clean_legacy; }
@@ -11827,7 +11791,7 @@ static int perf_event_uprobe_open_legacy(const char *probe_name, bool retprobe, -1 /* group_fd */, PERF_FLAG_FD_CLOEXEC);if (pfd <0 ) { err = -errno; -pr_warn ("legacy uprobe perf_event_open() failed: %d\n" , err); +pr_warn ("legacy uprobe perf_event_open() failed: %s\n" ,errstr (err)); goto err_clean_legacy; }return pfd;
@@ -11992,7 +11956,6 @@ bpf_program__attach_uprobe_multi(const struct bpf_program *prog,unsigned long *resolved_offsets =NULL ;int err =0 , link_fd, prog_fd;struct bpf_link *link =NULL ; -char errmsg[STRERR_BUFSIZE ];char full_path[PATH_MAX ];const __u64 *cookies;const char **syms;
@@ -12045,8 +12008,8 @@ bpf_program__attach_uprobe_multi(const struct bpf_program *prog,if (!strchr (path,'/' )) { err =resolve_full_path (path, full_path,sizeof (full_path));if (err) { -pr_warn ("prog '%s': failed to resolve full path for '%s': %d\n" , - prog->name, path, err); +pr_warn ("prog '%s': failed to resolve full path for '%s': %s\n" , + prog->name, path,errstr (err));return libbpf_err_ptr (err); } path = full_path;
@@ -12087,7 +12050,7 @@ bpf_program__attach_uprobe_multi(const struct bpf_program *prog,if (link_fd <0 ) { err = -errno;pr_warn ("prog '%s': failed to attach multi-uprobe: %s\n" , - prog->name,libbpf_strerror_r (err, errmsg,sizeof (errmsg))); + prog->name,errstr (err)); goto error; } link->fd = link_fd;
@@ -12106,7 +12069,7 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, const struct bpf_uprobe_opts *opts) {const char *archive_path =NULL , *archive_sep =NULL ; -char errmsg[STRERR_BUFSIZE ], *legacy_probe =NULL ; +char *legacy_probe =NULL ;DECLARE_LIBBPF_OPTS (bpf_perf_event_opts, pe_opts);enum probe_attach_mode attach_mode;char full_path[PATH_MAX ];
@@ -12138,8 +12101,8 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, }else if (!strchr (binary_path,'/' )) { err =resolve_full_path (binary_path, full_path,sizeof (full_path));if (err) { -pr_warn ("prog '%s': failed to resolve full path for '%s': %d\n" , - prog->name, binary_path, err); +pr_warn ("prog '%s': failed to resolve full path for '%s': %s\n" , + prog->name, binary_path,errstr (err));return libbpf_err_ptr (err); } binary_path = full_path;
@@ -12206,7 +12169,7 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,pr_warn ("prog '%s': failed to create %s '%s:0x%zx' perf event: %s\n" , prog->name, retprobe ?"uretprobe" :"uprobe" , binary_path, func_offset, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err)); goto err_out; }
@@ -12217,7 +12180,7 @@ bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid,pr_warn ("prog '%s': failed to attach to %s '%s:0x%zx': %s\n" , prog->name, retprobe ?"uretprobe" :"uprobe" , binary_path, func_offset, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err)); goto err_clean_legacy; }if (legacy) {
@@ -12338,8 +12301,8 @@ struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog,if (!strchr (binary_path,'/' )) { err =resolve_full_path (binary_path, resolved_path,sizeof (resolved_path));if (err) { -pr_warn ("prog '%s': failed to resolve full path for '%s': %d\n" , - prog->name, binary_path, err); +pr_warn ("prog '%s': failed to resolve full path for '%s': %s\n" , + prog->name, binary_path,errstr (err));return libbpf_err_ptr (err); } binary_path = resolved_path;
@@ -12417,14 +12380,13 @@ static int perf_event_open_tracepoint(const char *tp_category, {const size_t attr_sz =sizeof (struct perf_event_attr );struct perf_event_attr attr; -char errmsg[STRERR_BUFSIZE ];int tp_id, pfd, err; tp_id =determine_tracepoint_id (tp_category, tp_name);if (tp_id <0 ) {pr_warn ("failed to determine tracepoint '%s/%s' perf event ID: %s\n" , tp_category, tp_name, -libbpf_strerror_r (tp_id, errmsg,sizeof (errmsg))); +errstr (tp_id));return tp_id; }
@@ -12439,7 +12401,7 @@ static int perf_event_open_tracepoint(const char *tp_category, err = -errno;pr_warn ("tracepoint '%s/%s' perf_event_open() failed: %s\n" , tp_category, tp_name, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err));return err; }return pfd;
@@ -12451,7 +12413,6 @@ struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *p const struct bpf_tracepoint_opts *opts) {DECLARE_LIBBPF_OPTS (bpf_perf_event_opts, pe_opts); -char errmsg[STRERR_BUFSIZE ];struct bpf_link *link;int pfd, err;
@@ -12464,7 +12425,7 @@ struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *pif (pfd <0 ) {pr_warn ("prog '%s': failed to create tracepoint '%s/%s' perf event: %s\n" , prog->name, tp_category, tp_name, -libbpf_strerror_r (pfd, errmsg,sizeof (errmsg))); +errstr (pfd));return libbpf_err_ptr (pfd); } link =bpf_program__attach_perf_event_opts (prog, pfd, &pe_opts);
@@ -12473,7 +12434,7 @@ struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *pclose (pfd);pr_warn ("prog '%s': failed to attach to tracepoint '%s/%s': %s\n" , prog->name, tp_category, tp_name, -libbpf_strerror_r (err, errmsg,sizeof (errmsg))); +errstr (err));return libbpf_err_ptr (err); }return link;
@@ -12524,7 +12485,6 @@ bpf_program__attach_raw_tracepoint_opts(const struct bpf_program *prog, struct bpf_raw_tracepoint_opts *opts) {LIBBPF_OPTS (bpf_raw_tp_opts, raw_opts); -char errmsg[STRERR_BUFSIZE ];struct bpf_link *link;int prog_fd, pfd;
@@ -12549,7 +12509,7 @@ bpf_program__attach_raw_tracepoint_opts(const struct bpf_program *prog, pfd = -errno;free (link);pr_warn ("prog '%s': failed to attach to raw tracepoint '%s': %s\n" , - prog->name, tp_name,libbpf_strerror_r (pfd, errmsg,sizeof (errmsg))); + prog->name, tp_name,errstr (pfd));return libbpf_err_ptr (pfd); } link->fd = pfd;
@@ -12608,7 +12568,6 @@ static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *pro const struct bpf_trace_opts *opts) {LIBBPF_OPTS (bpf_link_create_opts, link_opts); -char errmsg[STRERR_BUFSIZE ];struct bpf_link *link;int prog_fd, pfd;
@@ -12633,7 +12592,7 @@ static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *pro pfd = -errno;free (link);pr_warn ("prog '%s': failed to attach: %s\n" , - prog->name,libbpf_strerror_r (pfd, errmsg,sizeof (errmsg))); + prog->name,errstr (pfd));return libbpf_err_ptr (pfd); } link->fd = pfd;
@@ -12674,7 +12633,6 @@ bpf_program_attach_fd(const struct bpf_program *prog, const struct bpf_link_create_opts *opts) {enum bpf_attach_type attach_type; -char errmsg[STRERR_BUFSIZE ];struct bpf_link *link;int prog_fd, link_fd;
@@ -12696,7 +12654,7 @@ bpf_program_attach_fd(const struct bpf_program *prog,free (link);pr_warn ("prog '%s': failed to attach to %s: %s\n" , prog->name, target_name, -libbpf_strerror_r (link_fd, errmsg,sizeof (errmsg))); +errstr (link_fd));return libbpf_err_ptr (link_fd); } link->fd = link_fd;
@@ -12838,7 +12796,6 @@ bpf_program__attach_iter(const struct bpf_program *prog, const struct bpf_iter_attach_opts *opts) {DECLARE_LIBBPF_OPTS (bpf_link_create_opts, link_create_opts); -char errmsg[STRERR_BUFSIZE ];struct bpf_link *link;int prog_fd, link_fd;__u32 target_fd =0 ;
@@ -12866,7 +12823,7 @@ bpf_program__attach_iter(const struct bpf_program *prog, link_fd = -errno;free (link);pr_warn ("prog '%s': failed to attach to iterator: %s\n" , - prog->name,libbpf_strerror_r (link_fd, errmsg,sizeof (errmsg))); + prog->name,errstr (link_fd));return libbpf_err_ptr (link_fd); } link->fd = link_fd;
@@ -12908,12 +12865,10 @@ struct bpf_link *bpf_program__attach_netfilter(const struct bpf_program *prog, link_fd =bpf_link_create (prog_fd,0 ,BPF_NETFILTER , &lopts);if (link_fd <0 ) { -char errmsg[STRERR_BUFSIZE ]; - link_fd = -errno;free (link);pr_warn ("prog '%s': failed to attach to netfilter: %s\n" , - prog->name,libbpf_strerror_r (link_fd, errmsg,sizeof (errmsg))); + prog->name,errstr (link_fd));return libbpf_err_ptr (link_fd); } link->fd = link_fd;
@@ -13198,7 +13153,6 @@ perf_buffer__open_cpu_buf(struct perf_buffer *pb, struct perf_event_attr *attr, int cpu, int map_key) {struct perf_cpu_buf *cpu_buf; -char msg[STRERR_BUFSIZE ];int err; cpu_buf =calloc (1 ,sizeof (*cpu_buf));
@@ -13214,7 +13168,7 @@ perf_buffer__open_cpu_buf(struct perf_buffer *pb, struct perf_event_attr *attr,if (cpu_buf->fd <0 ) { err = -errno;pr_warn ("failed to open perf buffer event on cpu #%d: %s\n" , - cpu,libbpf_strerror_r (err, msg,sizeof (msg))); + cpu,errstr (err)); goto error; }
@@ -13225,14 +13179,14 @@ perf_buffer__open_cpu_buf(struct perf_buffer *pb, struct perf_event_attr *attr, cpu_buf->base =NULL ; err = -errno;pr_warn ("failed to mmap perf buffer on cpu #%d: %s\n" , - cpu,libbpf_strerror_r (err, msg,sizeof (msg))); + cpu,errstr (err)); goto error; }if (ioctl (cpu_buf->fd,PERF_EVENT_IOC_ENABLE ,0 ) <0 ) { err = -errno;pr_warn ("failed to enable perf buffer event on cpu #%d: %s\n" , - cpu,libbpf_strerror_r (err, msg,sizeof (msg))); + cpu,errstr (err)); goto error; }
@@ -13307,7 +13261,6 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, {const char *online_cpus_file ="/sys/devices/system/cpu/online" ;struct bpf_map_info map; -char msg[STRERR_BUFSIZE ];struct perf_buffer *pb;bool *online =NULL ;__u32 map_info_len;
@@ -13330,7 +13283,7 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt,*/ if (err != -EINVAL ) {pr_warn ("failed to get map info for map FD %d: %s\n" , - map_fd,libbpf_strerror_r (err, msg,sizeof (msg))); + map_fd,errstr (err));return ERR_PTR (err); } pr_debug("failed to get map info for FD %d; API not supported? Ignoring...\n",
@@ -13360,7 +13313,7 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt,if (pb->epoll_fd <0 ) { err = -errno;pr_warn ("failed to create epoll instance: %s\n" , -libbpf_strerror_r (err, msg,sizeof (msg))); +errstr (err)); goto error; }
@@ -13391,7 +13344,7 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, err =parse_cpu_mask_file (online_cpus_file, &online, &n);if (err) { -pr_warn ("failed to get online CPU mask: %d\n" , err); +pr_warn ("failed to get online CPU mask: %s\n" ,errstr (err)); goto error; }
@@ -13422,7 +13375,7 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, err = -errno;pr_warn ("failed to set cpu #%d, key %d -> perf FD %d: %s\n" , cpu, map_key, cpu_buf->fd, -libbpf_strerror_r (err, msg,sizeof (msg))); +errstr (err)); goto error; }
@@ -13433,7 +13386,7 @@ static struct perf_buffer *__perf_buffer__new(int map_fd, size_t page_cnt, err = -errno;pr_warn ("failed to epoll_ctl cpu #%d perf FD %d: %s\n" , cpu, cpu_buf->fd, -libbpf_strerror_r (err, msg,sizeof (msg))); +errstr (err)); goto error; } j++;
@@ -13528,7 +13481,7 @@ int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms) err =perf_buffer__process_records (pb, cpu_buf);if (err) { -pr_warn ("error while processing records: %d\n" , err); +pr_warn ("error while processing records: %s\n" ,errstr (err));return libbpf_err (err); } }
@@ -13612,7 +13565,8 @@ int perf_buffer__consume(struct perf_buffer *pb) err =perf_buffer__process_records (pb, cpu_buf);if (err) { -pr_warn ("perf_buffer: failed to process records in buffer #%d: %d\n" , i, err); +pr_warn ("perf_buffer: failed to process records in buffer #%d: %s\n" , + i,errstr (err));return libbpf_err (err); } }
@@ -13723,14 +13677,14 @@ int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz) fd =open (fcpu,O_RDONLY |O_CLOEXEC );if (fd <0 ) { err = -errno; -pr_warn ("Failed to open cpu mask file %s: %d\n" , fcpu, err); +pr_warn ("Failed to open cpu mask file %s: %s\n" , fcpu,errstr (err));return err; } len =read (fd, buf,sizeof (buf));close (fd);if (len <=0 ) { err = len ? -errno : -EINVAL ; -pr_warn ("Failed to read cpu mask from %s: %d\n" , fcpu, err); +pr_warn ("Failed to read cpu mask from %s: %s\n" , fcpu,errstr (err));return err; }if (len >=sizeof (buf)) {
@@ -13822,20 +13776,21 @@ int bpf_object__open_skeleton(struct bpf_object_skeleton *s, 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); +pr_warn ("failed to initialize skeleton BPF object '%s': %s\n" , + s->name,errstr (err));return libbpf_err (err); } *s->obj = obj; err =populate_skeleton_maps (obj, s->maps, s->map_cnt, s->map_skel_sz);if (err) { -pr_warn ("failed to populate skeleton maps for '%s': %d\n" , s->name, err); +pr_warn ("failed to populate skeleton maps for '%s': %s\n" , s->name,errstr (err));return libbpf_err (err); } err =populate_skeleton_progs (obj, s->progs, s->prog_cnt, s->prog_skel_sz);if (err) { -pr_warn ("failed to populate skeleton progs for '%s': %d\n" , s->name, err); +pr_warn ("failed to populate skeleton progs for '%s': %s\n" , s->name,errstr (err));return libbpf_err (err); }
@@ -13865,13 +13820,13 @@ int bpf_object__open_subskeleton(struct bpf_object_subskeleton *s) err =populate_skeleton_maps (s->obj, s->maps, s->map_cnt, s->map_skel_sz);if (err) { -pr_warn ("failed to populate subskeleton maps: %d\n" , err); +pr_warn ("failed to populate subskeleton maps: %s\n" ,errstr (err));return libbpf_err (err); } err =populate_skeleton_progs (s->obj, s->progs, s->prog_cnt, s->prog_skel_sz);if (err) { -pr_warn ("failed to populate subskeleton maps: %d\n" , err); +pr_warn ("failed to populate subskeleton maps: %s\n" ,errstr (err));return libbpf_err (err); }
@@ -13918,7 +13873,7 @@ int bpf_object__load_skeleton(struct bpf_object_skeleton *s) err =bpf_object__load (*s->obj);if (err) { -pr_warn ("failed to load BPF skeleton '%s': %d\n" , s->name, err); +pr_warn ("failed to load BPF skeleton '%s': %s\n" , s->name,errstr (err));return libbpf_err (err); }
@@ -13957,8 +13912,8 @@ int bpf_object__attach_skeleton(struct bpf_object_skeleton *s) err = prog->sec_def->prog_attach_fn (prog, prog->sec_def->cookie, link);if (err) { -pr_warn ("prog '%s': failed to auto-attach: %d\n" , -bpf_program__name (prog), err); +pr_warn ("prog '%s': failed to auto-attach: %s\n" , +bpf_program__name (prog),errstr (err));return libbpf_err (err); }
@@ -14007,7 +13962,8 @@ int bpf_object__attach_skeleton(struct bpf_object_skeleton *s) *link =bpf_map__attach_struct_ops (map);if (!*link) { err = -errno; -pr_warn ("map '%s': failed to auto-attach: %d\n" ,bpf_map__name (map), err); +pr_warn ("map '%s': failed to auto-attach: %s\n" , +bpf_map__name (map),errstr (err));return libbpf_err (err); } }
Signature · 1 line
2.53.0
Re: [PATCH 6.12 354/666] libbpf: Stringify errno in log messages in libbpf.c
Hi Greg,
Quoted 11 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mykyta Yatsenko <[email protected]>
[ Upstream commit
271abf041cb354ce99df33ce1f99db79faf90477]Convert numeric error codes into the string representations in log messages in
libbpf.c.
Quoted 6 lines
Signed-off-by Mykyta Yatsenko <[email protected]>Signed-off-by Andrii Nakryiko <[email protected]>Stable-dep-of:
380044c40b16("libbpf: Prevent double close and leak of btf objects")Signed-off-by Sasha Levin <[email protected]>---
This commit caused a build failure while testing 6.12.91-rc1 to prepare it for Debian:
make -f /home/build/linux-stable-rc/tools/build/Makefile.build dir=./arch/x86 obj=objtool
In file included from libbpf.c:54:libbpf.c: In function ‘bpf_object__elf_init’:
libbpf.c:1538:76: error: implicit declaration of function ‘errstr’; did you mean ‘strstr’? [-Werror=implicit-function-declaration]
1538 | pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~
libbpf_internal.h:167:47: note: in definition of macro ‘__pr’
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~~
libbpf.c:1538:25: note: in expansion of macro ‘pr_warn’
1538 | pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~~libbpf.c:1538:76: error: nested extern declaration of ‘errstr’ [-Werror=nested-externs]
1538 | pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~
libbpf_internal.h:167:47: note: in definition of macro ‘__pr’
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~~
libbpf.c:1538:25: note: in expansion of macro ‘pr_warn’
1538 | pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:1538:25: note: in expansion of macro ‘pr_warn’
1538 | pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~~
libbpf.c: In function ‘bpf_object__init_internal_map’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:1938:17: note: in expansion of macro ‘pr_warn’
1938 | pr_warn("failed to alloc map '%s' content buffer: %s\n", map->name, errstr(err));
| ^~~~~~~
libbpf.c: In function ‘parse_u64’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:2102:17: note: in expansion of macro ‘pr_warn’
2102 | pr_warn("failed to parse '%s': %s\n", value, errstr(err));
| ^~~~~~~
libbpf.c: In function ‘bpf_object__read_kconfig_file’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:2268:25: note: in expansion of macro ‘pr_warn’
2268 | pr_warn("error parsing system Kconfig line '%s': %s\n",
| ^~~~~~~
libbpf.c: In function ‘bpf_object__read_kconfig_mem’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:2289:17: note: in expansion of macro ‘pr_warn’
2289 | pr_warn("failed to open in-memory Kconfig: %s\n", errstr(err));
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:2296:25: note: in expansion of macro ‘pr_warn’
2296 | pr_warn("error parsing in-memory Kconfig line '%s': %s\n",
| ^~~~~~~
libbpf.c: In function ‘bpf_object__init_btf’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:3212:25: note: in expansion of macro ‘pr_warn’
3212 | pr_warn("Error loading ELF section %s: %s.\n", BTF_ELF_SEC, errstr(err));
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:3230:25: note: in expansion of macro ‘pr_warn’
3230 | pr_warn("Error loading ELF section %s: %s. Ignored and continue.\n",
| ^~~~~~~
libbpf.c: In function ‘btf_fixup_datasec’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 5 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:172:33: note: in expansion of macro ‘__pr’
172 | #define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:3323:25: note: in expansion of macro ‘pr_debug’
3323 | pr_debug("sec '%s': failed to determine size from ELF: size %u, err %s\n",
| ^~~~~~~~
libbpf.c: In function ‘bpf_object__load_vmlinux_btf’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:3478:17: note: in expansion of macro ‘pr_warn’
3478 | pr_warn("Error loading vmlinux BTF: %s\n", errstr(err));
| ^~~~~~~
libbpf.c: In function ‘bpf_object__sanitize_and_load_btf’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:3582:25: note: in expansion of macro ‘pr_warn’
3582 | pr_warn("Error loading .BTF into kernel: %s. BTF is mandatory, can't proceed.\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:171:33: note: in expansion of macro ‘__pr’
171 | #define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:3585:25: note: in expansion of macro ‘pr_info’
3585 | pr_info("Error loading .BTF into kernel: %s. BTF is optional, ignoring.\n",
| ^~~~~~~
libbpf.c: In function ‘bpf_get_map_info_from_fdinfo’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:4798:17: note: in expansion of macro ‘pr_warn’
4798 | pr_warn("failed to open %s: %s. No procfs support?\n", file,
| ^~~~~~~
libbpf.c: In function ‘bpf_object_prepare_token’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf.c:4954:17: note: in expansion of macro ‘__pr’
4954 | __pr(level, "object '%s': failed (%s) to open BPF FS mount at '%s'%s\n",
| ^~~~
libbpf.c: In function ‘bpf_object__probe_loading’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5004:17: note: in expansion of macro ‘pr_warn’
5004 | pr_warn("Failed to bump RLIMIT_MEMLOCK (err = %s), you might need to do it explicitly!\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5013:17: note: in expansion of macro ‘pr_warn’
5013 | pr_warn("Error in %s(): %s. Couldn't load trivial BPF program. Make sure your kernel supports BPF (CONFIG_BPF_SYSCALL=y) and/or that RLIMIT_MEMLOCK is set to big enough value.\n",
| ^~~~~~~
libbpf.c: In function ‘map_is_reuse_compat’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5047:17: note: in expansion of macro ‘pr_warn’
5047 | pr_warn("failed to get map info for map FD %d: %s\n", map_fd,
| ^~~~~~~
libbpf.c: In function ‘bpf_object__reuse_map’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5084:17: note: in expansion of macro ‘pr_warn’
5084 | pr_warn("couldn't retrieve pinned map '%s': %s\n",
| ^~~~~~~
libbpf.c: In function ‘bpf_object__populate_internal_map’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5125:17: note: in expansion of macro ‘pr_warn’
5125 | pr_warn("map '%s': failed to set initial contents: %s\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5135:25: note: in expansion of macro ‘pr_warn’
5135 | pr_warn("map '%s': failed to freeze as read-only: %s\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5162:25: note: in expansion of macro ‘pr_warn’
5162 | pr_warn("map '%s': failed to re-mmap() contents: %s\n",
| ^~~~~~~
libbpf.c: In function ‘bpf_object__create_map’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5220:33: note: in expansion of macro ‘pr_warn’
5220 | pr_warn("map '%s': failed to create inner map: %s\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5276:17: note: in expansion of macro ‘pr_warn’
5276 | pr_warn("Error in bpf_create_map_xattr(%s): %s. Retrying without BTF.\n",
| ^~~~~~~
libbpf.c: In function ‘init_map_in_map_slots’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 7 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5332:25: note: in expansion of macro ‘pr_warn’
5332 | pr_warn("map '%s': failed to initialize slot [%d] to map '%s' fd=%d: %s\n",
| ^~~~~~~
libbpf.c: In function ‘init_prog_array_slots’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 7 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5365:25: note: in expansion of macro ‘pr_warn’
5365 | pr_warn("map '%s': failed to initialize slot [%d] to prog '%s' fd=%d: %s\n",
| ^~~~~~~
libbpf.c: In function ‘bpf_object__create_maps’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5492:41: note: in expansion of macro ‘pr_warn’
5492 | pr_warn("map '%s': failed to mmap arena: %s\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 5 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5515:33: note: in expansion of macro ‘pr_warn’
5515 | pr_warn("map '%s': failed to auto-pin at '%s': %s\n",
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5525:9: note: in expansion of macro ‘pr_warn’
5525 | pr_warn("map '%s': failed to create: %s\n", map->name, errstr(err));
| ^~~~~~~
libbpf.c: In function ‘load_module_btfs’:
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5649:25: note: in expansion of macro ‘pr_warn’
5649 | pr_warn("failed to iterate BTF objects: %s\n", errstr(err));
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~
libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
| ^~~~
libbpf.c:5658:25: note: in expansion of macro ‘pr_warn’
5658 | pr_warn("failed to get BTF object #%d FD: %s\n", id, errstr(err));
| ^~~~~~~
libbpf_internal.h:167:29: error: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Werror=format=]
167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~libbpf_internal.h:170:33: note: in expansion of macro ‘__pr’
170 | #define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
[...]
libbpf.c:13965:25: note: in expansion of macro ‘pr_warn’
13965 | pr_warn("map '%s': failed to auto-attach: %s\n",
| ^~~~~~~cc1: all warnings being treated as errors
make[8]: *** [/home/build/linux-stable-rc/tools/build/Makefile.build:105: /home/build/linux-stable-rc/tools/bpf/resolve_btfids/libbpf/staticobjs/libbpf.o] Error 1 make[7]: *** [Makefile:165: /home/build/linux-stable-rc/tools/bpf/resolve_btfids/libbpf/staticobjs/libbpf-in.o] Error 2
make[6]: *** [Makefile:63: /home/build/linux-stable-rc/tools/bpf/resolve_btfids//libbpf/libbpf.a] Error 2
make[5]: *** [Makefile:76: bpf/resolve_btfids] Error 2
make[4]: *** [Makefile:1391: tools/bpf/resolve_btfids] Error 2
Regards,
Salvatore
Re: [PATCH 6.12 354/666] libbpf: Stringify errno in log messages in libbpf.c
Hi Greg,
Quoted 14 lines
Quoted 7 lines
From: Mykyta Yatsenko <[email protected]>
[ Upstream commit
271abf041cb354ce99df33ce1f99db79faf90477]Convert numeric error codes into the string representations in log messages in
libbpf.c.Quoted 6 lines
Signed-off-by Mykyta Yatsenko <[email protected]>Signed-off-by Andrii Nakryiko <[email protected]>Stable-dep-of:
380044c40b16("libbpf: Prevent double close and leak of btf objects")Signed-off-by Sasha Levin <[email protected]>---
Quoted 3 lines
This commit caused a build failure while testing 6.12.91-rc1 to prepare it for Debian:
+ 1 for Oracle Linux.
I cherry-picked this commit: 1633a83bf993 ("libbpf: Introduce errstr() for stringifying errno") and it seems to work, so Greg, can you please queue this up as a prerequisite for this commit ?
Quoted 10 lines
make -f
/home/build/linux-stable-rc/tools/build/Makefile.builddir=./arch/x86 obj=objtool
In file included from libbpf.c:54:libbpf.c: In function ‘bpf_object__elf_init’:
libbpf.c:1538:76: error: implicit declaration of function ‘errstr’; did you mean ‘strstr’? [-Werror=implicit-function-declaration]
1538 |pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~
libbpf_internal.h:167:47: note: in definition of macro ‘__pr’
167 |libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
| ^~~~~~~~~~~
libbpf.c:1538:25: note: in expansion of macro ‘pr_warn’
Quoted 8 lines
1538 | pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err)); | ^~~~~~~libbpf.c:1538:76: error: nested extern declaration of ‘errstr’ [-Werror=nested-externs]
1538 |pr_warn("elf: failed to open %s: %s\n", obj->path, errstr(err));
| ^~~~~~
libbpf_internal.h:167:47: note: in definition of macro ‘__pr’167 | libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \ |
thanks,
Harshit
Sasha Levin
maintainerRe: [PATCH 6.12 354/666] libbpf: Stringify errno in log messages in libbpf.c
In reply to Salvatore BonaccorsoQuoted 5 lines · Salvatore Bonaccorso
This commit caused a build failure while testing 6.12.91-rc1 to prepare it for Debian:
[...]
libbpf.c:1538:76: error: implicit declaration of function 'errstr'; did you mean 'strstr'? [-Werror=implicit-function-declaration]
Dropped from the 6.12 queue along with its two dep-of companions:
- libbpf: Stringify errno in log messages in libbpf.c
- libbpf: Prevent double close and leak of btf objects
- libbpf: Change log level of btf loading error message
The errstr() helper would need a larger libbpf refactor (c68b6fdc3600 and its prerequisites) to come along, which doesn't apply cleanly. Thanks for the report.
--
Thanks,
Sasha
Re: [PATCH 6.12 354/666] libbpf: Stringify errno in log messages in libbpf.c
Hi Sasha,
Am 21.05.2026 um 14:55 schrieb Sasha Levin:
Quoted 13 lines · Salvatore Bonaccorso
Quoted 5 lines
This commit caused a build failure while testing 6.12.91-rc1 to prepare it for Debian:
[...]
libbpf.c:1538:76: error: implicit declaration of function 'errstr'; did you mean 'strstr'? [-Werror=implicit-function-declaration]Dropped from the 6.12 queue along with its two dep-of companions:
- libbpf: Stringify errno in log messages in
libbpf.c
- libbpf: Prevent double close and leak of btf objects
- libbpf: Change log level of btf loading error message
Quoted 7 lines
The
errstr()helper would need a larger libbpf refactor (c68b6fdc3600and its prerequisites) to come along, which doesn't apply cleanly. Thanks for the report.--
Thanks,
Sasha
I get the same build error. I tried, as you suggested, to revert
2e81d08459c32c57d037ad160e755bcfe6d5003b (libbpf: Stringify errno in log messages in libbpf.c) 5c758117c381172ccb60fe9a0313705794ccdce2 (libbpf: Prevent double close and leak of btf objects) a8061c6ed62cc94a5e19f0e31d03d23ff65d638a (libbpf: Change log level of btf loading error message)
but no matter how I do the revert, I get a conflict and I can't figure out how to resolve that.
Will wait to retest an -rc2 once it's pushed out...
Beste Grüße,
Peter Schneider
Signature · 8 lines
Climb the mountain not to plant your flag, but to embrace the challenge, enjoy the air and behold the view. Climb it so you can see the world, not so the world can see you. -- David McCullough Jr. OpenPGP: 0xA3828BD796CCE11A8CADE8866E3A92C92C3FF244 Download: https://www.peters-netzplatz.de/download/pschneider1968_pub.asc https://keys.mailvelope.com/pks/lookup?op=get&[email protected] https://keys.mailvelope.com/pks/lookup?op=get&[email protected]
Greg Kroah-Hartman
maintainerPATCH 355/666 libbpf: Prevent double close and leak of btf objects
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit 380044c40b1636a72fd8f188b5806be6ae564279 ]
Sashiko found possible double close of btf object fd [1], which happens when strdup in load_module_btfs fails at which point the obj->btf_module_cnt is already incremented.
The error path close btf fd and so does later cleanup code in bpf_object_post_load_cleanup function.
Also libbpf_ensure_mem failure leaves btf object not assigned and it's leaked.
Replacing the err_out label with break to make the error path less confusing as suggested by Alan.
Incrementing obj->btf_module_cnt only if there's no failure and releasing btf object in error path.
[1] https://sashiko.dev/#/patchset/20260324081846.2334094-1-jolsa%40kernel.org
--- tools/lib/bpf/libbpf.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
tools/lib/bpf/libbpf.c +11 -10
@@ -5664,11 +5664,12 @@ static int load_module_btfs(struct bpf_object *obj) info.name =ptr_to_u64 (name); info.name_len =sizeof (name); + btf =NULL ; err =bpf_btf_get_info_by_fd (fd, &info, &len);if (err) { err = -errno;pr_warn ("failed to get BTF object #%d info: %s\n" , id,errstr (err)); - goto err_out; +break ; }/* ignore non-module BTFs */
@@ -5682,15 +5683,15 @@ static int load_module_btfs(struct bpf_object *obj)if (err) {pr_warn ("failed to load module [%s]'s BTF object #%d: %s\n" , name, id,errstr (err)); - goto err_out; +break ; } err =libbpf_ensure_mem ((void **)&obj->btf_modules, &obj->btf_module_cap,sizeof (*obj->btf_modules), obj->btf_module_cnt +1 );if (err) - goto err_out; +break ; - mod_btf = &obj->btf_modules[obj->btf_module_cnt++]; + mod_btf = &obj->btf_modules[obj->btf_module_cnt]; mod_btf->btf = btf; mod_btf->id = id;
@@ -5698,16 +5699,16 @@ static int load_module_btfs(struct bpf_object *obj) mod_btf->name =strdup (name);if (!mod_btf->name) { err = -ENOMEM ; - goto err_out; +break ; } -continue ; + obj->btf_module_cnt++; + } -err_out: +if (err) { +btf__free (btf);close (fd); -return err; } - -return 0 ; +return err; } static struct bpf_core_cand_list *
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 356/666 bpf: Validate node_id in arena_alloc_pages()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Puranjay Mohan <[email protected]>
[ Upstream commit 2845989f2ebaf7848e4eccf9a779daf3156ea0a5 ]
arena_alloc_pages() accepts a plain int node_id and forwards it through the entire allocation chain without any bounds checking.
Validate node_id before passing it down the allocation chain in arena_alloc_pages().
--- kernel/bpf/arena.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/bpf/arena.c +4 -0
@@ -438,6 +438,10 @@ static long arena_alloc_pages(struct bpf_arena *arena, long uaddr, long page_cntu32 uaddr32;int ret, i; +if (node_id !=NUMA_NO_NODE && + ((unsigned int )node_id >= nr_node_ids || !node_online (node_id))) +return 0 ; +if (page_cnt > page_cnt_max)return 0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 357/666 bpf, arm32: Reject BPF-to-BPF calls and callbacks in the JIT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Puranjay Mohan <[email protected]>
[ Upstream commit e1d486445af3c392628532229f7ce5f5cf7891b6 ]
The ARM32 BPF JIT does not support BPF-to-BPF function calls (BPF_PSEUDO_CALL) or callbacks (BPF_PSEUDO_FUNC), but it does not reject them either.
When a program with subprograms is loaded (e.g. libxdp's XDP dispatcher uses __noinline__ subprograms, or any program using callbacks like bpf_loop or bpf_for_each_map_elem), the verifier invokes bpf_jit_subprogs() which calls bpf_int_jit_compile() for each subprogram.
For BPF_PSEUDO_CALL, since ARM32 does not reject it, the JIT silently emits code using the wrong address computation:
func = __bpf_call_base + imm
where imm is a pc-relative subprogram offset, producing a bogus function pointer.
For BPF_PSEUDO_FUNC, the ldimm64 handler ignores src_reg and loads the immediate as a normal 64-bit value without error.
In both cases, build_body() reports success and a JIT image is allocated. ARM32 lacks the jit_data/extra_pass mechanism needed for the second JIT pass in bpf_jit_subprogs(). On the second pass, bpf_int_jit_compile() performs a full fresh compilation, allocating a new JIT binary and overwriting prog->bpf_func. The first allocation is never freed. bpf_jit_subprogs() then detects the function pointer changed and aborts with -ENOTSUPP, but the original JIT binary has already been leaked. Each program load/unload cycle leaks one JIT binary allocation, as reported by kmemleak:
unreferenced object 0xbf0a1000 (size 4096):
backtrace:
bpf_jit_binary_alloc+0x64/0xfc
bpf_int_jit_compile+0x14c/0x348
bpf_jit_subprogs+0x4fc/0xa60Fix this by rejecting both BPF_PSEUDO_CALL in the BPF_CALL handler and BPF_PSEUDO_FUNC in the BPF_LD_IMM64 handler, falling through to the existing 'notyet' path. This causes build_body() to fail before any JIT binary is allocated, so bpf_int_jit_compile() returns the original program unjitted. bpf_jit_subprogs() then sees !prog->jited and cleanly falls back to the interpreter with no leak.
--- arch/arm/net/bpf_jit_32.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/arm/net/bpf_jit_32.c +6 -0
@@ -1852,6 +1852,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx) {u64 val = (u32 )imm | (u64 )insn[1 ].imm <<32 ; +if (insn->src_reg ==BPF_PSEUDO_FUNC ) + goto notyet; +emit_a32_mov_i64 (dst, val, ctx);return 1 ;
@@ -2055,6 +2058,9 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)const s8 *r5 = bpf2a32[BPF_REG_5 ];const u32 func = (u32 )__bpf_call_base + (u32 )imm; +if (insn->src_reg ==BPF_PSEUDO_CALL ) + goto notyet; +emit_a32_mov_r64 (true, r0, r1, ctx);emit_a32_mov_r64 (true, r1, r2, ctx);emit_push_r64 (r5, ctx);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 358/666 pinctrl: pinctrl-pic32: Fix resource leak
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Tidmore <[email protected]>
[ Upstream commit fe5560688f3ba98364c7de7b4f8dc240ffd1ff75 ]
Fix three possible resource leaks by using the devres version of clk_prepare_enable(). Also, update error message accordingly.
Detected by Smatch:drivers/pinctrl/pinctrl-pic32.c:2211 pic32_pinctrl_probe() warn:
'pctl->clk' from clk_prepare_enable() not released on lines: 2208.
drivers/pinctrl/pinctrl-pic32.c:2274 pic32_gpio_probe() warn:
'bank->clk' from clk_prepare_enable() not released on lines: 2264,2272.
--- drivers/pinctrl/pinctrl-pic32.c | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-)
drivers/pinctrl/pinctrl-pic32.c +4 -16
@@ -2173,16 +2173,10 @@ static int pic32_pinctrl_probe(struct platform_device *pdev)if (IS_ERR (pctl->reg_base))return PTR_ERR (pctl->reg_base); - pctl->clk =devm_clk_get (&pdev->dev,NULL ); + pctl->clk =devm_clk_get_enabled (&pdev->dev,NULL );if (IS_ERR (pctl->clk)) { ret =PTR_ERR (pctl->clk); -dev_err (&pdev->dev,"clk get failed\n" ); -return ret; - } - - ret =clk_prepare_enable (pctl->clk); -if (ret) { -dev_err (&pdev->dev,"clk enable failed\n" ); +dev_err (&pdev->dev,"Failed to get and enable clock\n" );return ret; }
@@ -2238,16 +2232,10 @@ static int pic32_gpio_probe(struct platform_device *pdev)if (irq <0 )return irq; - bank->clk =devm_clk_get (&pdev->dev,NULL ); + bank->clk =devm_clk_get_enabled (&pdev->dev,NULL );if (IS_ERR (bank->clk)) { ret =PTR_ERR (bank->clk); -dev_err (&pdev->dev,"clk get failed\n" ); -return ret; - } - - ret =clk_prepare_enable (bank->clk); -if (ret) { -dev_err (&pdev->dev,"clk enable failed\n" ); +dev_err (&pdev->dev,"Failed to get and enable clock\n" );return ret; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 359/666 pinctrl: cy8c95x0: remove duplicate error message
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 970dacb3b9f0fedbbbcfd7dbf1f4f22340b3f359 ]
The pin control core is covered to report any error via message. The devm_request_threaded_irq() already prints an error message. Remove the duplicates.
While at it, drop the info message as the same information about an IRQ in use can be retrieved differently.
Stable-dep-of: 5ad32c3607cf ("pinctrl: cy8c95x0: Avoid returning positive values to user space")
--- drivers/pinctrl/pinctrl-cy8c95x0.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-)
drivers/pinctrl/pinctrl-cy8c95x0.c +5 -16
@@ -1345,6 +1345,7 @@ static int cy8c95x0_irq_setup(struct cy8c95x0_pinctrl *chip, int irq) {struct gpio_irq_chip *girq = &chip->gpio_chip.irq;DECLARE_BITMAP (pending_irqs,MAX_LINE ); +struct device *dev = chip->dev;int ret;mutex_init (&chip->irq_lock);
@@ -1371,17 +1372,9 @@ static int cy8c95x0_irq_setup(struct cy8c95x0_pinctrl *chip, int irq) girq->handler = handle_simple_irq; girq->threaded = true; - ret =devm_request_threaded_irq (chip->dev, irq, -NULL , cy8c95x0_irq_handler, -IRQF_ONESHOT |IRQF_SHARED , -dev_name (chip->dev), chip); -if (ret) { -dev_err (chip->dev,"failed to request irq %d\n" , irq); -return ret; - } -dev_info (chip->dev,"Registered threaded IRQ\n" ); - -return 0 ; +return devm_request_threaded_irq (dev, irq,NULL , cy8c95x0_irq_handler, +IRQF_ONESHOT |IRQF_SHARED , +dev_name (chip->dev), chip); }static int cy8c95x0_setup_pinctrl (struct cy8c95x0_pinctrl *chip)
@@ -1397,11 +1390,7 @@ static int cy8c95x0_setup_pinctrl(struct cy8c95x0_pinctrl *chip) pd->owner =THIS_MODULE ; chip->pctldev =devm_pinctrl_register (chip->dev, pd, chip); -if (IS_ERR (chip->pctldev)) -return dev_err_probe (chip->dev,PTR_ERR (chip->pctldev), -"can't register controller\n" ); - -return 0 ; +return PTR_ERR_OR_ZERO (chip->pctldev); } static int cy8c95x0_detect(struct i2c_client *client,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 360/666 pinctrl: cy8c95x0: Unify messages with help of dev_err_probe()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 014884732095b982412d13d3220c3fe8483b9b3e ]
Unify error messages that might appear during probe phase by switching to use dev_err_probe().
Stable-dep-of: 5ad32c3607cf ("pinctrl: cy8c95x0: Avoid returning positive values to user space")
--- drivers/pinctrl/pinctrl-cy8c95x0.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/pinctrl/pinctrl-cy8c95x0.c +2 -4
@@ -1354,10 +1354,8 @@ static int cy8c95x0_irq_setup(struct cy8c95x0_pinctrl *chip, int irq)/* Read IRQ status register to clear all pending interrupts */ ret =cy8c95x0_irq_pending (chip, pending_irqs); -if (ret) { -dev_err (chip->dev,"failed to clear irq status register\n" ); -return ret; - } +if (ret) +return dev_err_probe (dev, ret,"failed to clear irq status register\n" );/* Mask all interrupts */ bitmap_fill (chip->irq_mask,MAX_LINE );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 361/666 pinctrl: cy8c95x0: Avoid returning positive values to user space
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 5ad32c3607cf241a1a2680cabd64cbcd757227aa ]
When probe fails due to unclear interrupt status register, it returns a positive number instead of the proper error code. Fix this accordingly.
--- drivers/pinctrl/pinctrl-cy8c95x0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/pinctrl-cy8c95x0.c +1 -1
@@ -1355,7 +1355,7 @@ static int cy8c95x0_irq_setup(struct cy8c95x0_pinctrl *chip, int irq)/* Read IRQ status register to clear all pending interrupts */ ret =cy8c95x0_irq_pending (chip, pending_irqs);if (ret) -return dev_err_probe (dev, ret,"failed to clear irq status register\n" ); +return dev_err_probe (dev, -EBUSY ,"failed to clear irq status register\n" );/* Mask all interrupts */ bitmap_fill (chip->irq_mask,MAX_LINE );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 362/666 perf branch: Avoid incrementing NULL
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit c969a9d7bbf46f983c4a48566b3b2f7340b02296 ]
If the entry is NULL the value is meaningless so early return NULL to avoid an increment of NULL. This was happening in calls from has_stitched_lbr when running the "perf record LBR tests". The return value isn't used in that case, so returning NULL as no effect.
--- tools/perf/util/branch.h | 3 +++ 1 file changed, 3 insertions(+)
tools/perf/util/branch.h +3 -0
@@ -65,6 +65,9 @@ static inline struct branch_entry *perf_sample__branch_entries(struct perf_sampl {u64 *entry = (u64 *)sample->branch_stack; +if (entry ==NULL ) +return NULL ; + entry++;if (sample->no_hw_idx)return (struct branch_entry *)entry;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 363/666 perf: tools: cs-etm: Fix print issue for Coresight debug in ETE/TRBE trace
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Leach <[email protected]>
[ Upstream commit 6c478e7b3eba3f387a2d6c749e3e3ee0f8ad1c53 ]
Building perf with CORESIGHT=1 and the optional CSTRACE_RAW=1 enables additional debug printing of raw trace data when using command:- perf report --dump.
This raw trace prints the CoreSight formatted trace frames, which may be used to investigate suspected issues with trace quality / corruption / decode.
These frames are not present in ETE + TRBE trace. This fix removes the unnecessary call to print these frames.
This fix also rationalises implementation - original code had helper function that unnecessarily repeated initialisation calls that had already been made.
Due to an addtional fault with the OpenCSD library, this call when ETE/TRBE are being decoded will cause a segfault in perf. This fix also prevents that problem for perf using older (<= 1.8.0 version) OpenCSD libraries.
--- .../perf/util/cs-etm-decoder/cs-etm-decoder.c | 51 +++++-------------- 1 file changed, 13 insertions(+), 38 deletions(-)
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +13 -38
@@ -237,46 +237,24 @@ cs_etm_decoder__init_def_logger_printing(struct cs_etm_decoder_params *d_params, (void *)decoder, cs_etm_decoder__print_str_cb);if (ret !=0 ) - ret =-1 ; - -return 0 ; -} +return -1 ;#ifdef CS_LOG_RAW_FRAMES -static void -cs_etm_decoder__init_raw_frame_logging (struct cs_etm_decoder_params *d_params, -struct cs_etm_decoder *decoder) -{ -/* Only log these during a --dump operation */ -if (d_params->operation ==CS_ETM_OPERATION_PRINT ) { -/* set up a library default logger to process the -* raw frame printer we add later -*/ -ocsd_def_errlog_init (OCSD_ERR_SEV_ERROR ,1 ); - -/* no stdout / err / file output */ -ocsd_def_errlog_config_output (C_API_MSGLOGOUT_FLG_NONE ,NULL ); - -/* set the string CB for the default logger, -* passes strings to perf print logger. -*/ -ocsd_def_errlog_set_strprint_cb (decoder->dcd_tree, - (void *)decoder, - cs_etm_decoder__print_str_cb); - +/* +* Only log raw frames if --dump operation and hardware is actually +* generating formatted CoreSight trace frames +*/ +if ((d_params->operation ==CS_ETM_OPERATION_PRINT ) && + (d_params->formatted == true)) {/* use the built in library printer for the raw frames */ -ocsd_dt_set_raw_frame_printer (decoder->dcd_tree, -CS_RAW_DEBUG_FLAGS ); + ret =ocsd_dt_set_raw_frame_printer (decoder->dcd_tree, +CS_RAW_DEBUG_FLAGS ); +if (ret !=0 ) +return -1 ; } -} -#else -static void -cs_etm_decoder__init_raw_frame_logging ( -struct cs_etm_decoder_params *d_params__maybe_unused , -struct cs_etm_decoder *decoder__maybe_unused ) -{ -}#endif +return 0 ; +} static ocsd_datapath_resp_t cs_etm_decoder__do_soft_timestamp(struct cs_etm_queue *etmq,
@@ -755,9 +733,6 @@ cs_etm_decoder__new(int decoders, struct cs_etm_decoder_params *d_params,if (ret !=0 ) goto err_free_decoder; -/* init raw frame logging if required */ -cs_etm_decoder__init_raw_frame_logging (d_params, decoder); -for (i =0 ; i < decoders; i++) { ret = cs_etm_decoder__create_etm_decoder(d_params, &t_params[i],
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 364/666 pinctrl: realtek: Fix function signature for config argument
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu-Chun Lin <[email protected]>
[ Upstream commit 1f5451844786ed203605528dca9e5d84ed378160 ]
The argument originates from pinconf_to_config_argument(), which returns a u32. Therefore, the arg parameter should be an unsigned int instead of enum pin_config_param.
--- drivers/pinctrl/realtek/pinctrl-rtd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/realtek/pinctrl-rtd.c +1 -1
@@ -279,7 +279,7 @@ static const struct rtd_pin_sconfig_desc *rtd_pinctrl_find_sconfig(struct rtd_pistatic int rtd_pconf_parse_conf (struct rtd_pinctrl *data,unsigned int pinnr,enum pin_config_param param, -enum pin_config_param arg) +unsigned int arg) {const struct rtd_pin_config_desc *config_desc;const struct rtd_pin_sconfig_desc *sconfig_desc;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 365/666 pinctrl: abx500: Fix type of argument variable
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu-Chun Lin <[email protected]>
[ Upstream commit 34006f77890d050e6d80cbee365b5d703c1140b4 ]
The argument variable is assigned the return value of pinconf_to_config_argument(), which returns a u32. Change its type from enum pin_config_param to unsigned int to correctly store the configuration argument.
--- drivers/pinctrl/nomadik/pinctrl-abx500.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/nomadik/pinctrl-abx500.c +1 -1
@@ -855,7 +855,7 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev,int ret = -EINVAL ;int i;enum pin_config_param param; -enum pin_config_param argument; +unsigned int argument;for (i =0 ; i < num_configs; i++) { param =pinconf_to_config_param (configs[i]);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 366/666 pinctrl: renesas: rzg2l: Fix save/restore of {IOLH,IEN,PUPD,SMT} registers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit d9a60e367919752a1d398ebeba667f1e200fae1e ]
The rzg2l_pinctrl_pm_setup_regs() handles save/restore of {IOLH,IEN,PUPD,SMT} registers during s2ram, but only for ports where all pins share the same pincfg. Extend the code to also support ports with variable pincfg per pin, so that {IOLH,IEN,PUPD,SMT} registers are correctly saved and restored for all pins.
--- drivers/pinctrl/renesas/pinctrl-rzg2l.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/pinctrl/renesas/pinctrl-rzg2l.c +7 -0
@@ -2812,6 +2812,13 @@ static void rzg2l_pinctrl_pm_setup_regs(struct rzg2l_pinctrl *pctrl, bool suspen off =RZG2L_PIN_CFG_TO_PORT_OFFSET (cfg); pincnt =hweight8 (FIELD_GET (PIN_CFG_PIN_MAP_MASK , cfg)); +if (cfg &RZG2L_VARIABLE_CFG ) { +unsigned int pin = port *RZG2L_PINS_PER_PORT ; + +for (unsigned int i =0 ; i <RZG2L_PINS_PER_PORT ; i++) + cfg |= *(u64 *)pctrl->desc.pins[pin + i].drv_data; + } + caps =FIELD_GET (PIN_CFG_MASK , cfg); has_iolh = !!(caps & (PIN_CFG_IOLH_A |PIN_CFG_IOLH_B |PIN_CFG_IOLH_C )); has_ien = !!(caps &PIN_CFG_IEN );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 367/666 perf lock: Fix option value type in parse_max_stack
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit cfaade34b52aa1ec553044255702c4b31b57c005 ]
The value is a void* and the address of an int, max_stack_depth, is set up in the perf lock options. The parse_max_stack function treats the int* as a long*, make this more correct by declaring the value to be an int*.
--- tools/perf/builtin-lock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/builtin-lock.c +1 -1
@@ -2300,7 +2300,7 @@ static int parse_map_entry(const struct option *opt, const char *str,static int parse_max_stack (const struct option *opt,const char *str,int unset__maybe_unused ) { -unsigned long *len = (unsigned long *)opt->value; +int *len = opt->value;long val;char *endptr;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 368/666 perf stat: Fix opt->value type for parse_cache_level
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 44311ae84ad9177fb311aee856027861c22f17b2 ]
Commit f5803651b4a4 ("perf stat: Choose the most disaggregate command line option") changed aggregation option handling for perf stat but not perf stat report leading to parse_cache_level being passed a struct in the perf stat case but erroneously an aggr_mode enum value for perf stat report. Change the perf stat report aggregation handling to use the same opt_aggr_mode as perf stat. Also, just pass the boolean for consistency with other boolean argument handling.
--- tools/perf/builtin-stat.c | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-)
tools/perf/builtin-stat.c +23 -20
@@ -171,7 +171,7 @@ struct opt_aggr_mode { };/* Turn command line option into most generic aggregation mode setting. */ -static enum aggr_mode opt_aggr_mode_to_aggr_mode (struct opt_aggr_mode *opt_mode) +static enum aggr_mode opt_aggr_mode_to_aggr_mode (const struct opt_aggr_mode *opt_mode) {enum aggr_mode mode =AGGR_GLOBAL ;
@@ -1154,8 +1154,8 @@ static int parse_cache_level(const struct option *opt, int unset __maybe_unused) {int level; -struct opt_aggr_mode *opt_aggr_mode = (struct opt_aggr_mode *)opt->value; -u32 *aggr_level = (u32 *)opt->data; +bool *per_cache = opt->value; +u32 *aggr_level = opt->data;/* * If no string is specified, aggregate based on the topology of
@@ -1193,7 +1193,7 @@ static int parse_cache_level(const struct option *opt,return -EINVAL ; } out: - opt_aggr_mode->cache = true; + *per_cache = true; *aggr_level = level;return 0 ; }
@@ -2316,24 +2316,23 @@ static struct perf_stat perf_stat = {static int __cmd_report (int argc,const char **argv) {struct perf_session *session; +struct opt_aggr_mode opt_mode = {};const struct option options[] = {OPT_STRING ('i' ,"input" , &input_name,"file" ,"input file name" ), -OPT_SET_UINT (0 ,"per-socket" , &perf_stat.aggr_mode, -"aggregate counts per processor socket" ,AGGR_SOCKET ), -OPT_SET_UINT (0 ,"per-die" , &perf_stat.aggr_mode, -"aggregate counts per processor die" ,AGGR_DIE ), -OPT_SET_UINT (0 ,"per-cluster" , &perf_stat.aggr_mode, -"aggregate counts perf processor cluster" ,AGGR_CLUSTER ), -OPT_CALLBACK_OPTARG (0 ,"per-cache" , &perf_stat.aggr_mode, &perf_stat.aggr_level, -"cache level" , -"aggregate count at this cache level (Default: LLC)" , +OPT_BOOLEAN (0 ,"per-thread" , &opt_mode.thread,"aggregate counts per thread" ), +OPT_BOOLEAN (0 ,"per-socket" , &opt_mode.socket, +"aggregate counts per processor socket" ), +OPT_BOOLEAN (0 ,"per-die" , &opt_mode.die,"aggregate counts per processor die" ), +OPT_BOOLEAN (0 ,"per-cluster" , &opt_mode.cluster, +"aggregate counts per processor cluster" ), +OPT_CALLBACK_OPTARG (0 ,"per-cache" , &opt_mode.cache, &perf_stat.aggr_level, +"cache level" ,"aggregate count at this cache level (Default: LLC)" , parse_cache_level), -OPT_SET_UINT (0 ,"per-core" , &perf_stat.aggr_mode, -"aggregate counts per physical processor core" ,AGGR_CORE ), -OPT_SET_UINT (0 ,"per-node" , &perf_stat.aggr_mode, -"aggregate counts per numa node" ,AGGR_NODE ), -OPT_SET_UINT ('A' ,"no-aggr" , &perf_stat.aggr_mode, -"disable CPU count aggregation" ,AGGR_NONE ), +OPT_BOOLEAN (0 ,"per-core" , &opt_mode.core, +"aggregate counts per physical processor core" ), +OPT_BOOLEAN (0 ,"per-node" , &opt_mode.node,"aggregate counts per numa node" ), +OPT_BOOLEAN ('A' ,"no-aggr" , &opt_mode.no_aggr, +"disable aggregation across CPUs or PMUs" ),OPT_END () };struct stat st;
@@ -2341,6 +2340,10 @@ static int __cmd_report(int argc, const char **argv) argc =parse_options (argc, argv, options, stat_report_usage,0 ); + perf_stat.aggr_mode =opt_aggr_mode_to_aggr_mode (&opt_mode); +if (perf_stat.aggr_mode ==AGGR_GLOBAL ) + perf_stat.aggr_mode =AGGR_UNSET ;/* No option found so leave unset. */ +if (!input_name || !strlen (input_name)) {if (!fstat (STDIN_FILENO , &st) &&S_ISFIFO (st.st_mode)) input_name ="-" ;
@@ -2490,7 +2493,7 @@ int cmd_stat(int argc, const char **argv)OPT_BOOLEAN (0 ,"per-die" , &opt_mode.die,"aggregate counts per processor die" ),OPT_BOOLEAN (0 ,"per-cluster" , &opt_mode.cluster,"aggregate counts per processor cluster" ), -OPT_CALLBACK_OPTARG (0 ,"per-cache" , &opt_mode, &stat_config.aggr_level, +OPT_CALLBACK_OPTARG (0 ,"per-cache" , &opt_mode.cache, &stat_config.aggr_level,"cache level" ,"aggregate count at this cache level (Default: LLC)" , parse_cache_level), OPT_BOOLEAN(0, "per-core", &opt_mode.core,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 369/666 perf tools: Fix module symbol resolution for non-zero .text sh_addr
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 9a82bfde4775b7a87cd1a7e791f46f83ae442848 ]
When perf resolves symbols from kernel module ELF files (ET_REL), it converts symbol addresses to file offsets so that sample IPs can be matched to the correct symbol. The conversion adjusts each symbol's st_value:
sym->st_value -= shdr->sh_addr - shdr->sh_offset;
For vmlinux (ET_EXEC), st_value is a virtual address and sh_addr is the section's virtual base, so subtracting sh_addr and adding sh_offset correctly yields a file offset.
For kernel modules (ET_REL), st_value is a section-relative offset. The module loader ignores sh_addr entirely and places symbols at module_base + st_value. Converting to file offset requires only adding sh_offset; subtracting sh_addr introduces an error equal to sh_addr bytes.
When .text has sh_addr == 0 -- the historical norm for simple modules -- both formulas produce the same result and the bug is latent. As modules gain more metadata sections before .text (.note, .static_call.text, etc.), the linker assigns .text a non-zero sh_addr, exposing the defect. For example, nfsd.ko on this kernel has sh_addr=0xa80, kvm-intel.ko has sh_addr=0x1e90.
The effect is that all .text symbols in affected modules shift by sh_addr bytes relative to sample IPs, causing perf report to attribute samples to incorrect, nearby symbols. This was observed as 13% of LLC-load-miss samples misattributed to nfsd_file_get_dio_attrs when the actual hot function was nfsd_cache_lookup, approximately 0xa80 bytes away in the symbol table.
Use the existing dso__rel() flag (already set for ET_REL modules) to select the correct adjustment: add sh_offset for ET_REL, subtract (sh_addr - sh_offset) for ET_EXEC/ET_DYN.
--- tools/perf/util/symbol-elf.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
tools/perf/util/symbol-elf.c +6 -2
@@ -1429,8 +1429,12 @@ static int dso__process_kernel_symbol(struct dso *dso, struct map *map,char dso_name[PATH_MAX ];/* Adjust symbol to map to file offset */ -if (adjust_kernel_syms) - sym->st_value -= shdr->sh_addr - shdr->sh_offset; +if (adjust_kernel_syms) { +if (dso__rel (dso)) + sym->st_value += shdr->sh_offset; +else + sym->st_value -= shdr->sh_addr - shdr->sh_offset; + }if (strcmp (section_name, (dso__short_name (curr_dso) +dso__short_name_len (dso))) ==0 )return 0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 370/666 perf expr: Return -EINVAL for syntax error in expr__find_ids()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leo Yan <[email protected]>
[ Upstream commit 3a61fd866ef9aaa1d3158b460f852b74a2df07f4 ]
expr__find_ids() propagates the parser return value directly. For syntax errors, the parser can return a positive value, but callers treat it as success, e.g., for below case on Arm64 platform:
metric expr 100 * (STALL_SLOT_BACKEND / (CPU_CYCLES * #slots) - BR_MIS_PRED * 3 / CPU_CYCLES) for backend_bound parsing metric: 100 * (STALL_SLOT_BACKEND / (CPU_CYCLES * #slots) - BR_MIS_PRED * 3 / CPU_CYCLES) Failure to read '#slots' literal: #slots = nan
syntax error
Convert positive parser returns in expr__find_ids() to -EINVAL, as a result, the error value will be respected by callers.
Before:
perf stat -C 5
Failure to read '#slots'Failure to read '#slots'Failure to read '#slots'Failure to read '#slots'Segmentation fault
After:
perf stat -C 5
Failure to read '#slots'Cannot find metric or group `Default'
--- tools/perf/util/expr.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/util/expr.c +2 -1
@@ -373,7 +373,8 @@ int expr__find_ids(const char *expr, const char *one,if (one)expr__del_id (ctx, one); -return ret; +/* A positive value means syntax error, convert to -EINVAL */ +return ret >0 ? -EINVAL : ret; }double expr_id_data__value (const struct expr_id_data *data)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 371/666 ipmi: ssif_bmc: fix missing check for copy_to_user() partial failure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Zhang <[email protected]>
[ Upstream commit ea641be7a4faee4351f9c5ed6b188e1bbf5586a6 ]
copy_to_user() returns the number of bytes that could not be copied, with a non-zero value indicating a partial or complete failure. The current code only checks for negative return values and treats all non-negative results as success.
Treating any positive return value from copy_to_user() as an error and returning -EFAULT.
Message-ID: <[email protected]>
--- drivers/char/ipmi/ssif_bmc.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/char/ipmi/ssif_bmc.c +2 -0
@@ -163,6 +163,8 @@ static ssize_t ssif_bmc_read(struct file *file, char __user *buf, size_t count,spin_unlock_irqrestore (&ssif_bmc->lock, flags); ret =copy_to_user (buf, &msg, count); +if (ret >0 ) + ret = -EFAULT ; }return (ret <0 ) ? ret : count;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 372/666 ipmi: ssif_bmc: fix message desynchronization after truncated response
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Zhang <[email protected]>
[ Upstream commit 1d38e849adb6851ee280aa1a1d687b2181549a66 ]
A truncated response, caused by host power-off, or other conditions, can lead to message desynchronization.
Raw trace data (STOP loss scenario, add state transition comment):
1. T-1: Read response phase (SSIF_RES_SENDING)
8271.955342 WR_RCV [03] <- Read polling cmd 8271.955348 RD_REQ [04] <== SSIF_RES_SENDING <- start sending response 8271.955436 RD_PRO [b4] 8271.955527 RD_PRO [00] 8271.955618 RD_PRO [c1] 8271.955707 RD_PRO [00] 8271.955814 RD_PRO [ad] <== SSIF_RES_SENDING <- last byte
<- !! STOP lost (truncated response)
2. T: New Write request arrives, BMC still in SSIF_RES_SENDING
8271.967973 WR_REQ [] <== SSIF_RES_SENDING >> SSIF_ABORTING <- log: unexpected WR_REQ in RES_SENDING 8271.968447 WR_RCV [02] <== SSIF_ABORTING <- do nothing 8271.968452 WR_RCV [02] <== SSIF_ABORTING <- do nothing 8271.968454 WR_RCV [18] <== SSIF_ABORTING <- do nothing 8271.968456 WR_RCV [01] <== SSIF_ABORTING <- do nothing 8271.968458 WR_RCV [66] <== SSIF_ABORTING <- do nothing 8271.978714 STOP [] <== SSIF_ABORTING >> SSIF_READY <- log: unexpected SLAVE STOP in state=SSIF_ABORTING
3. T+1: Next Read polling, treated as a fresh transaction
8271.979125 WR_REQ [] <== SSIF_READY >> SSIF_START 8271.979326 WR_RCV [03] <== SSIF_START >> SSIF_SMBUS_CMD <- smbus_cmd=0x03 8271.979331 RD_REQ [04] <== SSIF_RES_SENDING <- sending response 8271.979427 RD_PRO [b4] <- !! this is T's stale response -> desynchronization
When in SSIF_ABORTING state, a newly arrived command should still be handled to avoid dropping the request or causing message desynchronization.
Message-ID: <[email protected]>
--- drivers/char/ipmi/ssif_bmc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
drivers/char/ipmi/ssif_bmc.c +14 -0
@@ -457,6 +457,15 @@ static bool supported_write_cmd(u8 cmd)return false; } +static bool supported_write_start_cmd (u8 cmd) +{ +if (cmd ==SSIF_IPMI_SINGLEPART_WRITE || + cmd ==SSIF_IPMI_MULTIPART_WRITE_START ) +return true; + +return false; +} +/* Process the IPMI response that will be read by master */ static void handle_read_processed (struct ssif_bmc_ctx *ssif_bmc,u8 *val) {
@@ -708,6 +717,11 @@ static void on_write_received_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) ssif_bmc->state =SSIF_ABORTING ; else ssif_bmc->state = SSIF_REQ_RECVING; + }else if (ssif_bmc->state ==SSIF_ABORTING ) { +if (supported_write_start_cmd (*val)) { + ssif_bmc->state =SSIF_SMBUS_CMD ; + ssif_bmc->aborting = false; + } }/* This is response sending state */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 373/666 ipmi: ssif_bmc: change log level to dbg in irq callback
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jian Zhang <[email protected]>
[ Upstream commit c9c99b7b7051eb7121b3224bfce181fb023b0269 ]
Long-running tests indicate that this logging can occasionally disrupt timing and lead to request/response corruption.
Irq handler need to be executed as fast as possible,
most I2C slave IRQ implementations are byte-level, logging here can significantly affect transfer behavior and timing. It is recommended to use dev_dbg() for these messages.
Message-ID: <[email protected]>
--- drivers/char/ipmi/ssif_bmc.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
drivers/char/ipmi/ssif_bmc.c +9 -9
@@ -568,7 +568,7 @@ static void process_request_part(struct ssif_bmc_ctx *ssif_bmc) len = ssif_bmc->request.len + part->length;/* Do the bound check here, not allow the request len exceed 254 bytes */ if (len >IPMI_SSIF_PAYLOAD_MAX ) { -dev_warn (&ssif_bmc->client->dev, +dev_dbg (&ssif_bmc->client->dev,"Warn: Request exceeded 254 bytes, aborting" );/* Request too long, aborting */ ssif_bmc->aborting = true;
@@ -614,7 +614,7 @@ static void on_read_requested_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) ssif_bmc->state == SSIF_START || ssif_bmc->state == SSIF_REQ_RECVING || ssif_bmc->state == SSIF_RES_SENDING) { -dev_warn (&ssif_bmc->client->dev, +dev_dbg (&ssif_bmc->client->dev,"Warn: %s unexpected READ REQUESTED in state=%s\n" , __func__,state_to_string (ssif_bmc->state)); ssif_bmc->state =SSIF_ABORTING ;
@@ -623,7 +623,7 @@ static void on_read_requested_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) }else if (ssif_bmc->state ==SSIF_SMBUS_CMD ) {if (!supported_read_cmd (ssif_bmc->part_buf.smbus_cmd)) { -dev_warn (&ssif_bmc->client->dev,"Warn: Unknown SMBus read command=0x%x" , +dev_dbg (&ssif_bmc->client->dev,"Warn: Unknown SMBus read command=0x%x" , ssif_bmc->part_buf.smbus_cmd); ssif_bmc->aborting = true; }
@@ -658,7 +658,7 @@ static void on_read_processed_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) ssif_bmc->state == SSIF_START || ssif_bmc->state == SSIF_REQ_RECVING || ssif_bmc->state == SSIF_SMBUS_CMD) { -dev_warn (&ssif_bmc->client->dev, +dev_dbg (&ssif_bmc->client->dev,"Warn: %s unexpected READ PROCESSED in state=%s\n" , __func__,state_to_string (ssif_bmc->state)); ssif_bmc->state =SSIF_ABORTING ;
@@ -683,7 +683,7 @@ static void on_write_requested_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) }else if (ssif_bmc->state ==SSIF_START || ssif_bmc->state ==SSIF_REQ_RECVING || ssif_bmc->state ==SSIF_RES_SENDING ) { -dev_warn (&ssif_bmc->client->dev, +dev_dbg (&ssif_bmc->client->dev,"Warn: %s unexpected WRITE REQUEST in state=%s\n" , __func__,state_to_string (ssif_bmc->state)); ssif_bmc->state =SSIF_ABORTING ;
@@ -698,7 +698,7 @@ static void on_write_received_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) {if (ssif_bmc->state ==SSIF_READY || ssif_bmc->state ==SSIF_RES_SENDING ) { -dev_warn (&ssif_bmc->client->dev, +dev_dbg (&ssif_bmc->client->dev,"Warn: %s unexpected WRITE RECEIVED in state=%s\n" , __func__,state_to_string (ssif_bmc->state)); ssif_bmc->state =SSIF_ABORTING ;
@@ -708,7 +708,7 @@ static void on_write_received_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) }else if (ssif_bmc->state ==SSIF_SMBUS_CMD ) {if (!supported_write_cmd (ssif_bmc->part_buf.smbus_cmd)) { -dev_warn (&ssif_bmc->client->dev,"Warn: Unknown SMBus write command=0x%x" , +dev_dbg (&ssif_bmc->client->dev,"Warn: Unknown SMBus write command=0x%x" , ssif_bmc->part_buf.smbus_cmd); ssif_bmc->aborting = true; }
@@ -737,7 +737,7 @@ static void on_stop_event(struct ssif_bmc_ctx *ssif_bmc, u8 *val) ssif_bmc->state == SSIF_START || ssif_bmc->state == SSIF_SMBUS_CMD || ssif_bmc->state == SSIF_ABORTING) { -dev_warn (&ssif_bmc->client->dev, +dev_dbg (&ssif_bmc->client->dev,"Warn: %s unexpected SLAVE STOP in state=%s\n" , __func__,state_to_string (ssif_bmc->state)); ssif_bmc->state =SSIF_READY ;
@@ -804,7 +804,7 @@ static int ssif_bmc_cb(struct i2c_client *client, enum i2c_slave_event event, u8break ;default : -dev_warn (&ssif_bmc->client->dev,"Warn: Unknown i2c slave event\n" ); +dev_dbg (&ssif_bmc->client->dev,"Warn: Unknown i2c slave event\n" );break ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 374/666 perf evsel: Add alternate_hw_config and use in evsel__match
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 22a4db3c36034e2b034c5b88414680857fc59cf4 ]
There are cases where we want to match events like instructions and cycles with legacy hardware values, in particular in stat-shadow's hard coded metrics. An evsel's name isn't a good point of reference as it gets altered, strstr would be too imprecise and re-parsing the event from its name is silly. Instead, hold the legacy hardware event name, determined during parsing, in the evsel for this matching case.
Inline evsel__match2 that is only used in builtin-diff.
Stable-dep-of: c9ef786c0970 ("perf cgroup: Update metric leader in evlist__expand_cgroup")
--- tools/perf/builtin-diff.c | 6 ++-- tools/perf/util/evsel.c | 21 ++++++++++++ tools/perf/util/evsel.h | 19 ++--------- tools/perf/util/parse-events.c | 59 +++++++++++++++++++++------------- tools/perf/util/parse-events.h | 8 ++++- tools/perf/util/parse-events.y | 2 +- tools/perf/util/pmu.c | 6 +++- tools/perf/util/pmu.h | 2 +- 8 files changed, 77 insertions(+), 46 deletions(-)
tools/perf/builtin-diff.c +3 -3
@@ -469,13 +469,13 @@ static int diff__process_sample_event(const struct perf_tool *tool,static struct perf_diff pdiff; -static struct evsel *evsel_match (struct evsel *evsel, -struct evlist *evlist) +static struct evsel *evsel_match (struct evsel *evsel,struct evlist *evlist) {struct evsel *e;evlist__for_each_entry (evlist, e) { -if (evsel__match2 (evsel, e)) +if ((evsel->core.attr.type == e->core.attr.type) && + (evsel->core.attr.config == e->core.attr.config))return e; }
tools/perf/util/evsel.c +21 -0
@@ -299,6 +299,7 @@ void evsel__init(struct evsel *evsel, evsel->pmu_name =NULL ; evsel->group_pmu_name =NULL ; evsel->skippable = false; + evsel->alternate_hw_config =PERF_COUNT_HW_MAX ; }struct evsel *evsel__new_idx (struct perf_event_attr *attr,int idx)
@@ -445,6 +446,8 @@ struct evsel *evsel__clone(struct evsel *orig)if (evsel__copy_config_terms (evsel, orig) <0 ) goto out_err; + evsel->alternate_hw_config = orig->alternate_hw_config; +return evsel; out_err:
@@ -1856,6 +1859,24 @@ static int evsel__read_tool(struct evsel *evsel, int cpu_map_idx, int thread)return 0 ; } +bool __evsel__match (const struct evsel *evsel,u32 type,u64 config) +{ + +u32 e_type = evsel->core.attr.type; +u64 e_config = evsel->core.attr.config; + +if (e_type != type) { +return type ==PERF_TYPE_HARDWARE && evsel->pmu && evsel->pmu->is_core && + evsel->alternate_hw_config == config; + } + +if ((type ==PERF_TYPE_HARDWARE || type ==PERF_TYPE_HW_CACHE ) && +perf_pmus__supports_extended_type ()) + e_config &=PERF_HW_EVENT_MASK ; + +return e_config == config; +} +int evsel__read_counter (struct evsel *evsel,int cpu_map_idx,int thread) {if (evsel__is_tool (evsel))
tools/perf/util/evsel.h +2 -17
@@ -102,6 +102,7 @@ struct evsel {int bpf_fd;struct bpf_object *bpf_obj;struct list_head config_terms; +u64 alternate_hw_config; };/*
@@ -395,26 +396,10 @@ u64 format_field__intval(struct tep_format_field *field, struct perf_sample *samstruct tep_format_field *evsel__field (struct evsel *evsel,const char *name);struct tep_format_field *evsel__common_field (struct evsel *evsel,const char *name); -static inline bool __evsel__match (const struct evsel *evsel,u32 type,u64 config) -{ -if (evsel->core.attr.type != type) -return false; - -if ((type ==PERF_TYPE_HARDWARE || type ==PERF_TYPE_HW_CACHE ) && -perf_pmus__supports_extended_type ()) -return (evsel->core.attr.config &PERF_HW_EVENT_MASK ) == config; - -return evsel->core.attr.config == config; -} +bool __evsel__match (const struct evsel *evsel,u32 type,u64 config);#define evsel__match (evsel, t, c) __evsel__match(evsel, PERF_TYPE_##t, PERF_COUNT_##c) -static inline bool evsel__match2 (struct evsel *e1,struct evsel *e2) -{ -return (e1->core.attr.type == e2->core.attr.type) && - (e1->core.attr.config == e2->core.attr.config); -} -int evsel__read_counter (struct evsel *evsel,int cpu_map_idx,int thread);int __evsel__read_on_cpu (struct evsel *evsel,int cpu_map_idx,int thread,bool scale);
tools/perf/util/parse-events.c +37 -22
191 lines not on this page · raw message
tools/perf/util/parse-events.h +7 -1
@@ -127,6 +127,12 @@ struct parse_events_term {* value is assumed to be 1. An event name also has no value. */ bool no_value; +/** +* @alternate_hw_config: config is the event name but num is an +* alternate PERF_TYPE_HARDWARE config value which is often nice for the +* sake of quick matching. +*/ +bool alternate_hw_config; };struct parse_events_error {
@@ -238,7 +244,7 @@ struct evsel *parse_events__add_event(int idx, struct perf_event_attr *attr, struct perf_pmu *pmu);int parse_events_multi_pmu_add (struct parse_events_state *parse_state, -const char *event_name, +const char *event_name,u64 hw_config,const struct parse_events_terms *const_parsed_terms,struct list_head **listp,void *loc);
tools/perf/util/parse-events.y +1 -1
@@ -292,7 +292,7 @@ PE_NAME sep_dc struct list_head *list; int err; - err = parse_events_multi_pmu_add(_parse_state, $1, NULL, &list, &@1); + err = parse_events_multi_pmu_add(_parse_state, $1, PERF_COUNT_HW_MAX, NULL, &list, &@1); if (err < 0) { struct parse_events_state *parse_state = _parse_state; struct parse_events_error *error = parse_state->error;
tools/perf/util/pmu.c +5 -1
@@ -1606,7 +1606,7 @@ static int check_info_data(struct perf_pmu *pmu,*/ int perf_pmu__check_alias (struct perf_pmu *pmu,struct parse_events_terms *head_terms,struct perf_pmu_info *info,bool *rewrote_terms, -struct parse_events_error *err) +u64 *alternate_hw_config,struct parse_events_error *err) {struct parse_events_term *term, *h;struct perf_pmu_alias *alias;
@@ -1638,6 +1638,7 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_ NULL);return ret; } + *rewrote_terms = true; ret =check_info_data (pmu, alias, info, err, term->err_term);if (ret)
@@ -1646,6 +1647,9 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_if (alias->per_pkg) info->per_pkg = true; +if (term->alternate_hw_config) + *alternate_hw_config = term->val.num; +list_del_init (&term->list);parse_events_term__delete (term); }
tools/perf/util/pmu.h +1 -1
@@ -220,7 +220,7 @@ __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const char *name);int perf_pmu__format_type (struct perf_pmu *pmu,const char *name);int perf_pmu__check_alias (struct perf_pmu *pmu,struct parse_events_terms *head_terms,struct perf_pmu_info *info,bool *rewrote_terms, -struct parse_events_error *err); +u64 *alternate_hw_config,struct parse_events_error *err);int perf_pmu__find_event (struct perf_pmu *pmu,const char *event,void *state,pmu_event_callback cb);void perf_pmu_format__set_value (void *format,int config,unsigned long *bits);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 375/666 perf tool_pmu: Factor tool events into their own PMU
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 240505b2d0adcdc8fd018117e88dc27b09734735 ]
Rather than treat tool events as a special kind of event, create a tool only PMU where the events/aliases match the existing duration_time, user_time and system_time events. Remove special parsing and printing support for the tool events, but add function calls for when PMU functions are called on a tool_pmu.
Move the tool PMU code in evsel into tool_pmu.c to better encapsulate the tool event behavior in that file.
Stable-dep-of: c9ef786c0970 ("perf cgroup: Update metric leader in evlist__expand_cgroup")
--- tools/perf/builtin-list.c | 13 +- tools/perf/builtin-stat.c | 1 + tools/perf/util/Build | 1 + tools/perf/util/evsel.c | 272 ++-------------------- tools/perf/util/evsel.h | 28 +-- tools/perf/util/metricgroup.c | 1 + tools/perf/util/parse-events.c | 39 ---- tools/perf/util/parse-events.h | 3 - tools/perf/util/parse-events.l | 11 - tools/perf/util/parse-events.y | 16 -- tools/perf/util/pmu.c | 20 +- tools/perf/util/pmu.h | 2 + tools/perf/util/pmus.c | 9 + tools/perf/util/print-events.c | 36 +-- tools/perf/util/print-events.h | 1 - tools/perf/util/stat-display.c | 6 +- tools/perf/util/stat-shadow.c | 1 + tools/perf/util/tool_pmu.c | 411 +++++++++++++++++++++++++++++++++ tools/perf/util/tool_pmu.h | 51 ++++ 19 files changed, 530 insertions(+), 392 deletions(-) create mode 100644 tools/perf/util/tool_pmu.c create mode 100644 tools/perf/util/tool_pmu.h
tools/perf/builtin-list.c +11 -2
@@ -19,6 +19,7 @@#include "util/string2.h" #include "util/strlist.h" #include "util/strbuf.h" +#include "util/tool_pmu.h" #include <subcmd/pager.h> #include <subcmd/parse-options.h> #include <linux/zalloc.h>
@@ -614,9 +615,18 @@ int cmd_list(int argc, const char **argv) event_symbols_hw, PERF_COUNT_HW_MAX); else if (strcmp(argv[i], "sw") == 0 || strcmp(argv[i], "software") == 0) { + char *old_pmu_glob = default_ps.pmu_glob; + print_symbol_events(&print_cb, ps, PERF_TYPE_SOFTWARE, event_symbols_sw, PERF_COUNT_SW_MAX); - print_tool_events(&print_cb, ps); + default_ps.pmu_glob = strdup("tool"); + if (!default_ps.pmu_glob) { + ret = -1; + goto out; + } + perf_pmus__print_pmu_events(&print_cb, ps); + zfree(&default_ps.pmu_glob); + default_ps.pmu_glob = old_pmu_glob; } else if (strcmp(argv[i], "cache") == 0 || strcmp(argv[i], "hwcache") == 0) print_hwcache_events(&print_cb, ps);
@@ -664,7 +674,6 @@ int cmd_list(int argc, const char **argv) event_symbols_hw, PERF_COUNT_HW_MAX);print_symbol_events (&print_cb, ps,PERF_TYPE_SOFTWARE , event_symbols_sw,PERF_COUNT_SW_MAX ); -print_tool_events (&print_cb, ps);print_hwcache_events (&print_cb, ps);perf_pmus__print_pmu_events (&print_cb, ps);print_tracepoint_events (&print_cb, ps);
tools/perf/builtin-stat.c +1 -0
@@ -46,6 +46,7 @@#include "util/parse-events.h" #include "util/pmus.h" #include "util/pmu.h" +#include "util/tool_pmu.h" #include "util/event.h" #include "util/evlist.h" #include "util/evsel.h"
tools/perf/util/Build +1 -0
@@ -83,6 +83,7 @@ perf-util-y += pmu.o perf-util-y += pmus.o perf-util-y += pmu-flex.o perf-util-y += pmu-bison.o +perf-util-y += tool_pmu.o perf-util-y += svghelper.o perf-util-$(CONFIG_LIBTRACEEVENT) += trace-event-info.o perf-util-y += trace-event-scripting.o
tools/perf/util/evsel.c +17 -255
361 lines not on this page · raw message
tools/perf/util/evsel.h +1 -27
@@ -11,6 +11,7 @@#include <perf/evsel.h> #include "symbol_conf.h" #include "pmus.h" +#include "pmu.h" struct bpf_object ;struct cgroup ;
@@ -22,25 +23,9 @@ struct target;struct hashmap ;struct bperf_leader_bpf ;struct bperf_follower_bpf ; -struct perf_pmu ;typedef int (evsel__sb_cb_t )(union perf_event *event,void *data); -enum perf_tool_event { -PERF_TOOL_NONE =0 , -PERF_TOOL_DURATION_TIME =1 , -PERF_TOOL_USER_TIME =2 , -PERF_TOOL_SYSTEM_TIME =3 , - -PERF_TOOL_MAX , -}; - -const char *perf_tool_event__to_str (enum perf_tool_event ev); -enum perf_tool_event perf_tool_event__from_str (const char *str); - -#define perf_tool_event__for_each_event (ev) \ - for ((ev) = PERF_TOOL_DURATION_TIME; (ev) < PERF_TOOL_MAX; ev++) -/** struct evsel - event selector * * @evlist - evlist this evsel is in, if it is in one.
@@ -83,7 +68,6 @@ struct evsel {const char *unit;struct cgroup *cgrp;const char *metric_id; -enum perf_tool_event tool_event;/* parse modifier helper */ int exclude_GH;int sample_read;
@@ -323,21 +307,11 @@ const char *evsel__name(struct evsel *evsel);bool evsel__name_is (struct evsel *evsel,const char *name);const char *evsel__metric_id (const struct evsel *evsel); -static inline bool evsel__is_tool (const struct evsel *evsel) -{ -return evsel->tool_event !=PERF_TOOL_NONE ; -} -static inline bool evsel__is_retire_lat (const struct evsel *evsel) {return evsel->retire_lat; } -static inline enum perf_tool_event evsel__tool_event (const struct evsel *evsel) -{ -return evsel->tool_event; -} -const char *evsel__group_name (struct evsel *evsel);int evsel__group_desc (struct evsel *evsel,char *buf,size_t size);
tools/perf/util/metricgroup.c +1 -0
@@ -14,6 +14,7 @@#include "pmus.h" #include "print-events.h" #include "smt.h" +#include "tool_pmu.h" #include "expr.h" #include "rblist.h" #include <string.h>
tools/perf/util/parse-events.c +0 -39
@@ -302,38 +302,6 @@ static int add_event(struct list_head *list, int *idx, alternate_hw_config) ? 0 : -ENOMEM; } -static int add_event_tool (struct list_head *list,int *idx, -enum perf_tool_event tool_event) -{ -struct evsel *evsel; -struct perf_event_attr attr = { - .type =PERF_TYPE_SOFTWARE , - .config =PERF_COUNT_SW_DUMMY , - }; -struct perf_cpu_map *cpu_list =NULL ; - -if (tool_event ==PERF_TOOL_DURATION_TIME ) { -/* Duration time is gathered globally, pretend it is only on CPU0. */ - cpu_list =perf_cpu_map__new ("0" ); - } - evsel =__add_event (list, idx, &attr,/*init_attr=*/ true,/*name=*/ NULL , -/*metric_id=*/ NULL ,/*pmu=*/ NULL , -/*config_terms=*/ NULL ,/*auto_merge_stats=*/ false, - cpu_list, -/*alternate_hw_config=*/ PERF_COUNT_HW_MAX ); -perf_cpu_map__put (cpu_list); -if (!evsel) -return -ENOMEM ; - evsel->tool_event = tool_event; -if (tool_event ==PERF_TOOL_DURATION_TIME - || tool_event ==PERF_TOOL_USER_TIME - || tool_event ==PERF_TOOL_SYSTEM_TIME ) { -free ((char *)evsel->unit); - evsel->unit =strdup ("ns" ); - } -return 0 ; -} -/** * parse_aliases - search names for entries beginning or equalling str ignoring * case. If mutliple entries in names match str then the longest
@@ -1430,13 +1398,6 @@ int parse_events_add_numeric(struct parse_events_state *parse_state, type, /*extended_type=*/0, config, head_config); } -int parse_events_add_tool (struct parse_events_state *parse_state, -struct list_head *list, -int tool_event) -{ -return add_event_tool (list, &parse_state->idx, tool_event); -} -static bool config_term_percore (struct list_head *config_terms) {struct evsel_config_term *term;
tools/perf/util/parse-events.h +0 -3
@@ -227,9 +227,6 @@ int parse_events_add_numeric(struct parse_events_state *parse_state, u32 type, u64 config, const struct parse_events_terms *head_config, bool wildcard); -int parse_events_add_tool (struct parse_events_state *parse_state, -struct list_head *list, -int tool_event);int parse_events_add_cache (struct list_head *list,int *idx,const char *name,struct parse_events_state *parse_state,struct parse_events_terms *parsed_terms);
tools/perf/util/parse-events.l +0 -11
@@ -121,14 +121,6 @@ static int sym(yyscan_t scanner, int type, int config) return type == PERF_TYPE_HARDWARE ? PE_VALUE_SYM_HW : PE_VALUE_SYM_SW; } -static int tool(yyscan_t scanner, enum perf_tool_event event) -{ - YYSTYPE *yylval = parse_events_get_lval(scanner); - - yylval->num = event; - return PE_VALUE_SYM_TOOL; -} - static int term(yyscan_t scanner, enum parse_events__term_type type) { YYSTYPE *yylval = parse_events_get_lval(scanner);
@@ -404,9 +396,6 @@ cpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COU alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); } -duration_time { return tool(yyscanner, PERF_TOOL_DURATION_TIME); } -user_time { return tool(yyscanner, PERF_TOOL_USER_TIME); } -system_time { return tool(yyscanner, PERF_TOOL_SYSTEM_TIME); } bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); } cgroup-switches { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CGROUP_SWITCHES); }
tools/perf/util/parse-events.y +0 -16
@@ -56,7 +56,6 @@ static void free_list_evsel(struct list_head* list_evsel) %token PE_START_EVENTS PE_START_TERMS %token PE_VALUE PE_VALUE_SYM_HW PE_VALUE_SYM_SW PE_TERM -%token PE_VALUE_SYM_TOOL %token PE_EVENT_NAME %token PE_RAW PE_NAME %token PE_MODIFIER_EVENT PE_MODIFIER_BP PE_BP_COLON PE_BP_SLASH
@@ -68,7 +67,6 @@ static void free_list_evsel(struct list_head* list_evsel) %type <num> PE_VALUE %type <num> PE_VALUE_SYM_HW %type <num> PE_VALUE_SYM_SW -%type <num> PE_VALUE_SYM_TOOL %type <mod> PE_MODIFIER_EVENT %type <term_type> PE_TERM %type <num> value_sym
@@ -350,20 +348,6 @@ value_sym sep_slash_slash_dc PE_ABORT(err); $$ = list; } -| -PE_VALUE_SYM_TOOL sep_slash_slash_dc -{ - struct list_head *list; - int err; - - list = alloc_list(); - if (!list) - YYNOMEM; - err = parse_events_add_tool(_parse_state, list, $1); - if (err) - YYNOMEM; - $$ = list; -} event_legacy_cache: PE_LEGACY_CACHE opt_event_config
tools/perf/util/pmu.c +18 -2
@@ -19,6 +19,7 @@#include "evsel.h" #include "pmu.h" #include "pmus.h" +#include "tool_pmu.h" #include <util/pmu-bison.h> #include <util/pmu-flex.h> #include "parse-events.h"
@@ -1511,6 +1512,9 @@ int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr, {bool zero = !!pmu->perf_event_attr_init_default; +if (perf_pmu__is_tool (pmu)) +return tool_pmu__config_terms (attr, head_terms, err); +/* Fake PMU doesn't have proper terms so nothing to configure in attr. */ if (perf_pmu__is_fake (pmu))return 0 ;
@@ -1623,8 +1627,8 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_ info->scale =0.0 ; info->snapshot = false; -/* Fake PMU doesn't rewrite terms. */ -if (perf_pmu__is_fake (pmu)) +/* Tool/fake PMU doesn't rewrite terms. */ +if (perf_pmu__is_tool (pmu) ||perf_pmu__is_fake (pmu)) goto out;list_for_each_entry_safe (term, h, &head_terms->terms, list) {
@@ -1794,6 +1798,8 @@ bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name) {if (!name)return false; +if (perf_pmu__is_tool (pmu)) +return perf_tool_event__from_str (name) !=PERF_TOOL_NONE ;if (perf_pmu__find_alias (pmu, name,/*load=*/ true) !=NULL )return true;if (pmu->cpu_aliases_added || !pmu->events_table)
@@ -1805,6 +1811,9 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu) {size_t nr; +if (perf_pmu__is_tool (pmu)) +return tool_pmu__num_events (); +pmu_aliases_parse (pmu); nr = pmu->sysfs_aliases + pmu->sys_json_aliases;
@@ -1866,6 +1875,9 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,int ret =0 ;struct strbuf sb; +if (perf_pmu__is_tool (pmu)) +return tool_pmu__for_each_event_cb (pmu, state, cb); +strbuf_init (&sb,/*hint=*/ 0 );pmu_aliases_parse (pmu);pmu_add_cpu_aliases (pmu);
@@ -1954,6 +1966,7 @@ bool perf_pmu__is_software(const struct perf_pmu *pmu)case PERF_TYPE_HW_CACHE :return false;case PERF_TYPE_RAW :return false;case PERF_TYPE_BREAKPOINT :return true; +case PERF_PMU_TYPE_TOOL :return true;default :break ; }for (size_t i =0 ; i <ARRAY_SIZE (known_sw_pmus); i++) {
@@ -2281,6 +2294,9 @@ const char *perf_pmu__name_from_config(struct perf_pmu *pmu, u64 config)if (!pmu)return NULL ; +if (perf_pmu__is_tool (pmu)) +return perf_tool_event__to_str (config); +pmu_aliases_parse (pmu);pmu_add_cpu_aliases (pmu);list_for_each_entry (event, &pmu->aliases, list) {
tools/perf/util/pmu.h +2 -0
@@ -37,6 +37,7 @@ struct perf_pmu_caps { };enum { +PERF_PMU_TYPE_TOOL =0xFFFFFFFE ,PERF_PMU_TYPE_FAKE =0xFFFFFFFF , };
@@ -285,6 +286,7 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const charstruct perf_pmu *perf_pmu__create_placeholder_core_pmu (struct list_head *core_pmus);void perf_pmu__delete (struct perf_pmu *pmu);struct perf_pmu *perf_pmus__find_core_pmu (void ); +const char *perf_pmu__name_from_config (struct perf_pmu *pmu,u64 config);#endif /* __PMU_H */
tools/perf/util/pmus.c +9 -0
@@ -15,6 +15,7 @@#include "evsel.h" #include "pmus.h" #include "pmu.h" +#include "tool_pmu.h" #include "print-events.h" #include "strbuf.h"
@@ -200,6 +201,7 @@ static void pmu_read_sysfs(bool core_only)int fd;DIR *dir;struct dirent *dent; +struct perf_pmu *tool_pmu;if (read_sysfs_all_pmus || (core_only && read_sysfs_core_pmus))return ;
@@ -229,6 +231,10 @@ static void pmu_read_sysfs(bool core_only)pr_err ("Failure to set up any core PMUs\n" ); }list_sort (NULL , &core_pmus, pmus_cmp); +if (!core_only) { + tool_pmu =perf_pmus__tool_pmu (); +list_add_tail (&tool_pmu->list, &other_pmus); + }list_sort (NULL , &other_pmus, pmus_cmp);if (!list_empty (&core_pmus)) { read_sysfs_core_pmus = true;
@@ -584,6 +590,9 @@ void perf_pmus__print_raw_pmu_events(const struct print_callbacks *print_cb, voiint len =pmu_name_len_no_suffix (pmu->name);const char *desc ="(see 'man perf-list' or 'man perf-record' on how to encode it)" ; +if (perf_pmu__is_tool (pmu)) +continue ; +if (!pmu->is_core) desc =NULL ;
tools/perf/util/print-events.c +1 -35
@@ -29,6 +29,7 @@#include "tracepoint.h" #include "pfm.h" #include "thread_map.h" +#include "tool_pmu.h" #include "util.h" #define MAX_NAME_LEN 100
@@ -43,21 +44,6 @@ static const char * const event_type_descriptors[] = { "Hardware breakpoint", }; -static const struct event_symbol event_symbols_tool[PERF_TOOL_MAX ] = { - [PERF_TOOL_DURATION_TIME ] = { - .symbol ="duration_time" , - .alias ="" , - }, - [PERF_TOOL_USER_TIME ] = { - .symbol ="user_time" , - .alias ="" , - }, - [PERF_TOOL_SYSTEM_TIME ] = { - .symbol ="system_time" , - .alias ="" , - }, -}; -/* * Print the events from <debugfs_mount_point>/tracing/events */
@@ -342,24 +328,6 @@ int print_hwcache_events(const struct print_callbacks *print_cb, void *print_stareturn 0 ; } -void print_tool_events (const struct print_callbacks *print_cb,void *print_state) -{ -// Start at 1 because the first enum entry means no tool event. -for (int i =1 ; i <PERF_TOOL_MAX ; ++i) { - print_cb->print_event (print_state, -"tool" , -/*pmu_name=*/ NULL , - event_symbols_tool[i].symbol, - event_symbols_tool[i].alias, -/*scale_unit=*/ NULL , -/*deprecated=*/ false, -"Tool event" , -/*desc=*/ NULL , -/*long_desc=*/ NULL , -/*encoding_desc=*/ NULL ); - } -} -void print_symbol_events (const struct print_callbacks *print_cb,void *print_state,unsigned int type,const struct event_symbol *syms,unsigned int max)
@@ -423,8 +391,6 @@ void print_events(const struct print_callbacks *print_cb, void *print_state)print_symbol_events (print_cb, print_state,PERF_TYPE_SOFTWARE , event_symbols_sw,PERF_COUNT_SW_MAX ); -print_tool_events (print_cb, print_state); -print_hwcache_events (print_cb, print_state);perf_pmus__print_pmu_events (print_cb, print_state);
tools/perf/util/print-events.h +0 -1
@@ -36,7 +36,6 @@ void print_sdt_events(const struct print_callbacks *print_cb, void *print_state)void print_symbol_events (const struct print_callbacks *print_cb,void *print_state,unsigned int type,const struct event_symbol *syms,unsigned int max); -void print_tool_events (const struct print_callbacks *print_cb,void *print_state);void print_tracepoint_events (const struct print_callbacks *print_cb,void *print_state);bool is_event_supported (u8 type,u64 config);
tools/perf/util/stat-display.c +5 -1
@@ -21,6 +21,7 @@#include "iostat.h" #include "pmu.h" #include "pmus.h" +#include "tool_pmu.h" #define CNTR_NOT_SUPPORTED "<not supported>"#define CNTR_NOT_COUNTED "<not counted>"
@@ -946,7 +947,10 @@ static bool should_skip_zero_counter(struct perf_stat_config *config,if (config->aggr_mode ==AGGR_THREAD && config->system_wide)return true; -/* Tool events have the software PMU but are only gathered on 1. */ +/* +* Many tool events are only gathered on the first index, skip other +* zero values. +*/ if (evsel__is_tool (counter))return true;
tools/perf/util/stat-shadow.c +1 -0
@@ -15,6 +15,7 @@#include <linux/zalloc.h> #include "iostat.h" #include "util/hashmap.h" +#include "tool_pmu.h" struct stats walltime_nsecs_stats;struct rusage_stats ru_stats;
tools/perf/util/tool_pmu.c new file +411 -0
411 lines not on this page · raw message
tools/perf/util/tool_pmu.h new file +51 -0
51 lines not on this page · raw message
Signature · 1 line
2.53.0
Re: [PATCH 6.12 375/666] perf tool_pmu: Factor tool events into their own PMU
hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit
240505b2d0adcdc8fd018117e88dc27b09734735]
Quoted 8 lines
Rather than treat tool events as a special kind of event, create a tool only PMU where the events/aliases match the existing
duration_time,user_timeandsystem_timeevents. Remove special parsing and printing support for the tool events, but add function calls for when PMU functions are called on atool_pmu.Move the tool PMU code in evsel into
tool_pmu.cto better encapsulate the tool event behavior in that file.
While building now a complete set of packages for Debian for 6.12.91 where perf tools are included as well, I noticed that now the builds fails. In fact in v6.12.91
$ cd tools $ LC_ALL=C.UTF-8 ARCH=x86 make perf
fails with:
[...]
CC util/stat.outil/tool_pmu.c: In function ‘tool_pmu__config_term’:util/tool_pmu.c:62:49: error: implicit declaration of function ‘parse_events__term_type_str’; did you mean ‘parse_events_term__str’? [-Wimplicit-function-declaration]
62 | parse_events__term_type_str(term->type_term),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| parse_events_term__str
util/tool_pmu.c:61:79: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=]
61 | "unexpected tool event term (%s) %s",
| ~^
| |
| char *
| %d
62 | parse_events__term_type_str(term->type_term),
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| int
cc1: all warnings being treated as errors
CC util/stat-shadow.o
LD util/hisi-ptt-decoder/perf-util-in.o
CC util/stat-display.omake[5]: *** [/home/build/linux-stable-rc/tools/build/Makefile.build:105: util/tool_pmu.o] Error 1 make[5]: *** Waiting for unfinished jobs....
CC util/perf_api_probe.o
LD util/perf-regs-arch/perf-util-in.outil/cgroup.c: In function ‘evlist__expand_cgroup’:util/cgroup.c:498:32: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
498 | if (pos->first_wildcard_match)
| ^~util/cgroup.c:499:38: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
499 | evsel->first_wildcard_match = pos->first_wildcard_match->priv;
| ^~util/cgroup.c:499:66: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
499 | evsel->first_wildcard_match = pos->first_wildcard_match->priv;
| ^~
make[5]: *** [/home/build/linux-stable-rc/tools/build/Makefile.build:105: util/cgroup.o] Error 1
LD util/arm-spe-decoder/perf-util-in.o LD ui/browsers/perf-ui-in.o LD tests/workloads/perf-test-in.o LD ui/perf-ui-in.o LD perf-ui-in.o AR libperf-ui.a LD tests/perf-test-in.o LD perf-test-in.o AR libperf-test.a LD util/scripting-engines/perf-util-in.o LD util/intel-pt-decoder/perf-util-in.o LD perf-in.o
make[4]: *** [/home/build/linux-stable-rc/tools/build/Makefile.build:162: util] Error 2 make[3]: *** [Makefile.perf:789: perf-util-in.o] Error 2
make[3]: *** Waiting for unfinished jobs....
CC pmu-events/pmu-events.o
LD pmu-events/pmu-events-in.o
make[2]: *** [Makefile.perf:292: sub-make] Error 2
make[1]: *** [Makefile:76: all] Error 2
make: *** [Makefile:93: perf] Error 2
Regards,
Salvatore
Re: [PATCH 6.12 375/666] perf tool_pmu: Factor tool events into their own PMU
Quoted 85 lines · Salvatore Bonaccorso
hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit
240505b2d0adcdc8fd018117e88dc27b09734735]Quoted 8 lines
Rather than treat tool events as a special kind of event, create a tool only PMU where the events/aliases match the existing
duration_time,user_timeandsystem_timeevents. Remove special parsing and printing support for the tool events, but add function calls for when PMU functions are called on atool_pmu.Move the tool PMU code in evsel into
tool_pmu.cto better encapsulate the tool event behavior in that file.While building now a complete set of packages for Debian for 6.12.91 where perf tools are included as well, I noticed that now the builds fails. In fact in v6.12.91
$ cd tools $ LC_ALL=C.UTF-8 ARCH=x86 make perffails with:
[...]
CCutil/stat.outil/tool_pmu.c: In function ‘tool_pmu__config_term’:util/tool_pmu.c:62:49: error: implicit declaration of function ‘parse_events__term_type_str’; did you mean ‘parse_events_term__str’? [-Wimplicit-function-declaration]62 | parse_events__term_type_str(term->type_term), | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ | parse_events_term__str util/tool_pmu.c:61:79: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=] 61 | "unexpected tool event term (%s) %s", | ~^ | | | char * | %d 62 | parse_events__term_type_str(term->type_term), | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | int cc1: all warnings being treated as errors CC util/stat-shadow.o LD util/hisi-ptt-decoder/perf-util-in.o CC util/stat-display.omake[5]: *** [
/home/build/linux-stable-rc/tools/build/Makefile.build:105:util/tool_pmu.o] Error 1 make[5]: *** Waiting for unfinished jobs....
CCutil/perf_api_probe.o
LDutil/perf-regs-arch/perf-util-in.outil/cgroup.c: In function ‘evlist__expand_cgroup’:util/cgroup.c:498:32: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
498 | if (pos->first_wildcard_match)
| ^~util/cgroup.c:499:38: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
499 |evsel->first_wildcard_match=pos->first_wildcard_match->priv;
| ^~util/cgroup.c:499:66: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
499 |evsel->first_wildcard_match=pos->first_wildcard_match->priv;
| ^~
make[5]: *** [/home/build/linux-stable-rc/tools/build/Makefile.build:105:util/cgroup.o] Error 1LD util/arm-spe-decoder/perf-util-in.o LD ui/browsers/perf-ui-in.o LD tests/workloads/perf-test-in.o LD ui/perf-ui-in.o LD perf-ui-in.o AR libperf-ui.a LD tests/perf-test-in.o LD perf-test-in.o AR libperf-test.a LD util/scripting-engines/perf-util-in.o LD util/intel-pt-decoder/perf-util-in.o LD perf-in.omake[4]: *** [
/home/build/linux-stable-rc/tools/build/Makefile.build:162: util] Error 2 make[3]: *** [Makefile.perf:789: perf-util-in.o] Error 2
make[3]: *** Waiting for unfinished jobs....
CCpmu-events/pmu-events.o
LDpmu-events/pmu-events-in.o
make[2]: *** [Makefile.perf:292: sub-make] Error 2
make[1]: *** [Makefile:76: all] Error 2
make: *** [Makefile:93: perf] Error 2
Quoted 2 lines
Regards,
Salvatore
Second this - moreover, because of the other commits introduced in tools/perf as of 6.12.91, it's not possible to revert just this one commit without other conflicts.
Cheers,
Tyler
Re: [PATCH 6.12 375/666] perf tool_pmu: Factor tool events into their own PMU
Hello,
Quoted 86 lines · Tyler Stachecki
Quoted 85 lines · Salvatore Bonaccorso
hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit
240505b2d0adcdc8fd018117e88dc27b09734735]Quoted 8 lines
Rather than treat tool events as a special kind of event, create a tool only PMU where the events/aliases match the existing
duration_time,user_timeandsystem_timeevents. Remove special parsing and printing support for the tool events, but add function calls for when PMU functions are called on atool_pmu.Move the tool PMU code in evsel into
tool_pmu.cto better encapsulate the tool event behavior in that file.While building now a complete set of packages for Debian for 6.12.91 where perf tools are included as well, I noticed that now the builds fails. In fact in v6.12.91
$ cd tools $ LC_ALL=C.UTF-8 ARCH=x86 make perffails with:
[...]
CCutil/stat.outil/tool_pmu.c: In function ‘tool_pmu__config_term’:util/tool_pmu.c:62:49: error: implicit declaration of function ‘parse_events__term_type_str’; did you mean ‘parse_events_term__str’? [-Wimplicit-function-declaration]62 | parse_events__term_type_str(term->type_term), | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ | parse_events_term__str util/tool_pmu.c:61:79: error: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int’ [-Werror=format=] 61 | "unexpected tool event term (%s) %s", | ~^ | | | char * | %d 62 | parse_events__term_type_str(term->type_term), | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | int cc1: all warnings being treated as errors CC util/stat-shadow.o LD util/hisi-ptt-decoder/perf-util-in.o CC util/stat-display.omake[5]: *** [
/home/build/linux-stable-rc/tools/build/Makefile.build:105:util/tool_pmu.o] Error 1 make[5]: *** Waiting for unfinished jobs....
CCutil/perf_api_probe.o
LDutil/perf-regs-arch/perf-util-in.outil/cgroup.c: In function ‘evlist__expand_cgroup’:util/cgroup.c:498:32: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
498 | if (pos->first_wildcard_match)
| ^~util/cgroup.c:499:38: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
499 |evsel->first_wildcard_match=pos->first_wildcard_match->priv;
| ^~util/cgroup.c:499:66: error: ‘struct evsel’ has no member named ‘first_wildcard_match’
499 |evsel->first_wildcard_match=pos->first_wildcard_match->priv;
| ^~
make[5]: *** [/home/build/linux-stable-rc/tools/build/Makefile.build:105:util/cgroup.o] Error 1LD util/arm-spe-decoder/perf-util-in.o LD ui/browsers/perf-ui-in.o LD tests/workloads/perf-test-in.o LD ui/perf-ui-in.o LD perf-ui-in.o AR libperf-ui.a LD tests/perf-test-in.o LD perf-test-in.o AR libperf-test.a LD util/scripting-engines/perf-util-in.o LD util/intel-pt-decoder/perf-util-in.o LD perf-in.omake[4]: *** [
/home/build/linux-stable-rc/tools/build/Makefile.build:162: util] Error 2 make[3]: *** [Makefile.perf:789: perf-util-in.o] Error 2
make[3]: *** Waiting for unfinished jobs....
CCpmu-events/pmu-events.o
LDpmu-events/pmu-events-in.o
make[2]: *** [Makefile.perf:292: sub-make] Error 2
make[1]: *** [Makefile:76: all] Error 2
make: *** [Makefile:93: perf] Error 2
Quoted 6 lines
Quoted 2 lines
Regards,
SalvatoreSecond this - moreover, because of the other commits introduced in
tools/perfas of 6.12.91, it's not possible to revert just this one commit without other conflicts.
I don't think it's meant to be in the stable tree. Maybe need to drop this and later patches depend on it.
Thanks,
Namhyung
Greg Kroah-Hartman
maintainerPATCH 376/666 perf python: Add parse_events function
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit f081defccd934a8db309c90a61178e4f2eef386c ]
Add basic parse_events function that takes a string and returns an evlist. As the python evlist is embedded in a pyrf_evlist, and the evsels are embedded in pyrf_evsels, copy the parsed data into those structs and update evsel__clone to enable this.
Stable-dep-of: c9ef786c0970 ("perf cgroup: Update metric leader in evlist__expand_cgroup")
--- tools/perf/util/cgroup.c | 2 +- tools/perf/util/evsel.c | 19 ++++++++----- tools/perf/util/evsel.h | 2 +- tools/perf/util/python.c | 61 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 9 deletions(-)
tools/perf/util/cgroup.c +1 -1
@@ -473,7 +473,7 @@ int evlist__expand_cgroup(struct evlist *evlist, const char *str, leader =NULL ;evlist__for_each_entry (orig_list, pos) { - evsel =evsel__clone (pos); + evsel =evsel__clone (/*dest=*/ NULL , pos);if (evsel ==NULL ) goto out_err;
tools/perf/util/evsel.c +12 -7
@@ -332,7 +332,7 @@ static int evsel__copy_config_terms(struct evsel *dst, struct evsel *src)* The assumption is that @orig is not configured nor opened yet. * So we only care about the attributes that can be set while it's parsed. */ -struct evsel *evsel__clone (struct evsel *orig) +struct evsel *evsel__clone (struct evsel *dest,struct evsel *orig) {struct evsel *evsel;
@@ -345,7 +345,11 @@ struct evsel *evsel__clone(struct evsel *orig)if (orig->bpf_obj)return NULL ; - evsel =evsel__new (&orig->core.attr); +if (dest) + evsel = dest; +else + evsel =evsel__new (&orig->core.attr); +if (evsel ==NULL )return NULL ;
@@ -395,11 +399,12 @@ struct evsel *evsel__clone(struct evsel *orig) evsel->core.leader = orig->core.leader; evsel->max_events = orig->max_events; -free ((char *)evsel->unit); - evsel->unit =strdup (orig->unit); -if (evsel->unit ==NULL ) - goto out_err; - +zfree (&evsel->unit); +if (orig->unit) { + evsel->unit =strdup (orig->unit); +if (evsel->unit ==NULL ) + goto out_err; + } evsel->scale = orig->scale; evsel->snapshot = orig->snapshot; evsel->per_pkg = orig->per_pkg;
tools/perf/util/evsel.h +1 -1
@@ -241,7 +241,7 @@ static inline struct evsel *evsel__new(struct perf_event_attr *attr)return evsel__new_idx (attr,0 ); } -struct evsel *evsel__clone (struct evsel *orig); +struct evsel *evsel__clone (struct evsel *dest,struct evsel *orig);int copy_config_terms (struct list_head *dst,struct list_head *src);void free_config_terms (struct list_head *config_terms);
tools/perf/util/python.c +61 -0
79 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 377/666 perf cgroup: Update metric leader in evlist__expand_cgroup
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit c9ef786c0970991578397043f1c819229e2b7197 ]
When the evlist is expanded the metric leader wasn't being updated. As the original evsel is deleted this creates a use-after-free in stat-shadow's prepare_metric. This was detected running the "perf stat --bpf-counters --for-each-cgroup test" with sanitizers.
The change itself puts the copied evsel into the priv field (known unused because of evsel__clone use) and then in a second pass over the list updates the copied values using the priv pointer.
--- tools/perf/util/cgroup.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-)
tools/perf/util/cgroup.c +23 -7
@@ -417,7 +417,6 @@ int evlist__expand_cgroup(struct evlist *evlist, const char *str, struct rblist *metric_events, bool open_cgroup) {struct evlist *orig_list, *tmp_list; -struct evsel *pos, *evsel, *leader;struct rblist orig_metric_events;struct cgroup *cgrp =NULL ;struct cgroup_name *cn;
@@ -456,6 +455,7 @@ int evlist__expand_cgroup(struct evlist *evlist, const char *str, goto out_err;list_for_each_entry (cn, &cgroup_list, list) { +struct evsel *pos;char *name;if (!cn->used)
@@ -471,21 +471,37 @@ int evlist__expand_cgroup(struct evlist *evlist, const char *str,if (cgrp ==NULL )continue ; - leader =NULL ; +/* copy the list and set to the new cgroup. */ evlist__for_each_entry (orig_list, pos) { - evsel =evsel__clone (/*dest=*/ NULL , pos); +struct evsel *evsel =evsel__clone (/*dest=*/ NULL , pos); +if (evsel ==NULL ) goto out_err; +/* stash the copy during the copying. */ + pos->priv = evsel;cgroup__put (evsel->cgrp); evsel->cgrp =cgroup__get (cgrp); -if (evsel__is_group_leader (pos)) - leader = evsel; -evsel__set_leader (evsel, leader); -evlist__add (tmp_list, evsel); } +/* update leader information using stashed pointer to copy. */ +evlist__for_each_entry (orig_list, pos) { +struct evsel *evsel = pos->priv; + +if (evsel__leader (pos)) +evsel__set_leader (evsel,evsel__leader (pos)->priv); + +if (pos->metric_leader) + evsel->metric_leader = pos->metric_leader->priv; + +if (pos->first_wildcard_match) + evsel->first_wildcard_match = pos->first_wildcard_match->priv; + } +/* the stashed copy is no longer used. */ +evlist__for_each_entry (orig_list, pos) + pos->priv =NULL ; +/* cgroup__new() has a refcount, release it here */ cgroup__put (cgrp); nr_cgroups++;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 378/666 perf maps: Fix copy_from that can break sorted by name order
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit f552b132e4d5248715828e7e5c2bf7889bf05b2e ]
When an parent is copied into a child the name array is populated in address not name order. Make sure the name array isn't flagged as sorted.
--- tools/perf/util/maps.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
tools/perf/util/maps.c +3 -10
@@ -989,16 +989,9 @@ int maps__copy_from(struct maps *dest, struct maps *parent)map__put (new); }maps__set_maps_by_address_sorted (dest,maps__maps_by_address_sorted (parent)); -if (!err) { -RC_CHK_ACCESS (dest)->last_search_by_name_idx = -RC_CHK_ACCESS (parent)->last_search_by_name_idx; -maps__set_maps_by_name_sorted (dest, - dest_maps_by_name && -maps__maps_by_name_sorted (parent)); - }else { -RC_CHK_ACCESS (dest)->last_search_by_name_idx =0 ; -maps__set_maps_by_name_sorted (dest, false); - } +RC_CHK_ACCESS (dest)->last_search_by_name_idx =0 ; +/* Values were copied into the name array in address order. */ +maps__set_maps_by_name_sorted (dest, false); }else {/* Unexpected copying to a maps containing entries. */ for (unsigned int i =0 ; !err && i < n; i++) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 379/666 perf util: Kill die() prototype, dead for a long time
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit e5cce1b9c82fbd48e2f1f7a25a9fad8ee228176f ]
In fef2a735167a827a ("perf tools: Kill die()") the die() function was removed, but not the prototype in util.h, now when building with LIBPERL=1, during a 'make -C tools/perf build-test' routine test, it is failing as perl likes die() calls and then this clashes with this remnant, remove it.
--- tools/perf/util/util.h | 1 - 1 file changed, 1 deletion(-)
tools/perf/util/util.h +0 -1
@@ -26,7 +26,6 @@ extern bool perf_guest;/* General helper functions */ void usage (const char *err)__noreturn ; -void die(const char *err, ...) __noreturn __printf(1, 2);struct dirent ;struct strlist ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 380/666 reset: replace boolean parameters with flags parameter
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Zabel <[email protected]>
[ Upstream commit dad35f7d2fc14e446669d4cab100597a6798eae5 ]
Introduce enum reset_control_flags and replace the list of boolean parameters to the internal reset_control_get functions with a single flags parameter, before adding more boolean options.
The separate boolean parameters have been shown to be error prone in the past. See for example commit a57f68ddc886 ("reset: Fix devm bulk optional exclusive control getter").
Stable-dep-of: bef1eef66718 ("i3c: master: dw-i3c: Fix missing reset assertion in remove() callback")
--- drivers/reset/core.c | 71 +++++++++++-------- include/linux/reset.h | 161 ++++++++++++++++++++++++++---------------- 2 files changed, 139 insertions(+), 93 deletions(-)
drivers/reset/core.c +40 -31
@@ -773,12 +773,19 @@ EXPORT_SYMBOL_GPL(reset_control_bulk_release);static struct reset_control *__reset_control_get_internal (struct reset_controller_dev *rcdev, -unsigned int index,bool shared,bool acquired) +unsigned int index,enum reset_control_flags flags) { +bool shared = flags &RESET_CONTROL_FLAGS_BIT_SHARED ; +bool acquired = flags &RESET_CONTROL_FLAGS_BIT_ACQUIRED ;struct reset_control *rstc;lockdep_assert_held (&reset_list_mutex); +/* Expect callers to filter out OPTIONAL and DEASSERTED bits */ +if (WARN_ON (flags & ~(RESET_CONTROL_FLAGS_BIT_SHARED | +RESET_CONTROL_FLAGS_BIT_ACQUIRED ))) +return ERR_PTR (-EINVAL ); +list_for_each_entry (rstc, &rcdev->reset_control_head, list) {if (rstc->id == index) {/*
@@ -994,8 +1001,9 @@ static struct reset_controller_dev *__reset_find_rcdev(const struct of_phandle_astruct reset_control *__of_reset_control_get (struct device_node *node,const char *id,int index, -bool shared,bool optional,bool acquired) +enum reset_control_flags flags) { +bool optional = flags &RESET_CONTROL_FLAGS_BIT_OPTIONAL ;bool gpio_fallback = false;struct reset_control *rstc;struct reset_controller_dev *rcdev;
@@ -1059,8 +1067,10 @@ __of_reset_control_get(struct device_node *node, const char *id, int index, goto out_unlock; } + flags &= ~RESET_CONTROL_FLAGS_BIT_OPTIONAL ; +/* reset_list_mutex also protects the rcdev's reset_control list */ - rstc =__reset_control_get_internal (rcdev, rstc_id, shared, acquired); + rstc =__reset_control_get_internal (rcdev, rstc_id, flags); out_unlock:mutex_unlock (&reset_list_mutex);
@@ -1091,8 +1101,9 @@ __reset_controller_by_name(const char *name)static struct reset_control *__reset_control_get_from_lookup (struct device *dev,const char *con_id, -bool shared,bool optional,bool acquired) +enum reset_control_flags flags) { +bool optional = flags &RESET_CONTROL_FLAGS_BIT_OPTIONAL ;const struct reset_control_lookup *lookup;struct reset_controller_dev *rcdev;const char *dev_id =dev_name (dev);
@@ -1116,9 +1127,11 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id,return ERR_PTR (-EPROBE_DEFER ); } + flags &= ~RESET_CONTROL_FLAGS_BIT_OPTIONAL ; + rstc =__reset_control_get_internal (rcdev, lookup->index, - shared, acquired); + flags);mutex_unlock (&reset_list_mutex);break ; }
@@ -1133,30 +1146,29 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id, }struct reset_control *__reset_control_get (struct device *dev,const char *id, -int index,bool shared,bool optional, -bool acquired) +int index,enum reset_control_flags flags) { +bool shared = flags &RESET_CONTROL_FLAGS_BIT_SHARED ; +bool acquired = flags &RESET_CONTROL_FLAGS_BIT_ACQUIRED ; +if (WARN_ON (shared && acquired))return ERR_PTR (-EINVAL );if (dev->of_node) -return __of_reset_control_get (dev->of_node, id, index, shared, - optional, acquired); +return __of_reset_control_get (dev->of_node, id, index, flags); -return __reset_control_get_from_lookup (dev, id, shared, optional, - acquired); +return __reset_control_get_from_lookup (dev, id, flags); }EXPORT_SYMBOL_GPL (__reset_control_get);int __reset_control_bulk_get (struct device *dev,int num_rstcs,struct reset_control_bulk_data *rstcs, -bool shared,bool optional,bool acquired) +enum reset_control_flags flags) {int ret, i;for (i =0 ; i < num_rstcs; i++) { - rstcs[i].rstc =__reset_control_get (dev, rstcs[i].id,0 , - shared, optional, acquired); + rstcs[i].rstc =__reset_control_get (dev, rstcs[i].id,0 , flags);if (IS_ERR (rstcs[i].rstc)) { ret =PTR_ERR (rstcs[i].rstc); goto err;
@@ -1226,7 +1238,7 @@ static void devm_reset_control_release(struct device *dev, void *res)struct reset_control *__devm_reset_control_get (struct device *dev,const char *id,int index, -bool shared,bool optional,bool acquired) +enum reset_control_flags flags) {struct reset_control **ptr, *rstc;
@@ -1235,7 +1247,7 @@ __devm_reset_control_get(struct device *dev, const char *id, int index,if (!ptr)return ERR_PTR (-ENOMEM ); - rstc =__reset_control_get (dev, id, index, shared, optional, acquired); + rstc =__reset_control_get (dev, id, index, flags);if (IS_ERR_OR_NULL (rstc)) {devres_free (ptr);return rstc;
@@ -1262,7 +1274,7 @@ static void devm_reset_control_bulk_release(struct device *dev, void *res)int __devm_reset_control_bulk_get (struct device *dev,int num_rstcs,struct reset_control_bulk_data *rstcs, -bool shared,bool optional,bool acquired) +enum reset_control_flags flags) {struct reset_control_bulk_devres *ptr;int ret;
@@ -1272,7 +1284,7 @@ int __devm_reset_control_bulk_get(struct device *dev, int num_rstcs,if (!ptr)return -ENOMEM ; - ret =__reset_control_bulk_get (dev, num_rstcs, rstcs, shared, optional, acquired); + ret =__reset_control_bulk_get (dev, num_rstcs, rstcs, flags);if (ret <0 ) {devres_free (ptr);return ret;
@@ -1298,6 +1310,7 @@ EXPORT_SYMBOL_GPL(__devm_reset_control_bulk_get);*/ int __device_reset (struct device *dev,bool optional) { +enum reset_control_flags flags;struct reset_control *rstc;int ret;
@@ -1313,7 +1326,8 @@ int __device_reset(struct device *dev, bool optional) }#endif - rstc =__reset_control_get (dev,NULL ,0 ,0 , optional, true); + flags = optional ?RESET_CONTROL_OPTIONAL_EXCLUSIVE :RESET_CONTROL_EXCLUSIVE ; + rstc =__reset_control_get (dev,NULL ,0 , flags);if (IS_ERR (rstc))return PTR_ERR (rstc);
@@ -1356,17 +1370,14 @@ static int of_reset_control_get_count(struct device_node *node)* device node. * * @np: device node for the device that requests the reset controls array -* @shared: whether reset controls are shared or not -* @optional: whether it is optional to get the reset controls -* @acquired: only one reset control may be acquired for a given controller -* and ID +* @flags: whether reset controls are shared, optional, acquired * * Returns pointer to allocated reset_control on success or error on failure */ struct reset_control * -of_reset_control_array_get (struct device_node *np,bool shared,bool optional, -bool acquired) +of_reset_control_array_get (struct device_node *np,enum reset_control_flags flags) { +bool optional = flags &RESET_CONTROL_FLAGS_BIT_OPTIONAL ;struct reset_control_array *resets;struct reset_control *rstc;int num, i;
@@ -1381,8 +1392,7 @@ of_reset_control_array_get(struct device_node *np, bool shared, bool optional, resets->num_rstcs = num;for (i =0 ; i < num; i++) { - rstc =__of_reset_control_get (np,NULL , i, shared, optional, - acquired); + rstc =__of_reset_control_get (np,NULL , i, flags);if (IS_ERR (rstc)) goto err_rst; resets->rstc[i] = rstc;
@@ -1407,8 +1417,7 @@ EXPORT_SYMBOL_GPL(of_reset_control_array_get);* devm_reset_control_array_get - Resource managed reset control array get * * @dev: device that requests the list of reset controls -* @shared: whether reset controls are shared or not -* @optional: whether it is optional to get the reset controls +* @flags: whether reset controls are shared, optional, acquired * * The reset control array APIs are intended for a list of resets * that just have to be asserted or deasserted, without any
@@ -1417,7 +1426,7 @@ EXPORT_SYMBOL_GPL(of_reset_control_array_get);* Returns pointer to allocated reset_control on success or error on failure */ struct reset_control * -devm_reset_control_array_get (struct device *dev,bool shared,bool optional) +devm_reset_control_array_get (struct device *dev,enum reset_control_flags flags) {struct reset_control **ptr, *rstc;
@@ -1426,7 +1435,7 @@ devm_reset_control_array_get(struct device *dev, bool shared, bool optional)if (!ptr)return ERR_PTR (-ENOMEM ); - rstc =of_reset_control_array_get (dev->of_node, shared, optional, true); + rstc =of_reset_control_array_get (dev->of_node, flags);if (IS_ERR_OR_NULL (rstc)) {devres_free (ptr);return rstc;
include/linux/reset.h +99 -62
454 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 381/666 reset: Add devres helpers to request pre-deasserted reset controls
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philipp Zabel <[email protected]>
[ Upstream commit d872bed85036f5e60c66b0dd0994346b4ea6470c ]
Add devres helpers
- devm_reset_control_bulk_get_exclusive_deasserted
- devm_reset_control_bulk_get_optional_exclusive_deasserted
- devm_reset_control_bulk_get_optional_shared_deasserted
- devm_reset_control_bulk_get_shared_deasserted
- devm_reset_control_get_exclusive_deasserted
- devm_reset_control_get_optional_exclusive_deasserted
- devm_reset_control_get_optional_shared_deasserted
- devm_reset_control_get_shared_deasserted
to request and immediately deassert reset controls. During cleanup, reset_control_assert() will be called automatically on the returned reset controls.
Stable-dep-of: bef1eef66718 ("i3c: master: dw-i3c: Fix missing reset assertion in remove() callback")
--- drivers/reset/core.c | 48 +++++++++++++++++- include/linux/reset.h | 113 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 159 insertions(+), 2 deletions(-)
drivers/reset/core.c +46 -2
@@ -1236,23 +1236,46 @@ static void devm_reset_control_release(struct device *dev, void *res)reset_control_put (*(struct reset_control **)res); } +static void devm_reset_control_release_deasserted (struct device *dev,void *res) +{ +struct reset_control *rstc = *(struct reset_control **)res; + +reset_control_assert (rstc); +reset_control_put (rstc); +} +struct reset_control *__devm_reset_control_get (struct device *dev,const char *id,int index,enum reset_control_flags flags) {struct reset_control **ptr, *rstc; +bool deasserted = flags &RESET_CONTROL_FLAGS_BIT_DEASSERTED ; - ptr =devres_alloc (devm_reset_control_release,sizeof (*ptr), + ptr =devres_alloc (deasserted ? devm_reset_control_release_deasserted : + devm_reset_control_release,sizeof (*ptr),GFP_KERNEL );if (!ptr)return ERR_PTR (-ENOMEM ); + flags &= ~RESET_CONTROL_FLAGS_BIT_DEASSERTED ; + rstc =__reset_control_get (dev, id, index, flags);if (IS_ERR_OR_NULL (rstc)) {devres_free (ptr);return rstc; } +if (deasserted) { +int ret; + + ret =reset_control_deassert (rstc); +if (ret) { +reset_control_put (rstc); +devres_free (ptr); +return ERR_PTR (ret); + } + } + *ptr = rstc;devres_add (dev, ptr);
@@ -1272,24 +1295,45 @@ static void devm_reset_control_bulk_release(struct device *dev, void *res)reset_control_bulk_put (devres->num_rstcs, devres->rstcs); } +static void devm_reset_control_bulk_release_deasserted (struct device *dev,void *res) +{ +struct reset_control_bulk_devres *devres = res; + +reset_control_bulk_assert (devres->num_rstcs, devres->rstcs); +reset_control_bulk_put (devres->num_rstcs, devres->rstcs); +} +int __devm_reset_control_bulk_get (struct device *dev,int num_rstcs,struct reset_control_bulk_data *rstcs,enum reset_control_flags flags) {struct reset_control_bulk_devres *ptr; +bool deasserted = flags &RESET_CONTROL_FLAGS_BIT_DEASSERTED ;int ret; - ptr =devres_alloc (devm_reset_control_bulk_release,sizeof (*ptr), + ptr =devres_alloc (deasserted ? devm_reset_control_bulk_release_deasserted : + devm_reset_control_bulk_release,sizeof (*ptr),GFP_KERNEL );if (!ptr)return -ENOMEM ; + flags &= ~RESET_CONTROL_FLAGS_BIT_DEASSERTED ; + ret =__reset_control_bulk_get (dev, num_rstcs, rstcs, flags);if (ret <0 ) {devres_free (ptr);return ret; } +if (deasserted) { + ret =reset_control_bulk_deassert (num_rstcs, rstcs); +if (ret) { +reset_control_bulk_put (num_rstcs, rstcs); +devres_free (ptr); +return ret; + } + } + ptr->num_rstcs = num_rstcs; ptr->rstcs = rstcs;devres_add (dev, ptr);
include/linux/reset.h +113 -0
170 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 382/666 i3c: master: dw-i3c: Fix missing reset assertion in remove() callback
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit bef1eef667186cedb0bc6d152464acb3c97d5f72 ]
The reset line acquired during probe is currently left deasserted when the driver is unbound.
Switch to devm_reset_control_get_optional_exclusive_deasserted() to ensure the reset is automatically re-asserted by the devres core when the driver is removed.
--- drivers/i3c/master/dw-i3c-master.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
drivers/i3c/master/dw-i3c-master.c +3 -8
@@ -1566,13 +1566,11 @@ int dw_i3c_common_probe(struct dw_i3c_master *master,if (IS_ERR (master->pclk))return PTR_ERR (master->pclk); - master->core_rst =devm_reset_control_get_optional_exclusive (&pdev->dev, -"core_rst" ); + master->core_rst =devm_reset_control_get_optional_exclusive_deasserted (&pdev->dev, +"core_rst" );if (IS_ERR (master->core_rst))return PTR_ERR (master->core_rst); -reset_control_deassert (master->core_rst); -spin_lock_init (&master->xferqueue.lock);INIT_LIST_HEAD (&master->xferqueue.list);
@@ -1584,7 +1582,7 @@ int dw_i3c_common_probe(struct dw_i3c_master *master, dw_i3c_master_irq_handler,0 , dev_name(&pdev->dev), master);if (ret) - goto err_assert_rst; +return ret;platform_set_drvdata (pdev, master);
@@ -1620,9 +1618,6 @@ int dw_i3c_common_probe(struct dw_i3c_master *master,pm_runtime_set_suspended (&pdev->dev);pm_runtime_dont_use_autosuspend (&pdev->dev); -err_assert_rst: -reset_control_assert (master->core_rst); -return ret; }EXPORT_SYMBOL_GPL (dw_i3c_common_probe);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 383/666 i3c: dw: Fix memory leak in dw_i3c_master_i3c_xfers()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 256cc1f1305a8e5dcadf8ca208d04a3acadd26f1 ]
The dw_i3c_master_i3c_xfers() function allocates memory for the xfer structure using dw_i3c_master_alloc_xfer(). If pm_runtime_resume_and_get() fails, the function returns without freeing the allocated xfer, resulting in a memory leak.
Since dw_i3c_master_free_xfer() is a thin wrapper around kfree(), use the __free(kfree) cleanup attribute to handle the free automatically on all exit paths.
--- drivers/i3c/master/dw-i3c-master.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/i3c/master/dw-i3c-master.c +2 -3
@@ -6,6 +6,7 @@*/ #include <linux/bitops.h> +#include <linux/cleanup.h> #include <linux/clk.h> #include <linux/completion.h> #include <linux/err.h>
@@ -912,7 +913,6 @@ static int dw_i3c_master_priv_xfers(struct i3c_dev_desc *dev,struct i3c_master_controller *m =i3c_dev_get_master (dev);struct dw_i3c_master *master =to_dw_i3c_master (m);unsigned int nrxwords =0 , ntxwords =0 ; -struct dw_i3c_xfer *xfer;int i, ret =0 ;if (!i3c_nxfers)
@@ -932,7 +932,7 @@ static int dw_i3c_master_priv_xfers(struct i3c_dev_desc *dev, nrxwords > master->caps.datafifodepth)return -ENOTSUPP ; - xfer =dw_i3c_master_alloc_xfer (master, i3c_nxfers); + struct dw_i3c_xfer *xfer __free(kfree) = dw_i3c_master_alloc_xfer(master, i3c_nxfers);if (!xfer)return -ENOMEM ;
@@ -983,7 +983,6 @@ static int dw_i3c_master_priv_xfers(struct i3c_dev_desc *dev, } ret = xfer->ret; -dw_i3c_master_free_xfer (xfer);pm_runtime_mark_last_busy (master->dev);pm_runtime_put_autosuspend (master->dev);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 384/666 i3c: master: Fix error codes at send_ccc_cmd
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jorge Marques <[email protected]>
[ Upstream commit ef8b5229348f0719aca557c4ca5530630ae4d134 ]
i3c_master_send_ccc_cmd_locked() would propagate cmd->err (positive, Mx codes) to the ret variable, cascading down multiple methods until reaching methods that explicitly stated they would return 0 on success or negative error code. For example, the call chain:
i3c_device_enable_ibi <- i3c_dev_enable_ibi_locked <- master->ops.enable_ibi <- i3c_master_enec_locked <- i3c_master_enec_disec_locked <- i3c_master_send_ccc_cmd_locked
Fix this by returning the ret value, callers can still read the cmd->err value if ret is negative.
All corner cases where the Mx codes do need to be handled individually, are resolved in previous commits. Those corner cases are all scenarios when I3C_ERROR_M2 is expected and acceptable.
The prerequisite patches for the fix are:
i3c: master: Move rstdaa error suppression
i3c: master: Move entdaa error suppression
i3c: master: Move bus_init error suppression
--- drivers/i3c/master.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-)
drivers/i3c/master.c +13 -19
@@ -825,11 +825,17 @@ static void i3c_ccc_cmd_init(struct i3c_ccc_cmd *cmd, bool rnw, u8 id, cmd->err =I3C_ERROR_UNKNOWN ; } +/** +* i3c_master_send_ccc_cmd_locked() - send a CCC (Common Command Codes) +* @master: master used to send frames on the bus +* @cmd: command to send +* +* Return: 0 in case of success, or a negative error code otherwise. +* I3C Mx error codes are stored in cmd->err. +*/ static int i3c_master_send_ccc_cmd_locked (struct i3c_master_controller *master,struct i3c_ccc_cmd *cmd) { -int ret; -if (!cmd || !master)return -EINVAL ;
@@ -847,15 +853,7 @@ static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, !master->ops->supports_ccc_cmd(master, cmd)) return -ENOTSUPP; - ret = master->ops->send_ccc_cmd (master, cmd); -if (ret) { -if (cmd->err !=I3C_ERROR_UNKNOWN ) -return cmd->err; - -return ret; - } - -return 0 ; +return master->ops->send_ccc_cmd (master, cmd); } static struct i2c_dev_desc *
@@ -959,8 +957,7 @@ static int i3c_master_rstdaa_locked(struct i3c_master_controller *master,* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_entdaa_locked (struct i3c_master_controller *master) {
@@ -1012,8 +1009,7 @@ static int i3c_master_enec_disec_locked(struct i3c_master_controller *master,* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_disec_locked (struct i3c_master_controller *master,u8 addr,u8 evts)
@@ -1033,8 +1029,7 @@ EXPORT_SYMBOL_GPL(i3c_master_disec_locked);* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_enec_locked (struct i3c_master_controller *master,u8 addr,u8 evts)
@@ -1059,8 +1054,7 @@ EXPORT_SYMBOL_GPL(i3c_master_enec_locked);* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_defslvs_locked (struct i3c_master_controller *master) {
Signature · 1 line
2.53.0
Re: [PATCH 6.12 384/666] i3c: master: Fix error codes at send_ccc_cmd
Hi Greg/Sasha,
Quoted 20 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jorge Marques <[email protected]>
[ Upstream commit
ef8b5229348f0719aca557c4ca5530630ae4d134]
i3c_master_send_ccc_cmd_locked()would propagatecmd->err(positive, Mx codes) to the ret variable, cascading down multiple methods until reaching methods that explicitly stated they would return 0 on success or negative error code. For example, the call chain:
i3c_device_enable_ibi<-i3c_dev_enable_ibi_locked<-master->ops.enable_ibi<-i3c_master_enec_locked<-i3c_master_enec_disec_locked<-i3c_master_send_ccc_cmd_lockedFix this by returning the ret value, callers can still read the
cmd->errvalue if ret is negative.
Quoted 9 lines
All corner cases where the Mx codes do need to be handled individually, are resolved in previous commits. Those corner cases are all scenarios when
I3C_ERROR_M2is expected and acceptable.
The prerequisite patches for the fix are:i3c: master: Move rstdaa error suppression
i3c: master: Move entdaa error suppression
i3c: master: Movebus_initerror suppression
I have run an AI assisted backport review and it spotted an issue: I have taken a look and the issues goes like:
The above mentioned prerequisites are not present in 6.12.91, so I think it is incorrect to backport this to 6.12.91.
Thanks,
Harshit
Quoted 93 lines
Reported-by Dan Carpenter <[email protected]>Fixes 3a379bbcea0a ("i3c: Add core I3C infrastructure")Reviewed-by Adrian Hunter <[email protected]>Signed-off-by Jorge Marques <[email protected]>Signed-off-by Alexandre Belloni <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- drivers/i3c/master.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-)drivers/i3c/master.c +13
-19@@ -825,11 +825,17 @@ static void i3c_ccc_cmd_init(struct i3c_ccc_cmd *cmd, bool rnw, u8 id, cmd->err =I3C_ERROR_UNKNOWN ; } +/** +* i3c_master_send_ccc_cmd_locked() - send a CCC (Common Command Codes) +* @master: master used to send frames on the bus +* @cmd: command to send +* +* Return: 0 in case of success, or a negative error code otherwise. +* I3C Mx error codes are stored in cmd->err. +*/ static int i3c_master_send_ccc_cmd_locked (struct i3c_master_controller *master,struct i3c_ccc_cmd *cmd) { -int ret; -if (!cmd || !master)return -EINVAL ;@@ -847,15 +853,7 @@ static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, !master->ops->supports_ccc_cmd(master, cmd)) return -ENOTSUPP; - ret = master->ops->send_ccc_cmd (master, cmd); -if (ret) { -if (cmd->err !=I3C_ERROR_UNKNOWN ) -return cmd->err; - -return ret; - } - -return 0 ; +return master->ops->send_ccc_cmd (master, cmd); } static struct i2c_dev_desc *@@ -959,8 +957,7 @@ static int i3c_master_rstdaa_locked(struct i3c_master_controller *master,* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_entdaa_locked (struct i3c_master_controller *master) {@@ -1012,8 +1009,7 @@ static int i3c_master_enec_disec_locked(struct i3c_master_controller *master,* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_disec_locked (struct i3c_master_controller *master,u8 addr,u8 evts)@@ -1033,8 +1029,7 @@ EXPORT_SYMBOL_GPL(i3c_master_disec_locked);* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_enec_locked (struct i3c_master_controller *master,u8 addr,u8 evts)@@ -1059,8 +1054,7 @@ EXPORT_SYMBOL_GPL(i3c_master_enec_locked);* * This function must be called with the bus lock held in write mode. * -* Return: 0 in case of success, a positive I3C error code if the error is -* one of the official Mx error codes, and a negative error code otherwise. +* Return: 0 in case of success, or a negative error code otherwise. */ int i3c_master_defslvs_locked (struct i3c_master_controller *master) {
Sasha Levin
maintainerRe: [PATCH 6.12 384/666] i3c: master: Fix error codes at send_ccc_cmd
Quoted 2 lines · Harshit Mogalapalli
The above mentioned prerequisites are not present in 6.12.91, so I think it is incorrect to backport this to 6.12.91.
Dropped from the 7.0, 6.18, 6.12, 6.6, 6.1, 5.15, and 5.10 queues — the same prerequisite gap exists across all of them. Thanks for catching it.
--
Thanks,
Sasha
Greg Kroah-Hartman
maintainerPATCH 385/666 i3c: mipi-i3c-hci: fix IBI payload length calculation for final status
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Billy Tsai <[email protected]>
[ Upstream commit d35a6db887eeae7c57b719521e39d64f929c6dc3 ]
In DMA mode, the IBI status descriptor encodes the payload using CHUNKS (number of chunks) and DATA_LENGTH (valid bytes in the last chunk). All preceding chunks are implicitly full-sized.
The current code accumulates full chunk sizes for non-final status descriptors, but for the final status descriptor it only adds DATA_LENGTH. This ignores the contribution of the preceding full chunks described by the same final status entry.
As a result, the computed IBI payload length is truncated whenever the final status spans multiple chunks. For example, with a chunk size of 4 bytes, CHUNKS=2 and DATA_LENGTH=1 should result in a total payload size of 5 bytes, but the current code reports only 1 byte.
Fix the calculation by adding the size of (CHUNKS - 1) full chunks plus DATA_LENGTH for the last chunk.
--- drivers/i3c/master/mipi-i3c-hci/dma.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/i3c/master/mipi-i3c-hci/dma.c +4 -1
@@ -645,7 +645,10 @@ static void hci_dma_process_ibi(struct i3c_hci *hci, struct hci_rh_data *rh)if (!(ibi_status &IBI_LAST_STATUS )) { ibi_size += chunks * rh->ibi_chunk_sz; }else { - ibi_size +=FIELD_GET (IBI_DATA_LENGTH , ibi_status); +if (chunks) { + ibi_size += (chunks -1 ) * rh->ibi_chunk_sz; + ibi_size +=FIELD_GET (IBI_DATA_LENGTH , ibi_status); + } last_ptr = ptr;break ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 386/666 backlight: sky81452-backlight: Check return value of devm_gpiod_get_optional() in sky81452_bl_parse_dt()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ni <[email protected]>
[ Upstream commit 797cc011ae02bda26f93d25a4442d7a1a77d84df ]
The devm_gpiod_get_optional() function may return an ERR_PTR in case of genuine GPIO acquisition errors, not just NULL which indicates the legitimate absence of an optional GPIO.
Add an IS_ERR() check after the call in sky81452_bl_parse_dt(). On error, return the error code to ensure proper failure handling rather than proceeding with invalid pointers.
--- drivers/video/backlight/sky81452-backlight.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/video/backlight/sky81452-backlight.c +3 -0
@@ -202,6 +202,9 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( pdata->dpwm_mode =of_property_read_bool (np,"skyworks,dpwm-mode" ); pdata->phase_shift =of_property_read_bool (np,"skyworks,phase-shift" ); pdata->gpiod_enable =devm_gpiod_get_optional (dev,NULL ,GPIOD_OUT_HIGH ); +if (IS_ERR (pdata->gpiod_enable)) +return dev_err_cast_probe (dev, pdata->gpiod_enable, +"failed to get gpio\n" ); ret =of_property_count_u32_elems (np,"led-sources" );if (ret <0 ) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 387/666 platform/surface: surfacepro3_button: Drop wakeup source on remove
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit 1410a228ab2d36fe2b383415a632ae12048d4f3a ]
The wakeup source added by device_init_wakeup() in surface_button_add() needs to be dropped during driver removal, so update the driver to do that.
--- drivers/platform/surface/surfacepro3_button.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/surface/surfacepro3_button.c +1 -0
@@ -243,6 +243,7 @@ static void surface_button_remove(struct acpi_device *device) {struct surface_button *button =acpi_driver_data (device); +device_init_wakeup (&device->dev, false);input_unregister_device (button->input);kfree (button); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 388/666 leds: lgm-sso: Remove duplicate assignments for priv->mmap
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen Ni <[email protected]>
[ Upstream commit 7186d0330c3f3e86de577687a82f4ebd96dcb5ac ]
Remove duplicate assignment of priv->mmap in intel_sso_led_probe().
--- drivers/leds/blink/leds-lgm-sso.c | 2 -- 1 file changed, 2 deletions(-)
drivers/leds/blink/leds-lgm-sso.c +0 -2
@@ -806,8 +806,6 @@ static int intel_sso_led_probe(struct platform_device *pdev) priv->fpid_clkrate =clk_get_rate (priv->clocks[1 ].clk); - priv->mmap =syscon_node_to_regmap (dev->of_node); - priv->mmap =syscon_node_to_regmap (dev->of_node);if (IS_ERR (priv->mmap)) {dev_err (dev,"Failed to map iomem!\n" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 389/666 tty: hvc_iucv: fix off-by-one in number of supported devices
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Randy Dunlap <[email protected]>
[ Upstream commit f2a880e802ad12d1e38039d1334fb1475d0f5241 ]
MAX_HVC_IUCV_LINES == HVC_ALLOC_TTY_ADAPTERS == 8.
This is the number of entries in:
static struct hvc_iucv_private *hvc_iucv_table[MAX_HVC_IUCV_LINES];
Sometimes hvc_iucv_table[] is limited by:
(a) if (num > hvc_iucv_devices) // for error detection
or
(b) for (i = 0; i < hvc_iucv_devices; i++) // in 2 places
(so these 2 don't agree; second one appears to be correct to me.)
hvc_iucv_devices can be 0..8. This is a counter.
(c) if (hvc_iucv_devices > MAX_HVC_IUCV_LINES)
If hvc_iucv_devices == 8, (a) allows the code to access hvc_iucv_table[8]. Oops.
--- drivers/tty/hvc/hvc_iucv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/hvc/hvc_iucv.c +1 -1
@@ -130,7 +130,7 @@ static struct iucv_handler hvc_iucv_handler = {*/ static struct hvc_iucv_private *hvc_iucv_get_private (uint32_t num) { -if (num > hvc_iucv_devices) +if (num >= hvc_iucv_devices)return NULL ;return hvc_iucv_table[num]; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 390/666 platform/x86: panasonic-laptop: Fix OPTD notifier registration and cleanup
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafael J. Wysocki <[email protected]>
[ Upstream commit 8baeff2c1d33dad8572216c6ad3a7425852507d4 ]
An ACPI notify handler is leaked if device_create_file() returns an error in acpi_pcc_hotkey_add().
Also, it is pointless to call pcc_unregister_optd_notifier() in acpi_pcc_hotkey_remove() if pcc->platform is NULL and it is better to arrange the cleanup code in that function in the same order as the rollback code in acpi_pcc_hotkey_add().
Address the above by placing the pcc_register_optd_notifier() call in acpi_pcc_hotkey_add() after the device_create_file() return value check and placing the pcc_unregister_optd_notifier() call in acpi_pcc_hotkey_remove() right before the device_remove_file() call.
--- drivers/platform/x86/panasonic-laptop.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/platform/x86/panasonic-laptop.c +3 -2
@@ -1093,9 +1093,10 @@ static int acpi_pcc_hotkey_add(struct acpi_device *device) } result =device_create_file (&pcc->platform->dev, &dev_attr_cdpower); -pcc_register_optd_notifier (pcc,"\\_SB.PCI0.EHCI.ERHB.OPTD" );if (result) goto out_platform; + +pcc_register_optd_notifier (pcc,"\\_SB.PCI0.EHCI.ERHB.OPTD" ); }else { pcc->platform =NULL ; }
@@ -1129,10 +1130,10 @@ static void acpi_pcc_hotkey_remove(struct acpi_device *device)i8042_remove_filter (panasonic_i8042_filter);if (pcc->platform) { +pcc_unregister_optd_notifier (pcc,"\\_SB.PCI0.EHCI.ERHB.OPTD" );device_remove_file (&pcc->platform->dev, &dev_attr_cdpower);platform_device_unregister (pcc->platform); } -pcc_unregister_optd_notifier (pcc,"\\_SB.PCI0.EHCI.ERHB.OPTD" );sysfs_remove_group (&device->dev.kobj, &pcc_attr_group);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 391/666 mfd: mc13xxx-core: Fix memory leak in mc13xxx_add_subdevice_pdata()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abdun Nihaal <[email protected]>
[ Upstream commit a5a65a7fb2f7796bbe492cd6be59c92cb64377d1 ]
The memory allocated for cell.name using kmemdup() is not freed when mfd_add_devices() fails. Fix that by using devm_kmemdup().
--- drivers/mfd/mc13xxx-core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mfd/mc13xxx-core.c +1 -1
@@ -377,7 +377,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx,if (snprintf (buf,sizeof (buf), format, name) >sizeof (buf))return -E2BIG ; - cell.name =kmemdup (buf,strlen (buf) +1 ,GFP_KERNEL ); + cell.name =devm_kmemdup (mc13xxx->dev, buf,strlen (buf) +1 ,GFP_KERNEL );if (!cell.name)return -ENOMEM ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 392/666 nfs/blocklayout: Fix compilation error (`make W=1`) in bl_write_pagelist()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit f83c8dda456ce4863f346aa26d88efa276eda35d ]
Clang compiler is not happy about set but unused variable (when dprintk() is no-op):
.../blocklayout/blocklayout.c:384:9: error: variable 'count' set but not used [-Werror,-Wunused-but-set-variable]
Remove a leftover from the previous cleanup.
--- fs/nfs/blocklayout/blocklayout.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
fs/nfs/blocklayout/blocklayout.c +1 -3
@@ -381,14 +381,13 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync)sector_t isect, extent_length =0 ;struct parallel_io *par =NULL ;loff_t offset = header->args.offset; -size_t count = header->args.count;struct page **pages = header->args.pages;int pg_index = header->args.pgbase >>PAGE_SHIFT ;unsigned int pg_len;struct blk_plug plug;int i; -dprintk ("%s enter, %zu@%lld\n" , __func__, count, offset); +dprintk ("%s enter, %u@%lld\n" , __func__, header->args.count, offset);/* At this point, header->page_aray is a (sequential) list of nfs_pages. * We want to write each, and if there is an error set pnfs_error
@@ -429,7 +428,6 @@ bl_write_pagelist(struct nfs_pgio_header *header, int sync) } offset += pg_len; - count -= pg_len; isect += (pg_len >>SECTOR_SHIFT ); extent_length -= (pg_len >>SECTOR_SHIFT ); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 393/666 platform/x86: asus-wmi: adjust screenpad power/brightness handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denis Benato <[email protected]>
[ Upstream commit 130d29c5627cd50e786e926ad7ef66322c5a0c09 ]
Fix illogical screen off control by hardcoding 0 and 1 depending on the requested brightness and also do not rely on the last screenpad power state to issue screen brightness commands.
--- drivers/platform/x86/asus-wmi.c | 34 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 21 deletions(-)
drivers/platform/x86/asus-wmi.c +13 -21
@@ -4130,32 +4130,24 @@ static int read_screenpad_brightness(struct backlight_device *bd)static int update_screenpad_bl_status (struct backlight_device *bd) { -struct asus_wmi *asus =bl_get_data (bd); -int power, err =0 ; -u32 ctrl_param; +u32 ctrl_param = bd->props.brightness; +int err =0 ; - power =read_screenpad_backlight_power (asus); -if (power <0 ) -return power; +if (bd->props.power) { + err =asus_wmi_set_devstate (ASUS_WMI_DEVID_SCREENPAD_POWER ,1 ,NULL ); +if (err <0 ) +return err; -if (bd->props.power != power) { -if (power !=BACKLIGHT_POWER_ON ) { -/* Only brightness > 0 can power it back on */ - ctrl_param = asus->driver->screenpad_brightness -ASUS_SCREENPAD_BRIGHT_MIN ; - err =asus_wmi_set_devstate (ASUS_WMI_DEVID_SCREENPAD_LIGHT , - ctrl_param,NULL ); - }else { - err =asus_wmi_set_devstate (ASUS_WMI_DEVID_SCREENPAD_POWER ,0 ,NULL ); - } - }else if (power ==BACKLIGHT_POWER_ON ) { -/* Only set brightness if powered on or we get invalid/unsync state */ - ctrl_param = bd->props.brightness +ASUS_SCREENPAD_BRIGHT_MIN ; err =asus_wmi_set_devstate (ASUS_WMI_DEVID_SCREENPAD_LIGHT , ctrl_param,NULL ); +if (err <0 ) +return err; } -/* Ensure brightness is stored to turn back on with */ -if (err ==0 ) - asus->driver->screenpad_brightness = bd->props.brightness +ASUS_SCREENPAD_BRIGHT_MIN ; +if (!bd->props.power) { + err =asus_wmi_set_devstate (ASUS_WMI_DEVID_SCREENPAD_POWER ,0 ,NULL ); +if (err <0 ) +return err; + }return err; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 394/666 platform/x86: asus-wmi: fix screenpad brightness range
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denis Benato <[email protected]>
[ Upstream commit 8d95d1f4aa5c76202b0833a70998769384612488 ]
Fix screenpad brightness range being too limited without reason:
testing this patch on a Zenbook Duo showed the hardware minimum not being too low, therefore allow the user to configure the entire range, and expose to userspace the hardware brightness range and value.
--- drivers/platform/x86/asus-wmi.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)
drivers/platform/x86/asus-wmi.c +6 -10
@@ -127,7 +127,6 @@ module_param(fnlock_default, bool, 0444);#define NVIDIA_TEMP_MIN 75#define NVIDIA_TEMP_MAX 87 -#define ASUS_SCREENPAD_BRIGHT_MIN 20#define ASUS_SCREENPAD_BRIGHT_MAX 255#define ASUS_SCREENPAD_BRIGHT_DEFAULT 60
@@ -4119,13 +4118,13 @@ static int read_screenpad_brightness(struct backlight_device *bd)return err;/* The device brightness can only be read if powered, so return stored */ if (err ==BACKLIGHT_POWER_OFF ) -return asus->driver->screenpad_brightness -ASUS_SCREENPAD_BRIGHT_MIN ; +return bd->props.brightness; err =asus_wmi_get_devstate (asus,ASUS_WMI_DEVID_SCREENPAD_LIGHT , &retval);if (err <0 )return err; -return (retval &ASUS_WMI_DSTS_BRIGHTNESS_MASK ) -ASUS_SCREENPAD_BRIGHT_MIN ; +return retval &ASUS_WMI_DSTS_BRIGHTNESS_MASK ; }static int update_screenpad_bl_status (struct backlight_device *bd)
@@ -4165,22 +4164,19 @@ static int asus_screenpad_init(struct asus_wmi *asus)int err, power;int brightness =0 ; - power =read_screenpad_backlight_power (asus); + power =asus_wmi_get_devstate_simple (asus,ASUS_WMI_DEVID_SCREENPAD_POWER );if (power <0 )return power; -if (power !=BACKLIGHT_POWER_OFF ) { +if (power) { err =asus_wmi_get_devstate (asus,ASUS_WMI_DEVID_SCREENPAD_LIGHT , &brightness);if (err <0 )return err; } -/* default to an acceptable min brightness on boot if too low */ -if (brightness <ASUS_SCREENPAD_BRIGHT_MIN ) - brightness =ASUS_SCREENPAD_BRIGHT_DEFAULT ;memset (&props,0 ,sizeof (struct backlight_properties )); props.type =BACKLIGHT_RAW ;/* ensure this bd is last to be picked */ - props.max_brightness =ASUS_SCREENPAD_BRIGHT_MAX -ASUS_SCREENPAD_BRIGHT_MIN ; + props.max_brightness =ASUS_SCREENPAD_BRIGHT_MAX ; bd =backlight_device_register ("asus_screenpad" , &asus->platform_device->dev, asus, &asus_screenpad_bl_ops, &props);
@@ -4191,7 +4187,7 @@ static int asus_screenpad_init(struct asus_wmi *asus) asus->screenpad_backlight_device = bd; asus->driver->screenpad_brightness = brightness; - bd->props.brightness = brightness -ASUS_SCREENPAD_BRIGHT_MIN ; + bd->props.brightness = brightness; bd->props.power = power;backlight_update_status (bd);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 395/666 tty: serial: ip22zilog: Fix section mispatch warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Bogendoerfer <[email protected]>
[ Upstream commit a1a81aef99e853dec84241d701fbf587d713eb5b ]
ip22zilog_prepare() is now called by driver probe routine, so it shouldn't be in the __init section any longer.
--- drivers/tty/serial/ip22zilog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/ip22zilog.c +1 -1
@@ -1025,7 +1025,7 @@ static struct uart_driver ip22zilog_reg = {#endif }; -static void __init ip22zilog_prepare (struct uart_ip22zilog_port *up) +static void ip22zilog_prepare (struct uart_ip22zilog_port *up) {unsigned char sysrq_on =IS_ENABLED (CONFIG_SERIAL_IP22_ZILOG_CONSOLE );int brg;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 396/666 fs/ntfs3: terminate the cached volume label after UTF-8 conversion
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
[ Upstream commit a6cd43fe9b083fa23fe1595666d5738856cb261a ]
ntfs_fill_super() loads the on-disk volume label with utf16s_to_utf8s() and stores the result in sbi->volume.label. The converted label is later exposed through ntfs3_label_show() using %s, but utf16s_to_utf8s() only returns the number of bytes written and does not add a trailing NUL.
If the converted label fills the entire fixed buffer, ntfs3_label_show() can read past the end of sbi->volume.label while looking for a terminator.
Terminate the cached label explicitly after a successful conversion and clamp the exact-full case to the last byte of the buffer.
--- fs/ntfs3/super.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
fs/ntfs3/super.c +6 -1
@@ -1235,8 +1235,13 @@ static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc)le32_to_cpu (attr->res.data_size) >>1 ,UTF16_LITTLE_ENDIAN , sbi->volume.label, sizeof(sbi->volume.label)); -if (err <0 ) +if (err <0 ) { sbi->volume.label[0 ] =0 ; + }else if (err >=sizeof (sbi->volume.label)) { + sbi->volume.label[sizeof (sbi->volume.label) -1 ] =0 ; + }else { + sbi->volume.label[err] =0 ; + } }else {/* Should we break mounting here? */ //err = -EINVAL;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 397/666 platform/x86: dell_rbu: avoid uninit value usage in packet_size_write()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit f8fd138c2363c0e2d3235c32bfb4fb5c6474e4ae ]
Ensure the temp value has been properly parsed from the user-provided buffer and initialized to be used in later operations. While at it, prefer a convenient kstrtoul() helper.
Found by Linux Verification Center (linuxtesting.org) with Svace static analysis tool.
--- drivers/platform/x86/dell/dell_rbu.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/platform/x86/dell/dell_rbu.c +5 -1
@@ -30,6 +30,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/init.h> +#include <linux/kstrtox.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/string.h>
@@ -617,9 +618,12 @@ static ssize_t packet_size_write(struct file *filp, struct kobject *kobj, char *buffer, loff_t pos, size_t count) { unsigned long temp; + +if (kstrtoul (buffer,10 , &temp)) +return -EINVAL ; +spin_lock (&rbu_data.lock);packet_empty_list (); -sscanf (buffer,"%lu" , &temp);if (temp <0xffffffff ) rbu_data.packetsize = temp;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 398/666 platform/x86: dell-wmi-sysman: bound enumeration string aggregation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
[ Upstream commit 3c34471c26abc52a37f5ad90949e2e4b8027eb14 ]
populate_enum_data() aggregates firmware-provided value-modifier and possible-value strings into fixed 512-byte struct members. The current code bounds each individual source string but then appends every string and separator with raw strcat() and no remaining-space check.
Switch the aggregation loops to a bounded append helper and reject enumeration packages whose combined strings do not fit in the destination buffers.
--- .../dell/dell-wmi-sysman/enum-attributes.c | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-)
drivers/platform/x86/dell/dell-wmi-sysman/enum-attributes.c +28 -6
@@ -6,10 +6,32 @@* Copyright (c) 2020 Dell Inc. */ +#include <linux/bug.h> +#include "dell-wmi-sysman.h" get_instance_id (enumeration); +static int append_enum_string (char *dest,const char *src) +{ +size_t dest_len =strlen (dest); +ssize_t copied; + +if (WARN_ON_ONCE (dest_len >=MAX_BUFF )) +return -EINVAL ; + + copied =strscpy (dest + dest_len, src,MAX_BUFF - dest_len); +if (copied <0 ) +return -EINVAL ; + + dest_len += copied; + copied =strscpy (dest + dest_len,";" ,MAX_BUFF - dest_len); +if (copied <0 ) +return -EINVAL ; + +return 0 ; +} +static ssize_t current_value_show (struct kobject *kobj,struct kobj_attribute *attr,char *buf) {int instance_id =get_enumeration_instance_id (kobj);
@@ -176,9 +198,9 @@ int populate_enum_data(union acpi_object *enumeration_obj, int instance_id,return -EINVAL ;if (check_property_type (enumeration, next_obj,ACPI_TYPE_STRING ))return -EINVAL ; -strcat (wmi_priv.enumeration_data[instance_id].dell_value_modifier, - enumeration_obj[next_obj++].string.pointer); -strcat (wmi_priv.enumeration_data[instance_id].dell_value_modifier,";" ); +if (append_enum_string (wmi_priv.enumeration_data[instance_id].dell_value_modifier, + enumeration_obj[next_obj++].string.pointer)) +return -EINVAL ; }if (next_obj >= enum_property_count)
@@ -193,9 +215,9 @@ int populate_enum_data(union acpi_object *enumeration_obj, int instance_id,return -EINVAL ;if (check_property_type (enumeration, next_obj,ACPI_TYPE_STRING ))return -EINVAL ; -strcat (wmi_priv.enumeration_data[instance_id].possible_values, - enumeration_obj[next_obj++].string.pointer); -strcat (wmi_priv.enumeration_data[instance_id].possible_values,";" ); +if (append_enum_string (wmi_priv.enumeration_data[instance_id].possible_values, + enumeration_obj[next_obj++].string.pointer)) +return -EINVAL ; }return sysfs_create_group (attr_name_kobj, &enumeration_attr_group);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 399/666 RDMA/core: Prefer NLA_NUL_STRING
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 6ed3d14fc45d3da6025e7fe4a6a09066856698e2 ]
These attributes are evaluated as c-string (passed to strcmp), but NLA_STRING doesn't check for the presence of a \0 terminator.
Either this needs to switch to nla_strcmp() and needs to adjust printf fmt specifier to not use plain %s, or this needs to use NLA_NUL_STRING.
As the code has been this way for long time, it seems to me that userspace does include the terminating nul, even tough its not enforced so far, and thus NLA_NUL_STRING use is the simpler solution.
--- drivers/infiniband/core/iwpm_msg.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/infiniband/core/iwpm_msg.c +3 -3
@@ -365,9 +365,9 @@ int iwpm_remove_mapping(struct sockaddr_storage *local_addr, u8 nl_client)/* netlink attribute policy for the received response to register pid request */ static const struct nla_policy resp_reg_policy[IWPM_NLA_RREG_PID_MAX ] = { [IWPM_NLA_RREG_PID_SEQ ] = { .type =NLA_U32 }, - [IWPM_NLA_RREG_IBDEV_NAME ] = { .type =NLA_STRING , + [IWPM_NLA_RREG_IBDEV_NAME ] = { .type =NLA_NUL_STRING , .len =IWPM_DEVNAME_SIZE -1 }, - [IWPM_NLA_RREG_ULIB_NAME ] = { .type =NLA_STRING , + [IWPM_NLA_RREG_ULIB_NAME ] = { .type =NLA_NUL_STRING , .len =IWPM_ULIBNAME_SIZE -1 }, [IWPM_NLA_RREG_ULIB_VER ] = { .type =NLA_U16 }, [IWPM_NLA_RREG_PID_ERR ] = { .type =NLA_U16 }
@@ -677,7 +677,7 @@ int iwpm_remote_info_cb(struct sk_buff *skb, struct netlink_callback *cb)/* netlink attribute policy for the received request for mapping info */ static const struct nla_policy resp_mapinfo_policy[IWPM_NLA_MAPINFO_REQ_MAX ] = { - [IWPM_NLA_MAPINFO_ULIB_NAME ] = { .type =NLA_STRING , + [IWPM_NLA_MAPINFO_ULIB_NAME ] = { .type =NLA_NUL_STRING , .len =IWPM_ULIBNAME_SIZE -1 }, [IWPM_NLA_MAPINFO_ULIB_VER ] = { .type =NLA_U16 } };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 400/666 clk: qcom: dispcc-sm8450: use RCG2 ops for DPTX1 AUX clock source
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit 141af1be817c42c7f1e1605348d4b1983d319bea ]
The clk_dp_ops are supposed to be used for DP-related clocks with a proper MND divier. Use standard RCG2 ops for dptx1_aux_clk_src, the same as all other DPTX AUX clocks in this driver.
--- drivers/clk/qcom/dispcc-sm8450.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/dispcc-sm8450.c +1 -1
@@ -364,7 +364,7 @@ static struct clk_rcg2 disp_cc_mdss_dptx1_aux_clk_src = { .parent_data = disp_cc_parent_data_1, .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_dp_ops, + .ops = &clk_rcg2_ops, }, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 401/666 scsi: sg: Fix sysctl sg-big-buff register during sg_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Erkun <[email protected]>
[ Upstream commit 3033c471aaf675254efaa0da431e95d91a104b41 ]
Commit 26d1c80fd61e ("scsi/sg: move sg-big-buff sysctl to scsi/sg.c") made a mistake. sysctl sg-big-buff was not created because the call to register_sg_sysctls() was placed on the wrong code path.
--- drivers/scsi/sg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/sg.c +1 -1
@@ -1691,13 +1691,13 @@ init_sg(void) sg_sysfs_valid =1 ; rc =scsi_register_interface (&sg_interface);if (0 == rc) { +register_sg_sysctls ();#ifdef CONFIG_SCSI_PROC_FS sg_proc_init ();#endif /* CONFIG_SCSI_PROC_FS */ return 0 ; }class_unregister (&sg_sysfs_class); -register_sg_sysctls (); err_out:unregister_chrdev_region (MKDEV (SCSI_GENERIC_MAJOR ,0 ),SG_MAX_DEVS );return rc;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 402/666 scsi: sg: Resolve soft lockup issue when opening /dev/sgX
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yang Erkun <[email protected]>
[ Upstream commit d06a310b45e153872033dd0cf19d5a2279121099 ]
The parameter def_reserved_size defines the default buffer size reserved for each Sg_fd and should be restricted to a range between 0 and 1,048,576 (see https://tldp.org/HOWTO/SCSI-Generic-HOWTO/proc.html). Although the function sg_proc_write_dressz enforces this limit, it is possible to bypass it by directly modifying the module parameter as shown below, which then causes a soft lockup:
echo -1 > /sys/module/sg/parameters/def_reserved_size exec 4<> /dev/sg0
watchdog: BUG: soft lockup - CPU#5 stuck for 26 seconds! [bash:537] Modules loaded: CPU: 5 UID: 0 PID: 537 Command: bash, kernel version 6.19.0-rc3+ #134,
PREEMPT disabled
Hardware: QEMU Standard PC (i440FX + PIIX, 1996), BIOS version 1.16.1-2.fc37 dated 04/01/2014
...
Call Trace: sg_build_reserve+0x5c/0xa0 sg_add_sfp+0x168/0x270 sg_open+0x16e/0x340 chrdev_open+0xbe/0x230 do_dentry_open+0x175/0x480 vfs_open+0x34/0xf0 do_open+0x265/0x3d0 path_openat+0x110/0x290 do_filp_open+0xc3/0x170 do_sys_openat2+0x71/0xe0 __x64_sys_openat+0x6d/0xa0 do_syscall_64+0x62/0x310 entry_SYSCALL_64_after_hwframe+0x76/0x7e
The fix is to use module_param_cb to validate and reject invalid values assigned to def_reserved_size.
--- drivers/scsi/sg.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-)
drivers/scsi/sg.c +27 -2
@@ -1622,10 +1622,35 @@ sg_remove_device(struct device *cl_dev) }module_param_named (scatter_elem_sz, scatter_elem_sz, int,S_IRUGO |S_IWUSR ); -module_param_named (def_reserved_size, def_reserved_size, int, -S_IRUGO |S_IWUSR );module_param_named (allow_dio, sg_allow_dio, int,S_IRUGO |S_IWUSR ); +static int def_reserved_size_set (const char *val,const struct kernel_param *kp) +{ +int size, ret; + +if (!val) +return -EINVAL ; + + ret =kstrtoint (val,0 , &size); +if (ret) +return ret; + +/* limit to 1 MB */ +if (size <0 || size >1048576 ) +return -ERANGE ; + + def_reserved_size = size; +return 0 ; +} + +static const struct kernel_param_ops def_reserved_size_ops = { + .set = def_reserved_size_set, + .get = param_get_int, +}; + +module_param_cb (def_reserved_size, &def_reserved_size_ops, &def_reserved_size, +S_IRUGO |S_IWUSR ); +MODULE_AUTHOR ("Douglas Gilbert" );MODULE_DESCRIPTION ("SCSI generic (sg) driver" );MODULE_LICENSE ("GPL" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 403/666 clk: qcom: dispcc-sc8280xp: remove CLK_SET_RATE_PARENT from byte_div_clk_src dividers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: White Lewis <[email protected]>
[ Upstream commit 0b151a6307205eb867250985a910a88787cbf12e ]
The four byte_div_clk_src dividers (disp{0,1}_cc_mdss_byte{0,1}_div_clk_src) had CLK_SET_RATE_PARENT set. When the DSI driver calls clk_set_rate() on byte_intf_clk, the rate-change propagates through the divider up to the parent PLL (byte_clk_src), halving the byte clock rate.
A simiar issue had been also encountered on SM8750.b8501febdc51 ("clk: qcom: dispcc-sm8750: Drop incorrect CLK_SET_RATE_PARENT on byte intf parent").
Likewise, remove CLK_SET_RATE_PARENT from all four byte divider clocks so that clk_set_rate() on the divider adjusts only the divider ratio, leaving the parent PLL untouched.
--- drivers/clk/qcom/dispcc-sc8280xp.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/clk/qcom/dispcc-sc8280xp.c +0 -4
@@ -1161,7 +1161,6 @@ static struct clk_regmap_div disp0_cc_mdss_byte0_div_clk_src = { &disp0_cc_mdss_byte0_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
@@ -1176,7 +1175,6 @@ static struct clk_regmap_div disp1_cc_mdss_byte0_div_clk_src = { &disp1_cc_mdss_byte0_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
@@ -1191,7 +1189,6 @@ static struct clk_regmap_div disp0_cc_mdss_byte1_div_clk_src = { &disp0_cc_mdss_byte1_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
@@ -1206,7 +1203,6 @@ static struct clk_regmap_div disp1_cc_mdss_byte1_div_clk_src = { &disp1_cc_mdss_byte1_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 404/666 clk: qcom: dispcc-sm4450: Fix DSI byte clock rate setting
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 7bc48fcdf9e77bf68ef04af015d50df2a9acac00 ]
The clock tree for byte_clk_src is as follows:
┌──────byte0_clk_src─────┐
│ │
byte0_clk byte0_div_clk_src
│ byte0_intf_clk
If both of its direct children have CLK_SET_RATE_PARENT with different requests, byte0_clk_src (and its parent) will be reconfigured. In this case, byte0_intf should strictly follow the rate of byte0_clk (with some adjustments based on PHY mode).
Remove CLK_SET_RATE_PARENT from byte0_div_clk_src to avoid this issue.
--- drivers/clk/qcom/dispcc-sm4450.c | 1 - 1 file changed, 1 deletion(-)
drivers/clk/qcom/dispcc-sm4450.c +0 -1
@@ -336,7 +336,6 @@ static struct clk_regmap_div disp_cc_mdss_byte0_div_clk_src = { &disp_cc_mdss_byte0_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 405/666 scsi: target: core: Fix integer overflow in UNMAP bounds check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 2bf2d65f76697820dbc4227d13866293576dd90a ]
sbc_execute_unmap() checks LBA + range does not exceed the device capacity, but does not guard against LBA + range wrapping around on 64-bit overflow.
Add an overflow check matching the pattern already used for WRITE_SAME in the same file.
--- drivers/target/target_core_sbc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/target/target_core_sbc.c +2 -1
@@ -1136,7 +1136,8 @@ sbc_execute_unmap(struct se_cmd *cmd) goto err; } -if (lba + range > dev->transport->get_blocks (dev) +1 ) { +if (lba + range < lba || + lba + range > dev->transport->get_blocks (dev) +1 ) { ret =TCM_ADDRESS_OUT_OF_RANGE ; goto err; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 406/666 dt-bindings: clock: qcom,gcc-sc8180x: Add missing GDSCs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
[ Upstream commit 76404ffbf07f28a5ec04748e18fce3dac2e78ef6 ]
There are 5 more GDSCs that we were ignoring and not putting to sleep, which are listed in downstream DTS. Add them.
Stable-dep-of: 3565741eb985 ("clk: qcom: gcc-sc8180x: Add missing GDSCs")
--- include/dt-bindings/clock/qcom,gcc-sc8180x.h | 5 +++++ 1 file changed, 5 insertions(+)
include/dt-bindings/clock/qcom,gcc-sc8180x.h +5 -0
@@ -312,5 +312,10 @@#define USB30_MP_GDSC 8#define USB30_PRIM_GDSC 9#define USB30_SEC_GDSC 10 +#define HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC 11 +#define HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC 12 +#define HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC 13 +#define HLOS1_VOTE_TURING_MMU_TBU0_GDSC 14 +#define HLOS1_VOTE_TURING_MMU_TBU1_GDSC 15#endif
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 407/666 clk: qcom: gcc-sc8180x: Add missing GDSCs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
[ Upstream commit 3565741eb985a8a7cc6656eb33496195468cb99e ]
There are 5 more GDSCs that we were ignoring and not putting to sleep, which are listed in downstream DTS. Add them.
--- drivers/clk/qcom/gcc-sc8180x.c | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)
drivers/clk/qcom/gcc-sc8180x.c +50 -0
@@ -4266,6 +4266,51 @@ static struct gdsc usb30_mp_gdsc = { .flags = POLL_CFG_GDSCR, }; +static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc = { + .gdscr =0x7d050 , + .pd = { + .name ="hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc" , + }, + .pwrsts =PWRSTS_OFF_ON , + .flags =VOTABLE , +}; + +static struct gdsc hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc = { + .gdscr =0x7d058 , + .pd = { + .name ="hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc" , + }, + .pwrsts =PWRSTS_OFF_ON , + .flags =VOTABLE , +}; + +static struct gdsc hlos1_vote_mmnoc_mmu_tbu_sf_gdsc = { + .gdscr =0x7d054 , + .pd = { + .name ="hlos1_vote_mmnoc_mmu_tbu_sf_gdsc" , + }, + .pwrsts =PWRSTS_OFF_ON , + .flags =VOTABLE , +}; + +static struct gdsc hlos1_vote_turing_mmu_tbu0_gdsc = { + .gdscr =0x7d05c , + .pd = { + .name ="hlos1_vote_turing_mmu_tbu0_gdsc" , + }, + .pwrsts =PWRSTS_OFF_ON , + .flags =VOTABLE , +}; + +static struct gdsc hlos1_vote_turing_mmu_tbu1_gdsc = { + .gdscr =0x7d060 , + .pd = { + .name ="hlos1_vote_turing_mmu_tbu1_gdsc" , + }, + .pwrsts =PWRSTS_OFF_ON , + .flags =VOTABLE , +}; +static struct clk_regmap *gcc_sc8180x_clocks[] = { [GCC_AGGRE_NOC_PCIE_TBU_CLK ] = &gcc_aggre_noc_pcie_tbu_clk.clkr, [GCC_AGGRE_UFS_CARD_AXI_CLK ] = &gcc_aggre_ufs_card_axi_clk.clkr,
@@ -4595,6 +4640,11 @@ static struct gdsc *gcc_sc8180x_gdscs[] = { [USB30_MP_GDSC] = &usb30_mp_gdsc, [USB30_PRIM_GDSC] = &usb30_prim_gdsc, [USB30_SEC_GDSC] = &usb30_sec_gdsc, + [HLOS1_VOTE_MMNOC_MMU_TBU_HF0_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_hf0_gdsc, + [HLOS1_VOTE_MMNOC_MMU_TBU_HF1_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_hf1_gdsc, + [HLOS1_VOTE_MMNOC_MMU_TBU_SF_GDSC] = &hlos1_vote_mmnoc_mmu_tbu_sf_gdsc, + [HLOS1_VOTE_TURING_MMU_TBU0_GDSC] = &hlos1_vote_turing_mmu_tbu0_gdsc, + [HLOS1_VOTE_TURING_MMU_TBU1_GDSC] = &hlos1_vote_turing_mmu_tbu1_gdsc, };static const struct regmap_config gcc_sc8180x_regmap_config = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 408/666 clk: qcom: gcc-sc8180x: Use retention for USB power domains
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
[ Upstream commit 25bc96f26cd6c19dde13a0b9859183e531d6fbfc ]
The USB subsystem does not expect to lose its state on suspend:
xhci-hcd xhci-hcd.0.auto: xHC error in resume, USBSTS 0x401, Reinit usb usb1: root hub lost power or was reset
(The reinitialization usually succeeds, but it does slow down resume.)
To maintain state during suspend, the relevant GDSCs need to stay in retention mode, like they do on other similar SoCs. Change the mode to PWRSTS_RET_ON to fix.
--- drivers/clk/qcom/gcc-sc8180x.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/clk/qcom/gcc-sc8180x.c +3 -3
@@ -4172,7 +4172,7 @@ static struct gdsc usb30_sec_gdsc = { .pd = { .name = "usb30_sec_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
@@ -4190,7 +4190,7 @@ static struct gdsc usb30_prim_gdsc = { .pd = { .name = "usb30_prim_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
@@ -4262,7 +4262,7 @@ static struct gdsc usb30_mp_gdsc = { .pd = { .name = "usb30_mp_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 409/666 clk: qcom: gcc-sc8180x: Use retention for PCIe power domains
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
[ Upstream commit ccb92c78b42edd26225b4d5920847dfee3e1b093 ]
As the PCIe host controller driver does not yet support dealing with the loss of state during suspend, use retention for relevant GDSCs.
This fixes the link not surviving upon resume:
nvme 0002:01:00.0: Unable to change power state from D3cold to D0, device inaccessible nvme nvme0: controller is down; will reset: CSTS=0xffffffff, PCI_STATUS read failed (134) nvme 0002:01:00.0: Unable to change power state from D3cold to D0, device inaccessible nvme nvme0: Disabling device after reset failure: -19
--- drivers/clk/qcom/gcc-sc8180x.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/clk/qcom/gcc-sc8180x.c +4 -4
@@ -4199,7 +4199,7 @@ static struct gdsc pcie_0_gdsc = { .pd = { .name = "pcie_0_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
@@ -4226,7 +4226,7 @@ static struct gdsc pcie_1_gdsc = { .pd = { .name = "pcie_1_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
@@ -4235,7 +4235,7 @@ static struct gdsc pcie_2_gdsc = { .pd = { .name = "pcie_2_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
@@ -4253,7 +4253,7 @@ static struct gdsc pcie_3_gdsc = { .pd = { .name = "pcie_3_gdsc", }, - .pwrsts = PWRSTS_OFF_ON, + .pwrsts = PWRSTS_RET_ON, .flags = POLL_CFG_GDSCR, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 410/666 clk: qcom: dispcc-sm8250: Use shared ops on the mdss vsync clk
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
[ Upstream commit 8c522da70f0c2e5148c4c13ccb1c64cca57a6fdb ]
mdss_gdsc can get stuck on boot due to RCGs being left on from last boot. As a fix, commit 01a0a6cc8cfd ("clk: qcom: Park shared RCGs upon registration") introduced a callback to ensure the RCG is off upon init. However, the fix depends on all shared RCGs being marked as such in code.
For SM8150/SC8180X/SM8250 the MDSS vsync clock was using regular ops, unlike the same clock in the SC7180 code. This was causing display to frequently fail to initialize after rebooting on the Surface Pro X. Fix by using shared ops for this clock.
--- drivers/clk/qcom/dispcc-sm8250.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/dispcc-sm8250.c +1 -1
@@ -632,7 +632,7 @@ static struct clk_rcg2 disp_cc_mdss_vsync_clk_src = { .parent_data = disp_cc_parent_data_1, .num_parents = ARRAY_SIZE(disp_cc_parent_data_1), .flags = CLK_SET_RATE_PARENT, - .ops = &clk_rcg2_ops, + .ops = &clk_rcg2_shared_ops, }, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 411/666 clk: qcom: dispcc-sm8250: Enable parents for pixel clocks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Val Packett <[email protected]>
[ Upstream commit acf7a91d0b0e9e3ef374944021de62062125b7e4 ]
Add CLK_OPS_PARENT_ENABLE to MDSS pixel clock sources to ensure parent clocks are enabled during clock operations, preventing potential stability issues during display configuration.
--- drivers/clk/qcom/dispcc-sm8250.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/qcom/dispcc-sm8250.c +2 -2
@@ -578,7 +578,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk0_clk_src = { .name = "disp_cc_mdss_pclk0_clk_src", .parent_data = disp_cc_parent_data_6, .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), - .flags = CLK_SET_RATE_PARENT, + .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, .ops = &clk_pixel_ops, }, };
@@ -592,7 +592,7 @@ static struct clk_rcg2 disp_cc_mdss_pclk1_clk_src = { .name = "disp_cc_mdss_pclk1_clk_src", .parent_data = disp_cc_parent_data_6, .num_parents = ARRAY_SIZE(disp_cc_parent_data_6), - .flags = CLK_SET_RATE_PARENT, + .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE, .ops = &clk_pixel_ops, }, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 412/666 clk: imx: imx6q: Fix device node reference leak in pll6_bypassed()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 4b84d496c804b470124cd3a08e928df6801d8eae ]
The function pll6_bypassed() calls of_parse_phandle_with_args() but never calls of_node_put() to release the reference, causing a memory leak.
Fix this by adding proper cleanup calls on all exit paths.
--- drivers/clk/imx/clk-imx6q.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/clk/imx/clk-imx6q.c +7 -1
@@ -238,8 +238,11 @@ static bool pll6_bypassed(struct device_node *node)return false;if (clkspec.np == node && - clkspec.args[0 ] ==IMX6QDL_PLL6_BYPASS ) + clkspec.args[0 ] ==IMX6QDL_PLL6_BYPASS ) { +of_node_put (clkspec.np);break ; + } +of_node_put (clkspec.np); }/* PLL6 bypass is not part of the assigned clock list */
@@ -249,6 +252,9 @@ static bool pll6_bypassed(struct device_node *node) ret =of_parse_phandle_with_args (node,"assigned-clock-parents" ,"#clock-cells" , index, &clkspec); +if (!ret) +of_node_put (clkspec.np); +if (clkspec.args[0 ] !=IMX6QDL_CLK_PLL6 )return true;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 413/666 clk: imx: imx6q: Fix device node reference leak in of_assigned_ldb_sels()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 9faf207208951460f3f7eefbc112246c8d28ff1b ]
The function of_assigned_ldb_sels() calls of_parse_phandle_with_args() but never calls of_node_put() to release the reference, causing a memory leak.
Fix this by adding proper cleanup calls on all exit paths.
--- drivers/clk/imx/clk-imx6q.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/clk/imx/clk-imx6q.c +4 -0
@@ -188,9 +188,11 @@ static void of_assigned_ldb_sels(struct device_node *node, }if (clkspec.np != node || clkspec.args[0 ] >=IMX6QDL_CLK_END ) {pr_err ("ccm: parent clock %d not in ccm\n" , index); +of_node_put (clkspec.np);return ; } parent = clkspec.args[0 ]; +of_node_put (clkspec.np); rc =of_parse_phandle_with_args (node,"assigned-clocks" ,"#clock-cells" , index, &clkspec);
@@ -198,9 +200,11 @@ static void of_assigned_ldb_sels(struct device_node *node,return ;if (clkspec.np != node || clkspec.args[0 ] >=IMX6QDL_CLK_END ) {pr_err ("ccm: child clock %d not in ccm\n" , index); +of_node_put (clkspec.np);return ; } child = clkspec.args[0 ]; +of_node_put (clkspec.np);if (child !=IMX6QDL_CLK_LDB_DI0_SEL && child !=IMX6QDL_CLK_LDB_DI1_SEL )
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 414/666 clk: imx8mq: Correct the CSI PHY sels
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Krzyszkowiak <[email protected]>
[ Upstream commit d16f57caa78776e6e8a88b96cb2597797b376138 ]
According to i.MX 8M Quad Reference Manual (Section 5.1.2 Table 5-1) MIPI_CSI1_PHY_REF_CLK_ROOT and MIPI_CSI2_PHY_REF_CLK_ROOT have SYSTEM_PLL2_DIV3 available as their second source, which corresponds to sys2_pll_333m rather than sys2_pll_125m.
--- drivers/clk/imx/clk-imx8mq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-imx8mq.c +2 -2
@@ -237,7 +237,7 @@ static const char * const imx8mq_dsi_esc_sels[] = {"osc_25m", "sys2_pll_100m", "static const char *const imx8mq_csi1_core_sels[] = {"osc_25m" ,"sys1_pll_266m" ,"sys2_pll_250m" ,"sys1_pll_800m" ,"sys2_pll_1000m" ,"sys3_pll_out" ,"audio_pll2_out" ,"video_pll1_out" , }; -static const char *const imx8mq_csi1_phy_sels[] = {"osc_25m" ,"sys2_pll_125m" ,"sys2_pll_100m" ,"sys1_pll_800m" , +static const char *const imx8mq_csi1_phy_sels[] = {"osc_25m" ,"sys2_pll_333m" ,"sys2_pll_100m" ,"sys1_pll_800m" ,"sys2_pll_1000m" ,"clk_ext2" ,"audio_pll2_out" ,"video_pll1_out" , };static const char *const imx8mq_csi1_esc_sels[] = {"osc_25m" ,"sys2_pll_100m" ,"sys1_pll_80m" ,"sys1_pll_800m" ,
@@ -246,7 +246,7 @@ static const char * const imx8mq_csi1_esc_sels[] = {"osc_25m", "sys2_pll_100m",static const char *const imx8mq_csi2_core_sels[] = {"osc_25m" ,"sys1_pll_266m" ,"sys2_pll_250m" ,"sys1_pll_800m" ,"sys2_pll_1000m" ,"sys3_pll_out" ,"audio_pll2_out" ,"video_pll1_out" , }; -static const char *const imx8mq_csi2_phy_sels[] = {"osc_25m" ,"sys2_pll_125m" ,"sys2_pll_100m" ,"sys1_pll_800m" , +static const char *const imx8mq_csi2_phy_sels[] = {"osc_25m" ,"sys2_pll_333m" ,"sys2_pll_100m" ,"sys1_pll_800m" ,"sys2_pll_1000m" ,"clk_ext2" ,"audio_pll2_out" ,"video_pll1_out" , };static const char *const imx8mq_csi2_esc_sels[] = {"osc_25m" ,"sys2_pll_100m" ,"sys1_pll_80m" ,"sys1_pll_800m" ,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 415/666 x86/um/vdso: Drop VDSO64-y from Makefile
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit 3c9b904f9033fb250db72d258bbdec791dc89405 ]
This symbol is unnecessary, remove it.
Stable-dep-of: d1895c15fc7d ("x86/um: fix vDSO installation")
--- arch/x86/um/vdso/Makefile | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
arch/x86/um/vdso/Makefile +2 -5
@@ -3,16 +3,13 @@ # Building vDSO images for x86. # -VDSO64-y := y - -vdso-install-$(VDSO64-y) += vdso.so - +vdso-install-y += vdso.so # files to link into the vdso vobjs-y := vdso-note.o um_vdso.o # files to link into kernel -obj-$(VDSO64-y) += vdso.o vma.o +obj-y += vdso.o vma.o vobjs := $(foreach F,$(vobjs-y),$(obj)/$F)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 416/666 x86/um: fix vDSO installation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit d1895c15fc7d90a615bc8c455feb02acaf08ef1e ]
The generic vDSO installation logic used by 'make vdso_install' requires that $(vdso-install-y) is defined by the top-level architecture Makefile and that it contains a path relative to the root of the tree. For UML neither of these is satisfied.
Move the definition of $(vdso-install-y) to a place which is included by the arch/um/Makefile and use the full relative path.
--- arch/x86/Makefile.um | 2 ++ arch/x86/um/vdso/Makefile | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/Makefile.um +2 -0
@@ -60,4 +60,6 @@ ELF_FORMAT := elf64-x86-64 LINK-$(CONFIG_LD_SCRIPT_DYN_RPATH) += -Wl,-rpath,/lib64 LINK-y += -m64 +vdso-install-y += arch/x86/um/vdso/vdso.so.dbg + endif
arch/x86/um/vdso/Makefile +0 -2
@@ -3,8 +3,6 @@ # Building vDSO images for x86. # -vdso-install-y += vdso.so - # files to link into the vdso vobjs-y := vdso-note.o um_vdso.o
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 417/666 clk: qoriq: avoid format string warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 096abbb6682ee031a0f5ce9f4c71ead9fa63d31e ]
clang-22 warns about the use of non-variadic format arguments passed into snprintf():
drivers/clk/clk-qoriq.c:925:39: error: diagnostic behavior may be improved by adding the
'format(printf, 7, 8)' attribute to the declaration of 'create_mux_common' [-Werror,-Wmissing-format-attribute]
910 | static struct clk * __init create_mux_common(struct clockgen *cg,
| __attribute__((format(printf, 7, 8)))
911 | struct mux_hwclock *hwc,
912 | const struct clk_ops *ops,
913 | unsigned long min_rate,
914 | unsigned long max_rate,
915 | unsigned long pct80_rate,
916 | const char *fmt, int idx)
917 | {
918 | struct clk_init_data init = {};
919 | struct clk *clk;
920 | const struct clockgen_pll_div *div;
921 | const char *parent_names[NUM_MUX_PARENTS];
922 | char name[32];
923 | int i, j;
924 |
925 | snprintf(name, sizeof(name), fmt, idx);
| ^drivers/clk/clk-qoriq.c:910:28: note: 'create_mux_common' declared here
910 | static struct clk * __init create_mux_common(struct clockgen *cg,
Rework this to pass the 'int idx' as a varargs argument, allowing the format string to be verified at the caller location.
--- drivers/clk/clk-qoriq.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/clk/clk-qoriq.c +9 -8
@@ -906,13 +906,11 @@ static const struct clockgen_pll_div *get_pll_div(struct clockgen *cg,return &cg->pll[pll].div[div]; } -static struct clk *__init create_mux_common (struct clockgen *cg, -struct mux_hwclock *hwc, -const struct clk_ops *ops, -unsigned long min_rate, -unsigned long max_rate, -unsigned long pct80_rate, -const char *fmt,int idx) +static struct clk * __init __printf(7, 8) +create_mux_common(struct clockgen *cg, struct mux_hwclock *hwc, + const struct clk_ops *ops, unsigned long min_rate, + unsigned long max_rate, unsigned long pct80_rate, + const char *fmt, ...) { struct clk_init_data init = {};struct clk *clk;
@@ -920,8 +918,11 @@ static struct clk * __init create_mux_common(struct clockgen *cg,const char *parent_names[NUM_MUX_PARENTS ];char name[32 ];int i, j; +va_list args; -snprintf (name,sizeof (name), fmt, idx); +va_start (args, fmt); +vsnprintf (name,sizeof (name), fmt, args); +va_end (args);for (i =0 , j =0 ; i <NUM_MUX_PARENTS ; i++) {unsigned long rate;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 418/666 clk: xgene: Fix mapping leak in xgene_pllclk_init()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit f520a492e07bc6718e26cfb7543ab4cadd8bb0e2 ]
If xgene_register_clk_pll() fails, the mapped register block is never unmapped.
--- drivers/clk/clk-xgene.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/clk/clk-xgene.c +2 -0
@@ -187,6 +187,8 @@ static void xgene_pllclk_init(struct device_node *np, enum xgene_pll_type pll_tyof_clk_add_provider (np, of_clk_src_simple_get, clk);clk_register_clkdev (clk, clk_name,NULL );pr_debug ("Add %s clock PLL\n" , clk_name); + }else { +iounmap (reg); } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 419/666 dt-bindings: clock: qcom,dispcc-sc7180: Define MDSS resets
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit fc6e29d42872680dca017f2e5169eefe971f8d89 ]
The MDSS resets have so far been left undescribed. Fix that.
Stable-dep-of: b0bc6011c549 ("clk: qcom: dispcc-sc7180: Add missing MDSS resets")
--- include/dt-bindings/clock/qcom,dispcc-sc7180.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
include/dt-bindings/clock/qcom,dispcc-sc7180.h +6 -1
@@ -6,6 +6,7 @@#ifndef _DT_BINDINGS_CLK_QCOM_DISP_CC_SC7180_H#define _DT_BINDINGS_CLK_QCOM_DISP_CC_SC7180_H +/* Clocks */ #define DISP_CC_PLL0 0#define DISP_CC_PLL0_OUT_EVEN 1#define DISP_CC_MDSS_AHB_CLK 2
@@ -40,7 +41,11 @@#define DISP_CC_MDSS_VSYNC_CLK_SRC 31#define DISP_CC_XO_CLK 32 -/* DISP_CC GDSCR */ +/* Resets */ +#define DISP_CC_MDSS_CORE_BCR 0 +#define DISP_CC_MDSS_RSCC_BCR 1 + +/* GDSCs */ #define MDSS_GDSC 0#endif
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 420/666 clk: qcom: dispcc-sc7180: Add missing MDSS resets
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit b0bc6011c5499bdfddd0390262bfa13dce1eff74 ]
The MDSS resets have so far been left undescribed. Fix that.
--- drivers/clk/qcom/dispcc-sc7180.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/clk/qcom/dispcc-sc7180.c +8 -0
@@ -16,6 +16,7 @@#include "clk-regmap-divider.h" #include "common.h" #include "gdsc.h" +#include "reset.h" enum {P_BI_TCXO ,
@@ -635,6 +636,11 @@ static struct gdsc mdss_gdsc = { .flags = HW_CTRL, }; +static const struct qcom_reset_map disp_cc_sc7180_resets[] = { + [DISP_CC_MDSS_CORE_BCR ] = {0x2000 }, + [DISP_CC_MDSS_RSCC_BCR ] = {0x4000 }, +}; +static struct gdsc *disp_cc_sc7180_gdscs[] = { [MDSS_GDSC ] = &mdss_gdsc, };
@@ -686,6 +692,8 @@ static const struct qcom_cc_desc disp_cc_sc7180_desc = { .config = &disp_cc_sc7180_regmap_config, .clks = disp_cc_sc7180_clocks, .num_clks = ARRAY_SIZE(disp_cc_sc7180_clocks), + .resets = disp_cc_sc7180_resets, + .num_resets = ARRAY_SIZE(disp_cc_sc7180_resets), .gdscs = disp_cc_sc7180_gdscs, .num_gdscs = ARRAY_SIZE(disp_cc_sc7180_gdscs), };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 421/666 lib/hexdump: print_hex_dump_bytes() calls print_hex_dump_debug()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
[ Upstream commit 36776b7f8a8955b4e75b5d490a75fee0c7a2a7ef ]
print_hex_dump_bytes() claims to be a simple wrapper around print_hex_dump(), but it actally calls print_hex_dump_debug(), which means no output is printed if (dynamic) DEBUG is disabled.
Update the documentation to match the implementation.
--- include/linux/printk.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
include/linux/printk.h +3 -2
@@ -800,7 +800,8 @@ static inline void print_hex_dump_devel(const char *prefix_str, int prefix_type,#endif /** -* print_hex_dump_bytes - shorthand form of print_hex_dump() with default params +* print_hex_dump_bytes - shorthand form of print_hex_dump_debug() with default +* params * @prefix_str: string to prefix each line with; * caller supplies trailing spaces for alignment if desired * @prefix_type: controls whether prefix of an offset, address, or none
@@ -808,7 +809,7 @@ static inline void print_hex_dump_devel(const char *prefix_str, int prefix_type,* @buf: data blob to dump * @len: number of bytes in the @buf * -* Calls print_hex_dump(), with log level of KERN_DEBUG, +* Calls print_hex_dump_debug(), with log level of KERN_DEBUG, * rowsize of 16, groupsize of 1, and ASCII output included. */ #define print_hex_dump_bytes (prefix_str, prefix_type, buf, len) \
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 422/666 clk: qcom: gcc-x1e80100: Keep GCC USB QTB clock always ON
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jagadeesh Kona <[email protected]>
[ Upstream commit 05566ebcc0cd170bd4f50c907ee3ed8e106251e3 ]
In Hamoa, SMMU invalidation requires the GCC_AGGRE_USB_NOC_AXI_CLK to be on for the USB QTB to be functional. This is currently explicitly enabled by the DWC3 glue driver, so an invalidation happening while the USB controller is suspended will fault.
Solve this by voting for the GCC MMU USB QTB clock.
--- drivers/clk/qcom/gcc-x1e80100.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/gcc-x1e80100.c +1 -0
@@ -7413,6 +7413,7 @@ static int gcc_x1e80100_probe(struct platform_device *pdev)qcom_branch_set_clk_en (regmap,0x32004 );/* GCC_VIDEO_AHB_CLK */ qcom_branch_set_clk_en (regmap,0x32030 );/* GCC_VIDEO_XO_CLK */ qcom_branch_set_clk_en (regmap,0x71004 );/* GCC_GPU_CFG_AHB_CLK */ +qcom_branch_set_clk_en (regmap,0x7d01c );/* GCC_HLOS1_VOTE_AGGRE_NOC_MMU_USB_QTB_CLK */ /* Clear GDSC_SLEEP_ENA_VOTE to stop votes being auto-removed in sleep. */ regmap_write (regmap,0x52224 ,0x0 );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 423/666 clk: visconti: pll: initialize clk_init_data to zero
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Masney <[email protected]>
[ Upstream commit 1603cbb64173a0e9fa7500f2a686f4aa011c58b9 ]
Sashiko reported the following:
Quoted 4 lines
The struct
clk_init_datainit is declared on the stack without being fully zero-initialized. While fields like name, flags,parent_names,num_parents, and ops are explicitly assigned, theparent_dataandparent_hwsfields are left containing stack garbage.
clk_core_populate_parent_map() currently prefers the parent names over the parent data and hws, so this isn't a problem at the moment. If that ordering ever changed in the future, then this could lead to some unexpected crashes. Let's just go ahead and make sure that the struct clk_init_data is initialized to zero as a good practice.
--- drivers/clk/visconti/pll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/visconti/pll.c +1 -1
@@ -244,7 +244,7 @@ static struct clk_hw *visconti_register_pll(struct visconti_pll_provider *ctx,const struct visconti_pll_rate_table *rate_table, spinlock_t *lock) { - struct clk_init_data init; + struct clk_init_data init = {};struct visconti_pll *pll;struct clk_hw *pll_hw_clk;size_t len;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 424/666 f2fs: protect extension_list reading with sb_lock in f2fs_sbi_show()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongpeng Yang <[email protected]>
[ Upstream commit 5909bedbed38c558bee7cb6758ceedf9bc3a9194 ]
In f2fs_sbi_show(), the extension_list, extension_count and hot_ext_count are read without holding sbi->sb_lock. If a concurrent sysfs store modifies the extension list via f2fs_update_extension_list(), the show path may read inconsistent count and array contents, potentially leading to out-of-bounds access or displaying stale data.
Fix this by holding sb_lock around the entire extension list read and format operation.
--- fs/f2fs/sysfs.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
fs/f2fs/sysfs.c +5 -2
@@ -358,10 +358,12 @@ static ssize_t f2fs_sbi_show(struct f2fs_attr *a,if (!strcmp (a->attr.name,"extension_list" )) {__u8 (*extlist)[F2FS_EXTENSION_LEN ] = sbi->raw_super->extension_list; -int cold_count =le32_to_cpu (sbi->raw_super->extension_count); -int hot_count = sbi->raw_super->hot_ext_count; +int cold_count, hot_count;int len =0 , i; +f2fs_down_read (&sbi->sb_lock); + cold_count =le32_to_cpu (sbi->raw_super->extension_count); + hot_count = sbi->raw_super->hot_ext_count; len +=sysfs_emit_at (buf, len,"cold file extension:\n" );for (i =0 ; i < cold_count; i++) len +=sysfs_emit_at (buf, len,"%s\n" , extlist[i]);
@@ -369,6 +371,7 @@ static ssize_t f2fs_sbi_show(struct f2fs_attr *a, len +=sysfs_emit_at (buf, len,"hot file extension:\n" );for (i = cold_count; i < cold_count + hot_count; i++) len +=sysfs_emit_at (buf, len,"%s\n" , extlist[i]); +f2fs_up_read (&sbi->sb_lock);return len; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 425/666 drm/i915: Relocate the SKL wm sanitation code
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
[ Upstream commit e31e8681d29c5c35aa070ca6323c6b95ecf0db99 ]
In order to add more MBUS sanitation into the code we'll want to reuse a bunch of the code that performs the MBUS/related hardware programming. Currently that code comes after the main skl_wm_get_hw_state_and_sanitize() entrypoint. In order to avoid annoying forward declarations relocate the skl_wm_get_hw_state_and_sanitize() and related stuff nearer to the end of the file.
Stable-dep-of: a97c88a176b6 ("drm/i915/wm: Verify the correct plane DDB entry")
--- drivers/gpu/drm/i915/display/skl_watermark.c | 420 +++++++++---------- 1 file changed, 210 insertions(+), 210 deletions(-)
drivers/gpu/drm/i915/display/skl_watermark.c +210 -210
@@ -3039,202 +3039,6 @@ static void skl_wm_get_hw_state(struct drm_i915_private *i915) dbuf_state->enabled_slices = i915->display.dbuf.enabled_slices; } -static bool skl_dbuf_is_misconfigured (struct drm_i915_private *i915) -{ -const struct intel_dbuf_state *dbuf_state = -to_intel_dbuf_state (i915->display.dbuf.obj.state); -struct skl_ddb_entry entries[I915_MAX_PIPES ] = {}; -struct intel_crtc *crtc; - -for_each_intel_crtc (&i915->drm, crtc) { -const struct intel_crtc_state *crtc_state = -to_intel_crtc_state (crtc->base.state); - - entries[crtc->pipe] = crtc_state->wm.skl.ddb; - } - -for_each_intel_crtc (&i915->drm, crtc) { -const struct intel_crtc_state *crtc_state = -to_intel_crtc_state (crtc->base.state); -u8 slices; - - slices =skl_compute_dbuf_slices (crtc, dbuf_state->active_pipes, - dbuf_state->joined_mbus); -if (dbuf_state->slices[crtc->pipe] & ~slices) -return true; - -if (skl_ddb_allocation_overlaps (&crtc_state->wm.skl.ddb, entries, -I915_MAX_PIPES , crtc->pipe)) -return true; - } - -return false; -} - -static void skl_wm_sanitize (struct drm_i915_private *i915) -{ -struct intel_crtc *crtc; - -/* -* On TGL/RKL (at least) the BIOS likes to assign the planes -* to the wrong DBUF slices. This will cause an infinite loop -* in skl_commit_modeset_enables() as it can't find a way to -* transition between the old bogus DBUF layout to the new -* proper DBUF layout without DBUF allocation overlaps between -* the planes (which cannot be allowed or else the hardware -* may hang). If we detect a bogus DBUF layout just turn off -* all the planes so that skl_commit_modeset_enables() can -* simply ignore them. -*/ -if (!skl_dbuf_is_misconfigured (i915)) -return ; - -drm_dbg_kms (&i915->drm,"BIOS has misprogrammed the DBUF, disabling all planes\n" ); - -for_each_intel_crtc (&i915->drm, crtc) { -struct intel_plane *plane =to_intel_plane (crtc->base.primary); -const struct intel_plane_state *plane_state = -to_intel_plane_state (plane->base.state); -struct intel_crtc_state *crtc_state = -to_intel_crtc_state (crtc->base.state); - -if (plane_state->uapi.visible) -intel_plane_disable_noatomic (crtc, plane); - -drm_WARN_ON (&i915->drm, crtc_state->active_planes !=0 ); - -memset (&crtc_state->wm.skl.ddb,0 ,sizeof (crtc_state->wm.skl.ddb)); - } -} - -static void skl_wm_get_hw_state_and_sanitize (struct drm_i915_private *i915) -{ -skl_wm_get_hw_state (i915); -skl_wm_sanitize (i915); -} - -void intel_wm_state_verify (struct intel_atomic_state *state, -struct intel_crtc *crtc) -{ -struct drm_i915_private *i915 =to_i915 (state->base.dev); -const struct intel_crtc_state *new_crtc_state = -intel_atomic_get_new_crtc_state (state, crtc); -struct skl_hw_state { -struct skl_ddb_entry ddb[I915_MAX_PLANES ]; -struct skl_ddb_entry ddb_y[I915_MAX_PLANES ]; -struct skl_pipe_wm wm; - } *hw; -const struct skl_pipe_wm *sw_wm = &new_crtc_state->wm.skl.optimal; -struct intel_plane *plane; -u8 hw_enabled_slices; -int level; - -if (DISPLAY_VER (i915) <9 || !new_crtc_state->hw.active) -return ; - - hw =kzalloc (sizeof (*hw),GFP_KERNEL ); -if (!hw) -return ; - -skl_pipe_wm_get_hw_state (crtc, &hw->wm); - -skl_pipe_ddb_get_hw_state (crtc, hw->ddb, hw->ddb_y); - - hw_enabled_slices =intel_enabled_dbuf_slices_mask (i915); - -if (DISPLAY_VER (i915) >=11 && - hw_enabled_slices != i915->display.dbuf.enabled_slices) -drm_err (&i915->drm, -"mismatch in DBUF Slices (expected 0x%x, got 0x%x)\n" , - i915->display.dbuf.enabled_slices, - hw_enabled_slices); - -for_each_intel_plane_on_crtc (&i915->drm, crtc, plane) { -const struct skl_ddb_entry *hw_ddb_entry, *sw_ddb_entry; -const struct skl_wm_level *hw_wm_level, *sw_wm_level; - -/* Watermarks */ -for (level =0 ; level < i915->display.wm.num_levels; level++) { - hw_wm_level = &hw->wm.planes[plane->id].wm[level]; - sw_wm_level =skl_plane_wm_level (sw_wm, plane->id, level); - -if (skl_wm_level_equals (hw_wm_level, sw_wm_level)) -continue ; - -drm_err (&i915->drm, -"[PLANE:%d:%s] mismatch in WM%d (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , - plane->base.base.id, plane->base.name, level, - sw_wm_level->enable, - sw_wm_level->blocks, - sw_wm_level->lines, - hw_wm_level->enable, - hw_wm_level->blocks, - hw_wm_level->lines); - } - - hw_wm_level = &hw->wm.planes[plane->id].trans_wm; - sw_wm_level =skl_plane_trans_wm (sw_wm, plane->id); - -if (!skl_wm_level_equals (hw_wm_level, sw_wm_level)) { -drm_err (&i915->drm, -"[PLANE:%d:%s] mismatch in trans WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , - plane->base.base.id, plane->base.name, - sw_wm_level->enable, - sw_wm_level->blocks, - sw_wm_level->lines, - hw_wm_level->enable, - hw_wm_level->blocks, - hw_wm_level->lines); - } - - hw_wm_level = &hw->wm.planes[plane->id].sagv.wm0; - sw_wm_level = &sw_wm->planes[plane->id].sagv.wm0; - -if (HAS_HW_SAGV_WM (i915) && - !skl_wm_level_equals (hw_wm_level, sw_wm_level)) { -drm_err (&i915->drm, -"[PLANE:%d:%s] mismatch in SAGV WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , - plane->base.base.id, plane->base.name, - sw_wm_level->enable, - sw_wm_level->blocks, - sw_wm_level->lines, - hw_wm_level->enable, - hw_wm_level->blocks, - hw_wm_level->lines); - } - - hw_wm_level = &hw->wm.planes[plane->id].sagv.trans_wm; - sw_wm_level = &sw_wm->planes[plane->id].sagv.trans_wm; - -if (HAS_HW_SAGV_WM (i915) && - !skl_wm_level_equals (hw_wm_level, sw_wm_level)) { -drm_err (&i915->drm, -"[PLANE:%d:%s] mismatch in SAGV trans WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , - plane->base.base.id, plane->base.name, - sw_wm_level->enable, - sw_wm_level->blocks, - sw_wm_level->lines, - hw_wm_level->enable, - hw_wm_level->blocks, - hw_wm_level->lines); - } - -/* DDB */ - hw_ddb_entry = &hw->ddb[PLANE_CURSOR ]; - sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb[PLANE_CURSOR ]; - -if (!skl_ddb_entry_equal (hw_ddb_entry, sw_ddb_entry)) { -drm_err (&i915->drm, -"[PLANE:%d:%s] mismatch in DDB (expected (%u,%u), found (%u,%u))\n" , - plane->base.base.id, plane->base.name, - sw_ddb_entry->start, sw_ddb_entry->end, - hw_ddb_entry->start, hw_ddb_entry->end); - } - } - -kfree (hw); -} -bool skl_watermark_ipc_enabled (struct drm_i915_private *i915) {return i915->display.wm.ipc_enabled;
@@ -3390,20 +3194,6 @@ static void skl_setup_wm_latency(struct drm_i915_private *i915)intel_print_wm_latency (i915,"Gen9 Plane" , i915->display.wm.skl_latency); } -static const struct intel_wm_funcs skl_wm_funcs = { - .compute_global_watermarks = skl_compute_wm, - .get_hw_state = skl_wm_get_hw_state_and_sanitize, -}; - -void skl_wm_init (struct drm_i915_private *i915) -{ -intel_sagv_init (i915); - -skl_setup_wm_latency (i915); - - i915->display.funcs.wm = &skl_wm_funcs; -} -static struct intel_global_state *intel_dbuf_duplicate_state (struct intel_global_obj *obj) {struct intel_dbuf_state *dbuf_state;
@@ -3747,6 +3537,216 @@ void intel_dbuf_post_plane_update(struct intel_atomic_state *state)gen9_dbuf_slices_update (i915, new_slices); } +static bool skl_dbuf_is_misconfigured (struct drm_i915_private *i915) +{ +const struct intel_dbuf_state *dbuf_state = +to_intel_dbuf_state (i915->display.dbuf.obj.state); +struct skl_ddb_entry entries[I915_MAX_PIPES ] = {}; +struct intel_crtc *crtc; + +for_each_intel_crtc (&i915->drm, crtc) { +const struct intel_crtc_state *crtc_state = +to_intel_crtc_state (crtc->base.state); + + entries[crtc->pipe] = crtc_state->wm.skl.ddb; + } + +for_each_intel_crtc (&i915->drm, crtc) { +const struct intel_crtc_state *crtc_state = +to_intel_crtc_state (crtc->base.state); +u8 slices; + + slices =skl_compute_dbuf_slices (crtc, dbuf_state->active_pipes, + dbuf_state->joined_mbus); +if (dbuf_state->slices[crtc->pipe] & ~slices) +return true; + +if (skl_ddb_allocation_overlaps (&crtc_state->wm.skl.ddb, entries, +I915_MAX_PIPES , crtc->pipe)) +return true; + } + +return false; +} + +static void skl_wm_sanitize (struct drm_i915_private *i915) +{ +struct intel_crtc *crtc; + +/* +* On TGL/RKL (at least) the BIOS likes to assign the planes +* to the wrong DBUF slices. This will cause an infinite loop +* in skl_commit_modeset_enables() as it can't find a way to +* transition between the old bogus DBUF layout to the new +* proper DBUF layout without DBUF allocation overlaps between +* the planes (which cannot be allowed or else the hardware +* may hang). If we detect a bogus DBUF layout just turn off +* all the planes so that skl_commit_modeset_enables() can +* simply ignore them. +*/ +if (!skl_dbuf_is_misconfigured (i915)) +return ; + +drm_dbg_kms (&i915->drm,"BIOS has misprogrammed the DBUF, disabling all planes\n" ); + +for_each_intel_crtc (&i915->drm, crtc) { +struct intel_plane *plane =to_intel_plane (crtc->base.primary); +const struct intel_plane_state *plane_state = +to_intel_plane_state (plane->base.state); +struct intel_crtc_state *crtc_state = +to_intel_crtc_state (crtc->base.state); + +if (plane_state->uapi.visible) +intel_plane_disable_noatomic (crtc, plane); + +drm_WARN_ON (&i915->drm, crtc_state->active_planes !=0 ); + +memset (&crtc_state->wm.skl.ddb,0 ,sizeof (crtc_state->wm.skl.ddb)); + } +} + +static void skl_wm_get_hw_state_and_sanitize (struct drm_i915_private *i915) +{ +skl_wm_get_hw_state (i915); +skl_wm_sanitize (i915); +} + +void intel_wm_state_verify (struct intel_atomic_state *state, +struct intel_crtc *crtc) +{ +struct drm_i915_private *i915 =to_i915 (state->base.dev); +const struct intel_crtc_state *new_crtc_state = +intel_atomic_get_new_crtc_state (state, crtc); +struct skl_hw_state { +struct skl_ddb_entry ddb[I915_MAX_PLANES ]; +struct skl_ddb_entry ddb_y[I915_MAX_PLANES ]; +struct skl_pipe_wm wm; + } *hw; +const struct skl_pipe_wm *sw_wm = &new_crtc_state->wm.skl.optimal; +struct intel_plane *plane; +u8 hw_enabled_slices; +int level; + +if (DISPLAY_VER (i915) <9 || !new_crtc_state->hw.active) +return ; + + hw =kzalloc (sizeof (*hw),GFP_KERNEL ); +if (!hw) +return ; + +skl_pipe_wm_get_hw_state (crtc, &hw->wm); + +skl_pipe_ddb_get_hw_state (crtc, hw->ddb, hw->ddb_y); + + hw_enabled_slices =intel_enabled_dbuf_slices_mask (i915); + +if (DISPLAY_VER (i915) >=11 && + hw_enabled_slices != i915->display.dbuf.enabled_slices) +drm_err (&i915->drm, +"mismatch in DBUF Slices (expected 0x%x, got 0x%x)\n" , + i915->display.dbuf.enabled_slices, + hw_enabled_slices); + +for_each_intel_plane_on_crtc (&i915->drm, crtc, plane) { +const struct skl_ddb_entry *hw_ddb_entry, *sw_ddb_entry; +const struct skl_wm_level *hw_wm_level, *sw_wm_level; + +/* Watermarks */ +for (level =0 ; level < i915->display.wm.num_levels; level++) { + hw_wm_level = &hw->wm.planes[plane->id].wm[level]; + sw_wm_level =skl_plane_wm_level (sw_wm, plane->id, level); + +if (skl_wm_level_equals (hw_wm_level, sw_wm_level)) +continue ; + +drm_err (&i915->drm, +"[PLANE:%d:%s] mismatch in WM%d (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , + plane->base.base.id, plane->base.name, level, + sw_wm_level->enable, + sw_wm_level->blocks, + sw_wm_level->lines, + hw_wm_level->enable, + hw_wm_level->blocks, + hw_wm_level->lines); + } + + hw_wm_level = &hw->wm.planes[plane->id].trans_wm; + sw_wm_level =skl_plane_trans_wm (sw_wm, plane->id); + +if (!skl_wm_level_equals (hw_wm_level, sw_wm_level)) { +drm_err (&i915->drm, +"[PLANE:%d:%s] mismatch in trans WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , + plane->base.base.id, plane->base.name, + sw_wm_level->enable, + sw_wm_level->blocks, + sw_wm_level->lines, + hw_wm_level->enable, + hw_wm_level->blocks, + hw_wm_level->lines); + } + + hw_wm_level = &hw->wm.planes[plane->id].sagv.wm0; + sw_wm_level = &sw_wm->planes[plane->id].sagv.wm0; + +if (HAS_HW_SAGV_WM (i915) && + !skl_wm_level_equals (hw_wm_level, sw_wm_level)) { +drm_err (&i915->drm, +"[PLANE:%d:%s] mismatch in SAGV WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , + plane->base.base.id, plane->base.name, + sw_wm_level->enable, + sw_wm_level->blocks, + sw_wm_level->lines, + hw_wm_level->enable, + hw_wm_level->blocks, + hw_wm_level->lines); + } + + hw_wm_level = &hw->wm.planes[plane->id].sagv.trans_wm; + sw_wm_level = &sw_wm->planes[plane->id].sagv.trans_wm; + +if (HAS_HW_SAGV_WM (i915) && + !skl_wm_level_equals (hw_wm_level, sw_wm_level)) { +drm_err (&i915->drm, +"[PLANE:%d:%s] mismatch in SAGV trans WM (expected e=%d b=%u l=%u, got e=%d b=%u l=%u)\n" , + plane->base.base.id, plane->base.name, + sw_wm_level->enable, + sw_wm_level->blocks, + sw_wm_level->lines, + hw_wm_level->enable, + hw_wm_level->blocks, + hw_wm_level->lines); + } + +/* DDB */ + hw_ddb_entry = &hw->ddb[PLANE_CURSOR ]; + sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb[PLANE_CURSOR ]; + +if (!skl_ddb_entry_equal (hw_ddb_entry, sw_ddb_entry)) { +drm_err (&i915->drm, +"[PLANE:%d:%s] mismatch in DDB (expected (%u,%u), found (%u,%u))\n" , + plane->base.base.id, plane->base.name, + sw_ddb_entry->start, sw_ddb_entry->end, + hw_ddb_entry->start, hw_ddb_entry->end); + } + } + +kfree (hw); +} + +static const struct intel_wm_funcs skl_wm_funcs = { + .compute_global_watermarks = skl_compute_wm, + .get_hw_state = skl_wm_get_hw_state_and_sanitize, +}; + +void skl_wm_init (struct drm_i915_private *i915) +{ +intel_sagv_init (i915); + +skl_setup_wm_latency (i915); + + i915->display.funcs.wm = &skl_wm_funcs; +} +static int skl_watermark_ipc_status_show (struct seq_file *m,void *data) {struct drm_i915_private *i915 = m->private;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 426/666 drm/i915/wm: Verify the correct plane DDB entry
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ville Syrjälä <[email protected]>
[ Upstream commit a97c88a176b6b8d116f4d3f508f3bd02bc77b462 ]
Actually verify the DDB entry for the plane we're looking at instead of always verifying the cursor DDB.
--- drivers/gpu/drm/i915/display/skl_watermark.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/display/skl_watermark.c +2 -2
@@ -3718,8 +3718,8 @@ void intel_wm_state_verify(struct intel_atomic_state *state, }/* DDB */ - hw_ddb_entry = &hw->ddb[PLANE_CURSOR ]; - sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb[PLANE_CURSOR ]; + hw_ddb_entry = &hw->ddb[plane->id]; + sw_ddb_entry = &new_crtc_state->wm.skl.plane_ddb[plane->id];if (!skl_ddb_entry_equal (hw_ddb_entry, sw_ddb_entry)) { drm_err(&i915->drm,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 427/666 crypto: sa2ul - Fix AEAD fallback algorithm names
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: T Pratham <[email protected]>
[ Upstream commit 8451ab6ad686ffdcdf9ddadaa446a79ab48e5590 ]
For authenc AEAD algorithms, sa2ul is trying to register very specific -ce version as a fallback. This causes registration failure on SoCs which do not have ARMv8-CE enabled/available. Change the fallback algorithm from the specific driver name to generic algorithm name so that the kernel can allocate any available fallback.
--- drivers/crypto/sa2ul.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/sa2ul.c +2 -2
@@ -1775,13 +1775,13 @@ static int sa_cra_init_aead(struct crypto_aead *tfm, const char *hash,static int sa_cra_init_aead_sha1 (struct crypto_aead *tfm) {return sa_cra_init_aead (tfm,"sha1" , -"authenc(hmac(sha1-ce),cbc(aes-ce))" ); +"authenc(hmac(sha1),cbc(aes))" ); }static int sa_cra_init_aead_sha256 (struct crypto_aead *tfm) {return sa_cra_init_aead (tfm,"sha256" , -"authenc(hmac(sha256-ce),cbc(aes-ce))" ); +"authenc(hmac(sha256),cbc(aes))" ); }static void sa_exit_tfm_aead (struct crypto_aead *tfm)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 428/666 crypto: ccp - copy IV using skcipher ivsize
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Moses <[email protected]>
[ Upstream commit a7a1f3cdd64d8a165d9b8c9e9ad7fb46ac19dfc4 ]
AF_ALG rfc3686-ctr-aes-ccp requests pass an 8-byte IV to the driver.
ccp_aes_complete() restores AES_BLOCK_SIZE bytes into the caller's IV buffer while RFC3686 skciphers expose an 8-byte IV, so the restore overruns the provided buffer.
Use crypto_skcipher_ivsize() to copy only the algorithm's IV length.
--- drivers/crypto/ccp/ccp-crypto-aes.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/crypto/ccp/ccp-crypto-aes.c +5 -2
@@ -29,8 +29,11 @@ static int ccp_aes_complete(struct crypto_async_request *async_req, int ret)if (ret)return ret; -if (ctx->u.aes.mode !=CCP_AES_MODE_ECB ) -memcpy (req->iv, rctx->iv,AES_BLOCK_SIZE ); +if (ctx->u.aes.mode !=CCP_AES_MODE_ECB ) { +size_t ivsize =crypto_skcipher_ivsize (crypto_skcipher_reqtfm (req)); + +memcpy (req->iv, rctx->iv, ivsize); + }return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 429/666 erofs: add encoded extent on-disk definition
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
[ Upstream commit efb2aef569b35b415c232c4e9fdecd0e540e1f60 ]
Previously, EROFS provided both (non-)compact compressed indexes to keep necessary hints for each logical block, enabling O(1) random indexing. This approach was originally designed for small compression units (e.g., 4KiB), where compressed data is strictly block-aligned via fixed-sized output compression.
However, EROFS now supports big pclusters up to 1MiB and many users use large configurations to minimize image sizes. For such configurations, the total number of extents decreases significantly (e.g., only 1,024 extents for a 1GiB file using 1MiB pclusters), then runtime metadata overhead becomes negligible compared to data I/O and decoding costs.
Additionally, some popular compression algorithm (mainly Zstd) still lacks native fixed-sized output compression support (although it's planned by their authors). Instead of just waiting for compressor improvements, let's adopt byte-oriented extents, allowing these compressors to retain their current methods.
For example, it speeds up Zstd compression a lot:
Processor: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz * 96 Dataset: enwik9 Build time Size Type Command Line 3m52.339s 266653696 FO -C524288 -zzstd,22 3m48.549s 266174464 FO -E48bit -C524288 -zzstd,22 0m12.821s 272134144 FI -E48bit -C1048576 --max-extent-bytes=1048576 -zzstd,22
0m14.528s 248987648 FO -C1048576 -zlzma,9 0m14.605s 248504320 FO -E48bit -C1048576 -zlzma,9
Encoded extents are structured as an array of struct z_erofs_extent, sorted by logical address in ascending order:
__le32 plen // encoded length, algorithm id and flags __le32 pstart_lo // physical offset LSB __le32 pstart_hi // physical offset MSB __le32 lstart_lo // logical offset __le32 lstart_hi // logical offset MSB
..
Note that prefixed reduced records can be used to minimize metadata for specific cases (e.g. lstart less than 32 bits, then 32 to 16 bytes).
If the logical lengths of all encoded extents are the same, 4-byte (plen) and 8-byte (plen, pstart_lo) records can be used. Or, 16-byte (plen .. lstart_lo) and 32-byte full records have to be used instead.
If 16-byte and 32-byte records are used, the total number of extents is kept in struct z_erofs_map_header, and binary search can be applied on them. Note that eytzinger order is not considerd because data sequential access is important.
If 4-byte records are used, 8-byte start physical offset is between struct z_erofs_map_header and the plen array.
In addition, 64-bit physical offsets can be applied with new encoded extent format to match full 48-bit block addressing.
Remove redundant comments around struct z_erofs_lcluster_index too.
Stable-dep-of: 2d8c7edcb661 ("erofs: unify lcn as u64 for 32-bit platforms")
--- fs/erofs/erofs_fs.h | 99 +++++++++++++++++++++------------------------ fs/erofs/internal.h | 2 +- fs/erofs/zmap.c | 24 +++++------ 3 files changed, 58 insertions(+), 67 deletions(-)
fs/erofs/erofs_fs.h +45 -54
@@ -336,21 +336,20 @@ struct z_erofs_zstd_cfgs {#define Z_EROFS_ZSTD_MAX_DICT_SIZE Z_EROFS_PCLUSTER_MAX_SIZE/* -* bit 0 : COMPACTED_2B indexes (0 - off; 1 - on) -* e.g. for 4k logical cluster size, 4B if compacted 2B is off; -* (4B) + 2B + (4B) if compacted 2B is on. -* bit 1 : HEAD1 big pcluster (0 - off; 1 - on) -* bit 2 : HEAD2 big pcluster (0 - off; 1 - on) -* bit 3 : tailpacking inline pcluster (0 - off; 1 - on) -* bit 4 : interlaced plain pcluster (0 - off; 1 - on) -* bit 5 : fragment pcluster (0 - off; 1 - on) +* Enable COMPACTED_2B for EROFS_INODE_COMPRESSED_COMPACT inodes: +* 4B (disabled) vs 4B+2B+4B (enabled) */ #define Z_EROFS_ADVISE_COMPACTED_2B 0x0001 +/* Enable extent metadata for EROFS_INODE_COMPRESSED_FULL inodes */ +#define Z_EROFS_ADVISE_EXTENTS 0x0001#define Z_EROFS_ADVISE_BIG_PCLUSTER_1 0x0002#define Z_EROFS_ADVISE_BIG_PCLUSTER_2 0x0004#define Z_EROFS_ADVISE_INLINE_PCLUSTER 0x0008#define Z_EROFS_ADVISE_INTERLACED_PCLUSTER 0x0010#define Z_EROFS_ADVISE_FRAGMENT_PCLUSTER 0x0020 +/* Indicate the record size for each extent if extent metadata is used */ +#define Z_EROFS_ADVISE_EXTRECSZ_BIT 1 +#define Z_EROFS_ADVISE_EXTRECSZ_MASK 0x3#define Z_EROFS_FRAGMENT_INODE_BIT 7struct z_erofs_map_header {
@@ -362,45 +361,24 @@ struct z_erofs_map_header {/* indicates the encoded size of tailpacking data */ __le16 h_idata_size; }; +__le32 h_extents_lo;/* extent count LSB */ };__le16 h_advise; -/* -* bit 0-3 : algorithm type of head 1 (logical cluster type 01); -* bit 4-7 : algorithm type of head 2 (logical cluster type 11). -*/ -__u8 h_algorithmtype; -/* -* bit 0-2 : logical cluster bits - 12, e.g. 0 for 4096; -* bit 3-6 : reserved; -* bit 7 : move the whole file into packed inode or not. -*/ -__u8 h_clusterbits; +union { +struct { +/* algorithm type (bit 0-3: HEAD1; bit 4-7: HEAD2) */ +__u8 h_algorithmtype; +/* +* bit 0-3 : logical cluster bits - blkszbits +* bit 4-6 : reserved +* bit 7 : pack the whole file into packed inode +*/ +__u8 h_clusterbits; + }; +__le16 h_extents_hi;/* extent count MSB */ + }; }; -/* -* On-disk logical cluster type: -* 0 - literal (uncompressed) lcluster -* 1,3 - compressed lcluster (for HEAD lclusters) -* 2 - compressed lcluster (for NONHEAD lclusters) -* -* In detail, -* 0 - literal (uncompressed) lcluster, -* di_advise = 0 -* di_clusterofs = the literal data offset of the lcluster -* di_blkaddr = the blkaddr of the literal pcluster -* -* 1,3 - compressed lcluster (for HEAD lclusters) -* di_advise = 1 or 3 -* di_clusterofs = the decompressed data offset of the lcluster -* di_blkaddr = the blkaddr of the compressed pcluster -* -* 2 - compressed lcluster (for NONHEAD lclusters) -* di_advise = 2 -* di_clusterofs = -* the decompressed data offset in its own HEAD lcluster -* di_u.delta[0] = distance to this HEAD lcluster -* di_u.delta[1] = distance to the next HEAD lcluster -*/ enum {Z_EROFS_LCLUSTER_TYPE_PLAIN =0 ,Z_EROFS_LCLUSTER_TYPE_HEAD1 =1 ,
@@ -414,11 +392,7 @@ enum {/* (noncompact only, HEAD) This pcluster refers to partial decompressed data */ #define Z_EROFS_LI_PARTIAL_REF (1 << 15) -/* -* D0_CBLKCNT will be marked _only_ at the 1st non-head lcluster to store the -* compressed block count of a compressed extent (in logical clusters, aka. -* block count of a pcluster). -*/ +/* Set on 1st non-head lcluster to store compressed block counti (in blocks) */ #define Z_EROFS_LI_D0_CBLKCNT (1 << 11)struct z_erofs_lcluster_index {
@@ -427,19 +401,36 @@ struct z_erofs_lcluster_index {__le16 di_clusterofs;union { -/* for the HEAD lclusters */ -__le32 blkaddr; +__le32 blkaddr;/* for the HEAD lclusters */ /* -* for the NONHEAD lclusters * [0] - distance to its HEAD lcluster * [1] - distance to the next HEAD lcluster */ -__le16 delta[2 ]; +__le16 delta[2 ];/* for the NONHEAD lclusters */ } di_u; }; -#define Z_EROFS_FULL_INDEX_ALIGN (end) \ - (ALIGN(end, 8) + sizeof(struct z_erofs_map_header) + 8) +#define Z_EROFS_MAP_HEADER_END (end) \ + (ALIGN(end, 8) + sizeof(struct z_erofs_map_header)) +#define Z_EROFS_FULL_INDEX_START (end) (Z_EROFS_MAP_HEADER_END(end) + 8) + +#define Z_EROFS_EXTENT_PLEN_PARTIAL BIT(27) +#define Z_EROFS_EXTENT_PLEN_FMT_BIT 28 +#define Z_EROFS_EXTENT_PLEN_MASK ((Z_EROFS_PCLUSTER_MAX_SIZE << 1) - 1) +struct z_erofs_extent { +__le32 plen;/* encoded length */ +__le32 pstart_lo;/* physical offset */ +__le32 pstart_hi;/* physical offset MSB */ +__le32 lstart_lo;/* logical offset */ +__le32 lstart_hi;/* logical offset MSB (>= 4GiB inodes) */ +__u8 reserved[12 ];/* for future use */ +}; + +static inline int z_erofs_extent_recsize (unsigned int advise) +{ +return 4 << ((advise >>Z_EROFS_ADVISE_EXTRECSZ_BIT ) & +Z_EROFS_ADVISE_EXTRECSZ_MASK ); +}/* check the EROFS on-disk layout strictly at compile time */ static inline void erofs_check_ondisk_layout_definitions (void )
fs/erofs/internal.h +1 -1
@@ -275,7 +275,7 @@ struct erofs_inode {struct {unsigned short z_advise;unsigned char z_algorithmtype[2 ]; -unsigned char z_logical_clusterbits; +unsigned char z_lclusterbits;unsigned long z_tailextent_headlcn;erofs_off_t z_fragmentoff;unsigned short z_idata_size;
fs/erofs/zmap.c +12 -12
@@ -25,7 +25,7 @@ static int z_erofs_load_full_lcluster(struct z_erofs_maprecorder *m, {struct inode *const inode = m->inode;struct erofs_inode *const vi =EROFS_I (inode); -const erofs_off_t pos =Z_EROFS_FULL_INDEX_ALIGN (erofs_iloc (inode) + +const erofs_off_t pos =Z_EROFS_FULL_INDEX_START (erofs_iloc (inode) + vi->inode_isize + vi->xattr_isize) + lcn *sizeof (struct z_erofs_lcluster_index );struct z_erofs_lcluster_index *di;
@@ -40,7 +40,7 @@ static int z_erofs_load_full_lcluster(struct z_erofs_maprecorder *m, advise =le16_to_cpu (di->di_advise); m->type = advise &Z_EROFS_LI_LCLUSTER_TYPE_MASK ;if (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD ) { - m->clusterofs =1 << vi->z_logical_clusterbits; + m->clusterofs =1 << vi->z_lclusterbits; m->delta[0 ] =le16_to_cpu (di->di_u.delta[0 ]);if (m->delta[0 ] &Z_EROFS_LI_D0_CBLKCNT ) { if (!(vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |
@@ -55,7 +55,7 @@ static int z_erofs_load_full_lcluster(struct z_erofs_maprecorder *m, }else { m->partialref = !!(advise &Z_EROFS_LI_PARTIAL_REF ); m->clusterofs =le16_to_cpu (di->di_clusterofs); -if (m->clusterofs >=1 << vi->z_logical_clusterbits) { +if (m->clusterofs >=1 << vi->z_lclusterbits) {DBG_BUGON (1 );return -EFSCORRUPTED ; }
@@ -102,9 +102,9 @@ static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m, {struct inode *const inode = m->inode;struct erofs_inode *const vi =EROFS_I (inode); -const erofs_off_t ebase =sizeof (struct z_erofs_map_header ) + -ALIGN (erofs_iloc (inode) + vi->inode_isize + vi->xattr_isize,8 ); -const unsigned int lclusterbits = vi->z_logical_clusterbits; +const erofs_off_t ebase =Z_EROFS_MAP_HEADER_END (erofs_iloc (inode) + + vi->inode_isize + vi->xattr_isize); +const unsigned int lclusterbits = vi->z_lclusterbits;const unsigned int totalidx =erofs_iblks (inode);unsigned int compacted_4b_initial, compacted_2b, amortizedshift;unsigned int vcnt, lo, lobits, encodebits, nblk, bytes;
@@ -255,7 +255,7 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m, {struct super_block *sb = m->inode->i_sb;struct erofs_inode *const vi =EROFS_I (m->inode); -const unsigned int lclusterbits = vi->z_logical_clusterbits; +const unsigned int lclusterbits = vi->z_lclusterbits;while (m->lcn >= lookback_distance) {unsigned long lcn = m->lcn - lookback_distance;
@@ -304,7 +304,7 @@ static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m,if ((m->headtype ==Z_EROFS_LCLUSTER_TYPE_HEAD1 && !bigpcl1) || ((m->headtype ==Z_EROFS_LCLUSTER_TYPE_PLAIN || m->headtype ==Z_EROFS_LCLUSTER_TYPE_HEAD2 ) && !bigpcl2) || - (lcn << vi->z_logical_clusterbits) >= inode->i_size) + (lcn << vi->z_lclusterbits) >= inode->i_size) m->compressedblks =1 ;if (m->compressedblks)
@@ -354,7 +354,7 @@ static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m)struct inode *inode = m->inode;struct erofs_inode *vi =EROFS_I (inode);struct erofs_map_blocks *map = m->map; -unsigned int lclusterbits = vi->z_logical_clusterbits; +unsigned int lclusterbits = vi->z_lclusterbits;u64 lcn = m->lcn, headlcn = map->m_la >> lclusterbits;int err;
@@ -398,16 +398,16 @@ static int z_erofs_do_map_blocks(struct inode *inode,struct super_block *sb = inode->i_sb;bool fragment = vi->z_advise &Z_EROFS_ADVISE_FRAGMENT_PCLUSTER ;bool ztailpacking = vi->z_idata_size; +unsigned int lclusterbits = vi->z_lclusterbits;struct z_erofs_maprecorder m = { .inode = inode, .map = map, };int err =0 ; -unsigned int lclusterbits, endoff, afmt; +unsigned int endoff, afmt;unsigned long initial_lcn;unsigned long long ofs, end; - lclusterbits = vi->z_logical_clusterbits; ofs = flags &EROFS_GET_BLOCKS_FINDTAIL ? inode->i_size -1 : map->m_la; initial_lcn = ofs >> lclusterbits; endoff = ofs & ((1 << lclusterbits) -1 );
@@ -569,6 +569,7 @@ static int z_erofs_fill_inode_lazy(struct inode *inode) goto done; } vi->z_advise =le16_to_cpu (h->h_advise); + vi->z_lclusterbits = sb->s_blocksize_bits + (h->h_clusterbits &15 ); vi->z_algorithmtype[0 ] = h->h_algorithmtype &15 ; vi->z_algorithmtype[1 ] = h->h_algorithmtype >>4 ;if (vi->z_advise &Z_EROFS_ADVISE_FRAGMENT_PCLUSTER )
@@ -585,7 +586,6 @@ static int z_erofs_fill_inode_lazy(struct inode *inode) goto out_put_metabuf; } - vi->z_logical_clusterbits = sb->s_blocksize_bits + (h->h_clusterbits &7 );if (!erofs_sb_has_big_pcluster (EROFS_SB (sb)) && vi->z_advise & (Z_EROFS_ADVISE_BIG_PCLUSTER_1 |Z_EROFS_ADVISE_BIG_PCLUSTER_2 )) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 430/666 erofs: do sanity check on m->type in z_erofs_load_compact_lcluster()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 1a5223c182fdb3bb3c0ca85cec101c740f685ab6 ]
All below functions will do sanity check on m->type, let's move sanity check to z_erofs_load_compact_lcluster() for cleanup.
- z_erofs_map_blocks_fo
- z_erofs_get_extent_compressedlen
- z_erofs_get_extent_decompressedlen
- z_erofs_extent_lookback
Stable-dep-of: 2d8c7edcb661 ("erofs: unify lcn as u64 for 32-bit platforms")
--- fs/erofs/zmap.c | 103 +++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 62 deletions(-)
fs/erofs/zmap.c +41 -62
@@ -240,6 +240,13 @@ static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,static int z_erofs_load_lcluster_from_disk (struct z_erofs_maprecorder *m,unsigned int lcn,bool lookahead) { +if (m->type >=Z_EROFS_LCLUSTER_TYPE_MAX ) { +erofs_err (m->inode->i_sb,"unknown type %u @ lcn %u of nid %llu" , + m->type, lcn,EROFS_I (m->inode)->nid); +DBG_BUGON (1 ); +return -EOPNOTSUPP ; + } +switch (EROFS_I (m->inode)->datalayout) {case EROFS_INODE_COMPRESSED_FULL :return z_erofs_load_full_lcluster (m, lcn);
@@ -265,12 +272,7 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m,if (err)return err; -if (m->type >=Z_EROFS_LCLUSTER_TYPE_MAX ) { -erofs_err (sb,"unknown type %u @ lcn %lu of nid %llu" , - m->type, lcn, vi->nid); -DBG_BUGON (1 ); -return -EOPNOTSUPP ; - }else if (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD ) { +if (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD ) { lookback_distance = m->delta[0 ];if (!lookback_distance)break ;
@@ -325,25 +327,18 @@ static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m,DBG_BUGON (lcn == initial_lcn && m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD ); -if (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD ) { -if (m->delta[0 ] !=1 ) { -erofs_err (sb,"bogus CBLKCNT @ lcn %lu of nid %llu" , lcn, vi->nid); -DBG_BUGON (1 ); -return -EFSCORRUPTED ; - } -if (m->compressedblks) - goto out; - }else if (m->type <Z_EROFS_LCLUSTER_TYPE_MAX ) { -/* -* if the 1st NONHEAD lcluster is actually PLAIN or HEAD type -* rather than CBLKCNT, it's a 1 block-sized pcluster. -*/ - m->compressedblks =1 ; - goto out; +if (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD && m->delta[0 ] !=1 ) { +erofs_err (sb,"bogus CBLKCNT @ lcn %lu of nid %llu" , lcn, vi->nid); +DBG_BUGON (1 ); +return -EFSCORRUPTED ; } -erofs_err (sb,"cannot found CBLKCNT @ lcn %lu of nid %llu" , lcn, vi->nid); -DBG_BUGON (1 ); -return -EFSCORRUPTED ; + +/* +* if the 1st NONHEAD lcluster is actually PLAIN or HEAD type rather +* than CBLKCNT, it's a 1 block-sized pcluster. +*/ +if (m->type !=Z_EROFS_LCLUSTER_TYPE_NONHEAD || !m->compressedblks) + m->compressedblks =1 ; out: m->map->m_plen =erofs_pos (sb, m->compressedblks);return 0 ;
@@ -379,11 +374,6 @@ static int z_erofs_get_extent_decompressedlen(struct z_erofs_maprecorder *m)if (lcn != headlcn)break ;/* ends at the next HEAD lcluster */ m->delta[1 ] =1 ; - }else { -erofs_err (inode->i_sb,"unknown type %u @ lcn %llu of nid %llu" , - m->type, lcn, vi->nid); -DBG_BUGON (1 ); -return -EOPNOTSUPP ; } lcn += m->delta[1 ]; }
@@ -421,44 +411,33 @@ static int z_erofs_do_map_blocks(struct inode *inode, map->m_flags =EROFS_MAP_MAPPED |EROFS_MAP_ENCODED ; end = (m.lcn +1ULL ) << lclusterbits; -switch (m.type) { -case Z_EROFS_LCLUSTER_TYPE_PLAIN : -case Z_EROFS_LCLUSTER_TYPE_HEAD1 : -case Z_EROFS_LCLUSTER_TYPE_HEAD2 : -if (endoff >= m.clusterofs) { - m.headtype = m.type; - map->m_la = (m.lcn << lclusterbits) | m.clusterofs; -/* -* For ztailpacking files, in order to inline data more -* effectively, special EOF lclusters are now supported -* which can have three parts at most. -*/ -if (ztailpacking && end > inode->i_size) - end = inode->i_size; -break ; - } -/* m.lcn should be >= 1 if endoff < m.clusterofs */ -if (!m.lcn) { -erofs_err (sb,"invalid logical cluster 0 at nid %llu" , - vi->nid); - err = -EFSCORRUPTED ; - goto unmap_out; +if (m.type !=Z_EROFS_LCLUSTER_TYPE_NONHEAD && endoff >= m.clusterofs) { + m.headtype = m.type; + map->m_la = (m.lcn << lclusterbits) | m.clusterofs; +/* +* For ztailpacking files, in order to inline data more +* effectively, special EOF lclusters are now supported +* which can have three parts at most. +*/ +if (ztailpacking && end > inode->i_size) + end = inode->i_size; + }else { +if (m.type !=Z_EROFS_LCLUSTER_TYPE_NONHEAD ) { +/* m.lcn should be >= 1 if endoff < m.clusterofs */ +if (!m.lcn) { +erofs_err (sb,"invalid logical cluster 0 at nid %llu" , + vi->nid); + err = -EFSCORRUPTED ; + goto unmap_out; + } + end = (m.lcn << lclusterbits) | m.clusterofs; + map->m_flags |=EROFS_MAP_FULL_MAPPED ; + m.delta[0 ] =1 ; } - end = (m.lcn << lclusterbits) | m.clusterofs; - map->m_flags |=EROFS_MAP_FULL_MAPPED ; - m.delta[0 ] =1 ; - fallthrough; -case Z_EROFS_LCLUSTER_TYPE_NONHEAD :/* get the corresponding first chunk */ err =z_erofs_extent_lookback (&m, m.delta[0 ]);if (err) goto unmap_out; -break ; -default : -erofs_err (sb,"unknown type %u @ offset %llu of nid %llu" , - m.type, ofs, vi->nid); - err = -EOPNOTSUPP ; - goto unmap_out; }if (m.partialref) map->m_flags |=EROFS_MAP_PARTIAL_REF ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 431/666 erofs: avoid infinite loops due to corrupted subpage compact indexes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
[ Upstream commit e13d315ae077bb7c3c6027cc292401bc0f4ec683 ]
Robert reported an infinite loop observed by two crafted images.
The root cause is that clusterofs can be larger than lclustersize for !NONHEAD lclusters in corrupted subpage compact indexes, e.g.:
blocksize = lclustersize = 512 lcn = 6 clusterofs = 515
Move the corresponding check for full compress indexes to z_erofs_load_lcluster_from_disk() to also cover subpage compact compress indexes.
It also fixes the position of m->type >= Z_EROFS_LCLUSTER_TYPE_MAX check, since it should be placed right after z_erofs_load_{compact,full}_lcluster().
Stable-dep-of: 2d8c7edcb661 ("erofs: unify lcn as u64 for 32-bit platforms")
--- fs/erofs/zmap.c | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-)
fs/erofs/zmap.c +18 -14
@@ -55,10 +55,6 @@ static int z_erofs_load_full_lcluster(struct z_erofs_maprecorder *m, }else { m->partialref = !!(advise &Z_EROFS_LI_PARTIAL_REF ); m->clusterofs =le16_to_cpu (di->di_clusterofs); -if (m->clusterofs >=1 << vi->z_lclusterbits) { -DBG_BUGON (1 ); -return -EFSCORRUPTED ; - } m->pblk =le32_to_cpu (di->di_u.blkaddr); }return 0 ;
@@ -240,21 +236,29 @@ static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m,static int z_erofs_load_lcluster_from_disk (struct z_erofs_maprecorder *m,unsigned int lcn,bool lookahead) { +struct erofs_inode *vi =EROFS_I (m->inode); +int err; + +if (vi->datalayout ==EROFS_INODE_COMPRESSED_COMPACT ) { + err =z_erofs_load_compact_lcluster (m, lcn, lookahead); + }else { +DBG_BUGON (vi->datalayout !=EROFS_INODE_COMPRESSED_FULL ); + err =z_erofs_load_full_lcluster (m, lcn); + } +if (err) +return err; +if (m->type >=Z_EROFS_LCLUSTER_TYPE_MAX ) {erofs_err (m->inode->i_sb,"unknown type %u @ lcn %u of nid %llu" , - m->type, lcn,EROFS_I (m->inode)->nid); + m->type, lcn,EROFS_I (m->inode)->nid);DBG_BUGON (1 );return -EOPNOTSUPP ; + }else if (m->type !=Z_EROFS_LCLUSTER_TYPE_NONHEAD && + m->clusterofs >= (1 << vi->z_lclusterbits)) { +DBG_BUGON (1 ); +return -EFSCORRUPTED ; } - -switch (EROFS_I (m->inode)->datalayout) { -case EROFS_INODE_COMPRESSED_FULL : -return z_erofs_load_full_lcluster (m, lcn); -case EROFS_INODE_COMPRESSED_COMPACT : -return z_erofs_load_compact_lcluster (m, lcn, lookahead); -default : -return -EINVAL ; - } +return 0 ; } static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 432/666 erofs: unify lcn as u64 for 32-bit platforms
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
[ Upstream commit 2d8c7edcb661812249469f4a5b62e9339118846f ]
As sashiko reported [1], lcn was typed as unsigned long (or unsigned int sometimes), which is only 32 bits wide on 32-bit platforms, which causes (lcn << lclusterbits) to be truncated at 4 GiB.
In order to consolidate the logic, just use u64 consistently around the codebase.
[1] https://sashiko.dev/r/20260420034612.1899973-1-hsiangkao%40linux.alibaba.com
--- fs/erofs/zmap.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
fs/erofs/zmap.c +9 -10
@@ -10,7 +10,7 @@struct z_erofs_maprecorder {struct inode *inode;struct erofs_map_blocks *map; -unsigned long lcn; +u64 lcn;/* compression extent information gathered */ u8 type, headtype;u16 clusterofs;
@@ -20,8 +20,7 @@ struct z_erofs_maprecorder {bool partialref; }; -static int z_erofs_load_full_lcluster (struct z_erofs_maprecorder *m, -unsigned long lcn) +static int z_erofs_load_full_lcluster (struct z_erofs_maprecorder *m,u64 lcn) {struct inode *const inode = m->inode;struct erofs_inode *const vi =EROFS_I (inode);
@@ -94,7 +93,7 @@ static int get_compacted_la_distance(unsigned int lobits, }static int z_erofs_load_compact_lcluster (struct z_erofs_maprecorder *m, -unsigned long lcn,bool lookahead) +u64 lcn,bool lookahead) {struct inode *const inode = m->inode;struct erofs_inode *const vi =EROFS_I (inode);
@@ -234,7 +233,7 @@ static int z_erofs_load_compact_lcluster(struct z_erofs_maprecorder *m, }static int z_erofs_load_lcluster_from_disk (struct z_erofs_maprecorder *m, -unsigned int lcn,bool lookahead) +u64 lcn,bool lookahead) {struct erofs_inode *vi =EROFS_I (m->inode);int err;
@@ -249,7 +248,7 @@ static int z_erofs_load_lcluster_from_disk(struct z_erofs_maprecorder *m,return err;if (m->type >=Z_EROFS_LCLUSTER_TYPE_MAX ) { -erofs_err (m->inode->i_sb,"unknown type %u @ lcn %u of nid %llu" , +erofs_err (m->inode->i_sb,"unknown type %u @ lcn %llu of nid %llu" , m->type, lcn,EROFS_I (m->inode)->nid);DBG_BUGON (1 );return -EOPNOTSUPP ;
@@ -269,7 +268,7 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m,const unsigned int lclusterbits = vi->z_lclusterbits;while (m->lcn >= lookback_distance) { -unsigned long lcn = m->lcn - lookback_distance; +u64 lcn = m->lcn - lookback_distance;int err; err =z_erofs_load_lcluster_from_disk (m, lcn, false);
@@ -287,7 +286,7 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m,return 0 ; } } -erofs_err (sb,"bogus lookback distance %u @ lcn %lu of nid %llu" , +erofs_err (sb,"bogus lookback distance %u @ lcn %llu of nid %llu" , lookback_distance, m->lcn, vi->nid);DBG_BUGON (1 );return -EFSCORRUPTED ;
@@ -301,7 +300,7 @@ static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m,struct erofs_inode *vi =EROFS_I (inode);bool bigpcl1 = vi->z_advise &Z_EROFS_ADVISE_BIG_PCLUSTER_1 ;bool bigpcl2 = vi->z_advise &Z_EROFS_ADVISE_BIG_PCLUSTER_2 ; -unsigned long lcn = m->lcn +1 ; +u64 lcn = m->lcn +1 ;int err;DBG_BUGON (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD );
@@ -332,7 +331,7 @@ static int z_erofs_get_extent_compressedlen(struct z_erofs_maprecorder *m, m->type == Z_EROFS_LCLUSTER_TYPE_NONHEAD);if (m->type ==Z_EROFS_LCLUSTER_TYPE_NONHEAD && m->delta[0 ] !=1 ) { -erofs_err (sb,"bogus CBLKCNT @ lcn %lu of nid %llu" , lcn, vi->nid); +erofs_err (sb,"bogus CBLKCNT @ lcn %llu of nid %llu" , lcn, vi->nid);DBG_BUGON (1 );return -EFSCORRUPTED ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 433/666 arm64: dts: imx8mp-debix-model-a: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 3b778178997aee24537b521a8cb60970bc1ce01c ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there is interrupt storm for i.MX8MP DEBIX Model A. Per schematic, there is no on board PULL-UP resistors for GPIO1_IO03, so need to set PAD PUE and PU together to make pull up work properly.
--- arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-debix-model-a.dts +1 -1
@@ -440,7 +440,7 @@ MX8MP_IOMUXC_SAI5_RXC__I2C6_SDA 0x400001c3 pinctrl_pmic: pmicirqgrp { fsl,pins = < - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x41 + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 434/666 arm64: dts: imx8mp-debix-som-a: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 2ea7872048a179b0ea8dadc67771961df3f0fc4a ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there is interrupt storm for i.MX8MP DEBIX SOM A. Need to set PAD PUE and PU together to make pull up work properly.
--- arch/arm64/boot/dts/freescale/imx8mp-debix-som-a-bmb-08.dts | 2 +- arch/arm64/boot/dts/freescale/imx8mp-debix-som-a.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/freescale/imx8mp-debix-som-a-bmb-08.dts +1 -1
@@ -452,7 +452,7 @@ MX8MP_IOMUXC_SAI1_RXD1__GPIO4_IO03 0x140 pinctrl_pmic: pmicgrp { fsl,pins = < - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x41 + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 >; };
arch/arm64/boot/dts/freescale/imx8mp-debix-som-a.dtsi +1 -1
@@ -241,7 +241,7 @@ MX8MP_IOMUXC_I2C4_SDA__I2C4_SDA 0x400001c3 pinctrl_pmic: pmicgrp { fsl,pins = < - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x41 + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 435/666 arm64: dts: imx8mp-navqp: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 741d6ac1a2a2e0f3e2cae5eef3516cdd75119e83 ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there will be interrupt storm for i.MX8MP NAVQP. Per schematic, there is no on board PULL-UP resistors for GPIO1_IO03, so need to set PAD PUE and PU together to make pull up work properly.
--- arch/arm64/boot/dts/freescale/imx8mp-navqp.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-navqp.dts +1 -1
@@ -309,7 +309,7 @@ MX8MP_IOMUXC_I2C4_SDA__I2C4_SDA 0x400001c3 pinctrl_pmic: pmicgrp { fsl,pins = < - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x41 + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 436/666 arm64: dts: imx8mp-icore-mx8mp: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit ea8c90f5c7ceeb6657a8fe564aa7b190dce298a6 ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there might be interrupt storm for this board. Need to set PAD PUE and PU together to make pull up work properly.
--- arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-icore-mx8mp.dtsi +1 -1
@@ -132,7 +132,7 @@ MX8MP_IOMUXC_I2C1_SDA__I2C1_SDA 0x400001c3 pinctrl_pmic: pmicgrp { fsl,pins = < - MX8MP_IOMUXC_NAND_CE0_B__GPIO3_IO01 0x41 + MX8MP_IOMUXC_NAND_CE0_B__GPIO3_IO01 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 437/666 arm64: dts: imx8mp-dhcom-som: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit f9ed5afc988da3e22543725e35be6addbb0497bc ]
PMIC_nINT is low level triggered, but the current PAD settings is PE=0,PUE=0,FSEL_1_FAST_SLEW_RATE=1,SION=1. So PAD needs to be configured as PULL UP with PULL Enable, no need SION. Correct it.
--- arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi +1 -1
@@ -989,7 +989,7 @@ MX8MP_IOMUXC_SAI5_RXC__GPIO3_IO20 0x22 pinctrl_pmic: dhcom-pmic-grp { fsl,pins = < /* PMIC_nINT */ - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x40000090 + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 438/666 arm64: dts: imx8mp-data-modul-edm-sbc: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 8ff145577e93f312ff398cb950ee3bd44835f5be ]
PMIC_nINT is low level triggered, but the current PAD settings is PE=0,PUE=0,FSEL_1_FAST_SLEW_RATE=1,SION=1. So PAD needs to be configured as PULL UP with PULL Enable, no need SION. Correct it.
--- arch/arm64/boot/dts/freescale/imx8mp-data-modul-edm-sbc.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-data-modul-edm-sbc.dts +1 -1
@@ -900,7 +900,7 @@ MX8MP_IOMUXC_SAI3_RXFS__AUDIOMIX_PDM_BIT_STREAM00 0x0 pinctrl_pmic: pmic-grp { fsl,pins = < /* PMIC_nINT */ - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x40000090 + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 439/666 PCMCIA: Fix garbled log messages for KERN_CONT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: René Rebe <[email protected]>
[ Upstream commit bfeaa6814bd3f9a1f6d525b3b35a03b9a0368961 ]
For years the PCMCIA info messages are messed up by superfluous newlines. While f2e6cf76751d ("pcmcia: Convert dev_printk to dev_<level>") converted the code to pr_cont(), dev_info enforces a \n via vprintk_store setting LOG_NEWLINE, breaking subsequent pr_cont.
Fix by logging the device name manually to allow pr_cont to work for more readable and not \n distorted logs.
--- drivers/pcmcia/rsrc_nonstatic.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pcmcia/rsrc_nonstatic.c +3 -3
@@ -188,7 +188,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base,int any;u_char *b, hole, most; -dev_info (&s->dev,"cs: IO port probe %#x-%#x:" , base, base+num-1 ); +pr_info ("%s: cs: IO port probe %#x-%#x:" ,dev_name (&s->dev), base, base+num-1 );/* First, what does a floating port look like? */ b =kzalloc (256 ,GFP_KERNEL );
@@ -410,8 +410,8 @@ static int do_mem_probe(struct pcmcia_socket *s, u_long base, u_long num,struct socket_data *s_data = s->resource_data;u_long i, j, bad, fail, step; -dev_info (&s->dev,"cs: memory probe 0x%06lx-0x%06lx:" , - base, base+num-1 ); +pr_info ("%s: cs: memory probe 0x%06lx-0x%06lx:" , +dev_name (&s->dev), base, base+num-1 ); bad = fail =0 ; step = (num <0x20000 ) ?0x2000 : ((num>>4 ) & ~0x1fff );/* don't allow too large steps */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 440/666 arm64: dts: imx8mm-emtop-som: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 721dec3ee9ff5231d13a412ff87df63b966d137b ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there might be interrupt storm for this board. Need to set PAD PUE and PU together to make pull up work properly.
While at here, also correct interrupt type as IRQ_TYPE_LEVEL_LOW.
--- arch/arm64/boot/dts/freescale/imx8mm-emtop-som.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/freescale/imx8mm-emtop-som.dtsi +2 -2
@@ -60,7 +60,7 @@ pmic@25 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_pmic>; interrupt-parent = <&gpio1>; - interrupts = <3 IRQ_TYPE_EDGE_RISING>; + interrupts = <3 IRQ_TYPE_LEVEL_LOW>; regulators { buck1: BUCK1 {
@@ -194,7 +194,7 @@ MX8MM_IOMUXC_I2C1_SDA_I2C1_SDA 0x400001c3 pinctrl_pmic: emtop-pmic-grp { fsl,pins = < - MX8MM_IOMUXC_GPIO1_IO03_GPIO1_IO3 0x41 + MX8MM_IOMUXC_GPIO1_IO03_GPIO1_IO3 0x141 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 441/666 arm64: dts: imx8mn-tqma8mqnl: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 0fb37990774113afd943eaa91323679388584b6d ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there might be interrupt storm for this board. Need to set PAD PUE and PU together to make pull up work properly.
--- arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mn-tqma8mqnl.dtsi +1 -1
@@ -293,7 +293,7 @@ pinctrl_i2c1_gpio: i2c1gpiogrp { }; pinctrl_pmic: pmicgrp { - fsl,pins = <MX8MN_IOMUXC_GPIO1_IO08_GPIO1_IO8 0x84>; + fsl,pins = <MX8MN_IOMUXC_GPIO1_IO08_GPIO1_IO8 0x1c4>; }; pinctrl_reg_usdhc2_vmmc: regusdhc2vmmcgrp {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 442/666 arm64: dts: imx8mm-tqma8mqml: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 42a9f5a16328ed78a88e0498556965b6c6ec515c ]
With commit 5d0efaf47ee90 ("regulator: pca9450: Correct interrupt type"), there might be interrupt storm for this board. Need to set PAD PUE and PU together to make pull up work properly.
--- arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml.dtsi +1 -1
@@ -290,7 +290,7 @@ pinctrl_i2c1_gpio: i2c1gpiogrp { }; pinctrl_pmic: pmicgrp { - fsl,pins = <MX8MM_IOMUXC_GPIO1_IO08_GPIO1_IO8 0x94>; + fsl,pins = <MX8MM_IOMUXC_GPIO1_IO08_GPIO1_IO8 0x1d4>; }; pinctrl_reg_usdhc2_vmmc: regusdhc2vmmcgrp {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 443/666 arm64: dts: marvell: armada-37xx: use usb2-phy in USB3 controllers phy-names
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabor Juhos <[email protected]>
[ Upstream commit 0fef19844624f8bc07651b4d26088d8940affba3 ]
Instead of the generic 'usb2-phy' name, the Armada 37xx device trees are using a custom 'usb2-utmi-otg-phy' name for the USB2 PHY in the USB3 controller node. Since commit 53a2d95df836 ("usb: core: add phy notify connect and disconnect"), this triggers a bug [1] in the USB core which causes double use of the USB3 PHY.
Change the PHY name to 'usb2-phy' in the SoC and in the uDPU specific dtsi files in order to avoid triggering the bug and also to keep the names in line with the ones used by other platforms.
--- arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi | 2 +- arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/marvell/armada-3720-uDPU.dtsi +1 -1
@@ -161,7 +161,7 @@ ð1 { &usb3 { status = "okay"; phys = <&usb2_utmi_otg_phy>; - phy-names = "usb2-utmi-otg-phy"; + phy-names = "usb2-phy"; }; &uart0 {
arch/arm64/boot/dts/marvell/armada-37xx.dtsi +1 -1
@@ -375,7 +375,7 @@ usb3: usb@58000 { interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; clocks = <&sb_periph_clk 12>; phys = <&comphy0 0>, <&usb2_utmi_otg_phy>; - phy-names = "usb3-phy", "usb2-utmi-otg-phy"; + phy-names = "usb3-phy", "usb2-phy"; status = "disabled"; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 444/666 net/sched: act_mirred: fix wrong device for mac_header_xmit check in tcf_blockcast_redir
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dudu Lu <[email protected]>
[ Upstream commit 4510d140524ca7d6e772db962e013f26f09a63b1 ]
In tcf_blockcast_redir(), when iterating block ports to redirect packets to multiple devices, the mac_header_xmit flag is queried from the wrong device. The loop sends to dev_prev but queries dev_is_mac_header_xmit(dev) — which is the NEXT device in the iteration, not the one being sent to.
This causes tcf_mirred_to_dev() to make incorrect decisions about whether to push or pull the MAC header. When the block contains mixed device types (e.g., an ethernet veth and a tunnel device), intermediate devices get the wrong mac_header_xmit flag, leading to skb header corruption. In the worst case, skb_push_rcsum with an incorrect mac_len can exhaust headroom and panic.
The last device in the loop is handled correctly (line 365-366 uses dev_is_mac_header_xmit(dev_prev)), confirming this is a copy-paste oversight for the intermediate devices.
Fix by using dev_prev instead of dev for the mac_header_xmit query, consistent with the device actually being sent to.
--- net/sched/act_mirred.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/act_mirred.c +1 -1
@@ -348,7 +348,7 @@ static int tcf_blockcast_redir(struct sk_buff *skb, struct tcf_mirred *m, goto assign_prev;tcf_mirred_to_dev (skb, m, dev_prev, -dev_is_mac_header_xmit (dev), +dev_is_mac_header_xmit (dev_prev), mirred_eaction, retval); assign_prev: dev_prev = dev;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 445/666 macvlan: fix macvlan_get_size() not reserving space for IFLA_MACVLAN_BC_CUTOFF
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dudu Lu <[email protected]>
[ Upstream commit fa92a77b0ed4d5f11a71665a232ac5a54a4b055d ]
macvlan_get_size() does not account for IFLA_MACVLAN_BC_CUTOFF, but macvlan_fill_info() conditionally includes it when port->bc_cutoff != 1. This causes nla_put_s32() to fail with -EMSGSIZE when the netlink skb runs out of space, triggering a WARN_ON in rtnetlink and preventing the interface from being dumped.
The bug can be reproduced with:
ip link add macvlan0 link eth0 type macvlan mode bridge ip link set macvlan0 type macvlan bc_cutoff 0
ip -d link show macvlan0 # fails with -EMSGSIZE
The bc_cutoff feature was added in commit 954d1fa1ac93 ("macvlan: Add netlink attribute for broadcast cutoff"), which added the nla_put_s32() call in macvlan_fill_info() but missed adding the corresponding nla_total_size(4) in macvlan_get_size(). A follow-up commit 55cef78c244d ("macvlan: add forgotten nla_policy for IFLA_MACVLAN_BC_CUTOFF") fixed the missing nla_policy entry but still did not fix the size calculation.
--- drivers/net/macvlan.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/macvlan.c +1 -0
@@ -1678,6 +1678,7 @@ static size_t macvlan_get_size(const struct net_device *dev) +macvlan_get_size_mac (vlan)/* IFLA_MACVLAN_MACADDR */ +nla_total_size (4 )/* IFLA_MACVLAN_BC_QUEUE_LEN */ +nla_total_size (4 )/* IFLA_MACVLAN_BC_QUEUE_LEN_USED */ + +nla_total_size (4 )/* IFLA_MACVLAN_BC_CUTOFF */ ); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 446/666 net/sched: sch_cake: fix NAT destination port not being updated in cake_update_flowkeys
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dudu Lu <[email protected]>
[ Upstream commit f9e40664706927d7ae22a448a3383e23c38a4c0b ]
cake_update_flowkeys() is supposed to update the flow dissector keys with the NAT-translated addresses and ports from conntrack, so that CAKE's per-flow fairness correctly identifies post-NAT flows as belonging to the same connection.
For the source port, this works correctly:
keys->ports.src = port;
But for the destination port, the assignment is reversed:
port = keys->ports.dst;
This means the NAT destination port is never updated in the flow keys. As a result, when multiple connections are NATed to the same destination, CAKE treats them as separate flows because the original (pre-NAT) destination ports differ. This breaks CAKE's NAT-aware flow isolation when using the "nat" mode.
The bug was introduced in commit b0c19ed6088a ("sch_cake: Take advantage of skb->hash where appropriate") which refactored the original direct assignment into a compare-and-conditionally-update pattern, but wrote the destination port update backwards.
Fix by reversing the assignment direction to match the source port pattern.
--- net/sched/sch_cake.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sched/sch_cake.c +1 -1
@@ -603,7 +603,7 @@ static bool cake_update_flowkeys(struct flow_keys *keys, } port = rev ? tuple.src.u.all : tuple.dst.u.all;if (port != keys->ports.dst) { - port = keys->ports.dst; + keys->ports.dst = port; upd = true; } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 447/666 nexthop: fix IPv6 route referencing IPv4 nexthop
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiayuan Chen <[email protected]>
[ Upstream commit 29c95185ba32b621fbc3800fb86e7dc3edf5c2be ]
syzbot reported a panic [1] [2].
When an IPv6 nexthop is replaced with an IPv4 nexthop, the has_v4 flag of all groups containing this nexthop is not updated. This is because nh_group_v4_update is only called when replacing AF_INET to AF_INET6, but the reverse direction (AF_INET6 to AF_INET) is missed.
This allows a stale has_v4=false to bypass fib6_check_nexthop, causing IPv6 routes to be attached to groups that effectively contain only AF_INET members. Subsequent route lookups then call nexthop_fib6_nh() which returns NULL for the AF_INET member, leading to a NULL pointer dereference.
Fix by calling nh_group_v4_update whenever the family changes, not just AF_INET to AF_INET6.
Reproducer:
# AF_INET6 blackhole
ip -6 nexthop add id 1 blackhole
# group with has_v4=false
ip nexthop add id 100 group 1
# replace with AF_INET (no -6), has_v4 stays false ip nexthop replace id 1 blackhole
# pass stale has_v4 check
ip -6 route add 2001:db8::/64 nhid 100
# panic
ping -6 2001:db8::1
[1] https://syzkaller.appspot.com/bug?id=e17283eb2f8dcf3dd9b47fe6f67a95f71faadad0
[2] https://syzkaller.appspot.com/bug?id=8699b6ae54c9f35837d925686208402949e12ef3
--- net/ipv4/nexthop.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/ipv4/nexthop.c +2 -2
@@ -2445,10 +2445,10 @@ static int replace_nexthop_single(struct net *net, struct nexthop *old, goto err_notify; } -/* When replacing an IPv4 nexthop with an IPv6 nexthop, potentially +/* When replacing a nexthop with one of a different family, potentially * update IPv4 indication in all the groups using the nexthop. */ -if (oldi->family ==AF_INET && newi->family ==AF_INET6 ) { +if (oldi->family != newi->family) {list_for_each_entry (nhge, &old->grp_list, nh_list) {struct nexthop *nhp = nhge->nh_parent;struct nh_group *nhg;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 448/666 net/sched: taprio: fix use-after-free in advance_sched() on schedule switch
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vinicius Costa Gomes <[email protected]>
[ Upstream commit 105425b1969c5affe532713cfac1c0b320d7ac2b ]
In advance_sched(), when should_change_schedules() returns true, switch_schedules() is called to promote the admin schedule to oper. switch_schedules() queues the old oper schedule for RCU freeing via call_rcu(), but 'next' still points into an entry of the old oper schedule. The subsequent 'next->end_time = end_time' and rcu_assign_pointer(q->current_entry, next) are use-after-free.
Fix this by selecting 'next' from the new oper schedule immediately after switch_schedules(), and using its pre-calculated end_time. setup_first_end_time() sets the first entry's end_time to base_time + interval when the schedule is installed, so the value is already correct.
The deleted 'end_time = sched_base_time(admin)' assignment was also harmful independently: it would overwrite the new first entry's pre-calculated end_time with just base_time.
--- net/sched/sch_taprio.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
net/sched/sch_taprio.c +5 -4
@@ -971,11 +971,12 @@ static enum hrtimer_restart advance_sched(struct hrtimer *timer) }if (should_change_schedules (admin, oper, end_time)) { -/* Set things so the next time this runs, the new -* schedule runs. -*/ - end_time =sched_base_time (admin);switch_schedules (q, &admin, &oper); +/* After changing schedules, the next entry is the first one +* in the new schedule, with a pre-calculated end_time. +*/ + next = list_first_entry(&oper->entries, struct sched_entry, list); + end_time = next->end_time; } next->end_time = end_time;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 449/666 tcp: add data-race annotations around tp->data_segs_out and tp->total_retrans
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 21e92a38cfd891538598ba8f805e0165a820d532 ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.
--- net/ipv4/tcp.c | 4 ++-- net/ipv4/tcp_output.c | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-)
net/ipv4/tcp.c +2 -2
@@ -4276,9 +4276,9 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk,nla_put_u64_64bit (stats,TCP_NLA_SNDBUF_LIMITED , info.tcpi_sndbuf_limited,TCP_NLA_PAD );nla_put_u64_64bit (stats,TCP_NLA_DATA_SEGS_OUT , - tp->data_segs_out,TCP_NLA_PAD ); +READ_ONCE (tp->data_segs_out),TCP_NLA_PAD );nla_put_u64_64bit (stats,TCP_NLA_TOTAL_RETRANS , - tp->total_retrans,TCP_NLA_PAD ); +READ_ONCE (tp->total_retrans),TCP_NLA_PAD ); rate =READ_ONCE (sk->sk_pacing_rate); rate64 = (rate != ~0UL ) ? rate : ~0ULL ;
net/ipv4/tcp_output.c +5 -3
@@ -1446,7 +1446,8 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,if (skb->len != tcp_header_size) {tcp_event_data_sent (tp, sk); - tp->data_segs_out +=tcp_skb_pcount (skb); +WRITE_ONCE (tp->data_segs_out, + tp->data_segs_out +tcp_skb_pcount (skb)); tp->bytes_sent += skb->len - tcp_header_size; }
@@ -3411,7 +3412,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)TCP_ADD_STATS (sock_net (sk),TCP_MIB_RETRANSSEGS , segs);if (TCP_SKB_CB (skb)->tcp_flags &TCPHDR_SYN )__NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPSYNRETRANS ); - tp->total_retrans += segs; +WRITE_ONCE (tp->total_retrans, tp->total_retrans + segs); tp->bytes_retrans += skb->len;/* make sure skb->data is aligned on arches that require it
@@ -4433,7 +4434,8 @@ int tcp_rtx_synack(const struct sock *sk, struct request_sock *req)* However in this case, we are dealing with a passive fastopen * socket thus we can change total_retrans value. */ -tcp_sk_rw (sk)->total_retrans++; +WRITE_ONCE (tcp_sk_rw (sk)->total_retrans, +tcp_sk_rw (sk)->total_retrans +1 ); }trace_tcp_retransmit_synack (sk, req); }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 450/666 tcp: add data-race annotations for TCP_NLA_SNDQ_SIZE
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 124199444de467767175a9004e1574dc42523e62 ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.
--- net/ipv4/tcp.c | 4 +++- net/ipv4/tcp_input.c | 4 ++-- net/ipv4/tcp_output.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-)
net/ipv4/tcp.c +3 -1
@@ -4297,7 +4297,9 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk,nla_put_u32 (stats,TCP_NLA_DELIVERED , tp->delivered);nla_put_u32 (stats,TCP_NLA_DELIVERED_CE , tp->delivered_ce); -nla_put_u32 (stats,TCP_NLA_SNDQ_SIZE , tp->write_seq - tp->snd_una); +nla_put_u32 (stats,TCP_NLA_SNDQ_SIZE , +max_t (int,0 , +READ_ONCE (tp->write_seq) -READ_ONCE (tp->snd_una)));nla_put_u8 (stats,TCP_NLA_CA_STATE ,inet_csk (sk)->icsk_ca_state); nla_put_u64_64bit(stats, TCP_NLA_BYTES_SENT, tp->bytes_sent,
net/ipv4/tcp_input.c +2 -2
@@ -3670,7 +3670,7 @@ static void tcp_snd_una_update(struct tcp_sock *tp, u32 ack)sock_owned_by_me ((struct sock *)tp); tp->bytes_acked += delta;tcp_snd_sne_update (tp, ack); - tp->snd_una = ack; +WRITE_ONCE (tp->snd_una, ack); }static void tcp_rcv_sne_update (struct tcp_sock *tp,u32 seq)
@@ -6877,7 +6877,7 @@ tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)if (sk->sk_socket)sk_wake_async (sk,SOCK_WAKE_IO ,POLL_OUT ); - tp->snd_una =TCP_SKB_CB (skb)->ack_seq; +WRITE_ONCE (tp->snd_una,TCP_SKB_CB (skb)->ack_seq); tp->snd_wnd =ntohs (th->window) << tp->rx_opt.snd_wscale;tcp_init_wl (tp,TCP_SKB_CB (skb)->seq);
net/ipv4/tcp_output.c +1 -1
@@ -3945,7 +3945,7 @@ static void tcp_connect_init(struct sock *sk) tp->snd_wnd =0 ;tcp_init_wl (tp,0 );tcp_write_queue_purge (sk); - tp->snd_una = tp->write_seq; +WRITE_ONCE (tp->snd_una, tp->write_seq); tp->snd_sml = tp->write_seq; tp->snd_up = tp->write_seq;WRITE_ONCE (tp->snd_nxt, tp->write_seq);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 451/666 tcp: annotate data-races around tp->bytes_sent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit ee43e957ce2ec77b2ec47fef28f3c0df6ab01a31 ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.
--- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_output.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +1 -1
@@ -4302,7 +4302,7 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk, READ_ONCE(tp->write_seq) - READ_ONCE(tp->snd_una)));nla_put_u8 (stats,TCP_NLA_CA_STATE ,inet_csk (sk)->icsk_ca_state); -nla_put_u64_64bit (stats,TCP_NLA_BYTES_SENT , tp->bytes_sent, +nla_put_u64_64bit (stats,TCP_NLA_BYTES_SENT ,READ_ONCE (tp->bytes_sent),TCP_NLA_PAD );nla_put_u64_64bit (stats,TCP_NLA_BYTES_RETRANS , tp->bytes_retrans,TCP_NLA_PAD );
net/ipv4/tcp_output.c +2 -1
@@ -1448,7 +1448,8 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,tcp_event_data_sent (tp, sk);WRITE_ONCE (tp->data_segs_out, tp->data_segs_out +tcp_skb_pcount (skb)); - tp->bytes_sent += skb->len - tcp_header_size; +WRITE_ONCE (tp->bytes_sent, + tp->bytes_sent + skb->len - tcp_header_size); }if (after (tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 452/666 tcp: annotate data-races around tp->bytes_retrans
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 5efc7b9f7cbd43401f1af81d3d7f2be00f93390d ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.
--- net/ipv4/tcp.c | 4 ++-- net/ipv4/tcp_output.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
net/ipv4/tcp.c +2 -2
@@ -4304,8 +4304,8 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk,nla_put_u64_64bit (stats,TCP_NLA_BYTES_SENT ,READ_ONCE (tp->bytes_sent),TCP_NLA_PAD ); -nla_put_u64_64bit (stats,TCP_NLA_BYTES_RETRANS , tp->bytes_retrans, -TCP_NLA_PAD ); +nla_put_u64_64bit (stats,TCP_NLA_BYTES_RETRANS , +READ_ONCE (tp->bytes_retrans),TCP_NLA_PAD );nla_put_u32 (stats,TCP_NLA_DSACK_DUPS , tp->dsack_dups);nla_put_u32 (stats,TCP_NLA_REORD_SEEN , tp->reord_seen);nla_put_u32 (stats,TCP_NLA_SRTT , tp->srtt_us >>3 );
net/ipv4/tcp_output.c +1 -1
@@ -3414,7 +3414,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb, int segs)if (TCP_SKB_CB (skb)->tcp_flags &TCPHDR_SYN )__NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPSYNRETRANS );WRITE_ONCE (tp->total_retrans, tp->total_retrans + segs); - tp->bytes_retrans += skb->len; +WRITE_ONCE (tp->bytes_retrans, tp->bytes_retrans + skb->len);/* make sure skb->data is aligned on arches that require it * and check if ack-trimming & collapsing extended the headroom
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 453/666 tcp: annotate data-races around tp->dsack_dups
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit a984705ca88b976bf1087978fd98b7f3993da88c ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.
--- net/ipv4/tcp.c | 2 +- net/ipv4/tcp_input.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +1 -1
@@ -4306,7 +4306,7 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk, TCP_NLA_PAD);nla_put_u64_64bit (stats,TCP_NLA_BYTES_RETRANS ,READ_ONCE (tp->bytes_retrans),TCP_NLA_PAD ); -nla_put_u32 (stats,TCP_NLA_DSACK_DUPS , tp->dsack_dups); +nla_put_u32 (stats,TCP_NLA_DSACK_DUPS ,READ_ONCE (tp->dsack_dups));nla_put_u32 (stats,TCP_NLA_REORD_SEEN , tp->reord_seen);nla_put_u32 (stats,TCP_NLA_SRTT , tp->srtt_us >>3 );nla_put_u16 (stats,TCP_NLA_TIMEOUT_REHASH , tp->timeout_rehash);
net/ipv4/tcp_input.c +1 -1
@@ -1059,7 +1059,7 @@ static u32 tcp_dsack_seen(struct tcp_sock *tp, u32 start_seq,else if (tp->tlp_high_seq && tp->tlp_high_seq == end_seq) state->flag |=FLAG_DSACK_TLP ; - tp->dsack_dups += dup_segs; +WRITE_ONCE (tp->dsack_dups, tp->dsack_dups + dup_segs);/* Skip the DSACK if dup segs weren't retransmitted by sender */ if (tp->dsack_dups > tp->total_retrans)return 0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 454/666 tcp: annotate data-races around (tp->write_seq - tp->snd_nxt)
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 3a63b3d160560ef51e43fb4c880a5cde8078053c ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() annotations to keep KCSAN happy.
WRITE_ONCE() annotations are already present.
--- net/ipv4/tcp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv4/tcp.c +2 -1
@@ -4311,7 +4311,8 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk,nla_put_u32 (stats,TCP_NLA_SRTT , tp->srtt_us >>3 );nla_put_u16 (stats,TCP_NLA_TIMEOUT_REHASH , tp->timeout_rehash);nla_put_u32 (stats,TCP_NLA_BYTES_NOTSENT , -max_t (int,0 , tp->write_seq - tp->snd_nxt)); +max_t (int,0 , +READ_ONCE (tp->write_seq) -READ_ONCE (tp->snd_nxt)));nla_put_u64_64bit (stats,TCP_NLA_EDT , orig_skb->skb_mstamp_ns,TCP_NLA_PAD );if (ack_skb)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 455/666 tcp: annotate data-races around tp->plb_rehash
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 9e89b9d03a2d2e30dcca166d5af52f9a8eceab25 ]
tcp_get_timestamping_opt_stats() intentionally runs lockless, we must add READ_ONCE() and WRITE_ONCE() annotations to keep KCSAN happy.
--- net/ipv4/tcp.c | 3 ++- net/ipv4/tcp_plb.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
net/ipv4/tcp.c +2 -1
@@ -4319,7 +4319,8 @@ struct sk_buff *tcp_get_timestamping_opt_stats(const struct sock *sk,nla_put_u8 (stats,TCP_NLA_TTL ,tcp_skb_ttl_or_hop_limit (ack_skb)); -nla_put_u32 (stats,TCP_NLA_REHASH , tp->plb_rehash + tp->timeout_rehash); +nla_put_u32 (stats,TCP_NLA_REHASH , +READ_ONCE (tp->plb_rehash) +READ_ONCE (tp->timeout_rehash));return stats; }
net/ipv4/tcp_plb.c +1 -1
@@ -79,7 +79,7 @@ void tcp_plb_check_rehash(struct sock *sk, struct tcp_plb_state *plb)sk_rethink_txhash (sk); plb->consec_cong_rounds =0 ; -tcp_sk (sk)->plb_rehash++; +WRITE_ONCE (tcp_sk (sk)->plb_rehash,tcp_sk (sk)->plb_rehash +1 );NET_INC_STATS (sock_net (sk),LINUX_MIB_TCPPLBREHASH ); }EXPORT_SYMBOL_GPL (tcp_plb_check_rehash);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 456/666 ice: update PCS latency settings for E825 10G/25Gb modes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Grzegorz Nitka <[email protected]>
[ Upstream commit 05567e4052732d70c7ff9655217b3d14d25f639a ]
Update MAC Rx/Tx offset registers settings (PHY_MAC_[RX|TX]_OFFSET registers) with the data obtained with the latest research. It applies to PCS latency settings for the following speeds/modes:
* 10Gb NO-FEC
- TX latency changed from 71.25 ns to 73 ns
- RX latency changed from -25.6 ns to -28 ns
* 25Gb NO-FEC
- TX latency changed from 28.17 ns to 33 ns
- RX latency changed from -12.45 ns to -12 ns
* 25Gb RS-FEC
- TX latency changed from 64.5 ns to 69 ns
- RX latency changed from -3.6 ns to -3 ns
The original data came from simulation and pre-production hardware. The new data measures the actual delays and as such is more accurate.
--- drivers/net/ethernet/intel/ice/ice_ptp_consts.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/intel/ice/ice_ptp_consts.h +6 -6
@@ -123,14 +123,14 @@ struct ice_eth56g_mac_reg_cfg eth56g_mac_cfg[NUM_ICE_ETH56G_LNK_SPD] = { .blktime = 0x666, /* 3.2 */ .tx_offset = { .serdes = 0x234c, /* 17.6484848 */ - .no_fec = 0x8e80, /* 71.25 */ + .no_fec = 0x93d9, /* 73 */ .fc = 0xb4a4, /* 90.32 */ .sfd = 0x4a4, /* 2.32 */ .onestep =0x4ccd /* 38.4 */ }, .rx_offset = { .serdes = 0xffffeb27, /* -10.42424 */ - .no_fec = 0xffffcccd, /* -25.6 */ + .no_fec = 0xffffc7b6, /* -28 */ .fc = 0xfffc557b, /* -469.26 */ .sfd =0x4a4 ,/* 2.32 */ .bs_ds = 0x32 /* 0.0969697 */
@@ -163,17 +163,17 @@ struct ice_eth56g_mac_reg_cfg eth56g_mac_cfg[NUM_ICE_ETH56G_LNK_SPD] = { .mktime = 0x147b, /* 10.24, only if RS-FEC enabled */ .tx_offset = { .serdes = 0xe1e, /* 7.0593939 */ - .no_fec = 0x3857, /* 28.17 */ + .no_fec = 0x4266, /* 33 */ .fc = 0x48c3, /* 36.38 */ - .rs = 0x8100, /* 64.5 */ + .rs = 0x8a00, /* 69 */ .sfd = 0x1dc, /* 0.93 */ .onestep =0x1eb8 /* 15.36 */ }, .rx_offset = { .serdes = 0xfffff7a9, /* -4.1697 */ - .no_fec = 0xffffe71a, /* -12.45 */ + .no_fec = 0xffffe700, /* -12 */ .fc = 0xfffe894d, /* -187.35 */ - .rs = 0xfffff8cd, /* -3.6 */ + .rs = 0xfffff8cc, /* -3 */ .sfd = 0x1dc, /* 0.93 */ .bs_ds =0x14 /* 0.0387879, RS-FEC 0 */ }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 457/666 ice: Remove jumbo_remove step from TX path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alice Mikityanska <[email protected]>
[ Upstream commit 8b76102c5e00d1f090e0c31d17b060c76d8fa859 ]
Now that the kernel doesn't insert HBH for BIG TCP IPv6 packets, remove unnecessary steps from the ice TX path, that used to check and remove HBH.
Stable-dep-of: 1a303baa715e ("ice: fix double-free of tx_buf skb")
--- drivers/net/ethernet/intel/ice/ice_txrx.c | 3 --- 1 file changed, 3 deletions(-)
drivers/net/ethernet/intel/ice/ice_txrx.c +0 -3
@@ -2346,9 +2346,6 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring)ice_trace (xmit_frame_ring, tx_ring, skb); -if (unlikely (ipv6_hopopt_jumbo_remove (skb))) - goto out_drop; - count =ice_xmit_desc_count (skb);if (ice_chk_linearize (skb, count)) {if (__skb_linearize (skb))
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 458/666 ice: fix double-free of tx_buf skb
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Schmidt <[email protected]>
[ Upstream commit 1a303baa715e6b78d6a406aaf335f87ff35acfcd ]
If ice_tso() or ice_tx_csum() fail, the error path in ice_xmit_frame_ring() frees the skb, but the 'first' tx_buf still points to it and is marked as valid (ICE_TX_BUF_SKB).
'next_to_use' remains unchanged, so the potential problem will likely fix itself when the next packet is transmitted and the tx_buf gets overwritten. But if there is no next packet and the interface is brought down instead, ice_clean_tx_ring() -> ice_unmap_and_free_tx_buf() will find the tx_buf and free the skb for the second time.
The fix is to reset the tx_buf type to ICE_TX_BUF_EMPTY in the error path, so that ice_unmap_and_free_tx_buf().
Move the initialization of 'first' up, to ensure it's already valid in case we hit the linearization error path.
The bug was spotted by AI while I had it looking for something else. It also proposed an initial version of the patch.
I reproduced the bug and tested the fix by adding code to inject failures, on a build with KASAN.
I looked for similar bugs in related Intel drivers and did not find any.
--- drivers/net/ethernet/intel/ice/ice_txrx.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/ice/ice_txrx.c +4 -2
@@ -2346,6 +2346,9 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring)ice_trace (xmit_frame_ring, tx_ring, skb); +/* record the location of the first descriptor for this packet */ + first = &tx_ring->tx_buf[tx_ring->next_to_use]; + count =ice_xmit_desc_count (skb);if (ice_chk_linearize (skb, count)) {if (__skb_linearize (skb))
@@ -2371,8 +2374,6 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring) offload.tx_ring = tx_ring; -/* record the location of the first descriptor for this packet */ - first = &tx_ring->tx_buf[tx_ring->next_to_use]; first->skb = skb; first->type =ICE_TX_BUF_SKB ; first->bytecount = max_t(unsigned int, skb->len, ETH_ZLEN);
@@ -2436,6 +2437,7 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring) out_drop:ice_trace (xmit_frame_ring_drop, tx_ring, skb);dev_kfree_skb_any (skb); + first->type =ICE_TX_BUF_EMPTY ;return NETDEV_TX_OK ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 459/666 ice: fix ICE_AQ_LINK_SPEED_M for 200G
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Greenwalt <[email protected]>
[ Upstream commit 4a3a940059e98539de293a6e36e464094c2e875b ]
When setting PHY configuration during driver initialization, 200G link speed is not being advertised even when the PHY is capable. This is because the get PHY capabilities link speed response is being masked by ICE_AQ_LINK_SPEED_M, which does not include the 200G link speed bit.
ICE_AQ_LINK_SPEED_200GB is defined as BIT(11), but the mask 0x7FF only covers bits 0-10. Fix ICE_AQ_LINK_SPEED_M to use GENMASK(11, 0) so that it covers all defined link speed bits including 200G.
--- drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/intel/ice/ice_adminq_cmd.h +1 -1
@@ -1347,7 +1347,7 @@ struct ice_aqc_get_link_status_data {#define ICE_AQ_LINK_PWR_QSFP_CLASS_3 2#define ICE_AQ_LINK_PWR_QSFP_CLASS_4 3__le16 link_speed; -#define ICE_AQ_LINK_SPEED_M 0x7FF +#define ICE_AQ_LINK_SPEED_M GENMASK(11, 0)#define ICE_AQ_LINK_SPEED_10MB BIT(0)#define ICE_AQ_LINK_SPEED_100MB BIT(1)#define ICE_AQ_LINK_SPEED_1000MB BIT(2)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 460/666 i40e: dont advertise IFF_SUPP_NOFCS
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kohei Enju <[email protected]>
[ Upstream commit a24162f18825684ad04e3a5d0531f8a50d679347 ]
i40e advertises IFF_SUPP_NOFCS, allowing users to use the SO_NOFCS socket option. However, this option is silently ignored, as the driver does not check skb->no_fcs, and always enables FCS insertion offload.
Fix this by removing the advertisement of IFF_SUPP_NOFCS.
This behavior can be reproduced with a simple AF_PACKET socket:
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW) s.setsockopt(socket.SOL_SOCKET, 43, 1) # SO_NOFCS s.bind(("eth0", 0))
s.send(b'\xff' * 64)
Previously, send() succeeds but the driver ignores SO_NOFCS. With this change, send() fails with -EPROTONOSUPPORT, as expected.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +0 -1
@@ -13883,7 +13883,6 @@ static int i40e_config_netdev(struct i40e_vsi *vsi) netdev->neigh_priv_len =sizeof (u32) *4 ; netdev->priv_flags |=IFF_UNICAST_FLT ; - netdev->priv_flags |=IFF_SUPP_NOFCS ;/* Setup netdev TC information */ i40e_vsi_config_netdev_tc (vsi, vsi->tc_config.enabled_tc);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 461/666 e1000e: Unroll PTP in probe error handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Vollrath <[email protected]>
[ Upstream commit aa3f7fe409350857c25d050482a2eef2cfd69b58 ]
If probe fails after registering the PTP clock and its delayed work, these resources must be released.
This was not an issue until a 2016 fix moved the e1000e_ptp_init() call before the jump to err_register.
--- drivers/net/ethernet/intel/e1000e/netdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/intel/e1000e/netdev.c +1 -0
@@ -7700,6 +7700,7 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err_register:if (!(adapter->flags &FLAG_HAS_AMT ))e1000e_release_hw_control (adapter); +e1000e_ptp_remove (adapter); err_eeprom:if (hw->phy.ops.check_reset_block && !hw->phy.ops.check_reset_block (hw))e1000_phy_hw_reset (&adapter->hw);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 462/666 ipv6: fix possible UAF in icmpv6_rcv()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit f996edd7615e686ada141b7f3395025729ff8ccb ]
Caching saddr and daddr before pskb_pull() is problematic since skb->head can change.
Remove these temporary variables:
- We only access &ipv6_hdr(skb)->saddr and &ipv6_hdr(skb)->daddr when net_dbg_ratelimited() is called in the slow path.
- Avoid potential future misuse after pskb_pull() call.
--- net/ipv6/icmp.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
net/ipv6/icmp.c +4 -6
@@ -910,7 +910,6 @@ static int icmpv6_rcv(struct sk_buff *skb)struct net *net =dev_net_rcu (skb->dev);struct net_device *dev =icmp6_dev (skb);struct inet6_dev *idev =__in6_dev_get (dev); -const struct in6_addr *saddr, *daddr;struct icmp6hdr *hdr;u8 type;
@@ -941,12 +940,10 @@ static int icmpv6_rcv(struct sk_buff *skb)__ICMP6_INC_STATS (dev_net_rcu (dev), idev,ICMP6_MIB_INMSGS ); - saddr = &ipv6_hdr (skb)->saddr; - daddr = &ipv6_hdr (skb)->daddr; -if (skb_checksum_validate (skb,IPPROTO_ICMPV6 , ip6_compute_pseudo)) {net_dbg_ratelimited ("ICMPv6 checksum failed [%pI6c > %pI6c]\n" , - saddr, daddr); + &ipv6_hdr (skb)->saddr, + &ipv6_hdr (skb)->daddr); goto csum_error; }
@@ -1029,7 +1026,8 @@ static int icmpv6_rcv(struct sk_buff *skb)break ;net_dbg_ratelimited ("icmpv6: msg of unknown type [%pI6c > %pI6c]\n" , - saddr, daddr); + &ipv6_hdr (skb)->saddr, + &ipv6_hdr (skb)->daddr);/* * error of unknown type.
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 463/666 sctp: fix OOB write to userspace in sctp_getsockopt_peer_auth_chunks
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Bommarito <[email protected]>
[ Upstream commit 0cf004ffb61cd32d140531c3a84afe975f9fc7ea ]
sctp_getsockopt_peer_auth_chunks() checks that the caller's optval buffer is large enough for the peer AUTH chunk list with
if (len < num_chunks)
return -EINVAL;
but then writes num_chunks bytes to p->gauth_chunks, which lives at offset offsetof(struct sctp_authchunks, gauth_chunks) == 8 inside optval. The check is missing the sizeof(struct sctp_authchunks) = 8-byte header. When the caller supplies len == num_chunks (for any num_chunks > 0) the test passes but copy_to_user() writes sizeof(struct sctp_authchunks) = 8 bytes past the declared buffer.
The sibling function sctp_getsockopt_local_auth_chunks() at the next line already has the correct check:
if (len < sizeof(struct sctp_authchunks) + num_chunks)
return -EINVAL;
Align the peer variant with its sibling.
Reproducer confirms on v7.0-13-generic: an unprivileged userspace caller that opens a loopback SCTP association with AUTH enabled, queries num_chunks with a short optval, then issues the real getsockopt with len == num_chunks and sentinel bytes painted past the buffer observes those sentinel bytes overwritten with the peer's AUTH chunk type. The bytes written are under the peer's control but land in the caller's own userspace; this is not a kernel memory corruption, but it is a kernel-side contract violation that can silently corrupt adjacent userspace data.
--- net/sctp/socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sctp/socket.c +1 -1
@@ -7003,7 +7003,7 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,/* See if the user provided enough room for all the data */ num_chunks =ntohs (ch->param_hdr.length) -sizeof (struct sctp_paramhdr ); -if (len < num_chunks) +if (len <sizeof (struct sctp_authchunks ) + num_chunks)return -EINVAL ;if (copy_to_user (to, ch->chunks, num_chunks))
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 464/666 pppoe: drop PFC frames
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qingfang Deng <[email protected]>
[ Upstream commit cc1ff87bce1ccd38410ab10960f576dcd17db679 ]
RFC 2516 Section 7 states that Protocol Field Compression (PFC) is NOT RECOMMENDED for PPPoE. In practice, pppd does not support negotiating PFC for PPPoE sessions, and the current PPPoE driver assumes an uncompressed (2-byte) protocol field. However, the generic PPP layer function ppp_input() is not aware of the negotiation result, and still accepts PFC frames.
If a peer with a broken implementation or an attacker sends a frame with a compressed (1-byte) protocol field, the subsequent PPP payload is shifted by one byte. This causes the network header to be 4-byte misaligned, which may trigger unaligned access exceptions on some architectures.
To reduce the attack surface, drop PPPoE PFC frames. Introduce ppp_skb_is_compressed_proto() helper function to be used in both ppp_generic.c and pppoe.c to avoid open-coding.
--- drivers/net/ppp/ppp_generic.c | 2 +- drivers/net/ppp/pppoe.c | 8 +++++++- include/linux/ppp_defs.h | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-)
drivers/net/ppp/ppp_generic.c +1 -1
@@ -2245,7 +2245,7 @@ ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)*/ static void __ppp_decompress_proto (struct sk_buff *skb) { -if (skb->data[0 ] &0x01 ) +if (ppp_skb_is_compressed_proto (skb)) *(u8 *)skb_push (skb,1 ) =0x00 ; }
drivers/net/ppp/pppoe.c +7 -1
@@ -425,7 +425,7 @@ static int pppoe_rcv(struct sk_buff *skb, struct net_device *dev,if (skb_mac_header_len (skb) <ETH_HLEN ) goto drop; -if (!pskb_may_pull (skb,sizeof (struct pppoe_hdr ))) +if (!pskb_may_pull (skb,PPPOE_SES_HLEN )) goto drop; ph =pppoe_hdr (skb);
@@ -435,6 +435,12 @@ static int pppoe_rcv(struct sk_buff *skb, struct net_device *dev,if (skb->len < len) goto drop; +/* skb->data points to the PPP protocol header after skb_pull_rcsum. +* Drop PFC frames. +*/ +if (ppp_skb_is_compressed_proto (skb)) + goto drop; +if (pskb_trim_rcsum (skb, len)) goto drop;
include/linux/ppp_defs.h +16 -0
@@ -8,6 +8,7 @@#define _PPP_DEFS_H_#include <linux/crc-ccitt.h> +#include <linux/skbuff.h> #include <uapi/linux/ppp_defs.h> #define PPP_FCS (fcs, c) crc_ccitt_byte(fcs, c)
@@ -25,4 +26,19 @@ static inline bool ppp_proto_is_valid(u16 proto) return !!((proto & 0x0101) == 0x0001); } +/** +* ppp_skb_is_compressed_proto - checks if PPP protocol in a skb is compressed +* @skb: skb to check +* +* Check if the PPP protocol field is compressed (the least significant +* bit of the most significant octet is 1). skb->data must point to the PPP +* protocol header. +* +* Return: Whether the PPP protocol field is compressed. +*/ +static inline bool ppp_skb_is_compressed_proto (const struct sk_buff *skb) +{ +return unlikely (skb->data[0 ] &0x01 ); +} +#endif /* _PPP_DEFS_H_ */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 465/666 net/mlx5: Fix HCA caps leak on notifier init failure
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Prathamesh Deshpande <[email protected]>
[ Upstream commit d03fc81a57956248383efec99967d0ae627390a8 ]
mlx5_mdev_init() allocates HCA caps via mlx5_hca_caps_alloc() before calling mlx5_notifiers_init(). If notifier initialization fails, the error path jumps to err_hca_caps and skips mlx5_hca_caps_free(), leaking allocated caps.
Add a dedicated unwind label for notifier-init failure that frees HCA caps before continuing the existing cleanup sequence.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/main.c +3 -1
@@ -1885,7 +1885,7 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx) err =mlx5_notifiers_init (dev);if (err) - goto err_hca_caps; + goto err_notifiers_init;/* The conjunction of sw_vhca_id with sw_owner_id will be a global * unique id per function which uses mlx5_core.
@@ -1901,6 +1901,8 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)return 0 ; +err_notifiers_init: +mlx5_hca_caps_free (dev); err_hca_caps:mlx5_adev_cleanup (dev); err_adev_init:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 466/666 openvswitch: cap upcall PID array size and pre-size vport replies
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Weiming Shi <[email protected]>
[ Upstream commit 2091c6aa0df6aba47deb5c8ab232b1cb60af3519 ]
The vport netlink reply helpers allocate a fixed-size skb with nlmsg_new(NLMSG_DEFAULT_SIZE, ...) but serialize the full upcall PID array via ovs_vport_get_upcall_portids(). Since ovs_vport_set_upcall_portids() accepts any non-zero multiple of sizeof(u32) with no upper bound, a CAP_NET_ADMIN user can install a PID array large enough to overflow the reply buffer, causing nla_put() to fail with -EMSGSIZE and hitting BUG_ON(err < 0). On systems with unprivileged user namespaces enabled (e.g., Ubuntu default), this is reachable via unshare -Urn since OVS vport mutation operations use GENL_UNS_ADMIN_PERM.
kernel BUG at net/openvswitch/datapath.c:2414!
Oops: invalid opcode: 0000 [#1] SMP KASAN NOPTI CPU: 1 UID: 0 PID: 65 Comm: poc Not tainted 7.0.0-rc7-00195-geb216e422044 #1 RIP: 0010:ovs_vport_cmd_set+0x34c/0x400 Call Trace: <TASK> genl_family_rcv_msg_doit (net/netlink/genetlink.c:1116) genl_rcv_msg (net/netlink/genetlink.c:1194) netlink_rcv_skb (net/netlink/af_netlink.c:2550) genl_rcv (net/netlink/genetlink.c:1219) netlink_unicast (net/netlink/af_netlink.c:1344) netlink_sendmsg (net/netlink/af_netlink.c:1894) __sys_sendto (net/socket.c:2206) __x64_sys_sendto (net/socket.c:2209) do_syscall_64 (arch/x86/entry/syscall_64.c:63) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) </TASK> Kernel panic - not syncing: Fatal exception
Reject attempts to set more PIDs than nr_cpu_ids in ovs_vport_set_upcall_portids(), and pre-compute the worst-case reply size in ovs_vport_cmd_msg_size() based on that bound, similar to the existing ovs_dp_cmd_msg_size(). nr_cpu_ids matches the cap already used by the per-CPU dispatch configuration on the datapath side (ovs_dp_cmd_fill_info() serialises at most nr_cpu_ids PIDs), so the two sides stay consistent.
--- net/openvswitch/datapath.c | 35 +++++++++++++++++++++++++++++++++-- net/openvswitch/vport.c | 3 +++ 2 files changed, 36 insertions(+), 2 deletions(-)
net/openvswitch/datapath.c +33 -2
@@ -2157,9 +2157,40 @@ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb,return err; } +static size_t ovs_vport_cmd_msg_size (void ) +{ +size_t msgsize =NLMSG_ALIGN (sizeof (struct ovs_header )); + + msgsize +=nla_total_size (sizeof (u32));/* OVS_VPORT_ATTR_PORT_NO */ + msgsize +=nla_total_size (sizeof (u32));/* OVS_VPORT_ATTR_TYPE */ + msgsize +=nla_total_size (IFNAMSIZ );/* OVS_VPORT_ATTR_NAME */ + msgsize +=nla_total_size (sizeof (u32));/* OVS_VPORT_ATTR_IFINDEX */ + msgsize +=nla_total_size (sizeof (s32));/* OVS_VPORT_ATTR_NETNSID */ + +/* OVS_VPORT_ATTR_STATS */ + msgsize +=nla_total_size_64bit (sizeof (struct ovs_vport_stats )); + +/* OVS_VPORT_ATTR_UPCALL_STATS(OVS_VPORT_UPCALL_ATTR_SUCCESS + +* OVS_VPORT_UPCALL_ATTR_FAIL) +*/ + msgsize +=nla_total_size (nla_total_size_64bit (sizeof (u64)) + +nla_total_size_64bit (sizeof (u64))); + +/* OVS_VPORT_ATTR_UPCALL_PID */ + msgsize +=nla_total_size (nr_cpu_ids *sizeof (u32)); + +/* OVS_VPORT_ATTR_OPTIONS(OVS_TUNNEL_ATTR_DST_PORT + +* OVS_TUNNEL_ATTR_EXTENSION(OVS_VXLAN_EXT_GBP)) +*/ + msgsize +=nla_total_size (nla_total_size (sizeof (u16)) + +nla_total_size (nla_total_size (0 ))); + +return msgsize; +} +static struct sk_buff *ovs_vport_cmd_alloc_info (void ) { -return nlmsg_new (NLMSG_DEFAULT_SIZE ,GFP_KERNEL ); +return genlmsg_new (ovs_vport_cmd_msg_size (),GFP_KERNEL ); }/* Called with ovs_mutex, only via ovs_dp_notify_wq(). */
@@ -2169,7 +2200,7 @@ struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, struct net *net,struct sk_buff *skb;int retval; - skb =nlmsg_new (NLMSG_DEFAULT_SIZE ,GFP_KERNEL ); + skb =ovs_vport_cmd_alloc_info ();if (!skb)return ERR_PTR (-ENOMEM );
net/openvswitch/vport.c +3 -0
@@ -407,6 +407,9 @@ int ovs_vport_set_upcall_portids(struct vport *vport, const struct nlattr *ids)if (!nla_len (ids) ||nla_len (ids) %sizeof (u32))return -EINVAL ; +if (nla_len (ids) /sizeof (u32) > nr_cpu_ids) +return -EINVAL ; + old =ovsl_dereference (vport->upcall_portids); vport_portids = kmalloc(sizeof(*vport_portids) + nla_len(ids),
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 467/666 netfilter: nft_osf: restrict it to ipv4
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit b336fdbb7103fb1484e1dcb6741151d4b5a41e35 ]
This expression only supports for ipv4, restrict it.
--- net/netfilter/nft_osf.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/netfilter/nft_osf.c +5 -1
@@ -28,6 +28,11 @@ static void nft_osf_eval(const struct nft_expr *expr, struct nft_regs *regs,struct nf_osf_data data;struct tcphdr _tcph; +if (nft_pf (pkt) !=NFPROTO_IPV4 ) { + regs->verdict.code =NFT_BREAK ; +return ; + } +if (pkt->tprot !=IPPROTO_TCP ) { regs->verdict.code =NFT_BREAK ;return ;
@@ -114,7 +119,6 @@ static int nft_osf_validate(const struct nft_ctx *ctx,switch (ctx->family) {case NFPROTO_IPV4 : -case NFPROTO_IPV6 :case NFPROTO_INET : hooks = (1 <<NF_INET_LOCAL_IN ) | (1 << NF_INET_PRE_ROUTING) |
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 468/666 netfilter: nfnetlink_osf: fix divide-by-zero in OSF_WSS_MODULO
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit 2195574dc6d9017d32ac346987e12659f931d932 ]
nf_osf_match_one() computes ctx->window % f->wss.val in the OSF_WSS_MODULO branch with no guard for f->wss.val == 0. A CAP_NET_ADMIN user can add such a fingerprint via nfnetlink; a subsequent matching TCP SYN divides by zero and panics the kernel.
Reject the bogus fingerprint in nfnl_osf_add_callback() above the per-option for-loop. f->wss is per-fingerprint, not per-option, so the check must run regardless of f->opt_num (including 0). Also reject wss.wc >= OSF_WSS_MAX; nf_osf_match_one() already treats that as "should not happen".
Crash:
Oops: divide error: 0000 [#1] SMP KASAN NOPTI RIP: 0010:nf_osf_match_one (net/netfilter/nfnetlink_osf.c:98) Call Trace: <IRQ> nf_osf_match (net/netfilter/nfnetlink_osf.c:220) xt_osf_match_packet (net/netfilter/xt_osf.c:32) ipt_do_table (net/ipv4/netfilter/ip_tables.c:348) nf_hook_slow (net/netfilter/core.c:622) ip_local_deliver (net/ipv4/ip_input.c:265) ip_rcv (include/linux/skbuff.h:1162) __netif_receive_skb_one_core (net/core/dev.c:6181) process_backlog (net/core/dev.c:6642) __napi_poll (net/core/dev.c:7710) net_rx_action (net/core/dev.c:7945) handle_softirqs (kernel/softirq.c:622)
--- net/netfilter/nfnetlink_osf.c | 4 ++++ 1 file changed, 4 insertions(+)
net/netfilter/nfnetlink_osf.c +4 -0
@@ -320,6 +320,10 @@ static int nfnl_osf_add_callback(struct sk_buff *skb,if (f->opt_num >ARRAY_SIZE (f->opt))return -EINVAL ; +if (f->wss.wc >=OSF_WSS_MAX || + (f->wss.wc ==OSF_WSS_MODULO && f->wss.val ==0 )) +return -EINVAL ; +for (i =0 ; i < f->opt_num; i++) {if (!f->opt[i].length || f->opt[i].length >MAX_IPOPTLEN )return -EINVAL ;
Signature · 1 line
2.53.0