5.4.268-rc1 review
Greg Kroah-Hartman
maintainerRe: [PATCH 5.4 167/194] binder: print warnings when detecting oneway spamming.
In reply to Carlos LlamasQuoted 52 lines · Carlos Llamas
Quoted 19 lines · Greg Kroah-Hartman
5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Martijn Coenen <[email protected]>
[ Upstream commit
261e7818f06ec51e488e007f787ccd7e77272918]The most common cause of the binder transaction buffer filling up is a client rapidly firing oneway transactions into a process, before it has a chance to handle them. Yet the root cause of this is often hard to debug, because either the system or the app will stop, and by that time binder debug information we dump in bugreports is no longer relevant.
This change warns as soon as a process dips below 80% of its oneway space (less than 100kB available in the configuration), when any one process is responsible for either more than 50 transactions, or more than 50% of the oneway space.
Quoted 7 lines
Signed-off-by Martijn Coenen <[email protected]>Acked-by Todd Kjos <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>Stable-dep-of:
c6d05e0762ab("binder: fix unusedalloc->free_async_space")Signed-off-by Sasha Levin <[email protected]>---
I think we should drop this patch from the 5.4 stable queue. I assume it was pulled in as a dependency of patch
c6d05e0762ab("binder: fix unusedalloc->free_async_space"). However, I have instead fixed the conflicts for that backport here:
https://lore.kernel.org/all/[email protected]/I was not aware that this patch was being backported and now we have the following missing hunk in this v5.4 series:
drivers/android/binder_alloc.c +1
-2@@ -344,8 +344,7 @@ static bool debug_low_async_space_locked(struct binder_alloc *alloc, int pid)continue ;if (!buffer->async_transaction)continue ; - total_alloc_size +=binder_alloc_buffer_size (alloc, buffer) - +sizeof (struct binder_buffer ); + total_alloc_size +=binder_alloc_buffer_size (alloc, buffer); num_buffers++; }
Quoted 4 lines
Dropping this patch fixes this problem. After all it doesn't fix anything so we don't need it here.
Sorry for all the binder backporting mess.
I've dropped this now, thanks!
greg k-h
Greg Kroah-Hartman
maintainerPATCH 168/194 acpi: property: Let args be NULL in __acpi_node_get_property_reference
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sakari Ailus <[email protected]>
[ Upstream commit bef52aa0f3de1b7d8c258c13b16e577361dabf3a ]
fwnode_get_property_reference_args() may not be called with args argument NULL on ACPI, OF already supports this. Add the missing NULL checks and document this.
The purpose is to be able to count the references.
--- drivers/acpi/property.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/acpi/property.c +4 -0
@@ -646,6 +646,7 @@ acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,* @index: Index of the reference to return * @num_args: Maximum number of arguments after each reference * @args: Location to store the returned reference with optional arguments +* (may be NULL) * * Find property with @name, verifify that it is a package containing at least * one object reference and if so, store the ACPI device object pointer to the
@@ -704,6 +705,9 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,if (ret)return ret == -ENODEV ? -EINVAL : ret; +if (!args) +return 0 ; + args->fwnode =acpi_fwnode_handle (device); args->nargs =0 ;return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/194 software node: Let args be NULL in software_node_get_reference_args
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sakari Ailus <[email protected]>
[ Upstream commit 1eaea4b3604eb9ca7d9a1e73d88fc121bb4061f5 ]
fwnode_get_property_reference_args() may not be called with args argument NULL and while OF already supports this. Add the missing NULL check.
The purpose is to be able to count the references.
--- drivers/base/swnode.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/base/swnode.c +3 -0
@@ -604,6 +604,9 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode,if (nargs >NR_FWNODE_REFERENCE_ARGS )return -EINVAL ; +if (!args) +return 0 ; + args->fwnode =software_node_get (refnode); args->nargs = nargs;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/194 perf genelf: Set ELF program header addresses properly
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 1af478903fc48c1409a8dd6b698383b62387adf1 ]
The text section starts after the ELF headers so PHDR.p_vaddr and others should have the correct addresses.
--- tools/perf/util/genelf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/perf/util/genelf.c +3 -3
@@ -296,9 +296,9 @@ jit_write_elf(int fd, uint64_t load_addr, const char *sym,*/ phdr =elf_newphdr (e,1 ); phdr[0 ].p_type =PT_LOAD ; - phdr[0 ].p_offset =0 ; - phdr[0 ].p_vaddr =0 ; - phdr[0 ].p_paddr =0 ; + phdr[0 ].p_offset =GEN_ELF_TEXT_OFFSET ; + phdr[0 ].p_vaddr =GEN_ELF_TEXT_OFFSET ; + phdr[0 ].p_paddr =GEN_ELF_TEXT_OFFSET ; phdr[0 ].p_filesz = csize; phdr[0 ].p_memsz = csize; phdr[0 ].p_flags =PF_X |PF_R ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/194 nvmet-tcp: Fix a kernel panic when host sends an invalid H2C PDU length
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit efa56305908ba20de2104f1b8508c6a7401833be ]
If the host sends an H2CData command with an invalid DATAL, the kernel may crash in nvmet_tcp_build_pdu_iovec().
Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 lr : nvmet_tcp_io_work+0x6ac/0x718 [nvmet_tcp] Call trace: process_one_work+0x174/0x3c8 worker_thread+0x2d0/0x3e8 kthread+0x104/0x110
Fix the bug by raising a fatal error if DATAL isn't coherent with the packet size.
Also, the PDU length should never exceed the MAXH2CDATA parameter which has been communicated to the host in nvmet_tcp_handle_icreq().
--- drivers/nvme/target/tcp.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/nvme/target/tcp.c +12 -1
@@ -18,6 +18,7 @@#include "nvmet.h" #define NVMET_TCP_DEF_INLINE_DATA_SIZE (4 * PAGE_SIZE) +#define NVMET_TCP_MAXH2CDATA 0x400000/* 16M arbitrary limit */ #define NVMET_TCP_RECV_BUDGET 8#define NVMET_TCP_SEND_BUDGET 8
@@ -818,7 +819,7 @@ static int nvmet_tcp_handle_icreq(struct nvmet_tcp_queue *queue) icresp->hdr.pdo =0 ; icresp->hdr.plen =cpu_to_le32 (icresp->hdr.hlen); icresp->pfv =cpu_to_le16 (NVME_TCP_PFV_1_0 ); - icresp->maxdata =cpu_to_le32 (0x400000 );/* 16M arbitrary limit */ + icresp->maxdata =cpu_to_le32 (NVMET_TCP_MAXH2CDATA ); icresp->cpda =0 ;if (queue->hdr_digest) icresp->digest |=NVME_TCP_HDR_DIGEST_ENABLE ;
@@ -866,6 +867,7 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) {struct nvme_tcp_data_pdu *data = &queue->pdu.data;struct nvmet_tcp_cmd *cmd; +unsigned int plen;if (likely (queue->nr_cmds)) {if (unlikely (data->ttag >= queue->nr_cmds)) {
@@ -889,7 +891,16 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue)return -EPROTO ; } + plen =le32_to_cpu (data->hdr.plen); cmd->pdu_len =le32_to_cpu (data->data_length); +if (unlikely (cmd->pdu_len != (plen -sizeof (*data)) || + cmd->pdu_len ==0 || + cmd->pdu_len >NVMET_TCP_MAXH2CDATA )) { +pr_err ("H2CData PDU len %u is invalid\n" , cmd->pdu_len); +/* FIXME: use proper transport errors */ +nvmet_tcp_fatal_error (queue); +return -EPROTO ; + } cmd->pdu_recv =0 ;nvmet_tcp_map_pdu_iovec (cmd); queue->cmd = cmd;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/194 nvmet-tcp: fix a crash in nvmet_req_complete()
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit 0849a5441358cef02586fb2d60f707c0db195628 ]
in nvmet_tcp_handle_h2c_data_pdu(), if the host sends a data_offset different from rbytes_done, the driver ends up calling nvmet_req_complete() passing a status error.
The problem is that at this point cmd->req is not yet initialized, the kernel will crash after dereferencing a NULL pointer.
Fix the bug by replacing the call to nvmet_req_complete() with nvmet_tcp_fatal_error().
--- drivers/nvme/target/tcp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/nvme/target/tcp.c +1 -2
@@ -886,8 +886,7 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) data->ttag,le32_to_cpu (data->data_offset), cmd->rbytes_done);/* FIXME: use path and transport errors */ -nvmet_req_complete (&cmd->req, -NVME_SC_INVALID_FIELD |NVME_SC_DNR ); +nvmet_tcp_fatal_error (queue);return -EPROTO ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/194 perf env: Add perf_env__numa_node()
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Olsa <[email protected]>
[ Upstream commit 389799a7a1e86c55f38897e679762efadcc9dedd ]
To speed up cpu to node lookup, add perf_env__numa_node(), that creates cpu array on the first lookup, that holds numa nodes for each stored cpu.
Stable-dep-of: 9c51f8788b5d ("perf env: Avoid recursively taking env->bpf_progs.lock")
--- tools/perf/util/env.c | 40 ++++++++++++++++++++++++++++++++++++++++ tools/perf/util/env.h | 6 ++++++ 2 files changed, 46 insertions(+)
tools/perf/util/env.c +40 -0
@@ -183,6 +183,7 @@ void perf_env__exit(struct perf_env *env)zfree (&env->sibling_threads);zfree (&env->pmu_mappings);zfree (&env->cpu); +zfree (&env->numa_map);for (i =0 ; i < env->nr_numa_nodes; i++)perf_cpu_map__put (env->numa_nodes[i].map);
@@ -342,3 +343,42 @@ const char *perf_env__arch(struct perf_env *env)return normalize_arch (arch_name); } + + +int perf_env__numa_node (struct perf_env *env,int cpu) +{ +if (!env->nr_numa_map) { +struct numa_node *nn; +int i, nr =0 ; + +for (i =0 ; i < env->nr_numa_nodes; i++) { + nn = &env->numa_nodes[i]; + nr =max (nr,perf_cpu_map__max (nn->map)); + } + + nr++; + +/* +* We initialize the numa_map array to prepare +* it for missing cpus, which return node -1 +*/ + env->numa_map =malloc (nr *sizeof (int )); +if (!env->numa_map) +return -1 ; + +for (i =0 ; i < nr; i++) + env->numa_map[i] =-1 ; + + env->nr_numa_map = nr; + +for (i =0 ; i < env->nr_numa_nodes; i++) { +int tmp, j; + + nn = &env->numa_nodes[i]; +perf_cpu_map__for_each_cpu (j, tmp, nn->map) + env->numa_map[j] = i; + } + } + +return cpu >=0 && cpu < env->nr_numa_map ? env->numa_map[cpu] :-1 ; +}
tools/perf/util/env.h +6 -0
@@ -87,6 +87,10 @@ struct perf_env {struct rb_root btfs;u32 btfs_cnt; } bpf_progs; + +/* For fast cpu to numa node lookup via perf_env__numa_node */ +int *numa_map; +int nr_numa_map; };enum perf_compress_type {
@@ -119,4 +123,6 @@ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, __u32 prog_id);bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node);struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id); + +int perf_env__numa_node (struct perf_env *env,int cpu);#endif /* __PERF_ENV_H */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/194 perf record: Move sb_evlist to struct record
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit bc477d7983e345262757568ec27be0395dc2fe73 ]
Where state related to a 'perf record' session is grouped.
Stable-dep-of: 9c51f8788b5d ("perf env: Avoid recursively taking env->bpf_progs.lock")
--- tools/perf/builtin-record.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/perf/builtin-record.c +4 -4
@@ -80,6 +80,7 @@ struct record {struct auxtrace_record *itr;struct evlist *evlist;struct perf_session *session; +struct evlist *sb_evlist;int realtime_prio;bool no_buildid;bool no_buildid_set;
@@ -1343,7 +1344,6 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)struct perf_data *data = &rec->data;struct perf_session *session;bool disabled = false, draining = false; -struct evlist *sb_evlist =NULL ;int fd;float ratio =0 ;
@@ -1455,9 +1455,9 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) }if (!opts->no_bpf_event) -bpf_event__add_sb_event (&sb_evlist, &session->header.env); +bpf_event__add_sb_event (&rec->sb_evlist, &session->header.env); -if (perf_evlist__start_sb_thread (sb_evlist, &rec->opts.target)) { +if (perf_evlist__start_sb_thread (rec->sb_evlist, &rec->opts.target)) {pr_debug ("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n" ); opts->no_bpf_event = true; }
@@ -1731,7 +1731,7 @@ static int __cmd_record(struct record *rec, int argc, const char **argv)perf_session__delete (session);if (!opts->no_bpf_event) -perf_evlist__stop_sb_thread (sb_evlist); +perf_evlist__stop_sb_thread (rec->sb_evlist);return status; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/194 perf top: Move sb_evlist to struct perf_top
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit ca6c9c8b107f9788662117587cd24bbb19cea94d ]
Where state related to a 'perf top' session is grouped.
Stable-dep-of: 9c51f8788b5d ("perf env: Avoid recursively taking env->bpf_progs.lock")
--- tools/perf/builtin-top.c | 7 +++---- tools/perf/util/top.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-)
tools/perf/builtin-top.c +3 -4
@@ -1542,7 +1542,6 @@ int cmd_top(int argc, const char **argv)OPTS_EVSWITCH (&top.evswitch),OPT_END () }; -struct evlist *sb_evlist =NULL ;const char *const top_usage[] = {"perf top [<options>]" , NULL
@@ -1684,9 +1683,9 @@ int cmd_top(int argc, const char **argv) }if (!top.record_opts.no_bpf_event) -bpf_event__add_sb_event (&sb_evlist, &perf_env); +bpf_event__add_sb_event (&top.sb_evlist, &perf_env); -if (perf_evlist__start_sb_thread (sb_evlist, target)) { +if (perf_evlist__start_sb_thread (top.sb_evlist, target)) {pr_debug ("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n" ); opts->no_bpf_event = true; }
@@ -1694,7 +1693,7 @@ int cmd_top(int argc, const char **argv) status =__cmd_top (&top);if (!opts->no_bpf_event) -perf_evlist__stop_sb_thread (sb_evlist); +perf_evlist__stop_sb_thread (top.sb_evlist); out_delete_evlist:evlist__delete (top.evlist);
tools/perf/util/top.h +1 -1
@@ -18,7 +18,7 @@ struct perf_session;struct perf_top {struct perf_tool tool; -struct evlist *evlist; +struct evlist *evlist, *sb_evlist;struct record_opts record_opts;struct annotation_options annotation_opts;struct evswitch evswitch;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/194 perf bpf: Decouple creating the evlist from adding the SB event
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit b38d85ef49cf6af9d1deaaf01daf0986d47e6c7a ]
Renaming bpf_event__add_sb_event() to evlist__add_sb_event() and requiring that the evlist be allocated beforehand.
This will allow using the same side band thread and evlist to be used for multiple purposes in addition to react to PERF_RECORD_BPF_EVENT soon after they are generated.
Stable-dep-of: 9c51f8788b5d ("perf env: Avoid recursively taking env->bpf_progs.lock")
--- tools/perf/builtin-record.c | 17 ++++++++++++++--- tools/perf/builtin-top.c | 15 +++++++++++++-- tools/perf/util/bpf-event.c | 3 +-- tools/perf/util/bpf-event.h | 7 +++---- tools/perf/util/evlist.c | 21 ++++----------------- tools/perf/util/evlist.h | 2 +- 6 files changed, 36 insertions(+), 29 deletions(-)
tools/perf/builtin-record.c +14 -3
@@ -1446,16 +1446,27 @@ static int __cmd_record(struct record *rec, int argc, const char **argv) goto out_child; } + err =-1 ;if (!rec->no_buildid && !perf_header__has_feat (&session->header,HEADER_BUILD_ID )) {pr_err ("Couldn't generate buildids. " "Use --no-buildid to profile anyway.\n" ); - err =-1 ; goto out_child; } -if (!opts->no_bpf_event) -bpf_event__add_sb_event (&rec->sb_evlist, &session->header.env); +if (!opts->no_bpf_event) { + rec->sb_evlist =evlist__new (); + +if (rec->sb_evlist ==NULL ) { +pr_err ("Couldn't create side band evlist.\n." ); + goto out_child; + } + +if (evlist__add_bpf_sb_event (rec->sb_evlist, &session->header.env)) { +pr_err ("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n." ); + goto out_child; + } + }if (perf_evlist__start_sb_thread (rec->sb_evlist, &rec->opts.target)) {pr_debug ("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n" );
tools/perf/builtin-top.c +13 -2
@@ -1682,8 +1682,19 @@ int cmd_top(int argc, const char **argv) goto out_delete_evlist; } -if (!top.record_opts.no_bpf_event) -bpf_event__add_sb_event (&top.sb_evlist, &perf_env); +if (!top.record_opts.no_bpf_event) { + top.sb_evlist =evlist__new (); + +if (top.sb_evlist ==NULL ) { +pr_err ("Couldn't create side band evlist.\n." ); + goto out_delete_evlist; + } + +if (evlist__add_bpf_sb_event (top.sb_evlist, &perf_env)) { +pr_err ("Couldn't ask for PERF_RECORD_BPF_EVENT side band events.\n." ); + goto out_delete_evlist; + } + }if (perf_evlist__start_sb_thread (top.sb_evlist, target)) {pr_debug ("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n" );
tools/perf/util/bpf-event.c +1 -2
@@ -422,8 +422,7 @@ static int bpf_event__sb_cb(union perf_event *event, void *data)return 0 ; } -int bpf_event__add_sb_event (struct evlist **evlist, -struct perf_env *env) +int evlist__add_bpf_sb_event (struct evlist *evlist,struct perf_env *env) {struct perf_event_attr attr = { .type =PERF_TYPE_SOFTWARE ,
tools/perf/util/bpf-event.h +3 -4
@@ -33,8 +33,7 @@ struct btf_node {#ifdef HAVE_LIBBPF_SUPPORT int machine__process_bpf (struct machine *machine,union perf_event *event,struct perf_sample *sample); -int bpf_event__add_sb_event (struct evlist **evlist, -struct perf_env *env); +int evlist__add_bpf_sb_event (struct evlist *evlist,struct perf_env *env);void bpf_event__print_bpf_prog_info (struct bpf_prog_info *info,struct perf_env *env,FILE *fp);
@@ -46,8 +45,8 @@ static inline int machine__process_bpf(struct machine *machine __maybe_unused,return 0 ; } -static inline int bpf_event__add_sb_event (struct evlist **evlist__maybe_unused , -struct perf_env *env__maybe_unused ) +static inline int evlist__add_bpf_sb_event (struct evlist *evlist__maybe_unused , +struct perf_env *env__maybe_unused ) {return 0 ; }
tools/perf/util/evlist.c +4 -17
@@ -1672,39 +1672,26 @@ struct evsel *perf_evlist__reset_weak_group(struct evlist *evsel_list,return leader; } -int perf_evlist__add_sb_event (struct evlist **evlist, +int perf_evlist__add_sb_event (struct evlist *evlist,struct perf_event_attr *attr,perf_evsel__sb_cb_t cb,void *data) {struct evsel *evsel; -bool new_evlist = (*evlist) ==NULL ; - -if (*evlist ==NULL ) - *evlist =evlist__new (); -if (*evlist ==NULL ) -return -1 ;if (!attr->sample_id_all) {pr_warning ("enabling sample_id_all for all side band events\n" ); attr->sample_id_all =1 ; } - evsel =perf_evsel__new_idx (attr, (*evlist)->core.nr_entries); + evsel =perf_evsel__new_idx (attr, evlist->core.nr_entries);if (!evsel) - goto out_err; +return -1 ; evsel->side_band.cb = cb; evsel->side_band.data = data; -evlist__add (*evlist, evsel); +evlist__add (evlist, evsel);return 0 ; - -out_err: -if (new_evlist) { -evlist__delete (*evlist); - *evlist =NULL ; - } -return -1 ; }static void *perf_evlist__poll_thread (void *arg)
tools/perf/util/evlist.h +1 -1
@@ -107,7 +107,7 @@ int __perf_evlist__add_default_attrs(struct evlist *evlist,int perf_evlist__add_dummy (struct evlist *evlist); -int perf_evlist__add_sb_event (struct evlist **evlist, +int perf_evlist__add_sb_event (struct evlist *evlist,struct perf_event_attr *attr,perf_evsel__sb_cb_t cb,void *data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/194 perf env: Avoid recursively taking env->bpf_progs.lock
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 9c51f8788b5d4e9f46afbcf563255cfd355690b3 ]
Add variants of perf_env__insert_bpf_prog_info(), perf_env__insert_btf() and perf_env__find_btf prefixed with __ to indicate the env->bpf_progs.lock is assumed held.
Call these variants when the lock is held to avoid recursively taking it and potentially having a thread deadlock with itself.
--- tools/perf/util/bpf-event.c | 8 +++--- tools/perf/util/bpf-event.h | 12 ++++----- tools/perf/util/env.c | 50 ++++++++++++++++++++++++------------- tools/perf/util/env.h | 4 +++ tools/perf/util/header.c | 8 +++--- 5 files changed, 50 insertions(+), 32 deletions(-)
tools/perf/util/bpf-event.c +4 -4
@@ -442,9 +442,9 @@ int evlist__add_bpf_sb_event(struct evlist *evlist, struct perf_env *env)return perf_evlist__add_sb_event (evlist, &attr, bpf_event__sb_cb, env); } -void bpf_event__print_bpf_prog_info (struct bpf_prog_info *info, -struct perf_env *env, -FILE *fp) +void __bpf_event__print_bpf_prog_info (struct bpf_prog_info *info, +struct perf_env *env, +FILE *fp) {__u32 *prog_lens = (__u32 *)(uintptr_t )(info->jited_func_lens);__u64 *prog_addrs = (__u64 *)(uintptr_t )(info->jited_ksyms);
@@ -460,7 +460,7 @@ void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info,if (info->btf_id) {struct btf_node *node; - node =perf_env__find_btf (env, info->btf_id); + node =__perf_env__find_btf (env, info->btf_id);if (node) btf =btf__new ((__u8 *)(node->data), node->data_size);
tools/perf/util/bpf-event.h +6 -6
@@ -34,9 +34,9 @@ struct btf_node {int machine__process_bpf (struct machine *machine,union perf_event *event,struct perf_sample *sample);int evlist__add_bpf_sb_event (struct evlist *evlist,struct perf_env *env); -void bpf_event__print_bpf_prog_info (struct bpf_prog_info *info, -struct perf_env *env, -FILE *fp); +void __bpf_event__print_bpf_prog_info (struct bpf_prog_info *info, +struct perf_env *env, +FILE *fp);#else static inline int machine__process_bpf(struct machine *machine __maybe_unused, union perf_event *event __maybe_unused,
@@ -51,9 +51,9 @@ static inline int evlist__add_bpf_sb_event(struct evlist *evlist __maybe_unused,return 0 ; } -static inline void bpf_event__print_bpf_prog_info (struct bpf_prog_info *info__maybe_unused , -struct perf_env *env__maybe_unused , -FILE *fp__maybe_unused ) +static inline void __bpf_event__print_bpf_prog_info (struct bpf_prog_info *info__maybe_unused , +struct perf_env *env__maybe_unused , +FILE *fp__maybe_unused ) { }
tools/perf/util/env.c +32 -18
112 lines not on this page · raw message
tools/perf/util/env.h +4 -0
@@ -117,12 +117,16 @@ const char *perf_env__raw_arch(struct perf_env *env);int perf_env__nr_cpus_avail (struct perf_env *env);void perf_env__init (struct perf_env *env); +void __perf_env__insert_bpf_prog_info (struct perf_env *env, +struct bpf_prog_info_node *info_node);void perf_env__insert_bpf_prog_info (struct perf_env *env,struct bpf_prog_info_node *info_node);struct bpf_prog_info_node *perf_env__find_bpf_prog_info (struct perf_env *env,__u32 prog_id);bool perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node); +bool __perf_env__insert_btf (struct perf_env *env,struct btf_node *btf_node);struct btf_node *perf_env__find_btf (struct perf_env *env,__u32 btf_id); +struct btf_node *__perf_env__find_btf (struct perf_env *env,__u32 btf_id);int perf_env__numa_node (struct perf_env *env,int cpu);#endif /* __PERF_ENV_H */
tools/perf/util/header.c +4 -4
@@ -1546,8 +1546,8 @@ static void print_bpf_prog_info(struct feat_fd *ff, FILE *fp) node = rb_entry(next, struct bpf_prog_info_node, rb_node); next =rb_next (&node->rb_node); -bpf_event__print_bpf_prog_info (&node->info_linear->info, - env, fp); +__bpf_event__print_bpf_prog_info (&node->info_linear->info, + env, fp); }up_read (&env->bpf_progs.lock);
@@ -2724,7 +2724,7 @@ static int process_bpf_prog_info(struct feat_fd *ff, void *data __maybe_unused)/* after reading from file, translate offset to address */ bpf_program__bpil_offs_to_addr (info_linear); info_node->info_linear = info_linear; -perf_env__insert_bpf_prog_info (env, info_node); +__perf_env__insert_bpf_prog_info (env, info_node); }up_write (&env->bpf_progs.lock);
@@ -2777,7 +2777,7 @@ static int process_bpf_btf(struct feat_fd *ff, void *data __maybe_unused)if (__do_read (ff, node->data, data_size)) goto out; -perf_env__insert_btf (env, node); +__perf_env__insert_btf (env, node); node =NULL ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/194 apparmor: avoid crash when parsed profile name is empty
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit 55a8210c9e7d21ff2644809699765796d4bfb200 ]
When processing a packed profile in unpack_profile() described like
"profile :ns::samba-dcerpcd /usr/lib*/samba/{,samba/}samba-dcerpcd {...}"
a string ":samba-dcerpcd" is unpacked as a fully-qualified name and then passed to aa_splitn_fqname().
aa_splitn_fqname() treats ":samba-dcerpcd" as only containing a namespace. Thus it returns NULL for tmpname, meanwhile tmpns is non-NULL. Later aa_alloc_profile() crashes as the new profile name is NULL now.
general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN NOPTI KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] CPU: 6 PID: 1657 Comm: apparmor_parser Not tainted 6.7.0-rc2-dirty #16 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-3-gd478f380-rebuilt.opensuse.org 04/01/2014 RIP: 0010:strlen+0x1e/0xa0 Call Trace: <TASK> ? strlen+0x1e/0xa0 aa_policy_init+0x1bb/0x230 aa_alloc_profile+0xb1/0x480 unpack_profile+0x3bc/0x4960 aa_unpack+0x309/0x15e0 aa_replace_profiles+0x213/0x33c0 policy_update+0x261/0x370 profile_replace+0x20e/0x2a0 vfs_write+0x2af/0xe00 ksys_write+0x126/0x250 do_syscall_64+0x46/0xf0 entry_SYSCALL_64_after_hwframe+0x6e/0x76 </TASK> ---[ end trace 0000000000000000 ]--- RIP: 0010:strlen+0x1e/0xa0
It seems such behaviour of aa_splitn_fqname() is expected and checked in other places where it is called (e.g. aa_remove_profiles). Well, there is an explicit comment "a ns name without a following profile is allowed" inside.
AFAICS, nothing can prevent unpacked "name" to be in form like ":samba-dcerpcd" - it is passed from userspace.
Deny the whole profile set replacement in such case and inform user with EPROTO and an explaining message.
Found by Linux Verification Center (linuxtesting.org).
--- security/apparmor/policy_unpack.c | 4 ++++ 1 file changed, 4 insertions(+)
security/apparmor/policy_unpack.c +4 -0
@@ -693,6 +693,10 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name) tmpname =aa_splitn_fqname (name,strlen (name), &tmpns, &ns_len);if (tmpns) { +if (!tmpname) { + info ="empty profile name" ; + goto fail; + } *ns_name =kstrndup (tmpns, ns_len,GFP_KERNEL );if (!*ns_name) { info ="out of memory" ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/194 serial: imx: Correct clock error message in function probe()
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Niedermaier <[email protected]>
[ Upstream commit 3e189470cad27d41a3a9dc02649f965b7ed1c90f ]
Correct the clock error message by changing the clock name.
--- drivers/tty/serial/imx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/serial/imx.c +1 -1
@@ -2277,7 +2277,7 @@ static int imx_uart_probe(struct platform_device *pdev)/* For register access, we only need to enable the ipg clock. */ ret =clk_prepare_enable (sport->clk_ipg);if (ret) { -dev_err (&pdev->dev,"failed to enable per clk: %d\n" , ret); +dev_err (&pdev->dev,"failed to enable ipg clk: %d\n" , ret);return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/194 nvmet-tcp: Fix the H2C expected PDU len calculation
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit 9a1abc24850eb759e36a2f8869161c3b7254c904 ]
The nvmet_tcp_handle_h2c_data_pdu() function should take into consideration the possibility that the header digest and/or the data digests are enabled when calculating the expected PDU length, before comparing it to the value stored in cmd->pdu_len.
--- drivers/nvme/target/tcp.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/nvme/target/tcp.c +7 -3
@@ -867,7 +867,7 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) {struct nvme_tcp_data_pdu *data = &queue->pdu.data;struct nvmet_tcp_cmd *cmd; -unsigned int plen; +unsigned int exp_data_len;if (likely (queue->nr_cmds)) {if (unlikely (data->ttag >= queue->nr_cmds)) {
@@ -890,9 +890,13 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue)return -EPROTO ; } - plen =le32_to_cpu (data->hdr.plen); + exp_data_len =le32_to_cpu (data->hdr.plen) - +nvmet_tcp_hdgst_len (queue) - +nvmet_tcp_ddgst_len (queue) - +sizeof (*data); + cmd->pdu_len =le32_to_cpu (data->data_length); -if (unlikely (cmd->pdu_len != (plen -sizeof (*data)) || +if (unlikely (cmd->pdu_len != exp_data_len || cmd->pdu_len ==0 || cmd->pdu_len >NVMET_TCP_MAXH2CDATA )) {pr_err ("H2CData PDU len %u is invalid\n" , cmd->pdu_len);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/194 PCI: keystone: Fix race condition when initializing PHYs
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Siddharth Vadapalli <[email protected]>
[ Upstream commit c12ca110c613a81cb0f0099019c839d078cd0f38 ]
The PCI driver invokes the PHY APIs using the ks_pcie_enable_phy() function. The PHY in this case is the Serdes. It is possible that the PCI instance is configured for two lane operation across two different Serdes instances, using one lane of each Serdes.
In such a configuration, if the reference clock for one Serdes is provided by the other Serdes, it results in a race condition. After the Serdes providing the reference clock is initialized by the PCI driver by invoking its PHY APIs, it is not guaranteed that this Serdes remains powered on long enough for the PHY APIs based initialization of the dependent Serdes. In such cases, the PLL of the dependent Serdes fails to lock due to the absence of the reference clock from the former Serdes which has been powered off by the PM Core.
Fix this by obtaining reference to the PHYs before invoking the PHY initialization APIs and releasing reference after the initialization is complete.
--- drivers/pci/controller/dwc/pci-keystone.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/pci/controller/dwc/pci-keystone.c +9 -0
@@ -1305,7 +1305,16 @@ static int ks_pcie_probe(struct platform_device *pdev) goto err_link; } +/* Obtain references to the PHYs */ +for (i =0 ; i < num_lanes; i++) +phy_pm_runtime_get_sync (ks_pcie->phy[i]); + ret =ks_pcie_enable_phy (ks_pcie); + +/* Release references to the PHYs */ +for (i =0 ; i < num_lanes; i++) +phy_pm_runtime_put_sync (ks_pcie->phy[i]); +if (ret) {dev_err (dev,"failed to enable phy\n" ); goto err_link;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/194 s390/pci: fix max size calculation in zpci_memcpy_toio()
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Schnelle <[email protected]>
[ Upstream commit 80df7d6af7f6d229b34cf237b2cc9024c07111cd ]
The zpci_get_max_write_size() helper is used to determine the maximum size a PCI store or load can use at a given __iomem address.
For the PCI block store the following restrictions apply:
1. The dst + len must not cross a 4K boundary in the (pseudo-)MMIO space
2. len must not exceed ZPCI_MAX_WRITE_SIZE
3. len must be a multiple of 8 bytes
4. The src address must be double word (8 byte) aligned
5. The dst address must be double word (8 byte) aligned
Otherwise only a normal PCI store which takes its src value from a register can be used. For these PCI store restriction 1 still applies. Similarly 1 also applies to PCI loads.
It turns out zpci_max_write_size() instead implements stricter conditions which prevents PCI block stores from being used where they can and should be used. In particular instead of conditions 4 and 5 it wrongly enforces both dst and src to be size aligned. This indirectly covers condition 1 but also prevents many legal PCI block stores.
On top of the functional shortcomings the zpci_get_max_write_size() is misnamed as it is used for both read and write size calculations. Rename it to zpci_get_max_io_size() and implement the listed conditions explicitly.
--- arch/s390/include/asm/pci_io.h | 32 ++++++++++++++++++-------------- arch/s390/pci/pci_mmio.c | 12 ++++++------ 2 files changed, 24 insertions(+), 20 deletions(-)
arch/s390/include/asm/pci_io.h +18 -14
@@ -11,6 +11,8 @@/* I/O size constraints */ #define ZPCI_MAX_READ_SIZE 8#define ZPCI_MAX_WRITE_SIZE 128 +#define ZPCI_BOUNDARY_SIZE (1 << 12) +#define ZPCI_BOUNDARY_MASK (ZPCI_BOUNDARY_SIZE - 1)/* I/O Map */ #define ZPCI_IOMAP_SHIFT 48
@@ -125,16 +127,18 @@ static inline int zpci_read_single(void *dst, const volatile void __iomem *src,int zpci_write_block (volatile void __iomem *dst,const void *src,unsigned long len); -static inline u8 zpci_get_max_write_size (u64 src,u64 dst,int len,int max) +static inline int zpci_get_max_io_size (u64 src,u64 dst,int len,int max) { -int count = len > max ? max : len, size =1 ; +int offset = dst &ZPCI_BOUNDARY_MASK ; +int size; -while (!(src &0x1 ) && !(dst &0x1 ) && ((size <<1 ) <= count)) { - dst = dst >>1 ; - src = src >>1 ; - size = size <<1 ; - } -return size; + size =min3 (len,ZPCI_BOUNDARY_SIZE - offset, max); +if (IS_ALIGNED (src,8 ) &&IS_ALIGNED (dst,8 ) &&IS_ALIGNED (size,8 )) +return size; + +if (size >=8 ) +return 8 ; +return rounddown_pow_of_two (size); } static inline int zpci_memcpy_fromio(void *dst,
@@ -144,9 +148,9 @@ static inline int zpci_memcpy_fromio(void *dst,int size, rc =0 ;while (n >0 ) { - size =zpci_get_max_write_size ((u64 __force ) src, - (u64 ) dst, n, -ZPCI_MAX_READ_SIZE ); + size =zpci_get_max_io_size ((u64 __force ) src, + (u64 ) dst, n, +ZPCI_MAX_READ_SIZE ); rc =zpci_read_single (dst, src, size);if (rc)break ;
@@ -166,9 +170,9 @@ static inline int zpci_memcpy_toio(volatile void __iomem *dst,return -EINVAL ;while (n >0 ) { - size =zpci_get_max_write_size ((u64 __force ) dst, - (u64 ) src, n, -ZPCI_MAX_WRITE_SIZE ); + size =zpci_get_max_io_size ((u64 __force ) dst, + (u64 ) src, n, +ZPCI_MAX_WRITE_SIZE );if (size >8 )/* main path */ rc =zpci_write_block (dst, src, size);else
arch/s390/pci/pci_mmio.c +6 -6
@@ -100,9 +100,9 @@ static inline int __memcpy_toio_inuser(void __iomem *dst, old_fs =enable_sacf_uaccess ();while (n >0 ) { - size =zpci_get_max_write_size ((u64 __force ) dst, - (u64 __force ) src, n, -ZPCI_MAX_WRITE_SIZE ); + size =zpci_get_max_io_size ((u64 __force ) dst, + (u64 __force ) src, n, +ZPCI_MAX_WRITE_SIZE );if (size >8 )/* main path */ rc =__pcistb_mio_inuser (dst, src, size, &status);else
@@ -250,9 +250,9 @@ static inline int __memcpy_fromio_inuser(void __user *dst, old_fs =enable_sacf_uaccess ();while (n >0 ) { - size =zpci_get_max_write_size ((u64 __force ) src, - (u64 __force ) dst, n, -ZPCI_MAX_READ_SIZE ); + size =zpci_get_max_io_size ((u64 __force ) src, + (u64 __force ) dst, n, +ZPCI_MAX_READ_SIZE ); rc =__pcilg_mio_inuser (dst, src, size, &status);if (rc)break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/194 net: qualcomm: rmnet: fix global oob in rmnet_policy
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lin Ma <[email protected]>
[ Upstream commit b33fb5b801c6db408b774a68e7c8722796b59ecc ]
The variable rmnet_link_ops assign a *bigger* maxtype which leads to a global out-of-bounds read when parsing the netlink attributes. See bug trace below:
==================================================================
BUG: KASAN: global-out-of-bounds in validate_nla lib/nlattr.c:386 [inline]
BUG: KASAN: global-out-of-bounds in __nla_validate_parse+0x24af/0x2750 lib/nlattr.c:600
Read of size 1 at addr ffffffff92c438d0 by task syz-executor.6/84207
CPU: 0 PID: 84207 Comm: syz-executor.6 Tainted: G N 6.1.0 #3
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
Call Trace:
<TASK>
__dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0x8b/0xb3 lib/dump_stack.c:106
print_address_description mm/kasan/report.c:284 [inline]
print_report+0x172/0x475 mm/kasan/report.c:395
kasan_report+0xbb/0x1c0 mm/kasan/report.c:495
validate_nla lib/nlattr.c:386 [inline]
__nla_validate_parse+0x24af/0x2750 lib/nlattr.c:600
__nla_parse+0x3e/0x50 lib/nlattr.c:697
nla_parse_nested_deprecated include/net/netlink.h:1248 [inline]
__rtnl_newlink+0x50a/0x1880 net/core/rtnetlink.c:3485
rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3594
rtnetlink_rcv_msg+0x43c/0xd70 net/core/rtnetlink.c:6091
netlink_rcv_skb+0x14f/0x410 net/netlink/af_netlink.c:2540
netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline]
netlink_unicast+0x54e/0x800 net/netlink/af_netlink.c:1345
netlink_sendmsg+0x930/0xe50 net/netlink/af_netlink.c:1921
sock_sendmsg_nosec net/socket.c:714 [inline]
sock_sendmsg+0x154/0x190 net/socket.c:734
____sys_sendmsg+0x6df/0x840 net/socket.c:2482
___sys_sendmsg+0x110/0x1b0 net/socket.c:2536
__sys_sendmsg+0xf3/0x1c0 net/socket.c:2565
do_syscall_x64 arch/x86/entry/common.c:50 [inline]
do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80
entry_SYSCALL_64_after_hwframe+0x63/0xcd
RIP: 0033:0x7fdcf2072359
Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 f1 19 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48
RSP: 002b:00007fdcf13e3168 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
RAX: ffffffffffffffda RBX: 00007fdcf219ff80 RCX: 00007fdcf2072359
RDX: 0000000000000000 RSI: 0000000020000200 RDI: 0000000000000003
RBP: 00007fdcf20bd493 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
R13: 00007fffbb8d7bdf R14: 00007fdcf13e3300 R15: 0000000000022000
</TASK>
The buggy address belongs to the variable:
rmnet_policy+0x30/0xe0
The buggy address belongs to the physical page:
page:0000000065bdeb3c refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x155243
flags: 0x200000000001000(reserved|node=0|zone=2)
raw: 0200000000001000 ffffea00055490c8 ffffea00055490c8 0000000000000000
raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffffffff92c43780: f9 f9 f9 f9 00 00 00 02 f9 f9 f9 f9 00 00 00 07
ffffffff92c43800: f9 f9 f9 f9 00 00 00 05 f9 f9 f9 f9 06 f9 f9 f9
>ffffffff92c43880: f9 f9 f9 f9 00 00 00 00 00 00 f9 f9 f9 f9 f9 f9
^
ffffffff92c43900: 00 00 00 00 00 00 00 00 07 f9 f9 f9 f9 f9 f9 f9
ffffffff92c43980: 00 00 00 07 f9 f9 f9 f9 00 00 00 05 f9 f9 f9 f9According to the comment of nla_parse_nested_deprecated, the maxtype should be len(destination array) - 1. Hence use IFLA_RMNET_MAX here.
--- drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +1 -1
@@ -375,7 +375,7 @@ static int rmnet_fill_info(struct sk_buff *skb, const struct net_device *dev)struct rtnl_link_ops rmnet_link_ops__read_mostly = { .kind ="rmnet" , - .maxtype = __IFLA_RMNET_MAX, + .maxtype =IFLA_RMNET_MAX , .priv_size =sizeof (struct rmnet_priv ), .setup = rmnet_vnd_setup, .validate = rmnet_rtnl_validate,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/194 net: phy: micrel: populate .soft_reset for KSZ9131
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Claudiu Beznea <[email protected]>
[ Upstream commit e398822c4751017fe401f57409488f5948d12fb5 ]
The RZ/G3S SMARC Module has 2 KSZ9131 PHYs. In this setup, the KSZ9131 PHY is used with the ravb Ethernet driver. It has been discovered that when bringing the Ethernet interface down/up continuously, e.g., with the following sh script:
$ while :; do ifconfig eth0 down; ifconfig eth0 up; done
the link speed and duplex are wrong after interrupting the bring down/up operation even though the Ethernet interface is up. To recover from this state the following configuration sequence is necessary (executed manually):
$ ifconfig eth0 down $ ifconfig eth0 up
The behavior has been identified also on the Microchip SAMA7G5-EK board which runs the macb driver and uses the same PHY.
The order of PHY-related operations in ravb_open() is as follows:ravb_open() ->
ravb_phy_start() ->
ravb_phy_init() ->
of_phy_connect() ->
phy_connect_direct() ->
phy_attach_direct() ->
phy_init_hw() ->
phydev->drv->soft_reset()
phydev->drv->config_init()
phydev->drv->config_intr()
phy_resume()
kszphy_resume()The order of PHY-related operations in ravb_close is as follows:ravb_close() ->
phy_stop() ->
phy_suspend() ->
kszphy_suspend() ->
genphy_suspend()
// set BMCR_PDOWN bit in MII_BMCRIn genphy_suspend() setting the BMCR_PDWN bit in MII_BMCR switches the PHY to Software Power-Down (SPD) mode (according to the KSZ9131 datasheet). Thus, when opening the interface after it has been previously closed (via ravb_close()), the phydev->drv->config_init() and phydev->drv->config_intr() reach the KSZ9131 PHY driver via the ksz9131_config_init() and kszphy_config_intr() functions.
KSZ9131 specifies that the MII management interface remains operational during SPD (Software Power-Down), but (according to manual):
- Only access to the standard registers (0 through 31) is supported.
- Access to MMD address spaces other than MMD address space 1 is possible if the spd_clock_gate_override bit is set.
- Access to MMD address space 1 is not possible.
The spd_clock_gate_override bit is not used in the KSZ9131 driver.
ksz9131_config_init() configures RGMII delay, pad skews and LEDs by accessesing MMD registers other than those in address space 1.
The datasheet for the KSZ9131 does not specify what happens if registers from an unsupported address space are accessed while the PHY is in SPD.
To fix the issue the .soft_reset method has been instantiated for KSZ9131, too. This resets the PHY to the default state before doing any configurations to it, thus switching it out of SPD.
--- drivers/net/phy/micrel.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/phy/micrel.c +1 -0
@@ -1156,6 +1156,7 @@ static struct phy_driver ksphy_driver[] = {/* PHY_GBIT_FEATURES */ .driver_data = &ksz9021_type, .probe = kszphy_probe, + .soft_reset = genphy_soft_reset, .config_init = ksz9131_config_init, .read_status = genphy_read_status, .ack_interrupt = kszphy_ack_interrupt,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/194 net: ravb: Fix dma_addr_t truncation in error case
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nikita Yushchenko <[email protected]>
[ Upstream commit e327b2372bc0f18c30433ac40be07741b59231c5 ]
In ravb_start_xmit(), ravb driver uses u32 variable to store result of dma_map_single() call. Since ravb hardware has 32-bit address fields in descriptors, this works properly when mapping is successful - it is platform's job to provide mapping addresses that fit into hardware limitations.
However, in failure case dma_map_single() returns DMA_MAPPING_ERROR constant that is 64-bit when dma_addr_t is 64-bit. Storing this constant in u32 leads to truncation, and further call to dma_mapping_error() fails to notice the error.
Fix that by storing result of dma_map_single() in a dma_addr_t variable.
--- drivers/net/ethernet/renesas/ravb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/renesas/ravb_main.c +1 -1
@@ -1497,7 +1497,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)struct ravb_tstamp_skb *ts_skb;struct ravb_tx_desc *desc;unsigned long flags; -u32 dma_addr; +dma_addr_t dma_addr;void *buffer;u32 entry;u32 len;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/194 net: dsa: vsc73xx: Add null pointer check to vsc73xx_gpio_probe
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kunwu Chan <[email protected]>
[ Upstream commit 776dac5a662774f07a876b650ba578d0a62d20db ]
devm_kasprintf() returns a pointer to dynamically allocated memory which can be NULL upon failure.
--- drivers/net/dsa/vitesse-vsc73xx-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/dsa/vitesse-vsc73xx-core.c +2 -0
@@ -1108,6 +1108,8 @@ static int vsc73xx_gpio_probe(struct vsc73xx *vsc) vsc->gc.label =devm_kasprintf (vsc->dev,GFP_KERNEL ,"VSC%04x" , vsc->chipid); +if (!vsc->gc.label) +return -ENOMEM ; vsc->gc.ngpio =4 ; vsc->gc.owner =THIS_MODULE ; vsc->gc.parent = vsc->dev;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/194 netfilter: nf_tables: skip dead set elements in netlink dump
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 6b1ca88e4bb63673dc9f9c7f23c899f22c3cb17a ]
Delete from packet path relies on the garbage collector to purge elements with NFT_SET_ELEM_DEAD_BIT on.
Skip these dead elements from nf_tables_dump_setelem() path, I very rarely see tests/shell/testcases/maps/typeof_maps_add_delete reports [DUMP FAILED] showing a mismatch in the expected output with an element that should not be there.
If the netlink dump happens before GC worker run, it might show dead elements in the ruleset listing.
nft_rhash_get() already skips dead elements in nft_rhash_cmp(), therefore, it already does not show the element when getting a single element via netlink control plane.
--- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/netfilter/nf_tables_api.c +1 -1
@@ -4326,7 +4326,7 @@ static int nf_tables_dump_setelem(const struct nft_ctx *ctx,const struct nft_set_ext *ext =nft_set_elem_ext (set, elem->priv);struct nft_set_dump_args *args; -if (nft_set_elem_expired (ext)) +if (nft_set_elem_expired (ext) ||nft_set_elem_is_dead (ext))return 0 ; args = container_of(iter, struct nft_set_dump_args, iter);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/194 ipvs: avoid stat macros calls from preemptible context
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fedor Pchelkin <[email protected]>
[ Upstream commit d6938c1c76c64f42363d0d1f051e1b4641c2ad40 ]
Inside decrement_ttl() upon discovering that the packet ttl has exceeded, __IP_INC_STATS and __IP6_INC_STATS macros can be called from preemptible context having the following backtrace:
check_preemption_disabled: 48 callbacks suppressed
BUG: using __this_cpu_add() in preemptible [00000000] code: curl/1177 caller is decrement_ttl+0x217/0x830 CPU: 5 PID: 1177 Comm: curl Not tainted 6.7.0+ #34 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 04/01/2014 Call Trace: <TASK> dump_stack_lvl+0xbd/0xe0 check_preemption_disabled+0xd1/0xe0 decrement_ttl+0x217/0x830 __ip_vs_get_out_rt+0x4e0/0x1ef0 ip_vs_nat_xmit+0x205/0xcd0 ip_vs_in_hook+0x9b1/0x26a0 nf_hook_slow+0xc2/0x210 nf_hook+0x1fb/0x770 __ip_local_out+0x33b/0x640 ip_local_out+0x2a/0x490 __ip_queue_xmit+0x990/0x1d10 __tcp_transmit_skb+0x288b/0x3d10 tcp_connect+0x3466/0x5180 tcp_v4_connect+0x1535/0x1bb0 __inet_stream_connect+0x40d/0x1040 inet_stream_connect+0x57/0xa0 __sys_connect_file+0x162/0x1a0 __sys_connect+0x137/0x160 __x64_sys_connect+0x72/0xb0 do_syscall_64+0x6f/0x140 entry_SYSCALL_64_after_hwframe+0x6e/0x76 RIP: 0033:0x7fe6dbbc34e0
Use the corresponding preemption-aware variants: IP_INC_STATS and IP6_INC_STATS.
Found by Linux Verification Center (linuxtesting.org).
--- net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/netfilter/ipvs/ip_vs_xmit.c +2 -2
@@ -271,7 +271,7 @@ static inline bool decrement_ttl(struct netns_ipvs *ipvs, skb->dev = dst->dev;icmpv6_send (skb,ICMPV6_TIME_EXCEED ,ICMPV6_EXC_HOPLIMIT ,0 ); -__IP6_INC_STATS (net, idev,IPSTATS_MIB_INHDRERRORS ); +IP6_INC_STATS (net, idev,IPSTATS_MIB_INHDRERRORS );return false; }
@@ -286,7 +286,7 @@ static inline bool decrement_ttl(struct netns_ipvs *ipvs, {if (ip_hdr (skb)->ttl <=1 ) {/* Tell the sender its packet died... */ -__IP_INC_STATS (net,IPSTATS_MIB_INHDRERRORS ); +IP_INC_STATS (net,IPSTATS_MIB_INHDRERRORS );icmp_send (skb,ICMP_TIME_EXCEEDED ,ICMP_EXC_TTL ,0 );return false; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/194 kdb: Censor attempts to set PROMPT without ENABLE_MEM_READ
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Thompson <[email protected]>
[ Upstream commit ad99b5105c0823ff02126497f4366e6a8009453e ]
Currently the PROMPT variable could be abused to provoke the printf() machinery to read outside the current stack frame. Normally this doesn't matter becaues md is already a much better tool for reading from memory.
However the md command can be disabled by not setting KDB_ENABLE_MEM_READ. Let's also prevent PROMPT from being modified in these circumstances.
Whilst adding a comment to help future code reviewers we also remove the #ifdef where PROMPT in consumed. There is no problem passing an unused (0) to snprintf when !CONFIG_SMP.
argument
Stable-dep-of: 4f41d30cd6dc ("kdb: Fix a potential buffer overflow in kdb_local()")
--- kernel/debug/kdb/kdb_main.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
kernel/debug/kdb/kdb_main.c +8 -4
@@ -452,6 +452,13 @@ int kdb_set(int argc, const char **argv)if (argc !=2 )return KDB_ARGCOUNT ; +/* +* Censor sensitive variables +*/ +if (strcmp (argv[1 ],"PROMPT" ) ==0 && + !kdb_check_flags (KDB_ENABLE_MEM_READ , kdb_cmd_enabled, false)) +return KDB_NOPERM ; +/* * Check for internal variables */
@@ -1355,12 +1362,9 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, *(cmd_hist[cmd_head]) ='\0' ; do_full_getstr: -#if defined(CONFIG_SMP ) +/* PROMPT can only be set if we have MEM_READ permission. */ snprintf (kdb_prompt_str,CMD_BUFLEN ,kdbgetenv ("PROMPT" ),raw_smp_processor_id ()); -#else -snprintf (kdb_prompt_str,CMD_BUFLEN ,kdbgetenv ("PROMPT" )); -#endif if (defcmd_in_progress)strncat (kdb_prompt_str,"[defcmd]" ,CMD_BUFLEN );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/194 kdb: Fix a potential buffer overflow in kdb_local()
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit 4f41d30cd6dc865c3cbc1a852372321eba6d4e4c ]
When appending "[defcmd]" to 'kdb_prompt_str', the size of the string already in the buffer should be taken into account.
An option could be to switch from strncat() to strlcat() which does the correct test to avoid such an overflow.
However, this actually looks as dead code, because 'defcmd_in_progress' can't be true here.
See a more detailed explanation at [1].
[1]: https://lore.kernel.org/all/CAD=FV=WSh7wKN7Yp-3wWiDgX4E3isQ8uh0LCzTmd1v9Cg9j+nQ@mail.gmail.com/
--- kernel/debug/kdb/kdb_main.c | 2 -- 1 file changed, 2 deletions(-)
kernel/debug/kdb/kdb_main.c +0 -2
@@ -1365,8 +1365,6 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,/* PROMPT can only be set if we have MEM_READ permission. */ snprintf (kdb_prompt_str,CMD_BUFLEN ,kdbgetenv ("PROMPT" ),raw_smp_processor_id ()); -if (defcmd_in_progress) -strncat (kdb_prompt_str,"[defcmd]" ,CMD_BUFLEN );/* * Fetch command from keyboard
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/194 mlxsw: spectrum_acl_erp: Fix error flow of pool allocation failure
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amit Cohen <[email protected]>
[ Upstream commit 6d6eeabcfaba2fcadf5443b575789ea606f9de83 ]
Lately, a bug was found when many TC filters are added - at some point, several bugs are printed to dmesg [1] and the switch is crashed with segmentation fault.
The issue starts when gen_pool_free() fails because of unexpected behavior - a try to free memory which is already freed, this leads to BUG() call which crashes the switch and makes many other bugs.
Trying to track down the unexpected behavior led to a bug in eRP code. The function mlxsw_sp_acl_erp_table_alloc() gets a pointer to the allocated index, sets the value and returns an error code. When gen_pool_alloc() fails it returns address 0, we track it and return -ENOBUFS outside, BUT the call for gen_pool_alloc() already override the index in erp_table structure. This is a problem when such allocation is done as part of table expansion. This is not a new table, which will not be used in case of allocation failure. We try to expand eRP table and override the current index (non-zero) with zero. Then, it leads to an unexpected behavior when address 0 is freed twice. Note that address 0 is valid in erp_table->base_index and indeed other tables use it.
gen_pool_alloc() fails in case that there is no space left in the pre-allocated pool, in our case, the pool is limited to ACL_MAX_ERPT_BANK_SIZE, which is read from hardware. When more than max erp entries are required, we exceed the limit and return an error, this error leads to "Failed to migrate vregion" print.
Fix this by changing erp_table->base_index only in case of a successful allocation.
Add a test case for such a scenario. Without this fix it causes segmentation fault:
$ TESTS="max_erp_entries_test" ./tc_flower.sh ./tc_flower.sh: line 988: 1560 Segmentation fault tc filter del dev $h2 ingress chain $i protocol ip pref $i handle $j flower &>/dev/null
[1]:
kernel BUG at lib/genalloc.c:508!
invalid opcode: 0000 [#1] PREEMPT SMP
CPU: 6 PID: 3531 Comm: tc Not tainted 6.7.0-rc5-custom-ga6893f479f5e #1 Hardware name: Mellanox Technologies Ltd. MSN4700/VMOD0010, BIOS 5.11 07/12/2021 RIP: 0010:gen_pool_free_owner+0xc9/0xe0 ... Call Trace: <TASK> __mlxsw_sp_acl_erp_table_other_dec+0x70/0xa0 [mlxsw_spectrum] mlxsw_sp_acl_erp_mask_destroy+0xf5/0x110 [mlxsw_spectrum] objagg_obj_root_destroy+0x18/0x80 [objagg] objagg_obj_destroy+0x12c/0x130 [objagg] mlxsw_sp_acl_erp_mask_put+0x37/0x50 [mlxsw_spectrum] mlxsw_sp_acl_ctcam_region_entry_remove+0x74/0xa0 [mlxsw_spectrum] mlxsw_sp_acl_ctcam_entry_del+0x1e/0x40 [mlxsw_spectrum] mlxsw_sp_acl_tcam_ventry_del+0x78/0xd0 [mlxsw_spectrum] mlxsw_sp_flower_destroy+0x4d/0x70 [mlxsw_spectrum] mlxsw_sp_flow_block_cb+0x73/0xb0 [mlxsw_spectrum] tc_setup_cb_destroy+0xc1/0x180 fl_hw_destroy_filter+0x94/0xc0 [cls_flower] __fl_delete+0x1ac/0x1c0 [cls_flower] fl_destroy+0xc2/0x150 [cls_flower] tcf_proto_destroy+0x1a/0xa0
...mlxsw_spectrum3 0000:07:00.0: Failed to migrate vregion mlxsw_spectrum3 0000:07:00.0: Failed to migrate vregion
--- .../mellanox/mlxsw/spectrum_acl_erp.c | 8 +-- .../drivers/net/mlxsw/spectrum-2/tc_flower.sh | 52 ++++++++++++++++++- 2 files changed, 56 insertions(+), 4 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +5 -3
@@ -301,6 +301,7 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core, unsigned long *p_index) {unsigned int num_rows, entry_size; +unsigned long index;/* We only allow allocations of entire rows */ if (num_erps % erp_core->num_erp_banks !=0 )
@@ -309,10 +310,11 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core, entry_size = erp_core->erpt_entries_size[region_type]; num_rows = num_erps / erp_core->num_erp_banks; - *p_index =gen_pool_alloc (erp_core->erp_tables, num_rows * entry_size); -if (*p_index ==0 ) + index =gen_pool_alloc (erp_core->erp_tables, num_rows * entry_size); +if (!index)return -ENOBUFS ; - *p_index -=MLXSW_SP_ACL_ERP_GENALLOC_OFFSET ; + + *p_index = index -MLXSW_SP_ACL_ERP_GENALLOC_OFFSET ;return 0 ; }
tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +51 -1
64 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/194 i2c: s3c24xx: fix read transfers in polling mode
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Szyprowski <[email protected]>
[ Upstream commit 0d9cf23ed55d7ba3ab26d617a3ae507863674c8f ]
To properly handle read transfers in polling mode, no waiting for the ACK state is needed as it will never come. Just wait a bit to ensure start state is on the bus and continue processing next bytes.
--- drivers/i2c/busses/i2c-s3c2410.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-s3c2410.c +11 -2
@@ -223,8 +223,17 @@ static bool is_ack(struct s3c24xx_i2c *i2c)int tries;for (tries =50 ; tries; --tries) { -if (readl (i2c->regs +S3C2410_IICCON ) - &S3C2410_IICCON_IRQPEND ) { +unsigned long tmp =readl (i2c->regs +S3C2410_IICCON ); + +if (!(tmp &S3C2410_IICCON_ACKEN )) { +/* +* Wait a bit for the bus to stabilize, +* delay estimated experimentally. +*/ +usleep_range (100 ,200 ); +return true; + } +if (tmp &S3C2410_IICCON_IRQPEND ) {if (!(readl (i2c->regs +S3C2410_IICSTAT ) &S3C2410_IICSTAT_LASTBIT ))return true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/194 i2c: s3c24xx: fix transferring more than one message in polling mode
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Szyprowski <[email protected]>
[ Upstream commit 990489e1042c6c5d6bccf56deca68f8dbeed8180 ]
To properly handle ACK on the bus when transferring more than one message in polling mode, move the polling handling loop from s3c24xx_i2c_message_start() to s3c24xx_i2c_doxfer(). This way i2c_s3c_irq_nextbyte() is always executed till the end, properly acknowledging the IRQ bits and no recursive calls to i2c_s3c_irq_nextbyte() are made.
While touching this, also fix finishing transfers in polling mode by using common code path and always waiting for the bus to become idle and disabled.
--- drivers/i2c/busses/i2c-s3c2410.c | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-)
drivers/i2c/busses/i2c-s3c2410.c +10 -17
@@ -286,16 +286,6 @@ static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c, stat |=S3C2410_IICSTAT_START ;writel (stat, i2c->regs +S3C2410_IICSTAT ); - -if (i2c->quirks &QUIRK_POLL ) { -while ((i2c->msg_num !=0 ) &&is_ack (i2c)) { -i2c_s3c_irq_nextbyte (i2c, stat); - stat =readl (i2c->regs +S3C2410_IICSTAT ); - -if (stat &S3C2410_IICSTAT_ARBITR ) -dev_err (i2c->dev,"deal with arbitration loss\n" ); - } - } }static inline void s3c24xx_i2c_stop (struct s3c24xx_i2c *i2c,int ret)
@@ -703,7 +693,7 @@ static void s3c24xx_i2c_wait_idle(struct s3c24xx_i2c *i2c)static int s3c24xx_i2c_doxfer (struct s3c24xx_i2c *i2c,struct i2c_msg *msgs,int num) { -unsigned long timeout; +unsigned long timeout =0 ;int ret; ret =s3c24xx_i2c_set_master (i2c);
@@ -723,16 +713,19 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c,s3c24xx_i2c_message_start (i2c, msgs);if (i2c->quirks &QUIRK_POLL ) { - ret = i2c->msg_idx; +while ((i2c->msg_num !=0 ) &&is_ack (i2c)) { +unsigned long stat =readl (i2c->regs +S3C2410_IICSTAT ); -if (ret != num) -dev_dbg (i2c->dev,"incomplete xfer (%d)\n" , ret); +i2c_s3c_irq_nextbyte (i2c, stat); - goto out; + stat =readl (i2c->regs +S3C2410_IICSTAT ); +if (stat &S3C2410_IICSTAT_ARBITR ) +dev_err (i2c->dev,"deal with arbitration loss\n" ); + } + }else { + timeout =wait_event_timeout (i2c->wait, i2c->msg_num ==0 ,HZ *5 ); } - timeout =wait_event_timeout (i2c->wait, i2c->msg_num ==0 ,HZ *5 ); - ret = i2c->msg_idx;/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/194 perf top: Skip side-band event setup if HAVE_LIBBPF_SUPPORT is not set
In reply to Greg Kroah-Hartman5.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiezhu Yang <[email protected]>
commit 0c5f1acc2a14416bf30023f373558d369afdbfc8 upstream.
When I execute 'perf top' without HAVE_LIBBPF_SUPPORT, there exists the following segmentation fault, skip the side-band event setup to fix it, this is similar with commit 1101c872c8c7 ("perf record: Skip side-band event setup if HAVE_LIBBPF_SUPPORT is not set").
[yangtiezhu@linux perf]$ ./perf top <SNIP>
perf: Segmentation fault
Obtained 6 stack frames. ./perf(sighandler_dump_stack+0x5c) [0x12011b604] [0xffffffc010] ./perf(perf_mmap__read_init+0x3e) [0x1201feeae] ./perf() [0x1200d715c] /lib64/libpthread.so.0(+0xab9c) [0xffee10ab9c] /lib64/libc.so.6(+0x128f4c) [0xffedc08f4c] Segmentation fault
[yangtiezhu@linux perf]$
I use git bisect to find commit b38d85ef49cf ("perf bpf: Decouple creating the evlist from adding the SB event") is the first bad commit, so also add the Fixes tag.
Committer testing:
First build perf explicitely disabling libbpf:
$ make NO_LIBBPF=1 O=/tmp/build/perf -C tools/perf install-bin && perf test python
Now make sure it isn't linked:
$ perf -vv | grep -w bpf
bpf: [ OFF ] # HAVE_LIBBPF_SUPPORT
$
$ nm ~/bin/perf | grep libbpf
$And now try to run 'perf top':
# perf top perf: Segmentation fault -------- backtrace -------- perf[0x5bcd6d] /lib64/libc.so.6(+0x3ca6f)[0x7fd0f5a66a6f] perf(perf_mmap__read_init+0x1e)[0x5e1afe] perf[0x4cc468] /lib64/libpthread.so.0(+0x9431)[0x7fd0f645a431] /lib64/libc.so.6(clone+0x42)[0x7fd0f5b2b912] #
Applying this patch fixes the issue.
--- tools/perf/builtin-top.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/builtin-top.c +2 -0
@@ -1682,6 +1682,7 @@ int cmd_top(int argc, const char **argv) goto out_delete_evlist; } +#ifdef HAVE_LIBBPF_SUPPORT if (!top.record_opts.no_bpf_event) { top.sb_evlist =evlist__new ();
@@ -1695,6 +1696,7 @@ int cmd_top(int argc, const char **argv) goto out_delete_evlist; } } +#endif if (perf_evlist__start_sb_thread (top.sb_evlist, target)) {pr_debug ("Couldn't start the BPF side band thread:\nBPF programs starting from now on won't be annotatable\n" );
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.268 release. There are 194 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 24 Jan 2024 23:56:49 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.268-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.4:
10 builds: 10 pass, 0 fail
24 boots: 24 pass, 0 fail
54 tests: 54 pass, 0 failLinux version: 5.4.268-rc1-g982136305731
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra210-p3450-0000,
tegra30-cardhu-a04Jon
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.4.268 release. There are 194 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Wed, 24 Jan 2024 23:56:49 +0000. Anything received after that time might be too late.
No problems seen on x86_64 and aarch64 with our testing.
Thanks,
Harshit
Quoted 10 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.4.268-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.4.y
and the diffstat can be found below.thanks,
greg k-h