7.0.10-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 639/1146 perf stat: Fix opt->value type for parse_cache_level
In reply to Greg Kroah-Hartman7.0-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
@@ -164,7 +164,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 ;
@@ -1219,8 +1219,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
@@ -1258,7 +1258,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 ; }
@@ -2305,24 +2305,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;
@@ -2330,6 +2329,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 ="-" ;
@@ -2506,7 +2509,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 640/1146 memblock: reserve_mem: fix end caclulation in reserve_mem_release_by_name()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Rapoport (Microsoft) <[email protected]>
[ Upstream commit c12c3e1507809ad1fc0448f51c933f52e17d13cd ]
free_reserved_area() expects end parameter to point to the first address after the area, but reserve_mem_release_by_name() passes it the last address inside the area.
Remove subtraction of one in calculation of the area end.
--- mm/memblock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/memblock.c +1 -1
@@ -2434,7 +2434,7 @@ int reserve_mem_release_by_name(const char *name)return 0 ; start =phys_to_virt (map->start); - end = start + map->size -1 ; + end = start + map->size;snprintf (buf,sizeof (buf),"reserve_mem:%s" , name);free_reserved_area (start, end,0 , buf); map->size =0 ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 641/1146 perf stat: Fix crash on arm64
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit b5708a308a5602d4a3caf0720dce452082d443ec ]
Perf stat is crashing on arm64 hosts with the following issue:
# make -C tools/perf DEBUG=1 # perf stat sleep 1 perf: util/evsel.c:2034: get_group_fd: Assertion `!(!leader->core.fd)' failed. [1] 1220794 IOT instruction (core dumped) ./perf stat
The sorting function introduced by commit a745c0831c15c ("perf stat:
Sort default events/metrics") compares events based on their individual properties. This can cause events from different groups to be interleaved, resulting in group members appearing before their leaders in the sorted evlist.
When the iterator opens events in list order, a group member may be processed before its leader has been opened.
For example, CPU_CYCLES (idx=32) with leader STALL_SLOT_BACKEND (idx=37) could be sorted before its leader, causing the crash when CPU_CYCLES tries to get its group fd from the not-yet-opened leader.
Fix this by comparing events based on their leader's attributes instead of their own attributes when the events are in different groups. This ensures all members of a group share the same sort key as their leader, keeping groups together and guaranteeing leaders are opened before their members.
--- tools/perf/builtin-stat.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)
tools/perf/builtin-stat.c +17 -9
@@ -1917,25 +1917,33 @@ static int default_evlist_evsel_cmp(void *priv __maybe_unused, const struct evsel *lhs = container_of(lhs_core, struct evsel, core); const struct perf_evsel *rhs_core = container_of(r, struct perf_evsel, node); const struct evsel *rhs = container_of(rhs_core, struct evsel, core); +const struct evsel *lhs_leader =evsel__leader (lhs); +const struct evsel *rhs_leader =evsel__leader (rhs); -if (evsel__leader (lhs) ==evsel__leader (rhs)) { +if (lhs_leader == rhs_leader) {/* Within the same group, respect the original order. */ return lhs_core->idx - rhs_core->idx; } +/* +* Compare using leader's attributes so that all members of a group +* stay together. This ensures leaders are opened before their members. +*/ +/* Sort default metrics evsels first, and default show events before those. */ -if (lhs->default_metricgroup != rhs->default_metricgroup) -return lhs->default_metricgroup ?-1 :1 ; +if (lhs_leader->default_metricgroup != rhs_leader->default_metricgroup) +return lhs_leader->default_metricgroup ?-1 :1 ; -if (lhs->default_show_events != rhs->default_show_events) -return lhs->default_show_events ?-1 :1 ; +if (lhs_leader->default_show_events != rhs_leader->default_show_events) +return lhs_leader->default_show_events ?-1 :1 ;/* Sort by PMU type (prefers legacy types first). */ -if (lhs->pmu != rhs->pmu) -return lhs->pmu->type - rhs->pmu->type; +if (lhs_leader->pmu != rhs_leader->pmu) +return lhs_leader->pmu->type - rhs_leader->pmu->type; -/* Sort by name. */ -return strcmp (evsel__name ((struct evsel *)lhs),evsel__name ((struct evsel *)rhs)); +/* Sort by leader's name. */ +return strcmp (evsel__name ((struct evsel *)lhs_leader), +evsel__name ((struct evsel *)rhs_leader)); }/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 642/1146 perf tools: Fix module symbol resolution for non-zero .text sh_addr
In reply to Greg Kroah-Hartman7.0-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
@@ -1356,8 +1356,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 643/1146 perf test: Fix ratio_to_prev event parsing test
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Falcon <[email protected]>
[ Upstream commit 77cb9b443b7fff2a93d78cd2e309db030046772f ]
test__ratio_to_prev() assumed the first event in a group is the leader, which is not the case when the event is expanded into two event groups on hybrid PMU's with auto counter reload support. Instead, iterate over the event group generated for each core PMU. Also update "wrong leader" test to check that the subordinate event has the correct leader instead of checking that it is not the group leader. Finally, do not exit immediately if a PMU without auto counter reload support is found.
--- tools/perf/tests/parse-events.c | 49 +++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 21 deletions(-)
tools/perf/tests/parse-events.c +28 -21
@@ -1796,31 +1796,38 @@ static bool test__acr_valid(void)static int test__ratio_to_prev (struct evlist *evlist) { -struct evsel *evsel; +struct evsel *evsel, *leader;TEST_ASSERT_VAL ("wrong number of entries" ,2 *perf_pmus__num_core_pmus () == evlist->core.nr_entries); -evlist__for_each_entry (evlist, evsel) { -if (!perf_pmu__has_format (evsel->pmu,"acr_mask" )) -return TEST_OK ; - -if (evsel ==evlist__first (evlist)) { -TEST_ASSERT_VAL ("wrong config2" ,0 == evsel->core.attr.config2); -TEST_ASSERT_VAL ("wrong leader" ,evsel__is_group_leader (evsel)); -TEST_ASSERT_VAL ("wrong core.nr_members" , evsel->core.nr_members ==2 ); -TEST_ASSERT_VAL ("wrong group_idx" ,evsel__group_idx (evsel) ==0 ); -TEST_ASSERT_EVSEL ("unexpected event" , -evsel__match (evsel,HARDWARE ,HW_CPU_CYCLES ), - evsel); - }else { -TEST_ASSERT_VAL ("wrong config2" ,0 == evsel->core.attr.config2); -TEST_ASSERT_VAL ("wrong leader" , !evsel__is_group_leader (evsel)); -TEST_ASSERT_VAL ("wrong core.nr_members" , evsel->core.nr_members ==0 ); -TEST_ASSERT_VAL ("wrong group_idx" ,evsel__group_idx (evsel) ==1 ); -TEST_ASSERT_EVSEL ("unexpected event" , -evsel__match (evsel,HARDWARE ,HW_INSTRUCTIONS ), - evsel); +evlist__for_each_entry (evlist, evsel) { +if (evsel !=evsel__leader (evsel) || + !perf_pmu__has_format (evsel->pmu,"acr_mask" )) { +continue ; } + leader = evsel; +/* cycles */ +TEST_ASSERT_VAL ("wrong config2" ,0 == leader->core.attr.config2); +TEST_ASSERT_VAL ("wrong core.nr_members" , leader->core.nr_members ==2 ); +TEST_ASSERT_VAL ("wrong group_idx" ,evsel__group_idx (leader) ==0 ); +TEST_ASSERT_EVSEL ("unexpected event" , +evsel__match (leader,HARDWARE ,HW_CPU_CYCLES ), + leader); +/* +* The period value gets configured within evlist__config, +* while this test executes only parse events method. +*/ +TEST_ASSERT_VAL ("wrong period" ,0 == leader->core.attr.sample_period); + +/* instructions/period=200000,ratio-to-prev=2.0/ */ + evsel =evsel__next (evsel); +TEST_ASSERT_VAL ("wrong config2" ,0 == evsel->core.attr.config2); +TEST_ASSERT_VAL ("wrong leader" ,evsel__has_leader (evsel, leader)); +TEST_ASSERT_VAL ("wrong core.nr_members" , evsel->core.nr_members ==0 ); +TEST_ASSERT_VAL ("wrong group_idx" ,evsel__group_idx (evsel) ==1 ); +TEST_ASSERT_EVSEL ("unexpected event" , +evsel__match (evsel,HARDWARE ,HW_INSTRUCTIONS ), + evsel);/* * The period value gets configured within evlist__config, * while this test executes only parse events method.
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 644/1146 perf test: Skip perf data type profiling tests for s390
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Richter <[email protected]>
[ Upstream commit eb27e1c885ea75c1661188a548d100c8bce5970a ]
Test case 'perf data type profiling tests' fails on s390 with this error:
# ./perf mem record -- ./perf test -w code_with_type failed: no PMU supports the memory events # echo $? 255 #
because s390 does not support memory events at all. According to the man page, perf annotate --code-with-type only works with memory instructions only. As command 'perf mem record ...' is not supported on s390, skip this test for s390.
Output before:
# ./perf test 'perf data type profiling tests' 77: perf data type profiling tests : FAILED!
Output after:
# ./perf test 'perf data type profiling tests' 77: perf data type profiling tests : Skip
--- tools/perf/tests/shell/data_type_profiling.sh | 4 ++++ 1 file changed, 4 insertions(+)
tools/perf/tests/shell/data_type_profiling.sh +4 -0
@@ -15,6 +15,10 @@ err=0 perfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) perfout=$(mktemp /tmp/__perf_test.perf.out.XXXXX) +# Check for support of perf mem before trap handler +perf mem record -o /dev/null -- true 2>&1 | \ + grep -q "failed: no PMU supports the memory events" && exit 2 + cleanup() { rm -rf "${perfdata}" "${perfout}" rm -rf "${perfdata}".old
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 645/1146 perf expr: Return -EINVAL for syntax error in expr__find_ids()
In reply to Greg Kroah-Hartman7.0-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
@@ -376,7 +376,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 646/1146 perf metrics: Make common stalled metrics conditional on having the event
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit 210259987d9a7bb8506f3e93c2ddbece15c13b15 ]
The metric code uses the event parsing code but it generally assumes all events are supported. Arnaldo reported AMD supporting stalled-cycles-frontend but not stalled-cycles-backend [1]. An issue with this is that before parsing happens the metric code tries to share events within groups to reduce the number of events and multiplexing. If the group has some supported and not supported events, the whole group will become broken. To avoid this situation add has_event tests to the metrics for stalled-cycles-frontend and stalled-cycles-backend. has_events is evaluated when parsing the metric and its result constant propagated (with if-elses) to reduce the number of events. This means when the metric code considers sharing the events, only supported events will be shared.
Note for backporting. This change updates tools/perf/pmu-events/empty-pmu-events.c a convenience file for builds on systems without python present. While the metrics.json code should backport easily there can be conflicts on empty-pmu-events.c. In this case the build will have left a file test-empty-pmu-events.c that can be copied over empty-pmu-events.c to resolve issues and make an appropriate empty-pmu-events.c for the json in the source tree at the time of the build.
[1] https://lore.kernel.org/lkml/abm1nR-2xjOUBroD@x1/
--- .../arch/common/common/metrics.json | 6 +- tools/perf/pmu-events/empty-pmu-events.c | 108 +++++++++--------- 2 files changed, 57 insertions(+), 57 deletions(-)
tools/perf/pmu-events/arch/common/common/metrics.json +3 -3
@@ -46,14 +46,14 @@ }, { "BriefDescription": "Max front or backend stalls per instruction", - "MetricExpr": "max(stalled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions", + "MetricExpr": "(max(stalled\\-cycles\\-frontend, stalled\\-cycles\\-backend) / instructions) if (has_event(stalled\\-cycles\\-frontend) & has_event(stalled\\-cycles\\-backend)) else ((stalled\\-cycles\\-frontend / instructions) if has_event(stalled\\-cycles\\-frontend) else ((stalled\\-cycles\\-backend / instructions) if has_event(stalled\\-cycles\\-backend) else 0))", "MetricGroup": "Default", "MetricName": "stalled_cycles_per_instruction", "DefaultShowEvents": "1" }, { "BriefDescription": "Frontend stalls per cycle", - "MetricExpr": "stalled\\-cycles\\-frontend / cpu\\-cycles", + "MetricExpr": "(stalled\\-cycles\\-frontend / cpu\\-cycles) if has_event(stalled\\-cycles\\-frontend) else 0", "MetricGroup": "Default", "MetricName": "frontend_cycles_idle", "MetricThreshold": "frontend_cycles_idle > 0.1",
@@ -61,7 +61,7 @@ }, { "BriefDescription": "Backend stalls per cycle", - "MetricExpr": "stalled\\-cycles\\-backend / cpu\\-cycles", + "MetricExpr": "(stalled\\-cycles\\-backend / cpu\\-cycles) if has_event(stalled\\-cycles\\-backend) else 0", "MetricGroup": "Default", "MetricName": "backend_cycles_idle", "MetricThreshold": "backend_cycles_idle > 0.2",
tools/perf/pmu-events/empty-pmu-events.c +54 -54
130 lines not on this page · raw message
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 647/1146 ipmi: ssif_bmc: fix missing check for copy_to_user() partial failure
In reply to Greg Kroah-Hartman7.0-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 648/1146 ipmi: ssif_bmc: fix message desynchronization after truncated response
In reply to Greg Kroah-Hartman7.0-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
@@ -458,6 +458,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) {
@@ -709,6 +718,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 649/1146 ipmi: ssif_bmc: change log level to dbg in irq callback
In reply to Greg Kroah-Hartman7.0-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
@@ -569,7 +569,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;
@@ -615,7 +615,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 ;
@@ -624,7 +624,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; }
@@ -659,7 +659,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 ;
@@ -684,7 +684,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 ;
@@ -699,7 +699,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 ;
@@ -709,7 +709,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; }
@@ -738,7 +738,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 ;
@@ -805,7 +805,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 650/1146 perf cgroup: Update metric leader in evlist__expand_cgroup
In reply to Greg Kroah-Hartman7.0-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 @@ static bool has_pattern_string(const char *str)int evlist__expand_cgroup (struct evlist *evlist,const char *str,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;
@@ -452,6 +451,7 @@ int evlist__expand_cgroup(struct evlist *evlist, const char *str, bool open_cgro goto out_err;list_for_each_entry (cn, &cgroup_list, list) { +struct evsel *pos;char *name;if (!cn->used)
@@ -467,21 +467,37 @@ int evlist__expand_cgroup(struct evlist *evlist, const char *str, bool open_cgroif (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 651/1146 pinctrl: sophgo: pinctrl-sg2042: Fix wrong module description
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Inochi Amaoto <[email protected]>
[ Upstream commit ca1c2ddff00480c213903a1479b56203536e92de ]
Fix the SoC model in module description string, it should be sg2042 instead of sg2002.
--- drivers/pinctrl/sophgo/pinctrl-sg2042.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/sophgo/pinctrl-sg2042.c +1 -1
@@ -651,5 +651,5 @@ static struct platform_driver sg2042_pinctrl_driver = { };module_platform_driver (sg2042_pinctrl_driver); -MODULE_DESCRIPTION ("Pinctrl driver for the SG2002 series SoC" ); +MODULE_DESCRIPTION ("Pinctrl driver for the SG2042 series SoC" );MODULE_LICENSE ("GPL" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 652/1146 pinctrl: sophgo: pinctrl-sg2044: Fix wrong module description
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Inochi Amaoto <[email protected]>
[ Upstream commit 7648112358a4207916d3e38bfee49f85552fe95f ]
Fix the SoC model in module description string, it should be sg2044 instead of sg2002.
--- drivers/pinctrl/sophgo/pinctrl-sg2044.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/sophgo/pinctrl-sg2044.c +1 -1
@@ -714,5 +714,5 @@ static struct platform_driver sg2044_pinctrl_driver = { };module_platform_driver (sg2044_pinctrl_driver); -MODULE_DESCRIPTION ("Pinctrl driver for the SG2002 series SoC" ); +MODULE_DESCRIPTION ("Pinctrl driver for the SG2044 series SoC" );MODULE_LICENSE ("GPL" );
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 653/1146 perf maps: Fix fixup_overlap_and_insert that can break sorted by name order
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit c4f3ff3289380437d26177e8f2fe4b7507816ee3 ]
When an entry in the address array is replaced, the corresponding name entry is replaced. The entries names may sort differently and so it is important that the sorted by name property be cleared on the maps.
--- tools/perf/util/maps.c | 2 ++ 1 file changed, 2 insertions(+)
tools/perf/util/maps.c +2 -0
@@ -956,6 +956,7 @@ static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new)if (maps_by_name) {map__put (maps_by_name[ni]); maps_by_name[ni] =map__get (new); +maps__set_maps_by_name_sorted (maps, false); } err =__maps__insert_sorted (maps, i +1 , after,NULL );
@@ -982,6 +983,7 @@ static int __maps__fixup_overlap_and_insert(struct maps *maps, struct map *new)if (maps_by_name) {map__put (maps_by_name[ni]); maps_by_name[ni] =map__get (new); +maps__set_maps_by_name_sorted (maps, false); }check_invariants (maps);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 654/1146 perf maps: Fix copy_from that can break sorted by name order
In reply to Greg Kroah-Hartman7.0-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
@@ -1082,16 +1082,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 655/1146 perf util: Kill die() prototype, dead for a long time
In reply to Greg Kroah-Hartman7.0-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
@@ -30,7 +30,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 656/1146 i3c: master: dw-i3c: Fix missing reset assertion in remove() callback
In reply to Greg Kroah-Hartman7.0-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
@@ -1606,13 +1606,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);
@@ -1624,7 +1622,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);
@@ -1673,9 +1671,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 657/1146 i3c: master: dw-i3c: Balance PM runtime usage count on probe failure
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit 19d6dd322c3f05550606dbfcbafb5f6989975c02 ]
When DW_I3C_DISABLE_RUNTIME_PM_QUIRK is set, the probe function calls pm_runtime_get_noresume() to prevent runtime suspend. However, if i3c_master_register() fails, the error path does not balance this call, leaving the usage count incremented.
Add pm_runtime_put_noidle() in the error cleanup path to properly balance the usage count.
--- drivers/i3c/master/dw-i3c-master.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/i3c/master/dw-i3c-master.c +2 -0
@@ -1667,6 +1667,8 @@ int dw_i3c_common_probe(struct dw_i3c_master *master,return 0 ; err_disable_pm: +if (master->quirks &DW_I3C_DISABLE_RUNTIME_PM_QUIRK ) +pm_runtime_put_noidle (&pdev->dev);pm_runtime_disable (&pdev->dev);pm_runtime_set_suspended (&pdev->dev);pm_runtime_dont_use_autosuspend (&pdev->dev);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 658/1146 i3c: master: renesas: Fix memory leak in renesas_i3c_i3c_xfers()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Gu <[email protected]>
[ Upstream commit d7665c3b4f575251e449e2656879392346ca612b ]
The xfer structure allocated by renesas_i3c_alloc_xfer() was never freed in the renesas_i3c_i3c_xfers() function. Use the __free(kfree) cleanup attribute to automatically free the memory when the variable goes out of scope.
--- drivers/i3c/master/renesas-i3c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/i3c/master/renesas-i3c.c +2 -2
@@ -8,6 +8,7 @@#include <linux/bitfield.h> #include <linux/bitops.h> +#include <linux/cleanup.h> #include <linux/clk.h> #include <linux/completion.h> #include <linux/err.h>
@@ -817,13 +818,12 @@ static int renesas_i3c_i3c_xfers(struct i3c_dev_desc *dev, struct i3c_xfer *i3c_struct i3c_master_controller *m =i3c_dev_get_master (dev);struct renesas_i3c *i3c =to_renesas_i3c (m);struct renesas_i3c_i2c_dev_data *data =i3c_dev_get_master_data (dev); -struct renesas_i3c_xfer *xfer;int i;/* Enable I3C bus. */ renesas_i3c_bus_enable (m, true); - xfer =renesas_i3c_alloc_xfer (i3c,1 ); + struct renesas_i3c_xfer *xfer __free(kfree) = renesas_i3c_alloc_xfer(i3c, 1);if (!xfer)return -ENOMEM ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 659/1146 i3c: dw: Fix memory leak in dw_i3c_master_i3c_xfers()
In reply to Greg Kroah-Hartman7.0-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
@@ -7,6 +7,7 @@#include <linux/bitfield.h> #include <linux/bitops.h> +#include <linux/cleanup.h> #include <linux/clk.h> #include <linux/completion.h> #include <linux/err.h>
@@ -924,7 +925,6 @@ static int dw_i3c_master_i3c_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)
@@ -944,7 +944,7 @@ static int dw_i3c_master_i3c_xfers(struct i3c_dev_desc *dev, nrxwords > master->caps.datafifodepth)return -EOPNOTSUPP ; - 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 ;
@@ -995,7 +995,6 @@ static int dw_i3c_master_i3c_xfers(struct i3c_dev_desc *dev, } ret = xfer->ret; -dw_i3c_master_free_xfer (xfer);pm_runtime_put_autosuspend (master->dev);return ret;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 660/1146 i3c: master: Fix error codes at send_ccc_cmd
In reply to Greg Kroah-Hartman7.0-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
@@ -898,11 +898,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 ;
@@ -920,15 +926,7 @@ static int i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, !master->ops->supports_ccc_cmd(master, cmd)) return -EOPNOTSUPP; - 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 *
@@ -1032,8 +1030,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) {
@@ -1085,8 +1082,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)
@@ -1106,8 +1102,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)
@@ -1132,8 +1127,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
Greg Kroah-Hartman
maintainerPATCH 661/1146 i3c: master: adi: Fix error propagation for CCCs
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jorge Marques <[email protected]>
[ Upstream commit 0b73da96b6eb6b9354654f96a9d423ab22cb222d ]
adi_i3c_master_send_ccc_cmd() always returned 0, ignoring the transfer result populated in the completion path. As a consequence, CCC command errors were silently dropped, including the default -ETIMEDOUT and later overwritten by adi_i3c_master_end_xfer_locked().
Fix this by returning xfer->ret so that callers correctly receive any transfer error codes.
--- drivers/i3c/master/adi-i3c-master.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i3c/master/adi-i3c-master.c +1 -1
@@ -361,7 +361,7 @@ static int adi_i3c_master_send_ccc_cmd(struct i3c_master_controller *m, cmd->err =adi_i3c_cmd_get_err (&xfer->cmds[0 ]); -return 0 ; +return xfer->ret; } static int adi_i3c_master_i3c_xfers(struct i3c_dev_desc *dev,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 662/1146 i3c: mipi-i3c-hci: fix IBI payload length calculation for final status
In reply to Greg Kroah-Hartman7.0-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
@@ -754,7 +754,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 663/1146 fs/ntfs3: prevent uninitialized lcn caused by zero len
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Adam Davis <[email protected]>
[ Upstream commit e98266e823a1fa06fe6499df61aeaac2fd6f7a49 ]
syzbot reported a uninit-value in ntfs_iomap_begin [1].
Since runs was not touched yet, run_lookup_entry() immediately fails and returns false, which makes the value of "*len" 0. Simultaneously, the new value and err value are also 0, causing the logic in attr_data_get_block_locked() to jump directly to ok, ultimately resulting in *lcn being triggered before it is set [1].
In ntfs_iomap_begin(), the check for a 0 value in clen is moved forward to before updating lcn to avoid this [1].
[1]
BUG: KMSAN: uninit-value in ntfs_iomap_begin+0x8c0/0x1460 fs/ntfs3/inode.c:825 ntfs_iomap_begin+0x8c0/0x1460 fs/ntfs3/inode.c:825 iomap_iter+0x9b7/0x1540 fs/iomap/iter.c:110
Local variable lcn created at:
ntfs_iomap_begin+0x15d/0x1460 fs/ntfs3/inode.c:786
--- fs/ntfs3/inode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
fs/ntfs3/inode.c +5 -5
@@ -822,6 +822,11 @@ static int ntfs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,return err; } +if (!clen) { +/* broken file? */ +return -EINVAL ; + } +if (lcn ==EOF_LCN ) {/* request out of file. */ if (flags &IOMAP_REPORT ) {
@@ -855,11 +860,6 @@ static int ntfs_iomap_begin(struct inode *inode, loff_t offset, loff_t length,return 0 ; } -if (!clen) { -/* broken file? */ -return -EINVAL ; - } - iomap->bdev = inode->i_sb->s_bdev; iomap->offset = offset; iomap->length = ((loff_t )clen << cluster_bits) - off;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 664/1146 backlight: sky81452-backlight: Check return value of devm_gpiod_get_optional() in sky81452_bl_parse_dt()
In reply to Greg Kroah-Hartman7.0-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 665/1146 platform/surface: surfacepro3_button: Drop wakeup source on remove
In reply to Greg Kroah-Hartman7.0-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
@@ -242,6 +242,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 666/1146 leds: lgm-sso: Remove duplicate assignments for priv->mmap
In reply to Greg Kroah-Hartman7.0-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
@@ -808,8 +808,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 667/1146 usb: typec: Fix error pointer dereference
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ethan Tidmore <[email protected]>
[ Upstream commit f2529d08fcb429ea01bb87c326342f41483f8b2f ]
The variable tps->partner is checked for an error pointer and then if it is, it sends an error message but does not return and then immediately dereferenced a few lines below:
tps->partner = typec_register_partner(tps->port, &desc); if (IS_ERR(tps->partner))
dev_warn(tps->dev, "%s: failed to register partnet\n", __func__);
if (desc.identity) {
typec_partner_set_identity(tps->partner);
cd321x->cur_partner_identity = st.partner_identity;
}Add early return and fix spelling mistake in error message.
Detected by Smatch:drivers/usb/typec/tipd/core.c:827 cd321x_update_work() error:
'tps->partner' dereferencing possible ERR_PTR()
--- drivers/usb/typec/tipd/core.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/typec/tipd/core.c +4 -2
@@ -820,8 +820,10 @@ static void cd321x_update_work(struct work_struct *work) desc.identity = &st.partner_identity; tps->partner =typec_register_partner (tps->port, &desc); -if (IS_ERR (tps->partner)) -dev_warn (tps->dev,"%s: failed to register partnet\n" , __func__); +if (IS_ERR (tps->partner)) { +dev_warn (tps->dev,"%s: failed to register partner\n" , __func__); +return ; + }if (desc.identity) {typec_partner_set_identity (tps->partner);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 668/1146 tty: hvc_iucv: fix off-by-one in number of supported devices
In reply to Greg Kroah-Hartman7.0-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 669/1146 usb: typec: ps883x: Fix Oops at unbind
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mostafa Saleh <[email protected]>
[ Upstream commit 381133848a033c2086cf9cafb226f425bd0414ff ]
When trying to unbind a device in order to bind to it vfio-platform as:
echo bc0000.geniqup > /sys/bus/platform/devices/bc0000.geniqup/driver/unbind
I get the following Oops:
[ 436.478639] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000020 [ 436.487762] Mem abort info: [ 436.490716] ESR = 0x0000000096000004 [ 436.494595] EC = 0x25: DABT (current EL), IL = 32 bits [ 436.500071] SET = 0, FnV = 0 [ 436.503250] EA = 0, S1PTW = 0 [ 436.506505] FSC = 0x04: level 0 translation fault [ 436.511533] Data abort info: [ 436.514558] ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000 [ 436.520215] CM = 0, WnR = 0, TnD = 0, TagAccess = 0 [ 436.525436] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0 [ 436.530918] user pgtable: 4k pages, 48-bit VAs, pgdp=00000008861a9000 [ 436.537554] [0000000000000020] pgd=0000000000000000, p4d=0000000000000000 [ 436.544548] Internal error: Oops: 0000000096000004 [#1] SMP [ 436.550374] Modules linked in: [ 436.553542] CPU: 2 UID: 0 PID: 671 Comm: bash Tainted: G W 7.0.0-rc3-g56fcdd0911a5-dirty #2 PREEMPT [ 436.564440] Tainted: [W]=WARN [ 436.567515] Hardware name: LENOVO 91B6CTO1WW/3796, BIOS O6NKT3BA 05/02/2025 [ 436.574675] pstate: 21400005 (nzCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) [ 436.581841] pc : ps883x_retimer_remove+0x14/0x94 [ 436.586605] lr : i2c_device_remove+0x28/0x84 [ 436.591017] sp : ffff8000847137c0
That's because the ps883x_retimer_remove() retrieves the driver data from i2c_get_clientdata() which was never set at probe. So, add i2c_set_clientdata() at the end of the probe.
--- drivers/usb/typec/mux/ps883x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/typec/mux/ps883x.c +1 -0
@@ -444,6 +444,7 @@ static int ps883x_retimer_probe(struct i2c_client *client) goto err_switch_unregister; } +i2c_set_clientdata (client, retimer);return 0 ; err_switch_unregister:
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 670/1146 platform/x86: panasonic-laptop: Fix OPTD notifier registration and cleanup
In reply to Greg Kroah-Hartman7.0-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 671/1146 platform/x86: barco-p50-gpio: normalize return value of gpio_get
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Torokhov <[email protected]>
[ Upstream commit 1c9d30d37aaffe3454d70b89a77f8aaecda257bf ]
The GPIO get callback is expected to return 0 or 1 (or a negative error code). Ensure that the value returned by p50_gpio_get() is normalized to the [0, 1] range.
--- drivers/platform/x86/barco-p50-gpio.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/platform/x86/barco-p50-gpio.c +4 -1
@@ -275,8 +275,11 @@ static int p50_gpio_get(struct gpio_chip *gc, unsigned int offset)mutex_lock (&p50->lock); ret =p50_send_mbox_cmd (p50,P50_MBOX_CMD_READ_GPIO , gpio_params[offset],0 ); -if (ret ==0 ) +if (ret ==0 ) { ret =p50_read_mbox_reg (p50,P50_MBOX_REG_DATA ); +if (ret >=0 ) + ret = !!ret; + }mutex_unlock (&p50->lock);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 672/1146 fs/ntfs3: fix missing run load for vcn0 in attr_data_get_block_locked()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Deepanshu Kartikey <[email protected]>
[ Upstream commit d7ea8495fd307b58f8867acd81a1b40075b1d3ba ]
When a compressed or sparse attribute has its clusters frame-aligned, vcn is rounded down to the frame start using cmask, which can result in vcn != vcn0. In this case, vcn and vcn0 may reside in different attribute segments.
The code already handles the case where vcn is in a different segment by loading its runs before allocation. However, it fails to load runs for vcn0 when vcn0 resides in a different segment than vcn. This causes run_lookup_entry() to return SPARSE_LCN for vcn0 since its segment was never loaded into the in-memory run list, triggering the WARN_ON(1).
Fix this by adding a missing check for vcn0 after the existing vcn segment check. If vcn0 falls outside the current segment range [svcn, evcn1), find and load the attribute segment containing vcn0 before performing the run lookup.
The following scenario triggers the bug:
attr_data_get_block_locked()
vcn = vcn0 & cmask <- vcn != vcn0 after frame alignment
load runs for vcn segment <- vcn0 segment not loaded! attr_allocate_clusters() <- allocation succeeds
run_lookup_entry(vcn0) <- vcn0 not in run -> SPARSE_LCN
WARN_ON(1) <- bug fires here!
--- fs/ntfs3/attrib.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
fs/ntfs3/attrib.c +15 -0
@@ -1152,6 +1152,21 @@ int attr_data_get_block_locked(struct ntfs_inode *ni, CLST vcn, CLST clen,if (err) goto out; } + +if (vcn0 < svcn || evcn1 <= vcn0) { +struct ATTRIB *attr2; + + attr2 =ni_find_attr (ni, attr_b, &le_b,ATTR_DATA ,NULL , +0 , &vcn0, &mi); +if (!attr2) { + err = -EINVAL ; + goto out; + } + err =attr_load_runs (attr2, ni, run,NULL ); +if (err) + goto out; + } + da = false;/* no delalloc for compressed file. */ }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 673/1146 mfd: mc13xxx-core: Fix memory leak in mc13xxx_add_subdevice_pdata()
In reply to Greg Kroah-Hartman7.0-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 674/1146 nfs/blocklayout: Fix compilation error (`make W=1`) in bl_write_pagelist()
In reply to Greg Kroah-Hartman7.0-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 675/1146 sunrpc: Kill RPC_IFDEBUG()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit adcc59114ccd402259c089b0fea24da5e4974563 ]
RPC_IFDEBUG() is used in only two places. In one the user of the definition is guarded by ifdeffery, in the second one it's implied due to dprintk() usage. Kill the macro and move the ifdeffery to the regular condition with the variable defined inside, while in the second case add the same conditional and move the respective code there.
Stable-dep-of: 6f57293abb8d ("sunrpc: Fix compilation error (make W=1) when dprintk() is no-op")
--- fs/nfsd/nfsfh.c | 9 +++++--- include/linux/sunrpc/debug.h | 2 -- net/sunrpc/xprtrdma/svc_rdma_transport.c | 27 ++++++++++++------------ 3 files changed, 20 insertions(+), 18 deletions(-)
fs/nfsd/nfsfh.c +6 -3
@@ -105,9 +105,12 @@ static __be32 nfsd_setuser_and_check_port(struct svc_rqst *rqstp, {/* Check if the request originated from a secure port. */ if (rqstp && !nfsd_originating_port_ok (rqstp, cred, exp)) { - RPC_IFDEBUG(char buf[RPC_MAX_ADDRBUFLEN]); -dprintk ("nfsd: request from insecure port %s!\n" , -svc_print_addr (rqstp, buf,sizeof (buf))); +if (IS_ENABLED (CONFIG_SUNRPC_DEBUG )) { +char buf[RPC_MAX_ADDRBUFLEN ]; + +dprintk ("nfsd: request from insecure port %s!\n" , +svc_print_addr (rqstp, buf,sizeof (buf))); + }return nfserr_perm; }
include/linux/sunrpc/debug.h +0 -2
@@ -49,12 +49,10 @@ do { \ } \ } while (0) -# define RPC_IFDEBUG (x) x#else # define ifdebug (fac) if (0)# define dfprintk (fac, fmt, ...) do {} while (0)# define dfprintk_rcu (fac, fmt, ...) do {} while (0) -# define RPC_IFDEBUG (x)#endif /*
net/sunrpc/xprtrdma/svc_rdma_transport.c +14 -13
@@ -414,7 +414,6 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt)struct ib_qp_init_attr qp_attr;struct ib_device *dev;int ret =0 ; - RPC_IFDEBUG(struct sockaddr *sap); listen_rdma = container_of(xprt, struct svcxprt_rdma, sc_xprt);clear_bit (XPT_CONN , &xprt->xpt_flags);
@@ -560,18 +559,20 @@ static struct svc_xprt *svc_rdma_accept(struct svc_xprt *xprt) goto errout; } -#if IS_ENABLED (CONFIG_SUNRPC_DEBUG ) -dprintk ("svcrdma: new connection accepted on device %s:\n" , dev->name); - sap = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr; -dprintk (" local address : %pIS:%u\n" , sap,rpc_get_port (sap)); - sap = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr; -dprintk (" remote address : %pIS:%u\n" , sap,rpc_get_port (sap)); -dprintk (" max_sge : %d\n" , newxprt->sc_max_send_sges); -dprintk (" sq_depth : %d\n" , newxprt->sc_sq_depth); -dprintk (" rdma_rw_ctxs : %d\n" , ctxts); -dprintk (" max_requests : %d\n" , newxprt->sc_max_requests); -dprintk (" ord : %d\n" , conn_param.initiator_depth); -#endif +if (IS_ENABLED (CONFIG_SUNRPC_DEBUG )) { +struct sockaddr *sap; + +dprintk ("svcrdma: new connection accepted on device %s:\n" , dev->name); + sap = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.src_addr; +dprintk (" local address : %pIS:%u\n" , sap,rpc_get_port (sap)); + sap = (struct sockaddr *)&newxprt->sc_cm_id->route.addr.dst_addr; +dprintk (" remote address : %pIS:%u\n" , sap,rpc_get_port (sap)); +dprintk (" max_sge : %d\n" , newxprt->sc_max_send_sges); +dprintk (" sq_depth : %d\n" , newxprt->sc_sq_depth); +dprintk (" rdma_rw_ctxs : %d\n" , ctxts); +dprintk (" max_requests : %d\n" , newxprt->sc_max_requests); +dprintk (" ord : %d\n" , conn_param.initiator_depth); + }return &newxprt->sc_xprt;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 676/1146 sunrpc: Fix compilation error (`make W=1`) when dprintk() is no-op
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 6f57293abb8d087de830dd3f02e66d94b3e59973 ]
Clang compiler is not happy about set but unused variables:
.../flexfilelayout/flexfilelayoutdev.c:56:9: error: variable 'ret' set but not used [-Werror,-Wunused-but-set-variable] .../flexfilelayout/flexfilelayout.c:1505:6: error: variable 'err' set but not used [-Werror,-Wunused-but-set-variable] .../nfs4proc.c:9244:12: error: variable 'ptr' set but not used [-Werror,-Wunused-but-set-variable]
Fix these by forwarding parameters of dprintk() to no_printk(). The positive side-effect is a format-string checker enabled even for the cases when dprintk() is no-op.
--- fs/lockd/svclock.c | 5 +++++ include/linux/sunrpc/debug.h | 8 ++++++-- include/linux/sunrpc/sched.h | 3 --- 3 files changed, 11 insertions(+), 5 deletions(-)
fs/lockd/svclock.c +5 -0
@@ -80,6 +80,11 @@ static const char *nlmdbg_cookie2a(const struct nlm_cookie *cookie) return buf; } +#else +static inline const char *nlmdbg_cookie2a (const struct nlm_cookie *cookie) +{ +return "???" ; +}#endif /*
include/linux/sunrpc/debug.h +6 -2
@@ -38,6 +38,8 @@ extern unsigned int nlm_debug;do { \ ifdebug(fac) \ __sunrpc_printk(fmt, ##__VA_ARGS__); \ + else \ + no_printk(fmt, ##__VA_ARGS__); \ } while (0)# define dfprintk_rcu (fac, fmt, ...) \
@@ -46,13 +48,15 @@ do { \rcu_read_lock (); \ __sunrpc_printk(fmt, ##__VA_ARGS__); \ rcu_read_unlock(); \ + }else { \ + no_printk(fmt, ##__VA_ARGS__); \ } \ } while (0)#else # define ifdebug (fac) if (0) -# define dfprintk (fac, fmt, ...) do {} while (0) -# define dfprintk_rcu (fac, fmt, ...) do {} while (0) +# define dfprintk (fac, fmt, ...) no_printk(fmt, ##__VA_ARGS__) +# define dfprintk_rcu (fac, fmt, ...) no_printk(fmt, ##__VA_ARGS__)#endif /*
include/linux/sunrpc/sched.h +0 -3
@@ -95,10 +95,7 @@ struct rpc_task {int tk_rpc_status;/* Result of last RPC operation */ unsigned short tk_flags;/* misc flags */ unsigned short tk_timeouts;/* maj timeouts */ - -#if IS_ENABLED (CONFIG_SUNRPC_DEBUG ) ||IS_ENABLED (CONFIG_TRACEPOINTS )unsigned short tk_pid;/* debugging aid */ -#endif unsigned char tk_priority : 2,/* Task priority */ tk_garb_retry : 2, tk_cred_retry : 2;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 677/1146 NFSD: fix nfs4_file access extra count in nfsd4_add_rdaccess_to_wrdeleg
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dai Ngo <[email protected]>
[ Upstream commit b48f44f36e6607b2f818560f19deb86b4a9c717b ]
In nfsd4_add_rdaccess_to_wrdeleg, if fp->fi_fds[O_RDONLY] is already set by another thread, __nfs4_file_get_access should not be called to increment the nfs4_file access count since that was already done by the thread that added READ access to the file. The extra fi_access count in nfs4_file can prevent the corresponding nfsd_file from being freed.
When stopping nfs-server service, these extra access counts trigger a BUG in kmem_cache_destroy() that shows nfsd_file object remaining on __kmem_cache_shutdown.
This problem can be reproduced by running the Git project's test suite over NFS.
--- fs/nfsd/nfs4state.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfsd/nfs4state.c +2 -2
@@ -6257,12 +6257,12 @@ nfsd4_add_rdaccess_to_wrdeleg(struct svc_rqst *rqstp, struct nfsd4_open *open,return (false); fp = stp->st_stid.sc_file;spin_lock (&fp->fi_lock); -__nfs4_file_get_access (fp,NFS4_SHARE_ACCESS_READ );if (!fp->fi_fds[O_RDONLY ]) { +__nfs4_file_get_access (fp,NFS4_SHARE_ACCESS_READ ); fp->fi_fds[O_RDONLY ] = nf; + fp->fi_rdeleg_file =nfsd_file_get (fp->fi_fds[O_RDONLY ]); nf =NULL ; } - fp->fi_rdeleg_file =nfsd_file_get (fp->fi_fds[O_RDONLY ]);spin_unlock (&fp->fi_lock);if (nf)nfsd_file_put (nf);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 678/1146 nfsd: use dynamic allocation for oversized NFSv4.0 replay cache
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
[ Upstream commit 116b6b7acdd82605ed530232cd7509d1b5282f5c ]
Commit 1e8e9913672a ("nfsd: fix heap overflow in NFSv4.0 LOCK replay cache") capped the replay cache copy at NFSD4_REPLAY_ISIZE to prevent a heap overflow, but set rp_buflen to zero when the encoded response exceeded the inline buffer. A retransmitted LOCK reaching the replay path then produced only a status code with no operation body, resulting in a malformed XDR response.
When the encoded response exceeds the 112-byte inline rp_ibuf, a buffer is kmalloc'd to hold it. If the allocation fails, rp_buflen remains zero, preserving the behavior from the capped-copy fix. The buffer is freed when the stateowner is released or when a subsequent operation's response fits in the inline buffer.
--- fs/nfsd/nfs4state.c | 16 ++++++++++++++++ fs/nfsd/nfs4xdr.c | 23 ++++++++++++++++------- fs/nfsd/state.h | 12 +++++++----- 3 files changed, 39 insertions(+), 12 deletions(-)
fs/nfsd/nfs4state.c +16 -0
@@ -1495,8 +1495,24 @@ release_all_access(struct nfs4_ol_stateid *stp) } } +/** +* nfs4_replay_free_cache - release dynamically allocated replay buffer +* @rp: replay cache to reset +* +* If @rp->rp_buf points to a kmalloc'd buffer, free it and reset +* rp_buf to the inline rp_ibuf. Always zeroes rp_buflen. +*/ +void nfs4_replay_free_cache (struct nfs4_replay *rp) +{ +if (rp->rp_buf != rp->rp_ibuf) +kfree (rp->rp_buf); + rp->rp_buf = rp->rp_ibuf; + rp->rp_buflen =0 ; +} +static inline void nfs4_free_stateowner (struct nfs4_stateowner *sop) { +nfs4_replay_free_cache (&sop->so_replay);kfree (sop->so_owner.data); sop->so_ops->so_free (sop); }
fs/nfsd/nfs4xdr.c +16 -7
@@ -6281,14 +6281,23 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op)int len = xdr->buf->len - (op_status_offset +XDR_UNIT ); so->so_replay.rp_status = op->status; -if (len <=NFSD4_REPLAY_ISIZE ) { - so->so_replay.rp_buflen = len; -read_bytes_from_xdr_buf (xdr->buf, - op_status_offset +XDR_UNIT , - so->so_replay.rp_buf, len); - }else { - so->so_replay.rp_buflen =0 ; +if (len >NFSD4_REPLAY_ISIZE ) { +char *buf =kmalloc (len,GFP_KERNEL ); + +nfs4_replay_free_cache (&so->so_replay); +if (buf) { + so->so_replay.rp_buf = buf; + }else { +/* rp_buflen already zeroed; skip caching */ + goto status; + } + }else if (so->so_replay.rp_buf != so->so_replay.rp_ibuf) { +nfs4_replay_free_cache (&so->so_replay); } + so->so_replay.rp_buflen = len; +read_bytes_from_xdr_buf (xdr->buf, + op_status_offset +XDR_UNIT , + so->so_replay.rp_buf, len); } status: op->status = nfsd4_map_status(op->status,
fs/nfsd/state.h +7 -5
@@ -549,10 +549,10 @@ struct nfs4_client_reclaim {* ~32(deleg. ace) = 112 bytes * * Some responses can exceed this. A LOCK denial includes the conflicting -* lock owner, which can be up to 1024 bytes (NFS4_OPAQUE_LIMIT). Responses -* larger than REPLAY_ISIZE are not cached in rp_ibuf; only rp_status is -* saved. Enlarging this constant increases the size of every -* nfs4_stateowner. +* lock owner, which can be up to 1024 bytes (NFS4_OPAQUE_LIMIT). When a +* response exceeds REPLAY_ISIZE, a buffer is dynamically allocated. If +* that allocation fails, only rp_status is saved. Enlarging this constant +* increases the size of every nfs4_stateowner. */ #define NFSD4_REPLAY_ISIZE 112
@@ -564,12 +564,14 @@ struct nfs4_client_reclaim {struct nfs4_replay {__be32 rp_status;unsigned int rp_buflen; -char *rp_buf; +char *rp_buf;/* rp_ibuf or kmalloc'd */ struct knfsd_fh rp_openfh;int rp_locked;char rp_ibuf[NFSD4_REPLAY_ISIZE ]; }; +extern void nfs4_replay_free_cache (struct nfs4_replay *rp); +struct nfs4_stateowner ;struct nfs4_stateowner_operations {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 679/1146 RDMA/umem: Use consistent DMA attributes when unmapping entries
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit 179b32095854d44749dd535502f05d95bbf43775 ]
The DMA API expects that mapping and unmapping use the same DMA attributes. The RDMA umem code did not meet this requirement, so fix the mismatch.
--- drivers/infiniband/core/umem.c | 13 ++++++------- include/rdma/ib_umem.h | 1 + 2 files changed, 7 insertions(+), 7 deletions(-)
drivers/infiniband/core/umem.c +6 -7
@@ -55,8 +55,7 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dif (dirty)ib_dma_unmap_sgtable_attrs (dev, &umem->sgt_append.sgt, -DMA_BIDIRECTIONAL , -DMA_ATTR_REQUIRE_COHERENT ); +DMA_BIDIRECTIONAL , umem->dma_attrs);for_each_sgtable_sg (&umem->sgt_append.sgt, sg, i) { unpin_user_page_range_dirty_lock(sg_page(sg),
@@ -170,7 +169,6 @@ struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr,unsigned long lock_limit;unsigned long new_pinned;unsigned long cur_base; -unsigned long dma_attr =DMA_ATTR_REQUIRE_COHERENT ;struct mm_struct *mm;unsigned long npages;int pinned, ret;
@@ -203,6 +201,10 @@ struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr, umem->iova = addr; umem->writable =ib_access_writable (access); umem->owning_mm = mm = current->mm; + umem->dma_attrs =DMA_ATTR_REQUIRE_COHERENT ; +if (access &IB_ACCESS_RELAXED_ORDERING ) + umem->dma_attrs |=DMA_ATTR_WEAK_ORDERING ; +mmgrab (mm); page_list = (struct page **)__get_free_page (GFP_KERNEL );
@@ -255,11 +257,8 @@ struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr, } } -if (access &IB_ACCESS_RELAXED_ORDERING ) - dma_attr |=DMA_ATTR_WEAK_ORDERING ; - ret =ib_dma_map_sgtable_attrs (device, &umem->sgt_append.sgt, -DMA_BIDIRECTIONAL , dma_attr); +DMA_BIDIRECTIONAL , umem->dma_attrs);if (ret) goto umem_release; goto out;
include/rdma/ib_umem.h +1 -0
@@ -22,6 +22,7 @@ struct ib_umem {u64 iova;size_t length;unsigned long address; +unsigned long dma_attrs; u32 writable : 1; u32 is_odp : 1; u32 is_dmabuf : 1;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 680/1146 greybus: raw: fix use-after-free on cdev close
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Riégel <[email protected]>
[ Upstream commit 983cc2c7efbce04ecbf6328448d895044dd6ab31 ]
This addresses a use-after-free bug when a raw bundle is disconnected but its chardev is still opened by an application. When the application releases the cdev, it causes the following panic when init on free is enabled (CONFIG_INIT_ON_FREE_DEFAULT_ON=y):
refcount_t: underflow; use-after-free.
WARNING: CPU: 0 PID: 139 at lib/refcount.c:28 refcount_warn_saturate+0xd0/0x130
...
Call Trace:
<TASK>
cdev_put+0x18/0x30
__fput+0x255/0x2a0
__x64_sys_close+0x3d/0x80
do_syscall_64+0xa4/0x290
entry_SYSCALL_64_after_hwframe+0x77/0x7fThe cdev is contained in the "gb_raw" structure, which is freed in the disconnect operation. When the cdev is released at a later time, cdev_put gets an address that points to freed memory.
To fix this use-after-free, convert the struct device from a pointer to being embedded, that makes the lifetime of the cdev and of this device the same. Then, use cdev_device_add, which guarantees that the device won't be released until all references to the cdev have been released. Finally, delegate the freeing of the structure to the device release function, instead of freeing immediately in the disconnect callback.
--- drivers/staging/greybus/raw.c | 69 +++++++++++++++++------------------ 1 file changed, 34 insertions(+), 35 deletions(-)
drivers/staging/greybus/raw.c +34 -35
@@ -21,9 +21,8 @@ struct gb_raw {struct list_head list;int list_data;struct mutex list_lock; -dev_t dev;struct cdev cdev; -struct device *device; +struct device dev; };struct raw_data {
@@ -148,6 +147,15 @@ static int gb_raw_send(struct gb_raw *raw, u32 len, const char __user *data)return retval; } +static void raw_dev_release (struct device *dev) +{ + struct gb_raw *raw = container_of(dev, struct gb_raw, dev); + +ida_free (&minors,MINOR (raw->dev.devt)); + +kfree (raw); +} +static int gb_raw_probe (struct gb_bundle *bundle,const struct greybus_bundle_id *id) {
@@ -164,15 +172,30 @@ static int gb_raw_probe(struct gb_bundle *bundle,if (cport_desc->protocol_id !=GREYBUS_PROTOCOL_RAW )return -ENODEV ; - raw =kzalloc_obj (*raw); -if (!raw) + minor =ida_alloc (&minors,GFP_KERNEL ); +if (minor <0 ) +return minor; + + raw =kzalloc_obj (*raw,GFP_KERNEL ); +if (!raw) { +ida_free (&minors, minor);return -ENOMEM ; + } + +device_initialize (&raw->dev); + raw->dev.devt =MKDEV (raw_major, minor); + raw->dev.class = &raw_class; + raw->dev.parent = &bundle->dev; + raw->dev.release = raw_dev_release; + retval =dev_set_name (&raw->dev,"gb!raw%d" , minor); +if (retval) + goto error_put_device; connection =gb_connection_create (bundle,le16_to_cpu (cport_desc->id), gb_raw_request_handler);if (IS_ERR (connection)) { retval =PTR_ERR (connection); - goto error_free; + goto error_put_device; }INIT_LIST_HEAD (&raw->list);
@@ -181,46 +204,26 @@ static int gb_raw_probe(struct gb_bundle *bundle, raw->connection = connection;greybus_set_drvdata (bundle, raw); - minor =ida_alloc (&minors,GFP_KERNEL ); -if (minor <0 ) { - retval = minor; - goto error_connection_destroy; - } - - raw->dev =MKDEV (raw_major, minor);cdev_init (&raw->cdev, &raw_fops); retval =gb_connection_enable (connection);if (retval) - goto error_remove_ida; + goto error_connection_destroy; - retval =cdev_add (&raw->cdev, raw->dev,1 ); + retval =cdev_device_add (&raw->cdev, &raw->dev);if (retval) goto error_connection_disable; - raw->device =device_create (&raw_class, &connection->bundle->dev, - raw->dev, raw,"gb!raw%d" , minor); -if (IS_ERR (raw->device)) { - retval =PTR_ERR (raw->device); - goto error_del_cdev; - } -return 0 ; -error_del_cdev: -cdev_del (&raw->cdev); - error_connection_disable:gb_connection_disable (connection); -error_remove_ida: -ida_free (&minors, minor); - error_connection_destroy:gb_connection_destroy (connection); -error_free: -kfree (raw); +error_put_device: +put_device (&raw->dev);return retval; }
@@ -231,11 +234,8 @@ static void gb_raw_disconnect(struct gb_bundle *bundle)struct raw_data *raw_data;struct raw_data *temp; -// FIXME - handle removing a connection when the char device node is open. -device_destroy (&raw_class, raw->dev); -cdev_del (&raw->cdev); +cdev_device_del (&raw->cdev, &raw->dev);gb_connection_disable (connection); -ida_free (&minors,MINOR (raw->dev));gb_connection_destroy (connection);mutex_lock (&raw->list_lock);
@@ -244,8 +244,7 @@ static void gb_raw_disconnect(struct gb_bundle *bundle)kfree (raw_data); }mutex_unlock (&raw->list_lock); - -kfree (raw); +put_device (&raw->dev); }/*
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 681/1146 greybus: raw: fix use-after-free if write is called after disconnect
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Riégel <[email protected]>
[ Upstream commit 84265cbd96b97058ef67e3f8be3933667a000835 ]
If a user writes to the chardev after disconnect has been called, the kernel panics with the following trace (with CONFIG_INIT_ON_FREE_DEFAULT_ON=y):
BUG: kernel NULL pointer dereference, address: 0000000000000218
...
Call Trace:
<TASK>
gb_operation_create_common+0x61/0x180
gb_operation_create_flags+0x28/0xa0
gb_operation_sync_timeout+0x6f/0x100
raw_write+0x7b/0xc7 [gb_raw]
vfs_write+0xcf/0x420
? task_mm_cid_work+0x136/0x220
ksys_write+0x63/0xe0
do_syscall_64+0xa4/0x290
entry_SYSCALL_64_after_hwframe+0x77/0x7fDisconnect calls gb_connection_destroy, which ends up freeing the connection object. When gb_operation_sync is called in the write file operations, its gets a freed connection as parameter and the kernel panics.
The gb_connection_destroy cannot be moved out of the disconnect function, as the Greybus subsystem expect all connections belonging to a bundle to be destroyed when disconnect returns.
To prevent this bug, use a rw lock to synchronize access between write and disconnect. This guarantees that the write function doesn't try to use a disconnected connection.
--- drivers/staging/greybus/raw.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)
drivers/staging/greybus/raw.c +21 -2
@@ -21,6 +21,8 @@ struct gb_raw {struct list_head list;int list_data;struct mutex list_lock; +struct rw_semaphore disconnect_lock; +bool disconnected;struct cdev cdev;struct device dev; };
@@ -200,6 +202,7 @@ static int gb_raw_probe(struct gb_bundle *bundle,INIT_LIST_HEAD (&raw->list);mutex_init (&raw->list_lock); +init_rwsem (&raw->disconnect_lock); raw->connection = connection;greybus_set_drvdata (bundle, raw);
@@ -235,6 +238,11 @@ static void gb_raw_disconnect(struct gb_bundle *bundle)struct raw_data *temp;cdev_device_del (&raw->cdev, &raw->dev); + +down_write (&raw->disconnect_lock); + raw->disconnected = true; +up_write (&raw->disconnect_lock); +gb_connection_disable (connection);gb_connection_destroy (connection);
@@ -277,11 +285,22 @@ static ssize_t raw_write(struct file *file, const char __user *buf,if (count >MAX_PACKET_SIZE )return -E2BIG ; +down_read (&raw->disconnect_lock); + +if (raw->disconnected) { + retval = -ENODEV ; + goto exit; + } + retval =gb_raw_send (raw, count, buf);if (retval) -return retval; + goto exit; -return count; + retval = count; +exit: +up_read (&raw->disconnect_lock); + +return retval; } static ssize_t raw_read(struct file *file, char __user *buf, size_t count,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 682/1146 platform/x86: asus-wmi: adjust screenpad power/brightness handling
In reply to Greg Kroah-Hartman7.0-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
@@ -4419,32 +4419,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 683/1146 platform/x86: asus-wmi: fix screenpad brightness range
In reply to Greg Kroah-Hartman7.0-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
@@ -125,7 +125,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
@@ -4408,13 +4407,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)
@@ -4454,22 +4453,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);
@@ -4480,7 +4476,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 684/1146 tty: serial: ip22zilog: Fix section mispatch warning
In reply to Greg Kroah-Hartman7.0-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 685/1146 fs/ntfs3: terminate the cached volume label after UTF-8 conversion
In reply to Greg Kroah-Hartman7.0-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
@@ -1339,8 +1339,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 686/1146 platform/x86: hp-wmi: fix ignored return values in fan settings
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emre Cecanpunar <[email protected]>
[ Upstream commit 7265b57fbc32782d02bdb8d865ba0d8efa209c8c ]
hp_wmi_get_fan_count_userdefine_trigger() can fail, but its return value was silently ignored in hp_wmi_apply_fan_settings() for PWM_MODE_MAX/AUTO. Propagate these errors consistently.
Additionally, handle the return value of hp_wmi_apply_fan_settings() in its callers by adding appropriate warnings on failure, and remove an unreachable "return 0" at the end of the function.
--- drivers/platform/x86/hp/hp-wmi.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/platform/x86/hp/hp-wmi.c +16 -7
@@ -2358,8 +2358,11 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)switch (priv->mode) {case PWM_MODE_MAX : -if (is_victus_s_thermal_profile ()) -hp_wmi_get_fan_count_userdefine_trigger (); +if (is_victus_s_thermal_profile ()) { + ret =hp_wmi_get_fan_count_userdefine_trigger (); +if (ret <0 ) +return ret; + } ret =hp_wmi_fan_speed_max_set (1 );if (ret <0 )return ret;
@@ -2377,7 +2380,9 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)return 0 ;case PWM_MODE_AUTO :if (is_victus_s_thermal_profile ()) { -hp_wmi_get_fan_count_userdefine_trigger (); + ret =hp_wmi_get_fan_count_userdefine_trigger (); +if (ret <0 ) +return ret; ret =hp_wmi_fan_speed_max_reset (priv); }else { ret =hp_wmi_fan_speed_max_set (0 );
@@ -2390,8 +2395,6 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv)/* shouldn't happen */ return -EINVAL ; } - -return 0 ; } static umode_t hp_wmi_hwmon_is_visible(const void *data,
@@ -2533,6 +2536,7 @@ static void hp_wmi_hwmon_keep_alive_handler(struct work_struct *work) {struct delayed_work *dwork;struct hp_wmi_hwmon_priv *priv; +int ret; dwork =to_delayed_work (work); priv = container_of(dwork, struct hp_wmi_hwmon_priv, keep_alive_dwork);
@@ -2540,7 +2544,10 @@ static void hp_wmi_hwmon_keep_alive_handler(struct work_struct *work)* Re-apply the current hwmon context settings. * NOTE: hp_wmi_apply_fan_settings will handle the re-scheduling. */ -hp_wmi_apply_fan_settings (priv); + ret =hp_wmi_apply_fan_settings (priv); +if (ret) +pr_warn_ratelimited ("keep-alive failed to refresh fan settings: %d\n" , + ret); }static int hp_wmi_setup_fan_settings (struct hp_wmi_hwmon_priv *priv)
@@ -2602,7 +2609,9 @@ static int hp_wmi_hwmon_init(void)INIT_DELAYED_WORK (&priv->keep_alive_dwork, hp_wmi_hwmon_keep_alive_handler);platform_set_drvdata (hp_wmi_platform_dev, priv); -hp_wmi_apply_fan_settings (priv); + ret =hp_wmi_apply_fan_settings (priv); +if (ret) +dev_warn (dev,"Failed to apply initial fan settings: %d\n" , ret);return 0 ; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 687/1146 platform/x86: hp-wmi: avoid cancel_delayed_work_sync from work handler
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emre Cecanpunar <[email protected]>
[ Upstream commit 249ddba9c0ba4453c0a6bc0e3626e7864751d940 ]
hp_wmi_apply_fan_settings() uses cancel_delayed_work_sync() to stop the keep-alive timer in AUTO mode. However, since hp_wmi_apply_fan_settings() is also called from the keep-alive handler, a race condition with a sysfs write can cause the handler to wait on itself, leading to a deadlock.
Replace cancel_delayed_work_sync() with cancel_delayed_work() in hp_wmi_apply_fan_settings() to avoid the self-flush deadlock.
--- drivers/platform/x86/hp/hp-wmi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/hp/hp-wmi.c +1 -1
@@ -2389,7 +2389,7 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv) }if (ret <0 )return ret; -cancel_delayed_work_sync (&priv->keep_alive_dwork); +cancel_delayed_work (&priv->keep_alive_dwork);return 0 ;default :/* shouldn't happen */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 688/1146 platform/x86: hp-wmi: use mod_delayed_work to reset keep-alive timer
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emre Cecanpunar <[email protected]>
[ Upstream commit 6297443beb0c5606399ec7d4f4b335e2e7379147 ]
Currently, schedule_delayed_work() is used to queue the 90s keep-alive timer. If a user manually changes the fan speed at T=85s, schedule_delayed_work() leaves the existing timer in place as it is a no-op if the work is already pending. This results in the keep-alive timer firing unnecessarily at T=90s, just 5 seconds after the user action.
Replace schedule_delayed_work() with mod_delayed_work() to reset the 90s timer whenever fan settings are applied. This guarantees a full 90s delay after every user interaction, preventing redundant keep-alive executions and improving efficiency.
--- drivers/platform/x86/hp/hp-wmi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/platform/x86/hp/hp-wmi.c +4 -4
@@ -2366,8 +2366,8 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv) ret =hp_wmi_fan_speed_max_set (1 );if (ret <0 )return ret; -schedule_delayed_work (&priv->keep_alive_dwork, -secs_to_jiffies (KEEP_ALIVE_DELAY_SECS )); +mod_delayed_work (system_wq, &priv->keep_alive_dwork, +secs_to_jiffies (KEEP_ALIVE_DELAY_SECS ));return 0 ;case PWM_MODE_MANUAL :if (!is_victus_s_thermal_profile ())
@@ -2375,8 +2375,8 @@ static int hp_wmi_apply_fan_settings(struct hp_wmi_hwmon_priv *priv) ret =hp_wmi_fan_speed_set (priv,pwm_to_rpm (priv->pwm, priv));if (ret <0 )return ret; -schedule_delayed_work (&priv->keep_alive_dwork, -secs_to_jiffies (KEEP_ALIVE_DELAY_SECS )); +mod_delayed_work (system_wq, &priv->keep_alive_dwork, +secs_to_jiffies (KEEP_ALIVE_DELAY_SECS ));return 0 ;case PWM_MODE_AUTO :if (is_victus_s_thermal_profile ()) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 689/1146 platform/x86: hp-wmi: fix u8 underflow in gpu_delta calculation
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emre Cecanpunar <[email protected]>
[ Upstream commit cb4daa450f05447c1f914eaef75b2577c25a0fcd ]
gpu_delta was declared as u8. If the firmware specifies a GPU RPM lower than the CPU RPM, subtracting them causes an underflow (e.g. 10 - 20 = 246), which forces the GPU fan to remain clamped at U8_MAX (100% speed) during operation.
Change gpu_delta to int and use signed arithmetic. Existing signed logic in hp_wmi_fan_speed_set() correctly handles negative deltas.
--- drivers/platform/x86/hp/hp-wmi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/platform/x86/hp/hp-wmi.c +3 -3
@@ -460,7 +460,7 @@ enum pwm_modes {struct hp_wmi_hwmon_priv {u8 min_rpm;u8 max_rpm; -u8 gpu_delta; +int gpu_delta;u8 mode;u8 pwm;struct delayed_work keep_alive_dwork;
@@ -2554,8 +2554,8 @@ static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv) {u8 fan_data[128 ] = {0 };struct victus_s_fan_table *fan_table; -u8 min_rpm, max_rpm, gpu_delta; -int ret; +u8 min_rpm, max_rpm; +int gpu_delta, ret;/* Default behaviour on hwmon init is automatic mode */ priv->mode =PWM_MODE_AUTO ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 690/1146 platform/x86: hp-wmi: add locking for concurrent hwmon access
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emre Cecanpunar <[email protected]>
[ Upstream commit 5969c55e2145368254194edbe0e64880314be69f ]
hp_wmi_hwmon_priv.mode and .pwm are written by hp_wmi_hwmon_write() in sysfs context and read by hp_wmi_hwmon_keep_alive_handler() in a workqueue. A concurrent write and keep-alive expiry can observe an inconsistent mode/pwm pair (e.g. mode=MANUAL with a stale pwm).
Add a mutex to hp_wmi_hwmon_priv protecting mode and pwm. Hold it in hp_wmi_hwmon_write() across the field update and apply call, and in hp_wmi_hwmon_keep_alive_handler() before calling apply.
In hp_wmi_hwmon_read(), only the pwm_enable path reads priv->mode; use scoped_guard() there to avoid holding the lock across unrelated WMI calls.
--- drivers/platform/x86/hp/hp-wmi.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/platform/x86/hp/hp-wmi.c +13 -2
@@ -458,6 +458,7 @@ enum pwm_modes { };struct hp_wmi_hwmon_priv { +struct mutex lock;/* protects mode, pwm */ u8 min_rpm;u8 max_rpm;int gpu_delta;
@@ -2427,6 +2428,7 @@ static int hp_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type, {struct hp_wmi_hwmon_priv *priv;int rpm, ret; +u8 mode; priv =dev_get_drvdata (dev);switch (type) {
@@ -2450,11 +2452,13 @@ static int hp_wmi_hwmon_read(struct device *dev, enum hwmon_sensor_types type, *val =rpm_to_pwm (rpm /100 , priv);return 0 ; } -switch (priv->mode) { +scoped_guard (mutex, &priv->lock) + mode = priv->mode; +switch (mode) {case PWM_MODE_MAX :case PWM_MODE_MANUAL :case PWM_MODE_AUTO : - *val = priv->mode; + *val = mode;return 0 ;default :/* shouldn't happen */
@@ -2472,6 +2476,7 @@ static int hp_wmi_hwmon_write(struct device *dev, enum hwmon_sensor_types type,int rpm; priv =dev_get_drvdata (dev); +guard (mutex)(&priv->lock);switch (type) {case hwmon_pwm:if (attr == hwmon_pwm_input) {
@@ -2540,6 +2545,8 @@ static void hp_wmi_hwmon_keep_alive_handler(struct work_struct *work) dwork =to_delayed_work (work); priv = container_of(dwork, struct hp_wmi_hwmon_priv, keep_alive_dwork); + +guard (mutex)(&priv->lock);/* * Re-apply the current hwmon context settings. * NOTE: hp_wmi_apply_fan_settings will handle the re-scheduling.
@@ -2596,6 +2603,10 @@ static int hp_wmi_hwmon_init(void)if (!priv)return -ENOMEM ; + ret =devm_mutex_init (dev, &priv->lock); +if (ret) +return ret; + ret =hp_wmi_setup_fan_settings (priv);if (ret)return ret;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 691/1146 platform/x86: dell_rbu: avoid uninit value usage in packet_size_write()
In reply to Greg Kroah-Hartman7.0-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>
@@ -619,9 +620,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 692/1146 platform/x86: dell-wmi-sysman: bound enumeration string aggregation
In reply to Greg Kroah-Hartman7.0-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 693/1146 RDMA/core: Prefer NLA_NUL_STRING
In reply to Greg Kroah-Hartman7.0-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 694/1146 platform/x86: hp-wmi: fix fan table parsing
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krishna Chomal <[email protected]>
[ Upstream commit 9d317a54e46d3b6420567dc5b63e9d7ff5c064a3 ]
For Victus S devices, the BIOS fan table header was being incorrectly parsed as:
struct {
u8 unknown;
u8 num_entries;
}The first field should be num_fans and the second should be unknown. It is pure coincidence that interpreting an "unknown" field as "num_entries" worked on multiple device, however for board 8D87 (in an upcoming patch), this assumption fails, and the hp-wmi driver fails to load.
We fix this by correcting the header definition and compensating for num_entries by parsing each entry of the fan table until an all-NULL row is obtained, mirroring the behavior of OMEN Gaming Hub on Windows.
--- drivers/platform/x86/hp/hp-wmi.c | 41 +++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-)
drivers/platform/x86/hp/hp-wmi.c +33 -8
@@ -468,14 +468,14 @@ struct hp_wmi_hwmon_priv { };struct victus_s_fan_table_header { +u8 num_fans;u8 unknown; -u8 num_entries; } __packed;struct victus_s_fan_table_entry {u8 cpu_rpm;u8 gpu_rpm; -u8 unknown; +u8 noise_db; } __packed;struct victus_s_fan_table {
@@ -2562,7 +2562,9 @@ static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)u8 fan_data[128 ] = {0 };struct victus_s_fan_table *fan_table;u8 min_rpm, max_rpm; -int gpu_delta, ret; +u8 cpu_rpm, gpu_rpm, noise_db; +int gpu_delta, i, num_entries, ret; +size_t header_size, entry_size;/* Default behaviour on hwmon init is automatic mode */ priv->mode =PWM_MODE_AUTO ;
@@ -2577,13 +2579,36 @@ static int hp_wmi_setup_fan_settings(struct hp_wmi_hwmon_priv *priv)return ret; fan_table = (struct victus_s_fan_table *)fan_data; -if (fan_table->header.num_entries ==0 || -sizeof (struct victus_s_fan_table_header ) + -sizeof (struct victus_s_fan_table_entry ) * fan_table->header.num_entries >sizeof (fan_data)) +if (fan_table->header.num_fans ==0 ) +return -EINVAL ; + + header_size =sizeof (struct victus_s_fan_table_header ); + entry_size =sizeof (struct victus_s_fan_table_entry ); + num_entries = (sizeof (fan_data) - header_size) / entry_size; + min_rpm =U8_MAX ; + max_rpm =0 ; + +for (i =0 ; i < num_entries ; i++) { + cpu_rpm = fan_table->entries[i].cpu_rpm; + gpu_rpm = fan_table->entries[i].gpu_rpm; + noise_db = fan_table->entries[i].noise_db; + +/* +* On some devices, the fan table is truncated with an all-zero row, +* hence we stop parsing here. +*/ +if (cpu_rpm ==0 && gpu_rpm ==0 && noise_db ==0 ) +break ; + +if (cpu_rpm < min_rpm) + min_rpm = cpu_rpm; +if (cpu_rpm > max_rpm) + max_rpm = cpu_rpm; + } + +if (min_rpm ==U8_MAX || max_rpm ==0 )return -EINVAL ; - min_rpm = fan_table->entries[0 ].cpu_rpm; - max_rpm = fan_table->entries[fan_table->header.num_entries -1 ].cpu_rpm; gpu_delta = fan_table->entries[0 ].gpu_rpm - fan_table->entries[0 ].cpu_rpm; priv->min_rpm = min_rpm; priv->max_rpm = max_rpm;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 695/1146 dt-bindings: clock: qcom: Add GCC video axi reset clock for Glymur
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Taniya Das <[email protected]>
[ Upstream commit 7c3260327fc874b7c89d7bb230cd569d2e78aff7 ]
The global clock controller video axi reset clocks are required by the video SW driver to assert and deassert the clock resets.
Stable-dep-of: 1c8ce43e1e07 ("clk: qcom: gcc-glymur: Add video axi clock resets for glymur")
--- include/dt-bindings/clock/qcom,glymur-gcc.h | 1 + 1 file changed, 1 insertion(+)
include/dt-bindings/clock/qcom,glymur-gcc.h +1 -0
@@ -574,5 +574,6 @@#define GCC_VIDEO_AXI0_CLK_ARES 89#define GCC_VIDEO_AXI1_CLK_ARES 90#define GCC_VIDEO_BCR 91 +#define GCC_VIDEO_AXI0C_CLK_ARES 92#endif
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 696/1146 clk: qcom: gcc-glymur: Add video axi clock resets for glymur
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Taniya Das <[email protected]>
[ Upstream commit 1c8ce43e1e07ecc531fb517f95620ed85e998608 ]
The global clock controller video axi reset clocks are required by the video SW driver to assert and deassert the clock resets during their power down sequence. Hence add these clock resets.
--- drivers/clk/qcom/gcc-glymur.c | 1 + 1 file changed, 1 insertion(+)
drivers/clk/qcom/gcc-glymur.c +1 -0
@@ -8507,6 +8507,7 @@ static const struct qcom_reset_map gcc_glymur_resets[] = { [GCC_VIDEO_AXI0_CLK_ARES] = { 0x3201c, 2 }, [GCC_VIDEO_AXI1_CLK_ARES] = { 0x32044, 2 }, [GCC_VIDEO_BCR] = { 0x32000 }, + [GCC_VIDEO_AXI0C_CLK_ARES] = { 0x32030, 2 }, };static const struct clk_rcg_dfs_data gcc_dfs_clocks[] = {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 697/1146 clk: qcom: dispcc-glymur: use RCG2 ops for DPTX1 AUX clock source
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit e7c8eb1646db5d967d77ee67793dd95a2c5ff451 ]
The clk_dp_ops are supposed to be used for DP-related clocks with a proper MND divier. Use shared RCG2 ops for dptx1_aux_clk_src, the same as all other DPTX AUX clocks in this driver.
--- drivers/clk/qcom/dispcc-glymur.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/dispcc-glymur.c +1 -1
@@ -417,7 +417,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_shared_ops, }, };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 698/1146 clk: qcom: dispcc-sm8450: use RCG2 ops for DPTX1 AUX clock source
In reply to Greg Kroah-Hartman7.0-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
@@ -409,7 +409,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 699/1146 clk: renesas: r9a09g057: Fix ordering of module clocks array
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ovidiu Panait <[email protected]>
[ Upstream commit 79cac2b8dc1d9f63fbf6c6793e423052118cc51a ]
The r9a09g057_mod_clks array is sorted by CPG_CLKON register number and bit position. Move the RTC and RSPI module clock entries to their correct position to restore the array sort order.
--- drivers/clk/renesas/r9a09g057-cpg.c | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-)
drivers/clk/renesas/r9a09g057-cpg.c +20 -20
@@ -296,6 +296,26 @@ static const struct rzv2h_mod_clk r9a09g057_mod_clks[] __initconst = { BUS_MSTOP(5, BIT(13))),DEF_MOD ("wdt_3_clk_loco" ,CLK_QEXTAL ,5 ,2 ,2 ,18 ,BUS_MSTOP (5 ,BIT (13 ))), +DEF_MOD ("rtc_0_clk_rtc" ,CLK_PLLCM33_DIV16 ,5 ,3 ,2 ,19 , +BUS_MSTOP (3 ,BIT (11 ) |BIT (12 ))), +DEF_MOD ("rspi_0_pclk" ,CLK_PLLCLN_DIV8 ,5 ,4 ,2 ,20 , +BUS_MSTOP (11 ,BIT (0 ))), +DEF_MOD ("rspi_0_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,5 ,2 ,21 , +BUS_MSTOP (11 ,BIT (0 ))), +DEF_MOD ("rspi_0_tclk" ,CLK_PLLCLN_DIV8 ,5 ,6 ,2 ,22 , +BUS_MSTOP (11 ,BIT (0 ))), +DEF_MOD ("rspi_1_pclk" ,CLK_PLLCLN_DIV8 ,5 ,7 ,2 ,23 , +BUS_MSTOP (11 ,BIT (1 ))), +DEF_MOD ("rspi_1_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,8 ,2 ,24 , +BUS_MSTOP (11 ,BIT (1 ))), +DEF_MOD ("rspi_1_tclk" ,CLK_PLLCLN_DIV8 ,5 ,9 ,2 ,25 , +BUS_MSTOP (11 ,BIT (1 ))), +DEF_MOD ("rspi_2_pclk" ,CLK_PLLCLN_DIV8 ,5 ,10 ,2 ,26 , +BUS_MSTOP (11 ,BIT (2 ))), +DEF_MOD ("rspi_2_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,11 ,2 ,27 , +BUS_MSTOP (11 ,BIT (2 ))), +DEF_MOD ("rspi_2_tclk" ,CLK_PLLCLN_DIV8 ,5 ,12 ,2 ,28 , +BUS_MSTOP (11 ,BIT (2 ))),DEF_MOD ("rsci0_pclk" ,CLK_PLLCLN_DIV16 ,5 ,13 ,2 ,29 ,BUS_MSTOP (11 ,BIT (3 ))), DEF_MOD("rsci0_tclk", CLK_PLLCLN_DIV16, 5, 14, 2, 30,
@@ -396,26 +416,6 @@ static const struct rzv2h_mod_clk r9a09g057_mod_clks[] __initconst = { BUS_MSTOP(11, BIT(12))),DEF_MOD ("rsci9_ps_ps1_n" ,CLK_PLLCLN_DIV64 ,8 ,14 ,4 ,14 ,BUS_MSTOP (11 ,BIT (12 ))), -DEF_MOD ("rtc_0_clk_rtc" ,CLK_PLLCM33_DIV16 ,5 ,3 ,2 ,19 , -BUS_MSTOP (3 ,BIT (11 ) |BIT (12 ))), -DEF_MOD ("rspi_0_pclk" ,CLK_PLLCLN_DIV8 ,5 ,4 ,2 ,20 , -BUS_MSTOP (11 ,BIT (0 ))), -DEF_MOD ("rspi_0_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,5 ,2 ,21 , -BUS_MSTOP (11 ,BIT (0 ))), -DEF_MOD ("rspi_0_tclk" ,CLK_PLLCLN_DIV8 ,5 ,6 ,2 ,22 , -BUS_MSTOP (11 ,BIT (0 ))), -DEF_MOD ("rspi_1_pclk" ,CLK_PLLCLN_DIV8 ,5 ,7 ,2 ,23 , -BUS_MSTOP (11 ,BIT (1 ))), -DEF_MOD ("rspi_1_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,8 ,2 ,24 , -BUS_MSTOP (11 ,BIT (1 ))), -DEF_MOD ("rspi_1_tclk" ,CLK_PLLCLN_DIV8 ,5 ,9 ,2 ,25 , -BUS_MSTOP (11 ,BIT (1 ))), -DEF_MOD ("rspi_2_pclk" ,CLK_PLLCLN_DIV8 ,5 ,10 ,2 ,26 , -BUS_MSTOP (11 ,BIT (2 ))), -DEF_MOD ("rspi_2_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,11 ,2 ,27 , -BUS_MSTOP (11 ,BIT (2 ))), -DEF_MOD ("rspi_2_tclk" ,CLK_PLLCLN_DIV8 ,5 ,12 ,2 ,28 , -BUS_MSTOP (11 ,BIT (2 ))),DEF_MOD ("scif_0_clk_pck" ,CLK_PLLCM33_DIV16 ,8 ,15 ,4 ,15 ,BUS_MSTOP (3 ,BIT (14 ))), DEF_MOD("i3c_0_pclkrw", CLK_PLLCLN_DIV16, 9, 0, 4, 16,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 700/1146 clk: renesas: r9a09g056: Fix ordering of module clocks array
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ovidiu Panait <[email protected]>
[ Upstream commit dc71d92f0d36dcb68fcf0ef126131a2dedef9393 ]
The r9a09g056_mod_clks array is sorted by CPG_CLKON register number and bit position. Move the RSPI 0/1/2 module clock entries to their correct position to restore the array sort order.
--- drivers/clk/renesas/r9a09g056-cpg.c | 36 ++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-)
drivers/clk/renesas/r9a09g056-cpg.c +18 -18
@@ -289,6 +289,24 @@ static const struct rzv2h_mod_clk r9a09g056_mod_clks[] __initconst = { BUS_MSTOP(5, BIT(13))),DEF_MOD ("wdt_3_clk_loco" ,CLK_QEXTAL ,5 ,2 ,2 ,18 ,BUS_MSTOP (5 ,BIT (13 ))), +DEF_MOD ("rspi_0_pclk" ,CLK_PLLCLN_DIV8 ,5 ,4 ,2 ,20 , +BUS_MSTOP (11 ,BIT (0 ))), +DEF_MOD ("rspi_0_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,5 ,2 ,21 , +BUS_MSTOP (11 ,BIT (0 ))), +DEF_MOD ("rspi_0_tclk" ,CLK_PLLCLN_DIV8 ,5 ,6 ,2 ,22 , +BUS_MSTOP (11 ,BIT (0 ))), +DEF_MOD ("rspi_1_pclk" ,CLK_PLLCLN_DIV8 ,5 ,7 ,2 ,23 , +BUS_MSTOP (11 ,BIT (1 ))), +DEF_MOD ("rspi_1_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,8 ,2 ,24 , +BUS_MSTOP (11 ,BIT (1 ))), +DEF_MOD ("rspi_1_tclk" ,CLK_PLLCLN_DIV8 ,5 ,9 ,2 ,25 , +BUS_MSTOP (11 ,BIT (1 ))), +DEF_MOD ("rspi_2_pclk" ,CLK_PLLCLN_DIV8 ,5 ,10 ,2 ,26 , +BUS_MSTOP (11 ,BIT (2 ))), +DEF_MOD ("rspi_2_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,11 ,2 ,27 , +BUS_MSTOP (11 ,BIT (2 ))), +DEF_MOD ("rspi_2_tclk" ,CLK_PLLCLN_DIV8 ,5 ,12 ,2 ,28 , +BUS_MSTOP (11 ,BIT (2 ))),DEF_MOD ("rsci0_pclk" ,CLK_PLLCLN_DIV16 ,5 ,13 ,2 ,29 ,BUS_MSTOP (11 ,BIT (3 ))), DEF_MOD("rsci0_tclk", CLK_PLLCLN_DIV16, 5, 14, 2, 30,
@@ -389,24 +407,6 @@ static const struct rzv2h_mod_clk r9a09g056_mod_clks[] __initconst = { BUS_MSTOP(11, BIT(12))),DEF_MOD ("rsci9_ps_ps1_n" ,CLK_PLLCLN_DIV64 ,8 ,14 ,4 ,14 ,BUS_MSTOP (11 ,BIT (12 ))), -DEF_MOD ("rspi_0_pclk" ,CLK_PLLCLN_DIV8 ,5 ,4 ,2 ,20 , -BUS_MSTOP (11 ,BIT (0 ))), -DEF_MOD ("rspi_0_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,5 ,2 ,21 , -BUS_MSTOP (11 ,BIT (0 ))), -DEF_MOD ("rspi_0_tclk" ,CLK_PLLCLN_DIV8 ,5 ,6 ,2 ,22 , -BUS_MSTOP (11 ,BIT (0 ))), -DEF_MOD ("rspi_1_pclk" ,CLK_PLLCLN_DIV8 ,5 ,7 ,2 ,23 , -BUS_MSTOP (11 ,BIT (1 ))), -DEF_MOD ("rspi_1_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,8 ,2 ,24 , -BUS_MSTOP (11 ,BIT (1 ))), -DEF_MOD ("rspi_1_tclk" ,CLK_PLLCLN_DIV8 ,5 ,9 ,2 ,25 , -BUS_MSTOP (11 ,BIT (1 ))), -DEF_MOD ("rspi_2_pclk" ,CLK_PLLCLN_DIV8 ,5 ,10 ,2 ,26 , -BUS_MSTOP (11 ,BIT (2 ))), -DEF_MOD ("rspi_2_pclk_sfr" ,CLK_PLLCLN_DIV8 ,5 ,11 ,2 ,27 , -BUS_MSTOP (11 ,BIT (2 ))), -DEF_MOD ("rspi_2_tclk" ,CLK_PLLCLN_DIV8 ,5 ,12 ,2 ,28 , -BUS_MSTOP (11 ,BIT (2 ))),DEF_MOD ("scif_0_clk_pck" ,CLK_PLLCM33_DIV16 ,8 ,15 ,4 ,15 ,BUS_MSTOP (3 ,BIT (14 ))), DEF_MOD("i3c_0_pclkrw", CLK_PLLCLN_DIV16, 9, 0, 4, 16,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 701/1146 clk: sunxi-ng: sun55i-a523-r: Add missing r-spi module clock
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit fb20ccf70cf695f178d7c32e2d33b376560df0ff ]
When the PRCM clk driver was added, somehow the r-spi module clock was skipped over.
Add it so that r-spi can actually work.
--- drivers/clk/sunxi-ng/ccu-sun55i-a523-r.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
drivers/clk/sunxi-ng/ccu-sun55i-a523-r.c +16 -1
@@ -83,9 +83,22 @@ static SUNXI_CCU_MUX_DATA_WITH_GATE(r_pwmctrl_clk, "r-pwmctrl", static SUNXI_CCU_GATE_HW(bus_r_pwmctrl_clk, "bus-r-pwmctrl", &r_apb0_clk.common.hw, 0x13c, BIT(0), 0); -/* SPI clock is /M/N (same as new MMC?) */ +static const struct clk_parent_data r_spi_parents[] = { + { .fw_name ="hosc" }, + { .fw_name ="pll-periph" }, + { .name ="pll-periph0-300M" }, + { .name ="pll-periph1-300M" }, + { .name ="pll-audio" }, +}; +static SUNXI_CCU_DUALDIV_MUX_GATE(r_spi_clk, "r-spi", r_spi_parents, 0x150, +0 ,5 ,/* M */ +8 ,5 ,/* P */ +24 ,3 ,/* mux */ +BIT (31 ),/* gate */ + 0); static SUNXI_CCU_GATE_HW(bus_r_spi_clk, "bus-r-spi", &r_ahb_clk.common.hw, 0x15c, BIT(0), 0); + static SUNXI_CCU_GATE_HW(bus_r_spinlock_clk, "bus-r-spinlock", &r_ahb_clk.common.hw, 0x16c, BIT(0), 0); static SUNXI_CCU_GATE_HW(bus_r_msgbox_clk, "bus-r-msgbox",
@@ -138,6 +151,7 @@ static struct ccu_common *sun55i_a523_r_ccu_clks[] = { &bus_r_twd_clk.common, &r_pwmctrl_clk.common, &bus_r_pwmctrl_clk.common, + &r_spi_clk.common, &bus_r_spi_clk.common, &bus_r_spinlock_clk.common, &bus_r_msgbox_clk.common,
@@ -169,6 +183,7 @@ static struct clk_hw_onecell_data sun55i_a523_r_hw_clks = { [CLK_BUS_R_TWD] = &bus_r_twd_clk.common.hw, [CLK_R_PWMCTRL] = &r_pwmctrl_clk.common.hw, [CLK_BUS_R_PWMCTRL] = &bus_r_pwmctrl_clk.common.hw, + [CLK_R_SPI] = &r_spi_clk.common.hw, [CLK_BUS_R_SPI] = &bus_r_spi_clk.common.hw, [CLK_BUS_R_SPINLOCK] = &bus_r_spinlock_clk.common.hw, [CLK_BUS_R_MSGBOX] = &bus_r_msgbox_clk.common.hw,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 702/1146 scsi: sg: Fix sysctl sg-big-buff register during sg_init()
In reply to Greg Kroah-Hartman7.0-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 703/1146 scsi: sg: Resolve soft lockup issue when opening /dev/sgX
In reply to Greg Kroah-Hartman7.0-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
@@ -1623,10 +1623,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 704/1146 clk: qcom: dispcc-sc8280xp: remove CLK_SET_RATE_PARENT from byte_div_clk_src dividers
In reply to Greg Kroah-Hartman7.0-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
@@ -1160,7 +1160,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, }, };
@@ -1175,7 +1174,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, }, };
@@ -1190,7 +1188,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, }, };
@@ -1205,7 +1202,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 705/1146 clk: qcom: dispcc-glymur: Fix DSI byte clock rate setting
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 98ea9eda030587601db56425efcd32263d853591 ]
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-glymur.c | 2 -- 1 file changed, 2 deletions(-)
drivers/clk/qcom/dispcc-glymur.c +0 -2
@@ -747,7 +747,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, }, };
@@ -762,7 +761,6 @@ static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = { &disp_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 706/1146 clk: qcom: dispcc-kaanapali: Fix DSI byte clock rate setting
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit e892f4e3f3d558ce5d7595dca7cce2bd170a19fa ]
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-kaanapali.c | 2 -- 1 file changed, 2 deletions(-)
drivers/clk/qcom/dispcc-kaanapali.c +0 -2
@@ -800,7 +800,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, }, };
@@ -815,7 +814,6 @@ static struct clk_regmap_div disp_cc_mdss_byte1_div_clk_src = { &disp_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 707/1146 clk: qcom: dispcc-milos: Fix DSI byte clock rate setting
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit dd5b76257b4048151006620c9895e2f5f0d997eb ]
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-milos.c | 1 - 1 file changed, 1 deletion(-)
drivers/clk/qcom/dispcc-milos.c +0 -1
@@ -394,7 +394,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 708/1146 clk: qcom: dispcc-sm4450: Fix DSI byte clock rate setting
In reply to Greg Kroah-Hartman7.0-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
@@ -335,7 +335,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 709/1146 clk: qcom: dispcc[01]-sa8775p: Fix DSI byte clock rate setting
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
[ Upstream commit 2851b6c6a42e22c243aa4cd606a49e2b9acfb6d6 ]
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/dispcc0-sa8775p.c | 2 -- drivers/clk/qcom/dispcc1-sa8775p.c | 2 -- 2 files changed, 4 deletions(-)
drivers/clk/qcom/dispcc0-sa8775p.c +0 -2
@@ -591,7 +591,6 @@ static struct clk_regmap_div mdss_0_disp_cc_mdss_byte0_div_clk_src = { &mdss_0_disp_cc_mdss_byte0_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
@@ -606,7 +605,6 @@ static struct clk_regmap_div mdss_0_disp_cc_mdss_byte1_div_clk_src = { &mdss_0_disp_cc_mdss_byte1_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
drivers/clk/qcom/dispcc1-sa8775p.c +0 -2
@@ -591,7 +591,6 @@ static struct clk_regmap_div mdss_1_disp_cc_mdss_byte0_div_clk_src = { &mdss_1_disp_cc_mdss_byte0_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, .ops = &clk_regmap_div_ops, }, };
@@ -606,7 +605,6 @@ static struct clk_regmap_div mdss_1_disp_cc_mdss_byte1_div_clk_src = { &mdss_1_disp_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 710/1146 clk: renesas: r9a09g057: Remove entries for WDT{0,2,3}
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabrizio Castro <[email protected]>
[ Upstream commit 1b4f047dc4010d51821694cc4ed73b52b3040a5c ]
The HW user manual for the Renesas RZ/V2H(P) SoC specifies that only the WDT1 IP is supposed to be used by Linux, while the WDT{0,2,3} IPs are supposed to be used by the CM33 and CR8 cores.
Remove the clock and reset entries for WDT{0,2,3} to prevent interfering with the CM33 and CR8 cores.
This change is harmless as only WDT1 is used by Linux, there are no users for the WDT{0,2,3} cores.
--- drivers/clk/renesas/r9a09g057-cpg.c | 15 --------------- 1 file changed, 15 deletions(-)
drivers/clk/renesas/r9a09g057-cpg.c +0 -15
@@ -280,22 +280,10 @@ static const struct rzv2h_mod_clk r9a09g057_mod_clks[] __initconst = { BUS_MSTOP(11, BIT(15))),DEF_MOD ("gtm_7_pclk" ,CLK_PLLCLN_DIV16 ,4 ,10 ,2 ,10 ,BUS_MSTOP (12 ,BIT (0 ))), -DEF_MOD ("wdt_0_clkp" ,CLK_PLLCM33_DIV16 ,4 ,11 ,2 ,11 , -BUS_MSTOP (3 ,BIT (10 ))), -DEF_MOD ("wdt_0_clk_loco" ,CLK_QEXTAL ,4 ,12 ,2 ,12 , -BUS_MSTOP (3 ,BIT (10 ))),DEF_MOD ("wdt_1_clkp" ,CLK_PLLCLN_DIV16 ,4 ,13 ,2 ,13 ,BUS_MSTOP (1 ,BIT (0 ))),DEF_MOD ("wdt_1_clk_loco" ,CLK_QEXTAL ,4 ,14 ,2 ,14 ,BUS_MSTOP (1 ,BIT (0 ))), -DEF_MOD ("wdt_2_clkp" ,CLK_PLLCLN_DIV16 ,4 ,15 ,2 ,15 , -BUS_MSTOP (5 ,BIT (12 ))), -DEF_MOD ("wdt_2_clk_loco" ,CLK_QEXTAL ,5 ,0 ,2 ,16 , -BUS_MSTOP (5 ,BIT (12 ))), -DEF_MOD ("wdt_3_clkp" ,CLK_PLLCLN_DIV16 ,5 ,1 ,2 ,17 , -BUS_MSTOP (5 ,BIT (13 ))), -DEF_MOD ("wdt_3_clk_loco" ,CLK_QEXTAL ,5 ,2 ,2 ,18 , -BUS_MSTOP (5 ,BIT (13 ))),DEF_MOD ("rtc_0_clk_rtc" ,CLK_PLLCM33_DIV16 ,5 ,3 ,2 ,19 ,BUS_MSTOP (3 ,BIT (11 ) |BIT (12 ))), DEF_MOD("rspi_0_pclk", CLK_PLLCLN_DIV8, 5, 4, 2, 20,
@@ -598,10 +586,7 @@ static const struct rzv2h_reset r9a09g057_resets[] __initconst = {DEF_RST (7 ,2 ,3 ,3 ),/* GTM_5_PRESETZ */ DEF_RST (7 ,3 ,3 ,4 ),/* GTM_6_PRESETZ */ DEF_RST (7 ,4 ,3 ,5 ),/* GTM_7_PRESETZ */ -DEF_RST (7 ,5 ,3 ,6 ),/* WDT_0_RESET */ DEF_RST (7 ,6 ,3 ,7 ),/* WDT_1_RESET */ -DEF_RST (7 ,7 ,3 ,8 ),/* WDT_2_RESET */ -DEF_RST (7 ,8 ,3 ,9 ),/* WDT_3_RESET */ DEF_RST (8 ,1 ,3 ,18 ),/* RSCI0_PRESETN */ DEF_RST (8 ,2 ,3 ,19 ),/* RSCI0_TRESETN */ DEF_RST(8, 3, 3, 20), /* RSCI1_PRESETN */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 711/1146 scsi: qla2xxx: Add support to report MPI FW state
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nilesh Javali <[email protected]>
[ Upstream commit 0e124af675ebabddacfeb0958abd443265dddf13 ]
MPI firmware state was returned as 0. Get MPI FW state to proceed with flash image validation.
A new sysfs node 'mpi_fw_state' is added to report MPI firmware state:
/sys/class/scsi_host/hostXX/mpi_fw_state
--- drivers/scsi/qla2xxx/qla_attr.c | 62 ++++++++++++++++++++++++++++++++- drivers/scsi/qla2xxx/qla_init.c | 2 +- drivers/scsi/qla2xxx/qla_mbx.c | 9 +++++ 3 files changed, 71 insertions(+), 2 deletions(-)
drivers/scsi/qla2xxx/qla_attr.c +61 -1
@@ -1638,7 +1638,7 @@ qla2x00_fw_state_show(struct device *dev, struct device_attribute *attr, {scsi_qla_host_t *vha =shost_priv (class_to_shost (dev));int rval =QLA_FUNCTION_FAILED ; -uint16_t state[6 ]; +uint16_t state[16 ];uint32_t pstate;if (IS_QLAFX00 (vha->hw)) {
@@ -2402,6 +2402,63 @@ qla2x00_dport_diagnostics_show(struct device *dev, vha->dport_data[0 ], vha->dport_data[1 ], vha->dport_data[2], vha->dport_data[3]); } + +static ssize_t +qla2x00_mpi_fw_state_show (struct device *dev,struct device_attribute *attr, +char *buf) +{ +scsi_qla_host_t *vha =shost_priv (class_to_shost (dev)); +int rval =QLA_FUNCTION_FAILED ; +u16 state[16 ]; +u16 mpi_state; +struct qla_hw_data *ha = vha->hw; + +if (!(IS_QLA27XX (ha) ||IS_QLA28XX (ha))) +return scnprintf (buf,PAGE_SIZE , +"MPI state reporting is not supported for this HBA.\n" ); + +memset (state,0 ,sizeof (state)); + +mutex_lock (&vha->hw->optrom_mutex); +if (qla2x00_chip_is_down (vha)) { +mutex_unlock (&vha->hw->optrom_mutex); +ql_dbg (ql_dbg_user, vha,0x70df , +"ISP reset is in progress, failing mpi_fw_state.\n" ); +return -EBUSY ; + }else if (vha->hw->flags.eeh_busy) { +mutex_unlock (&vha->hw->optrom_mutex); +ql_dbg (ql_dbg_user, vha,0x70ea , +"HBA in PCI error state, failing mpi_fw_state.\n" ); +return -EBUSY ; + } + + rval =qla2x00_get_firmware_state (vha, state); +mutex_unlock (&vha->hw->optrom_mutex); +if (rval !=QLA_SUCCESS ) { +ql_dbg (ql_dbg_user, vha,0x70eb , +"MB Command to retrieve MPI state failed (%d), failing mpi_fw_state.\n" , + rval); +return -EIO ; + } + + mpi_state = state[11 ]; + +if (!(mpi_state &BIT_15 )) +return scnprintf (buf,PAGE_SIZE , +"MPI firmware state reporting is not supported by this firmware. (0x%02x)\n" , + mpi_state); + +if (!(mpi_state &BIT_8 )) +return scnprintf (buf,PAGE_SIZE , +"MPI firmware is disabled. (0x%02x)\n" , + mpi_state); + +return scnprintf (buf,PAGE_SIZE , +"MPI firmware is enabled, state is %s. (0x%02x)\n" , + mpi_state &BIT_9 ?"active" :"inactive" , + mpi_state); +} + static DEVICE_ATTR(dport_diagnostics, 0444, qla2x00_dport_diagnostics_show, NULL);
@@ -2469,6 +2526,8 @@ static DEVICE_ATTR(port_speed, 0644, qla2x00_port_speed_show, qla2x00_port_speed_store); static DEVICE_ATTR(port_no, 0444, qla2x00_port_no_show, NULL); static DEVICE_ATTR(fw_attr, 0444, qla2x00_fw_attr_show, NULL); +static DEVICE_ATTR(mpi_fw_state, 0444, qla2x00_mpi_fw_state_show, NULL); +static struct attribute *qla2x00_host_attrs[] = { &dev_attr_driver_version.attr.attr,
@@ -2517,6 +2576,7 @@ static struct attribute *qla2x00_host_attrs[] = { &dev_attr_qlini_mode.attr, &dev_attr_ql2xiniexchg.attr, &dev_attr_ql2xexchoffld.attr, + &dev_attr_mpi_fw_state.attr, NULL, };
drivers/scsi/qla2xxx/qla_init.c +1 -1
@@ -4914,7 +4914,7 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)unsigned long wtime, mtime, cs84xx_time;uint16_t min_wait;/* Minimum wait time if loop is down */ uint16_t wait_time;/* Wait time if loop is coming ready */ -uint16_t state[6 ]; +uint16_t state[16 ];struct qla_hw_data *ha = vha->hw;if (IS_QLAFX00 (vha->hw))
drivers/scsi/qla2xxx/qla_mbx.c +9 -0
@@ -2268,6 +2268,13 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states) mcp->in_mb =MBX_6 |MBX_5 |MBX_4 |MBX_3 |MBX_2 |MBX_1 |MBX_0 ; else mcp->in_mb = MBX_1|MBX_0; + +if (IS_QLA27XX (ha) ||IS_QLA28XX (ha)) { + mcp->mb[12 ] =0 ; + mcp->out_mb |=MBX_12 ; + mcp->in_mb |=MBX_12 ; + } + mcp->tov =MBX_TOV_SECONDS ; mcp->flags =0 ; rval =qla2x00_mailbox_command (vha, mcp);
@@ -2280,6 +2287,8 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states) states[3 ] = mcp->mb[4 ]; states[4 ] = mcp->mb[5 ]; states[5 ] = mcp->mb[6 ];/* DPORT status */ +if (IS_QLA27XX (ha) ||IS_QLA28XX (ha)) + states[11 ] = mcp->mb[12 ];/* MPI state. */ }if (rval !=QLA_SUCCESS ) {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 712/1146 scsi: target: core: Fix integer overflow in UNMAP bounds check
In reply to Greg Kroah-Hartman7.0-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
@@ -1187,7 +1187,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 713/1146 scsi: ufs: rockchip,rk3576-ufshc: dt-bindings: Add new mphy reset item
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shawn Lin <[email protected]>
[ Upstream commit bdce3a69c578090dd5e3c77bcdaaca10c3a41e34 ]
Add the mphy reset property to the devicetree bindings for the Rockchip RK3576 UFS host controller. The mphy reset signal is used to reset the physical adapter. Resetting other components while leaving the mphy unreset may occasionally prevent the UFS controller from successfully linking up with the device.
This addresses an intermittent hardware bug where the UFS link fails to establish under specific timing conditions with certain chips. While difficult to reproduce initially, this issue was consistently observed in downstream testing and requires explicit mphy reset control for full stability.
Although this change increases the maxItems for resets and adds a new entry (which technically alters the binding ABI), it does not break compatibility for existing Linux systems. The driver uses devm_reset_control_array_get_exclusive() to manage resets, allowing it to function correctly with both older Device Trees (without the mphy entry) and newer ones.
--- .../devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
Documentation/devicetree/bindings/ufs/rockchip,rk3576-ufshc.yaml +4 -3
@@ -41,7 +41,7 @@ properties: maxItems: 1 resets: - maxItems: 4 + maxItems: 5 reset-names: items:
@@ -49,6 +49,7 @@ properties: - const: sys - const: ufs - const: grf + - const: mphy reset-gpios: maxItems: 1
@@ -98,8 +99,8 @@ examples: interrupts = <GIC_SPI 361 IRQ_TYPE_LEVEL_HIGH>; power-domains = <&power RK3576_PD_USB>; resets = <&cru SRST_A_UFS_BIU>, <&cru SRST_A_UFS_SYS>, <&cru SRST_A_UFS>, - <&cru SRST_P_UFS_GRF>; - reset-names = "biu", "sys", "ufs", "grf"; + <&cru SRST_P_UFS_GRF>, <&cru SRST_MPHY_INIT>; + reset-names = "biu", "sys", "ufs", "grf", "mphy"; reset-gpios = <&gpio4 RK_PD0 GPIO_ACTIVE_LOW>; }; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 714/1146 dt-bindings: clock: qcom,gcc-sc8180x: Add missing GDSCs
In reply to Greg Kroah-Hartman7.0-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
@@ -322,5 +322,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 715/1146 clk: qcom: gcc-sc8180x: Add missing GDSCs
In reply to Greg Kroah-Hartman7.0-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 716/1146 clk: qcom: gcc-sc8180x: Use retention for USB power domains
In reply to Greg Kroah-Hartman7.0-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 717/1146 clk: qcom: gcc-sc8180x: Use retention for PCIe power domains
In reply to Greg Kroah-Hartman7.0-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 718/1146 clk: qcom: dispcc-sm8250: Use shared ops on the mdss vsync clk
In reply to Greg Kroah-Hartman7.0-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 719/1146 clk: qcom: dispcc-sm8250: Enable parents for pixel clocks
In reply to Greg Kroah-Hartman7.0-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 720/1146 clk: imx: imx6q: Fix device node reference leak in pll6_bypassed()
In reply to Greg Kroah-Hartman7.0-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 721/1146 clk: imx: imx6q: Fix device node reference leak in of_assigned_ldb_sels()
In reply to Greg Kroah-Hartman7.0-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 722/1146 clk: imx8mq: Correct the CSI PHY sels
In reply to Greg Kroah-Hartman7.0-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 723/1146 um: Fix potential race condition in TLB sync
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tiwei Bie <[email protected]>
[ Upstream commit 102331b66bcaf1f41f50b9c4cd5c36e46bafa9f3 ]
During the TLB sync, we need to traverse and modify the page table, so we should hold the page table lock. Since full SMP support for threads within the same process is still missing, let's disable the split page table lock for simplicity.
--- arch/um/kernel/tlb.c | 1 + mm/Kconfig | 1 + 2 files changed, 2 insertions(+)
arch/um/kernel/tlb.c +1 -0
@@ -165,6 +165,7 @@ int um_tlb_sync(struct mm_struct *mm)unsigned long addr, next;int ret =0 ; +guard (spinlock_irqsave)(&mm->page_table_lock);guard (spinlock_irqsave)(&mm->context.sync_tlb_lock);if (mm->context.sync_tlb_range_to ==0 )
mm/Kconfig +1 -0
@@ -572,6 +572,7 @@ config SPLIT_PTE_PTLOCKS depends on !ARM || CPU_CACHE_VIPT depends on !PARISC || PA20 depends on !SPARC32 + depends on !UML config ARCH_ENABLE_SPLIT_PMD_PTLOCK bool
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 724/1146 x86/um: fix vDSO installation
In reply to Greg Kroah-Hartman7.0-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 725/1146 clk: qoriq: avoid format string warning
In reply to Greg Kroah-Hartman7.0-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
@@ -907,13 +907,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;
@@ -921,8 +919,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 726/1146 clk: xgene: Fix mapping leak in xgene_pllclk_init()
In reply to Greg Kroah-Hartman7.0-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
@@ -188,6 +188,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 727/1146 clk: spacemit: ccu_mix: fix inverted condition in ccu_mix_trigger_fc()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shuwei Wu <[email protected]>
[ Upstream commit 54e97360b44bed6b4399dd3be3d65f392df940fa ]
Fix inverted condition that skips frequency change trigger, causing kernel panics during cpufreq scaling.
--- drivers/clk/spacemit/ccu_mix.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/spacemit/ccu_mix.c +1 -1
@@ -73,7 +73,7 @@ static int ccu_mix_trigger_fc(struct clk_hw *hw)struct ccu_common *common =hw_to_ccu_common (hw);unsigned int val; -if (common->reg_fc) +if (!common->reg_fc)return 0 ;ccu_update (common, fc, common->mask_fc, common->mask_fc);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 728/1146 f2fs: avoid reading already updated pages during GC
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jianan Huang <[email protected]>
[ Upstream commit 570e2ccc7cb35fe720106964e65060602d3d2ac4 ]
We found the following issue during fuzz testing:
page: refcount:3 mapcount:0 mapping:00000000b6e89c65 index:0x18b2dc pfn:0x161ba9 memcg:f8ffff800e269c00 aops:f2fs_meta_aops ino:2 flags: 0x52880000000080a9(locked|waiters|uptodate|lru|private|zone=1|kasantag=0x4a) raw: 52880000000080a9 fffffffec6e17588 fffffffec0ccc088 a7ffff8067063618 raw: 000000000018b2dc 0000000000000009 00000003ffffffff f8ffff800e269c00 page dumped because: VM_BUG_ON_FOLIO(folio_test_uptodate(folio)) page_owner tracks the page as allocated post_alloc_hook+0x58c/0x5ec prep_new_page+0x34/0x284 get_page_from_freelist+0x2dcc/0x2e8c __alloc_pages_noprof+0x280/0x76c __folio_alloc_noprof+0x18/0xac __filemap_get_folio+0x6bc/0xdc4 pagecache_get_page+0x3c/0x104 do_garbage_collect+0x5c78/0x77a4 f2fs_gc+0xd74/0x25f0 gc_thread_func+0xb28/0x2930 kthread+0x464/0x5d8 ret_from_fork+0x10/0x20 ------------[ cut here ]------------ kernel BUG at mm/filemap.c:1563! folio_end_read+0x140/0x168 f2fs_finish_read_bio+0x5c4/0xb80 f2fs_read_end_io+0x64c/0x708 bio_endio+0x85c/0x8c0 blk_update_request+0x690/0x127c scsi_end_request+0x9c/0xb8c scsi_io_completion+0xf0/0x250 scsi_finish_command+0x430/0x45c scsi_complete+0x178/0x6d4 blk_mq_complete_request+0xcc/0x104 scsi_done_internal+0x214/0x454 scsi_done+0x24/0x34
which is similar to the problem reported by syzbot:
https://syzkaller.appspot.com/bug?extid=3686758660f980b402dc
This case is consistent with the description in commit 9bf1a3f ("f2fs: avoid GC causing encrypted file corrupted"):
Page 1 is moved from blkaddr A to blkaddr B by move_data_block, and after being written it is marked as uptodate. Then, Page 1 is moved from blkaddr B to blkaddr C, VM_BUG_ON_FOLIO was triggered in the endio initiated by ra_data_block.
There is no need to read Page 1 again from blkaddr B, since it has already been updated. Therefore, avoid initiating I/O in this case.
--- fs/f2fs/gc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
fs/f2fs/gc.c +4 -1
@@ -1230,7 +1230,7 @@ static int ra_data_block(struct inode *inode, pgoff_t index) .encrypted_page = NULL, .in_list = 0, }; -int err; +int err =0 ; folio =f2fs_grab_cache_folio (mapping, index, true);if (IS_ERR (folio))
@@ -1283,6 +1283,9 @@ static int ra_data_block(struct inode *inode, pgoff_t index) fio.encrypted_page = &efolio->page; +if (folio_test_uptodate (efolio)) + goto put_encrypted_page; + err =f2fs_submit_page_bio (&fio);if (err) goto put_encrypted_page;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 729/1146 printk_ringbuffer: Fix get_data() size sanity check
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Ogness <[email protected]>
[ Upstream commit 8e81ecbf1cb46b8d2d13e772d5924b09bd60169a ]
Commit cc3bad11de6e ("printk_ringbuffer: Fix check of valid data size when blk_lpos overflows") added sanity checking to get_data() to avoid returning data of illegal sizes (too large or too small). It uses the helper function data_check_size() for the check. However, data_check_size() expects the size of the data, not the size of the data block. get_data() is providing the size of the data block. This means that if the data size (text_buf_size) is at or near the maximum legal size:
sizeof(prb_data_block) + text_buf_size == DATA_SIZE(data_ring) / 2
data_check_size() will report failure because it adds sizeof(prb_data_block) to the provided size. The sanity check in get_data() is counting the data block header twice. The result is that the reader fails to read the legal record.
Since get_data() subtracts the data block header size before returning, move the sanity check to after the subtraction.
Luckily printk() is not vulnerable to this problem because truncate_msg() limits printk-messages to 1/4 of the ringbuffer. Indeed, by adjusting the printk_ringbuffer KUnit test, which does not use printk() and its truncate_msg() check, it is easy to see that the reader fails and the WARN_ON is triggered.
--- kernel/printk/printk_ringbuffer.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
kernel/printk/printk_ringbuffer.c +4 -4
@@ -1302,10 +1302,6 @@ static const char *get_data(struct prb_data_ring *data_ring,return NULL ; } -/* Sanity check. Data-less blocks were handled earlier. */ -if (WARN_ON_ONCE (!data_check_size (data_ring, *data_size) || !*data_size)) -return NULL ; -/* A valid data block will always be aligned to the ID size. */ if (WARN_ON_ONCE (blk_lpos->begin !=ALIGN (blk_lpos->begin,sizeof (db->id))) ||WARN_ON_ONCE (blk_lpos->next !=ALIGN (blk_lpos->next,sizeof (db->id)))) {
@@ -1319,6 +1315,10 @@ static const char *get_data(struct prb_data_ring *data_ring,/* Subtract block ID space from size to reflect data size. */ *data_size -=sizeof (db->id); +/* Sanity check the max size of the regular data block. */ +if (WARN_ON_ONCE (!data_check_size (data_ring, *data_size))) +return NULL ; +return &db->data[0 ]; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 730/1146 clk: qcom: gdsc: Fix error path on registration of multiple pm subdomains
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Zapolskiy <[email protected]>
[ Upstream commit 16ba98dace9e7cfe25ad8a314e34befacd91f86f ]
Some pm subdomains may be left in added to a parent domain state, if gdsc_add_subdomain_list() function fails in the middle and bails from a GDSC power domain controller registration out.
--- drivers/clk/qcom/gdsc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/clk/qcom/gdsc.c +11 -1
@@ -518,10 +518,20 @@ static int gdsc_add_subdomain_list(struct dev_pm_domain_list *pd_list, ret =pm_genpd_add_subdomain (genpd, subdomain);if (ret) -return ret; + goto remove_added_subdomains; }return 0 ; + +remove_added_subdomains: +for (i--; i >=0 ; i--) { +struct device *dev = pd_list->pd_devs[i]; +struct generic_pm_domain *genpd =pd_to_genpd (dev->pm_domain); + +pm_genpd_remove_subdomain (genpd, subdomain); + } + +return ret; } static void gdsc_remove_subdomain_list(struct dev_pm_domain_list *pd_list,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 731/1146 lib/hexdump: print_hex_dump_bytes() calls print_hex_dump_debug()
In reply to Greg Kroah-Hartman7.0-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
@@ -815,7 +815,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
@@ -823,7 +824,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 732/1146 f2fs: fix data loss caused by incorrect use of nat_entry flag
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongpeng Yang <[email protected]>
[ Upstream commit 238e14eb7226f883b72caccd2d37bf5707df066b ]
Data loss can occur when fsync is performed on a newly created file (before any checkpoint has been written) concurrently with a checkpoint operation. The scenario is as follows:
create & write & fsync 'file A' write checkpoint
- f2fs_do_sync_file // inline inode
- f2fs_write_inode // inode folio is dirty
- f2fs_write_checkpoint
- f2fs_flush_merged_writes
- f2fs_sync_node_pages
- f2fs_flush_nat_entries
- f2fs_fsync_node_pages // no dirty node
- f2fs_need_inode_block_update // return false
SPO and lost 'file A'
f2fs_flush_nat_entries() sets the IS_CHECKPOINTED and HAS_LAST_FSYNC flags for the nat_entry, but this does not mean that the checkpoint has actually completed successfully. However, f2fs_need_inode_block_update() checks these flags and incorrectly assumes that the checkpoint has finished.
The root cause is that the semantics of IS_CHECKPOINTED and HAS_LAST_FSYNC are only guaranteed after the checkpoint write fully completes.
This patch modifies f2fs_need_inode_block_update() to acquire the sbi->node_write lock before reading the nat_entry flags, ensuring that once IS_CHECKPOINTED and HAS_LAST_FSYNC are observed to be set, the checkpoint operation has already completed.
--- fs/f2fs/node.c | 3 +++ 1 file changed, 3 insertions(+)
fs/f2fs/node.c +3 -0
@@ -427,7 +427,9 @@ bool f2fs_need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)struct f2fs_nm_info *nm_i =NM_I (sbi);struct nat_entry *e;bool need_update = true; +struct f2fs_lock_context lc; +f2fs_down_read_trace (&sbi->node_write, &lc);f2fs_down_read (&nm_i->nat_tree_lock); e =__lookup_nat_cache (nm_i, ino, false); if (e && get_nat_flag(e, HAS_LAST_FSYNC) &&
@@ -435,6 +437,7 @@ bool f2fs_need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino) get_nat_flag(e, HAS_FSYNCED_INODE))) need_update = false;f2fs_up_read (&nm_i->nat_tree_lock); +f2fs_up_read_trace (&sbi->node_write, &lc);return need_update; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 733/1146 f2fs: fix to preserve previous reserve_{blocks,node} value when remount
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiguo Niu <[email protected]>
[ Upstream commit 01968164d94762db2f703647c5acfa28613844f1 ]
The following steps will change previous value of reserve_{blocks,node}, this dones not match the original intention.
1.mount -t f2fs -o reserve_root=8192 imgfile test_mount/
F2FS-fs (loop56): Mounted with checkpoint version = 1b69f8c7
mount info:/dev/block/loop56 on /data/test_mount type f2fs (xxx,reserve_root=8192,reserve_node=0,resuid=0,resgid=0,xxx)
2.mount -t f2fs -o remount,reserve_root=4096 /data/test_mount
F2FS-fs (loop56): Preserve previous reserve_root=8192
check mount info: reserve_root change to 4096/dev/block/loop56 on /data/test_mount type f2fs (xxx,reserve_root=4096,reserve_node=0,resuid=0,resgid=0,xxx)
Prior to commit d18535132523 ("f2fs: separate the options parsing and options checking"), the value of reserve_{blocks,node} was only set during the first mount, along with the corresponding mount option F2FS_MOUNT_RESERVE_{ROOT,NODE} . If the mount option F2FS_MOUNT_RESERVE_{ROOT,NODE} was found to have been set during the mount/remount, the previously value of reserve_{blocks,node} would also be preserved, as shown in the code below.
if (test_opt(sbi, RESERVE_ROOT)) {
f2fs_info(sbi, "Preserve previous reserve_root=%u",
F2FS_OPTION(sbi).root_reserved_blocks);
} else {
F2FS_OPTION(sbi).root_reserved_blocks = arg;
set_opt(sbi, RESERVE_ROOT);
}But commit d18535132523 ("f2fs: separate the options parsing and options checking") only preserved the previous mount option; it did not preserve the previous value of reserve_{blocks,node}. Since value of reserve_{blocks,node} value is assigned or not depends on ctx->spec_mask, ctx->spec_mask should be alos handled in f2fs_check_opt_consistency.
This patch will clear the corresponding ctx->spec_mask bits in f2fs_check_opt_consistency to preserve the previously values of reserve_{blocks,node} if it already have a value.
--- fs/f2fs/super.c | 2 ++ 1 file changed, 2 insertions(+)
fs/f2fs/super.c +2 -0
@@ -1515,6 +1515,7 @@ static int f2fs_check_opt_consistency(struct fs_context *fc, F2FS_OPTION(sbi).root_reserved_blocks);ctx_clear_opt (ctx,F2FS_MOUNT_RESERVE_ROOT ); ctx->opt_mask &= ~BIT (F2FS_MOUNT_RESERVE_ROOT ); + ctx->spec_mask &= ~F2FS_SPEC_reserve_root; } if (test_opt(sbi, RESERVE_NODE) && (ctx->opt_mask & BIT(F2FS_MOUNT_RESERVE_NODE)) &&
@@ -1523,6 +1524,7 @@ static int f2fs_check_opt_consistency(struct fs_context *fc, F2FS_OPTION(sbi).root_reserved_nodes);ctx_clear_opt (ctx,F2FS_MOUNT_RESERVE_NODE ); ctx->opt_mask &= ~BIT (F2FS_MOUNT_RESERVE_NODE ); + ctx->spec_mask &= ~F2FS_SPEC_reserve_node; } err =f2fs_check_test_dummy_encryption (fc, sb);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 734/1146 scsi: hpsa: Enlarge controller and IRQ name buffers
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pengpeng Hou <[email protected]>
[ Upstream commit 8e8cb6f39930e836144f51cdb6d409c9e4cb71fe ]
hpsa formats the controller name into h->devname[8] and derives interrupt names from it in h->intrname[][16]. Once host_no reaches four digits, "hpsa%d" no longer fits in devname, and the derived IRQ names can then overrun the interrupt-name buffers as well.
The previous fix switched these builders to bounded formatting, but that would truncate user-visible controller and IRQ names. Keep the existing names intact instead by enlarging the fixed buffers to cover the current formatted strings.
--- drivers/scsi/hpsa.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/hpsa.h +2 -2
@@ -164,7 +164,7 @@ struct bmic_controller_parameters {struct ctlr_info {unsigned int *reply_map;int ctlr; -char devname[8 ]; +char devname[16 ];char *product_name;struct pci_dev *pdev;u32 board_id;
@@ -255,7 +255,7 @@ struct ctlr_info {int remove_in_progress;/* Address of h->q[x] is passed to intr handler to know which queue */ u8 q[MAX_REPLY_QUEUES ]; -char intrname[MAX_REPLY_QUEUES ][16 ];/* "hpsa0-msix00" names */ +char intrname[MAX_REPLY_QUEUES ][32 ];/* controller and IRQ names */ u32 TMFSupportFlags;/* cache what task mgmt funcs are supported. */ #define HPSATMF_BITS_SUPPORTED (1 << 0)#define HPSATMF_PHYS_LUN_RESET (1 << 1)
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 735/1146 drm/amd/display: Fix parameter mismatch in panel self-refresh helper
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit f2483b3f39c8e20d2de0cc16e512a1b2aa14baf9 ]
Align parameter names with function arguments.
The function controls panel self-refresh enable/disable based on vblank and VRR state.
Fixes the below with gcc W=1:../display/amdgpu_dm/amdgpu_dm_crtc.c:131 function parameter 'dm' not described in 'amdgpu_dm_crtc_set_panel_sr_feature' ../display/amdgpu_dm/amdgpu_dm_crtc.c:131 function parameter 'acrtc' not described in 'amdgpu_dm_crtc_set_panel_sr_feature' ../display/amdgpu_dm/amdgpu_dm_crtc.c:131 function parameter 'stream' not described in 'amdgpu_dm_crtc_set_panel_sr_feature' ../display/amdgpu_dm/amdgpu_dm_crtc.c:131 function parameter 'dm' not described in 'amdgpu_dm_crtc_set_panel_sr_feature' ../display/amdgpu_dm/amdgpu_dm_crtc.c:131 function parameter 'acrtc' not described in 'amdgpu_dm_crtc_set_panel_sr_feature' ../display/amdgpu_dm/amdgpu_dm_crtc.c:131 function parameter 'stream' not described in 'amdgpu_dm_crtc_set_panel_sr_feature'
--- .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +10 -11
@@ -101,23 +101,22 @@ bool amdgpu_dm_crtc_vrr_active(const struct dm_crtc_state *dm_state)/** * amdgpu_dm_crtc_set_panel_sr_feature() - Manage panel self-refresh features. -* -* @vblank_work: is a pointer to a struct vblank_control_work object. -* @vblank_enabled: indicates whether the DRM vblank counter is currently -* enabled (true) or disabled (false). -* @allow_sr_entry: represents whether entry into the self-refresh mode is -* allowed (true) or not allowed (false). +* @dm: amdgpu display manager instance. +* @acrtc: CRTC whose panel self-refresh state is being updated. +* @stream: DC stream associated with @acrtc. +* @vblank_enabled: Whether the DRM vblank counter is currently enabled. +* @allow_sr_entry: Whether entry into self-refresh mode is allowed. * * The DRM vblank counter enable/disable action is used as the trigger to enable * or disable various panel self-refresh features: * * Panel Replay and PSR SU * - Enable when: -* - VRR is disabled -* - vblank counter is disabled -* - entry is allowed: usermode demonstrates an adequate number of fast -* commits) -* - CRC capture window isn't active +* - VRR is disabled +* - vblank counter is disabled +* - entry is allowed: usermode demonstrates an adequate number of fast +* commits +* - CRC capture window isn't active * - Keep enabled even when vblank counter gets enabled * * PSR1
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 736/1146 clk: qcom: gcc-x1e80100: Keep GCC USB QTB clock always ON
In reply to Greg Kroah-Hartman7.0-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
@@ -7480,6 +7480,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 737/1146 clk: visconti: pll: initialize clk_init_data to zero
In reply to Greg Kroah-Hartman7.0-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
@@ -249,7 +249,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 738/1146 f2fs: allow empty mount string for Opt_usr|grp|projjquota
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit 2a3db1e02ce08c14af04da70bb99e8a0a31eb9e8 ]
The fsparam_string_empty() gives an error when mounting without string, since its type is set to fsparam_flag in VFS. So, let's allow the flag as well.
This addresses xfstests/f2fs/015 and f2fs/021.
--- fs/f2fs/super.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-)
fs/f2fs/super.c +15 -12
@@ -336,9 +336,12 @@ static const struct fs_parameter_spec f2fs_param_specs[] = {fsparam_flag ("usrquota" , Opt_usrquota),fsparam_flag ("grpquota" , Opt_grpquota),fsparam_flag ("prjquota" , Opt_prjquota), -fsparam_string_empty ("usrjquota" , Opt_usrjquota), -fsparam_string_empty ("grpjquota" , Opt_grpjquota), -fsparam_string_empty ("prjjquota" , Opt_prjjquota), +fsparam_string ("usrjquota" , Opt_usrjquota), +fsparam_flag ("usrjquota" , Opt_usrjquota), +fsparam_string ("grpjquota" , Opt_grpjquota), +fsparam_flag ("grpjquota" , Opt_grpjquota), +fsparam_string ("prjjquota" , Opt_prjjquota), +fsparam_flag ("prjjquota" , Opt_prjjquota),fsparam_flag ("nat_bits" , Opt_nat_bits),fsparam_enum ("jqfmt" , Opt_jqfmt, f2fs_param_jqfmt), fsparam_enum("alloc_mode", Opt_alloc, f2fs_param_alloc_mode),
@@ -979,26 +982,26 @@ static int f2fs_parse_param(struct fs_context *fc, struct fs_parameter *param)ctx_set_opt (ctx,F2FS_MOUNT_PRJQUOTA );break ;case Opt_usrjquota: -if (!*param->string) - ret =f2fs_unnote_qf_name (fc,USRQUOTA ); -else +if (param->type == fs_value_is_string && *param->string) ret =f2fs_note_qf_name (fc,USRQUOTA , param); +else + ret =f2fs_unnote_qf_name (fc,USRQUOTA );if (ret)return ret;break ;case Opt_grpjquota: -if (!*param->string) - ret =f2fs_unnote_qf_name (fc,GRPQUOTA ); -else +if (param->type == fs_value_is_string && *param->string) ret =f2fs_note_qf_name (fc,GRPQUOTA , param); +else + ret =f2fs_unnote_qf_name (fc,GRPQUOTA );if (ret)return ret;break ;case Opt_prjjquota: -if (!*param->string) - ret =f2fs_unnote_qf_name (fc,PRJQUOTA ); -else +if (param->type == fs_value_is_string && *param->string) ret =f2fs_note_qf_name (fc,PRJQUOTA , param); +else + ret =f2fs_unnote_qf_name (fc,PRJQUOTA );if (ret)return ret;break ;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 739/1146 f2fs: protect extension_list reading with sb_lock in f2fs_sbi_show()
In reply to Greg Kroah-Hartman7.0-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
@@ -379,10 +379,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]);
@@ -390,6 +392,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 740/1146 drm/i915/wm: Verify the correct plane DDB entry
In reply to Greg Kroah-Hartman7.0-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
@@ -3980,8 +3980,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(display->drm,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 741/1146 virt: arm-cca-guest: fix error check for RSI_INCOMPLETE
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sami Mujawar <[email protected]>
[ Upstream commit e534e9d13d0b7bdbb2cccdace7b96b769a10540e ]
The RSI interface can return RSI_INCOMPLETE when a report spans multiple granules. This is an expected condition and should not be treated as a fatal error.
Currently, arm_cca_report_new() checks for info.result != RSI_SUCCESS and bails out, which incorrectly flags RSI_INCOMPLETE as a failure. Fix the check to only break out on results other than RSI_SUCCESS or RSI_INCOMPLETE.
This ensures partial reports are handled correctly and avoids spurious -ENXIO errors when generating attestation reports.
--- drivers/virt/coco/arm-cca-guest/arm-cca-guest.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/virt/coco/arm-cca-guest/arm-cca-guest.c +2 -1
@@ -157,7 +157,8 @@ static int arm_cca_report_new(struct tsm_report *report, void *data) }while (info.result ==RSI_INCOMPLETE && info.offset <RSI_GRANULE_SIZE ); -if (info.result !=RSI_SUCCESS ) { +/* Break out in case of failure */ +if (info.result !=RSI_SUCCESS && info.result !=RSI_INCOMPLETE ) { ret = -ENXIO ; token_size =0 ; goto exit_free_granule_page;
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 742/1146 crypto: eip93 - fix hmac setkey algo selection
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aleksander Jan Bajkowski <[email protected]>
[ Upstream commit 3ba3b02f897b14e34977e1886d95ffe64d907204 ]
eip93_hmac_setkey() allocates a temporary ahash transform for computing HMAC ipad/opad key material. The allocation uses the driver-specific cra_driver_name (e.g. "sha256-eip93") but passes CRYPTO_ALG_ASYNC as the mask, which excludes async algorithms.
Since the EIP93 hash algorithms are the only ones registered under those driver names and they are inherently async, the lookup is self-contradictory and always fails with -ENOENT.
When called from the AEAD setkey path, this failure leaves the SA record partially initialized with zeroed digest fields. A subsequent crypto operation then dereferences a NULL pointer in the request context, resulting in a kernel panic:
``` pc : eip93_aead_handle_result+0xc8c/0x1240 [crypto_hw_eip93] lr : eip93_aead_handle_result+0xbec/0x1240 [crypto_hw_eip93] sp : ffffffc082feb820 x29: ffffffc082feb820 x28: ffffff8011043980 x27: 0000000000000000 x26: 0000000000000000 x25: ffffffc078da0bc8 x24: 0000000091043980 x23: ffffff8004d59e50 x22: ffffff8004d59410 x21: ffffff8004d593c0 x20: ffffff8004d593c0 x19: ffffff8004d4f300 x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000007fda7aa498 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: 0000000000000000 x10: fffffffff8127a80 x9 : 0000000000000000 x8 : ffffff8004d4f380 x7 : 0000000000000000 x6 : 000000000000003f x5 : 0000000000000040 x4 : 0000000000000008 x3 : 0000000000000009 x2 : 0000000000000008 x1 : 0000000028000003 x0 : ffffff8004d388c0 Code: 910142b6 f94012e0 f9002aa0 f90006d3 (f9400740) ```
The reported symbol eip93_aead_handle_result+0xc8c is a resolution artifact from static functions being merged under the nearest exported symbol. Decoding the faulting sequence:
``` 910142b6 ADD X22, X21, #0x50 f94012e0 LDR X0, [X23, #0x20] f9002aa0 STR X0, [X21, #0x50] f90006d3 STR X19, [X22, #0x8] f9400740 LDR X0, [X26, #0x8] ```
The faulting LDR at [X26, #0x8] is loading ctx->flags (offset 8 in eip93_hash_ctx), where ctx has been resolved to NULL from a partially initialized or unreachable transform context following the failed setkey.
Fix this by dropping the CRYPTO_ALG_ASYNC mask from the crypto_alloc_ahash() call. The code already handles async completion correctly via crypto_wait_req(), so there is no requirement to restrict the lookup to synchronous algorithms.
Note that hashing a single 64-byte block through the hardware is likely slower than doing it in software due to the DMA round-trip overhead, but offloading it may still spare CPU cycles on the slower embedded cores where this IP is found.
--- drivers/crypto/inside-secure/eip93/eip93-common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/inside-secure/eip93/eip93-common.c +1 -1
@@ -731,7 +731,7 @@ int eip93_hmac_setkey(u32 ctx_flags, const u8 *key, unsigned int keylen,return -EINVAL ; } - ahash_tfm =crypto_alloc_ahash (alg_name,0 ,CRYPTO_ALG_ASYNC ); + ahash_tfm =crypto_alloc_ahash (alg_name,0 ,0 );if (IS_ERR (ahash_tfm))return PTR_ERR (ahash_tfm);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 743/1146 crypto: sa2ul - Fix AEAD fallback algorithm names
In reply to Greg Kroah-Hartman7.0-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
@@ -1744,13 +1744,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 744/1146 crypto: ccp - copy IV using skcipher ivsize
In reply to Greg Kroah-Hartman7.0-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
@@ -30,8 +30,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 745/1146 sh: Include <linux/io.h> in dac.h
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Zimmermann <[email protected]>
[ Upstream commit 57b3ec396dd898aadc073bb16f3d05ee64b2c8af ]
Include <linux/io.h> to avoid depending on <linux/backlight.h> for including it. Declares __raw_readb() and __raw_writeb().
--- arch/sh/include/cpu-sh3/cpu/dac.h | 2 ++ 1 file changed, 2 insertions(+)
arch/sh/include/cpu-sh3/cpu/dac.h +2 -0
@@ -2,6 +2,8 @@#ifndef __ASM_CPU_SH3_DAC_H#define __ASM_CPU_SH3_DAC_H +#include <linux/io.h> +/* * Copyright (C) 2003 Andriy Skulysh */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 746/1146 erofs: fix offset truncation when shifting pgoff on 32-bit platforms
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
[ Upstream commit c99493ce409c3b98fec1616dbcf24c102e006deb ]
On 32-bit platforms, pgoff_t is 32 bits wide, so left-shifting large arbitrary pgoff_t values by PAGE_SHIFT performs 32-bit arithmetic and silently truncates the result for pages beyond the 4 GiB boundary.
Cast the page index to loff_t before shifting to produce a correct 64-bit byte offset.
--- fs/erofs/data.c | 2 +- fs/erofs/zdata.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
fs/erofs/data.c +1 -1
@@ -39,7 +39,7 @@ void *erofs_bread(struct erofs_buf *buf, erofs_off_t offset, bool need_kmap)* However, the data access range must be verified here in advance. */ if (buf->file) { - fpos = index <<PAGE_SHIFT ; + fpos = (loff_t )index <<PAGE_SHIFT ; err =rw_verify_area (READ , buf->file, &fpos,PAGE_SIZE );if (err <0 )return ERR_PTR (err);
fs/erofs/zdata.c +1 -1
@@ -1874,7 +1874,7 @@ static void z_erofs_pcluster_readmore(struct z_erofs_frontend *f,if (cur <PAGE_SIZE )break ; - cur = (index <<PAGE_SHIFT ) -1 ; + cur = ((loff_t )index <<PAGE_SHIFT ) -1 ; } }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 747/1146 erofs: unify lcn as u64 for 32-bit platforms
In reply to Greg Kroah-Hartman7.0-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, in_mbox; }; -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;if (!lookback_distance)
@@ -286,7 +285,7 @@ static int z_erofs_extent_lookback(struct z_erofs_maprecorder *m, m->map->m_la = (lcn << lclusterbits) | m->clusterofs;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 ;
@@ -300,7 +299,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 );
@@ -331,7 +330,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 748/1146 tools: hv: Fix cross-compilation
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aditya Garg <[email protected]>
[ Upstream commit ca5ee0e918115fb5cf626d75461d9fca06e06caf ]
Use the native ARCH only in case it is not set, this will allow the cross-compilation where ARCH is explicitly set.
Additionally, simplify the ARCH check to build the fcopy daemon only for x86 and x86_64.
--- tools/hv/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/hv/Makefile +2 -2
@@ -2,7 +2,7 @@ # Makefile for Hyper-V tools include ../scripts/Makefile.include -ARCH := $(shell uname -m 2>/dev/null) +ARCH ?= $(shell uname -m 2>/dev/null) sbindir ?= /usr/sbin libexecdir ?= /usr/libexec sharedstatedir ?= /var/lib
@@ -20,7 +20,7 @@ override CFLAGS += -O2 -Wall -g -D_GNU_SOURCE -I$(OUTPUT)include override CFLAGS += -Wno-address-of-packed-member ALL_TARGETS := hv_kvp_daemon hv_vss_daemon -ifneq ($(ARCH), aarch64) +ifneq ($(filter x86_64 x86,$(ARCH)),) ALL_TARGETS += hv_fcopy_uio_daemon endif ALL_PROGRAMS := $(patsubst %,$(OUTPUT)%,$(ALL_TARGETS))
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 749/1146 Drivers: hv: vmbus: fix hyperv_cpuhp_online variable shadowing
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jork Loeser <[email protected]>
[ Upstream commit 3c42b33433796b73ddecd8f60bda419b1648d997 ]
vmbus_alloc_synic_and_connect() declares a local 'int hyperv_cpuhp_online' that shadows the file-scope global of the same name. The cpuhp state returned by cpuhp_setup_state() is stored in the local, leaving the global at 0 (CPUHP_OFFLINE). When hv_kexec_handler() or hv_machine_shutdown() later call cpuhp_remove_state(hyperv_cpuhp_online) they pass 0, which hits the BUG_ON in __cpuhp_remove_state_cpuslocked().
Remove the local declaration so the cpuhp state is stored in the file-scope global where hv_kexec_handler() and hv_machine_shutdown() expect it.
--- drivers/hv/vmbus_drv.c | 1 - 1 file changed, 1 deletion(-)
drivers/hv/vmbus_drv.c +0 -1
@@ -1430,7 +1430,6 @@ static int vmbus_alloc_synic_and_connect(void) {int ret, cpu;struct work_struct __percpu *works; -int hyperv_cpuhp_online; ret =hv_synic_alloc ();if (ret <0 )
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 750/1146 arm64: dts: imx8mp-debix-model-a: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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 751/1146 arm64: dts: imx8mp-debix-som-a: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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
@@ -499,7 +499,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 752/1146 arm64: dts: imx8mp-navqp: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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
@@ -356,7 +356,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 753/1146 arm64: dts: imx8mp-icore-mx8mp: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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 754/1146 arm64: dts: imx8mp-edm-g: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit c46c5a54443440ce0f71de9f4df9dd860f5c2afd ]
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-edm-g.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-edm-g.dtsi +1 -1
@@ -563,7 +563,7 @@ MX8MP_IOMUXC_GPIO1_IO01__GPIO1_IO01 0x41 /* PCIE RST */ 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 755/1146 arm64: dts: imx8mp-aristainetos3a-som-v1: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit e6d2d8e49ca34bb39126a69128794d08ffd7c83e ]
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-aristainetos3a-som-v1.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-aristainetos3a-som-v1.dtsi +1 -1
@@ -903,7 +903,7 @@ MX8MP_IOMUXC_SAI1_MCLK__GPIO4_IO20 0x41 pinctrl_pmic: aristainetos3-pmic-grp { 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 756/1146 arm64: dts: imx8mp-nitrogen-som: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 16611eda2c7584a1a7d6f80511d825e5108f026c ]
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-nitrogen-som.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/freescale/imx8mp-nitrogen-som.dtsi +1 -1
@@ -296,7 +296,7 @@ MX8MP_IOMUXC_I2C4_SDA__I2C4_SDA 0x400001c3 pinctrl_pmic: pmicirqgrp { fsl,pins = < - MX8MP_IOMUXC_NAND_ALE__GPIO3_IO00 0x41 + MX8MP_IOMUXC_NAND_ALE__GPIO3_IO00 0x1c0 >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 757/1146 arm64: dts: imx8mp-sr-som: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit 695a476275cfb9c798a696aeaa43967701d5c78a ]
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-sr-som.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/freescale/imx8mp-sr-som.dtsi +2 -2
@@ -174,7 +174,7 @@ pmic: pmic@25 { pinctrl-0 = <&pmic_pins>; pinctrl-names = "default"; interrupt-parent = <&gpio1>; - interrupts = <3 GPIO_ACTIVE_LOW>; + interrupts = <3 IRQ_TYPE_LEVEL_LOW>; nxp,i2c-lt-enable; regulators {
@@ -417,7 +417,7 @@ MX8MP_IOMUXC_SAI1_RXD1__GPIO4_IO03 0x160 pmic_pins: pinctrl-pmic-grp { 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 758/1146 arm64: dts: imx8mp-ultra-mach-sbc: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peng Fan <[email protected]>
[ Upstream commit daaf41ee72fb5fad936e7051a015cccae9b33937 ]
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-ultra-mach-sbc.dts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/freescale/imx8mp-ultra-mach-sbc.dts +2 -2
@@ -275,7 +275,7 @@ pmic@25 { reg = <0x25>; pinctrl-0 = <&pinctrl_pmic>; interrupt-parent = <&gpio1>; - interrupts = <3 GPIO_ACTIVE_LOW>; + interrupts = <3 IRQ_TYPE_LEVEL_LOW>; /* * i.MX 8M Plus Data Sheet for Consumer Products
@@ -739,7 +739,7 @@ MX8MP_IOMUXC_GPIO1_IO07__GPIO1_IO07 0x40 /* NFC_INT */ pinctrl_pmic: pmic-grp { fsl,pins = < - MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x40 /* #PMIC_INT */ + MX8MP_IOMUXC_GPIO1_IO03__GPIO1_IO03 0x1c0 /* #PMIC_INT */ >; };
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 759/1146 arm64: dts: imx8mp-dhcom-som: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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 760/1146 arm64: dts: imx8mp-data-modul-edm-sbc: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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
@@ -1001,7 +1001,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 761/1146 PCMCIA: Fix garbled log messages for KERN_CONT
In reply to Greg Kroah-Hartman7.0-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
@@ -187,7 +187,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 );
@@ -409,8 +409,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 762/1146 reset: amlogic: t7: Fix null reset ops
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ronald Claveau <[email protected]>
[ Upstream commit 9797524ef2b69c6b187b55bd844eb72a8c1cbd99 ]
Fix missing reset ops causing kernel null pointer dereference. This SOC's reset is currently not used yet.
--- drivers/reset/amlogic/reset-meson.c | 1 + 1 file changed, 1 insertion(+)
drivers/reset/amlogic/reset-meson.c +1 -0
@@ -42,6 +42,7 @@ static const struct meson_reset_param meson_s4_param = { };static const struct meson_reset_param t7_param = { + .reset_ops = &meson_reset_ops, .reset_num =224 , .reset_offset =0x0 , .level_offset =0x40 ,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 763/1146 arm64: dts: imx8mm-emtop-som: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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 764/1146 arm64: dts: imx8mn-tqma8mqnl: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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
@@ -283,7 +283,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 765/1146 arm64: dts: imx8mm-tqma8mqml: Correct PAD settings for PMIC_nINT
In reply to Greg Kroah-Hartman7.0-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
@@ -292,7 +292,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 766/1146 arm64: dts: marvell: armada-37xx: use usb2-phy in USB3 controllers phy-names
In reply to Greg Kroah-Hartman7.0-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
@@ -373,7 +373,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 767/1146 pwm: stm32: Fix rounding issue for requests with inverted polarity
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Uwe Kleine-König <[email protected]>
[ Upstream commit 5d087c485b6ecf200a9ebb2a032bf8571d330250 ]
The calculation of the number of pwm clk ticks from a time length in nanoseconds involves a division and thus some rounding. That might result in
duty_ticks + offset_ticks < period_ticks
despite
duty_length_ns + duty_offset_ns >= period_length_ns
. The stm32 PWM cannot configure offset_ticks freely, it can only select 0 or period_length_ns - duty_length_ns---that is the classic normal and inverted polarity. The decision to select the hardware polarity must be done using the ticks values and not the nanoseconds times to adhere to the rounding rules by the pwm core.
With the pwm clk running at 208900 kHz on my test machine (stm32mp135f-dk), a test case that was handled wrong is:
# pwmround -P 9999962 -O 24970 -D 9974992 period_length = 9999962 duty_length = 9974840 duty_offset = 25123
With this change applied the rounding is done correctly:
# pwmround -P 9999962 -O 24970 -D 9974992 period_length = 9999962 duty_length = 9974840 duty_offset = 0
--- drivers/pwm/pwm-stm32.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
drivers/pwm/pwm-stm32.c +12 -10
@@ -68,7 +68,7 @@ static int stm32_pwm_round_waveform_tohw(struct pwm_chip *chip,struct stm32_pwm *priv =to_stm32_pwm_dev (chip);unsigned int ch = pwm->hwpwm;unsigned long rate; -u64 ccr, duty; +u64 duty_ticks, offset_ticks;int ret;if (wf->period_length_ns ==0 ) {
@@ -164,23 +164,25 @@ static int stm32_pwm_round_waveform_tohw(struct pwm_chip *chip, wfhw->arr =min_t (u64, arr, priv->max_arr) -1 ; } - duty =mul_u64_u64_div_u64 (wf->duty_length_ns, rate, - (u64 )NSEC_PER_SEC * (wfhw->psc +1 )); - duty =min_t (u64, duty, wfhw->arr +1 ); + duty_ticks =mul_u64_u64_div_u64 (wf->duty_length_ns, rate, + (u64 )NSEC_PER_SEC * (wfhw->psc +1 )); + duty_ticks =min_t (u64, duty_ticks, wfhw->arr +1 ); -if (wf->duty_length_ns && wf->duty_offset_ns && - wf->duty_length_ns + wf->duty_offset_ns >= wf->period_length_ns) { + offset_ticks =mul_u64_u64_div_u64 (wf->duty_offset_ns, rate, + (u64 )NSEC_PER_SEC * (wfhw->psc +1 )); + offset_ticks =min_t (u64, offset_ticks, wfhw->arr +1 ); + +if (duty_ticks && offset_ticks && + duty_ticks + offset_ticks >= wfhw->arr +1 ) { wfhw->ccer |=TIM_CCER_CCxP (ch +1 );if (priv->have_complementary_output) wfhw->ccer |=TIM_CCER_CCxNP (ch +1 ); - ccr = wfhw->arr +1 - duty; + wfhw->ccr = wfhw->arr +1 - duty_ticks; }else { - ccr = duty; + wfhw->ccr = duty_ticks; } - wfhw->ccr =min_t (u64, ccr, wfhw->arr +1 ); - out: dev_dbg(&chip->dev, "pwm#%u: %lld/%lld [+%lld] @%lu -> CCER: %08x, PSC: %08x, ARR: %08x, CCR: %08x\n", pwm->hwpwm, wf->duty_length_ns, wf->period_length_ns, wf->duty_offset_ns,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 768/1146 net/sched: act_mirred: fix wrong device for mac_header_xmit check in tcf_blockcast_redir
In reply to Greg Kroah-Hartman7.0-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
@@ -354,7 +354,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 769/1146 macvlan: fix macvlan_get_size() not reserving space for IFLA_MACVLAN_BC_CUTOFF
In reply to Greg Kroah-Hartman7.0-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
@@ -1682,6 +1682,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 770/1146 net/sched: sch_cake: fix NAT destination port not being updated in cake_update_flowkeys
In reply to Greg Kroah-Hartman7.0-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
@@ -619,7 +619,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 771/1146 nexthop: fix IPv6 route referencing IPv4 nexthop
In reply to Greg Kroah-Hartman7.0-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
@@ -2466,10 +2466,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 772/1146 net: airoha: Wait for NPU PPE configuration to complete in airoha_ppe_offload_setup()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lorenzo Bianconi <[email protected]>
[ Upstream commit f3206328bb52c2787197d80d7cbd687946047d5f ]
In order to properly enable flowtable hw offloading, poll REG_PPE_FLOW_CFG register in airoha_ppe_offload_setup routine and wait for NPU PPE configuration triggered by ppe_init callback to complete before running airoha_ppe_hw_init().
--- drivers/net/ethernet/airoha/airoha_ppe.c | 28 ++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
drivers/net/ethernet/airoha/airoha_ppe.c +28 -0
@@ -1335,6 +1335,29 @@ static struct airoha_npu *airoha_ppe_npu_get(struct airoha_eth *eth)return npu; } +static int airoha_ppe_wait_for_npu_init (struct airoha_eth *eth) +{ +int err; +u32 val; + +/* PPE_FLOW_CFG default register value is 0. Since we reset FE +* during the device probe we can just check the configured value +* is not 0 here. +*/ + err =read_poll_timeout (airoha_fe_rr, val, val,USEC_PER_MSEC , +100 *USEC_PER_MSEC , false, eth, +REG_PPE_PPE_FLOW_CFG (0 )); +if (err) +return err; + +if (airoha_ppe_is_enabled (eth,1 )) + err =read_poll_timeout (airoha_fe_rr, val, val,USEC_PER_MSEC , +100 *USEC_PER_MSEC , false, eth, +REG_PPE_PPE_FLOW_CFG (1 )); + +return err; +} +static int airoha_ppe_offload_setup (struct airoha_eth *eth) {struct airoha_npu *npu =airoha_ppe_npu_get (eth);
@@ -1348,6 +1371,11 @@ static int airoha_ppe_offload_setup(struct airoha_eth *eth)if (err) goto error_npu_put; +/* Wait for NPU PPE configuration to complete */ + err =airoha_ppe_wait_for_npu_init (eth); +if (err) + goto error_npu_put; + ppe_num_stats_entries =airoha_ppe_get_total_num_stats_entries (ppe);if (ppe_num_stats_entries >0 ) { err = npu->ops.ppe_init_stats(npu, ppe->foe_stats_dma,
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 773/1146 net/sched: taprio: fix use-after-free in advance_sched() on schedule switch
In reply to Greg Kroah-Hartman7.0-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
@@ -972,11 +972,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 774/1146 net: dsa: remove redundant netdev_lock_ops() from conduit ethtool ops
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislav Fomichev <[email protected]>
[ Upstream commit 0f99e0c3e19badaf3fdced0d3feba623e59eed41 ]
DSA replaces the conduit (master) device's ethtool_ops with its own wrappers that aggregate stats from both the conduit and DSA switch ports. Taking the lock again inside the DSA wrappers causes a deadlock.
Stumbled upon this when booting qemu with fbnic and CONFIG_NET_DSA_LOOP=y (which looks like some kind of testing device that auto-populates the ports of eth0). ethtool -i is enough to deadlock. This means we have basically zero coverage for DSA stuff with real ops locked devs.
Remove the redundant netdev_lock_ops()/netdev_unlock_ops() calls from the DSA conduit ethtool wrappers.
--- net/dsa/conduit.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-)
net/dsa/conduit.c +1 -15
@@ -27,9 +27,7 @@ static int dsa_conduit_get_regs_len(struct net_device *dev)int len;if (ops && ops->get_regs_len) { -netdev_lock_ops (dev); len = ops->get_regs_len (dev); -netdev_unlock_ops (dev);if (len <0 )return len; ret += len;
@@ -60,15 +58,11 @@ static void dsa_conduit_get_regs(struct net_device *dev,int len;if (ops && ops->get_regs_len && ops->get_regs) { -netdev_lock_ops (dev); len = ops->get_regs_len (dev); -if (len <0 ) { -netdev_unlock_ops (dev); +if (len <0 )return ; - } regs->len = len; ops->get_regs (dev, regs, data); -netdev_unlock_ops (dev); data += regs->len; }
@@ -115,10 +109,8 @@ static void dsa_conduit_get_ethtool_stats(struct net_device *dev,int count, mcount =0 ;if (ops && ops->get_sset_count && ops->get_ethtool_stats) { -netdev_lock_ops (dev); mcount = ops->get_sset_count (dev,ETH_SS_STATS ); ops->get_ethtool_stats (dev, stats, data); -netdev_unlock_ops (dev); }list_for_each_entry (dp, &dst->ports, list) {
@@ -149,10 +141,8 @@ static void dsa_conduit_get_ethtool_phy_stats(struct net_device *dev,if (count >=0 )phy_ethtool_get_stats (dev->phydev, stats, data); }else if (ops && ops->get_sset_count && ops->get_ethtool_phy_stats) { -netdev_lock_ops (dev); count = ops->get_sset_count (dev,ETH_SS_PHY_STATS ); ops->get_ethtool_phy_stats (dev, stats, data); -netdev_unlock_ops (dev); }if (count <0 )
@@ -176,13 +166,11 @@ static int dsa_conduit_get_sset_count(struct net_device *dev, int sset)struct dsa_switch_tree *dst = cpu_dp->dst;int count =0 ; -netdev_lock_ops (dev);if (sset ==ETH_SS_PHY_STATS && dev->phydev && (!ops || !ops->get_ethtool_phy_stats)) count =phy_ethtool_get_sset_count (dev->phydev);else if (ops && ops->get_sset_count) count = ops->get_sset_count (dev, sset); -netdev_unlock_ops (dev);if (count <0 ) count =0 ;
@@ -239,7 +227,6 @@ static void dsa_conduit_get_strings(struct net_device *dev, u32 stringset,struct dsa_switch_tree *dst = cpu_dp->dst;int count, mcount =0 ; -netdev_lock_ops (dev);if (stringset ==ETH_SS_PHY_STATS && dev->phydev && !ops->get_ethtool_phy_stats) { mcount =phy_ethtool_get_sset_count (dev->phydev);
@@ -253,7 +240,6 @@ static void dsa_conduit_get_strings(struct net_device *dev, u32 stringset, mcount =0 ; ops->get_strings (dev, stringset, data); } -netdev_unlock_ops (dev);list_for_each_entry (dp, &dst->ports, list) {if (!dsa_port_is_dsa (dp) && !dsa_port_is_cpu (dp))
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 775/1146 net: enetc: correct the command BD ring consumer index
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Fang <[email protected]>
[ Upstream commit 759a32900b6f3db3d0f34a3b61123742723b50b4 ]
The command BD ring cousumer index register has the consumer index as the lower 10 bits, and the bit 31 is SBE, which indicates whether a system bus error occurred during execution of the CBD command. So if a system bus error occurs, reading the register will get the SBE bit set.
However, the current implementation directly uses the register value as the consumer index without masking it. Therefore, if a system bus error occurs, an incorrect consumer index will be obtained, causing errors in the processing of the command BD ring. Thus, we need to mask out the other bits to obtain the correct consumer index.
In addition, this patch adds a check for the SBE bit after the polling loop and returns an error if the bit is set.
--- drivers/net/ethernet/freescale/enetc/ntmp.c | 13 ++++++++++--- drivers/net/ethernet/freescale/enetc/ntmp_private.h | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-)
drivers/net/ethernet/freescale/enetc/ntmp.c +10 -3
@@ -55,7 +55,7 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,spin_lock_init (&cbdr->ring_lock); cbdr->next_to_use =netc_read (cbdr->regs.pir); - cbdr->next_to_clean =netc_read (cbdr->regs.cir); + cbdr->next_to_clean =netc_read (cbdr->regs.cir) &NETC_CBDRCIR_INDEX ;/* Step 1: Configure the base address of the Control BD Ring */ netc_write (cbdr->regs.bar0,lower_32_bits (cbdr->dma_base_align));
@@ -98,7 +98,7 @@ static void ntmp_clean_cbdr(struct netc_cbdr *cbdr)int i; i = cbdr->next_to_clean; -while (netc_read (cbdr->regs.cir) != i) { +while ((netc_read (cbdr->regs.cir) &NETC_CBDRCIR_INDEX ) != i) { cbd =ntmp_get_cbd (cbdr, i);memset (cbd,0 ,sizeof (*cbd)); i = (i +1 ) % cbdr->bd_num;
@@ -135,12 +135,19 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user, union netc_cbd *cbd) cbdr->next_to_use = i;netc_write (cbdr->regs.pir, i); - err =read_poll_timeout_atomic (netc_read, val, val == i, + err =read_poll_timeout_atomic (netc_read, val, + (val &NETC_CBDRCIR_INDEX ) == i,NETC_CBDR_DELAY_US ,NETC_CBDR_TIMEOUT , true, cbdr->regs.cir);if (unlikely (err)) goto cbdr_unlock; +if (unlikely (val &NETC_CBDRCIR_SBE )) { +dev_err (user->dev,"Command BD system bus error\n" ); + err = -EIO ; + goto cbdr_unlock; + } +dma_rmb ();/* Get the writeback command BD, because the caller may need * to check some other fields of the response header.
drivers/net/ethernet/freescale/enetc/ntmp_private.h +2 -0
@@ -12,6 +12,8 @@#define NTMP_EID_REQ_LEN 8#define NETC_CBDR_BD_NUM 256 +#define NETC_CBDRCIR_INDEX GENMASK(9, 0) +#define NETC_CBDRCIR_SBE BIT(31) union netc_cbd { struct {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 776/1146 net: enetc: fix NTMP DMA use-after-free issue
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Fang <[email protected]>
[ Upstream commit 3cade698881eb238f88cbbfec82acc2110440a3f ]
The AI-generated review reported a potential DMA use-after-free issue [1]. If netc_xmit_ntmp_cmd() times out and returns an error, the pending command is not explicitly aborted, while ntmp_free_data_mem() unconditionally frees the DMA buffer. If the buffer has already been reallocated elsewhere, this may lead to silent memory corruption. Because the hardware eventually processes the pending command and perform a DMA write of the response to the physical address of the freed buffer.
To resolve this issue, this patch does the following modifications:
1. Convert cbdr->ring_lock from a spinlock to a mutex
The lock was originally a spinlock in case NTMP operations might be invoked from atomic context. After downstream support for all NTMP tables, no such usage has materialized. A mutex lock is now required because the driver now needs to reclaim used BDs and release associated DMA memory within the lock's context, while dma_free_coherent() might sleep.
2. Introduce software command BD (struct netc_swcbd)
The hardware write-back overwrites the addr and len fields of the BD, so the driver cannot rely on the hardware BD to free the associated DMA memory. The driver now maintains a software shadow BD storing the DMA buffer pointer, DMA address, and size. And netc_xmit_ntmp_cmd() only reclaims older BDs when the number of used BDs reaches NETC_CBDR_CLEAN_WORK (16). The software BD enables correct DMA memory release. With this, struct ntmp_dma_buf and ntmp_free_data_mem() are no longer needed and are removed.
3. Require callers to hold ring_lock across netc_xmit_ntmp_cmd()
netc_xmit_ntmp_cmd() releases the ring_lock before the caller finishes consuming the response. At this point, if a concurrent thread submits a new command, it may trigger ntmp_clean_cbdr() and free the DMA buffer while it is still in use. Move ring_lock ownership to the caller to ensure the response buffer cannot be reclaimed prematurely. So the helpers ntmp_select_and_lock_cbdr() and ntmp_unlock_cbdr() are added.
These changes eliminate the DMA use-after-free condition and ensure safe and consistent BD reclamation and DMA buffer lifecycle management.
--- drivers/net/ethernet/freescale/enetc/ntmp.c | 214 ++++++++++-------- .../ethernet/freescale/enetc/ntmp_private.h | 8 +- include/linux/fsl/ntmp.h | 9 +- 3 files changed, 134 insertions(+), 97 deletions(-)
drivers/net/ethernet/freescale/enetc/ntmp.c +125 -89
@@ -7,6 +7,7 @@#include <linux/dma-mapping.h> #include <linux/fsl/netc_global.h> #include <linux/iopoll.h> +#include <linux/vmalloc.h> #include "ntmp_private.h"
@@ -42,6 +43,12 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev,if (!cbdr->addr_base)return -ENOMEM ; + cbdr->swcbd =vcalloc (cbd_num,sizeof (struct netc_swcbd )); +if (!cbdr->swcbd) { +dma_free_coherent (dev, size, cbdr->addr_base, cbdr->dma_base); +return -ENOMEM ; + } + cbdr->dma_size = size; cbdr->bd_num = cbd_num; cbdr->regs = *regs;
@@ -52,7 +59,7 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev, cbdr->addr_base_align =PTR_ALIGN (cbdr->addr_base,NTMP_BASE_ADDR_ALIGN ); -spin_lock_init (&cbdr->ring_lock); +mutex_init (&cbdr->ring_lock); cbdr->next_to_use =netc_read (cbdr->regs.pir); cbdr->next_to_clean =netc_read (cbdr->regs.cir) &NETC_CBDRCIR_INDEX ;
@@ -71,10 +78,24 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device *dev, }EXPORT_SYMBOL_GPL (ntmp_init_cbdr); +static void ntmp_free_data_mem (struct device *dev,struct netc_swcbd *swcbd) +{ +if (unlikely (!swcbd->buf)) +return ; + +dma_free_coherent (dev, swcbd->size +NTMP_DATA_ADDR_ALIGN , + swcbd->buf, swcbd->dma); +} +void ntmp_free_cbdr (struct netc_cbdr *cbdr) {/* Disable the Control BD Ring */ netc_write (cbdr->regs.mr,0 ); + +for (int i =0 ; i < cbdr->bd_num; i++) +ntmp_free_data_mem (cbdr->dev, &cbdr->swcbd[i]); + +vfree (cbdr->swcbd);dma_free_coherent (cbdr->dev, cbdr->dma_size, cbdr->addr_base, cbdr->dma_base);memset (cbdr,0 ,sizeof (*cbdr));
@@ -94,40 +115,59 @@ static union netc_cbd *ntmp_get_cbd(struct netc_cbdr *cbdr, int index)static void ntmp_clean_cbdr (struct netc_cbdr *cbdr) { -union netc_cbd *cbd; -int i; +int i = cbdr->next_to_clean; - i = cbdr->next_to_clean;while ((netc_read (cbdr->regs.cir) &NETC_CBDRCIR_INDEX ) != i) { - cbd =ntmp_get_cbd (cbdr, i); +union netc_cbd *cbd =ntmp_get_cbd (cbdr, i); +struct netc_swcbd *swcbd = &cbdr->swcbd[i]; + +ntmp_free_data_mem (cbdr->dev, swcbd); +memset (swcbd,0 ,sizeof (*swcbd));memset (cbd,0 ,sizeof (*cbd)); i = (i +1 ) % cbdr->bd_num; } +dma_wmb (); cbdr->next_to_clean = i; } -static int netc_xmit_ntmp_cmd (struct ntmp_user *user,union netc_cbd *cbd) +static void ntmp_select_and_lock_cbdr (struct ntmp_user *user, +struct netc_cbdr **cbdr) +{ +/* Currently only ENETC is supported, and it has only one command +* BD ring. +*/ + *cbdr = &user->ring[0 ]; + +mutex_lock (&(*cbdr)->ring_lock); +} + +static void ntmp_unlock_cbdr (struct netc_cbdr *cbdr) +{ +mutex_unlock (&cbdr->ring_lock); +} + +static int netc_xmit_ntmp_cmd (struct netc_cbdr *cbdr,union netc_cbd *cbd, +struct netc_swcbd *swcbd) {union netc_cbd *cur_cbd; -struct netc_cbdr *cbdr; -int i, err; +int i, err, used_bds;u16 status;u32 val; -/* Currently only i.MX95 ENETC is supported, and it only has one -* command BD ring -*/ - cbdr = &user->ring[0 ]; - -spin_lock_bh (&cbdr->ring_lock); - -if (unlikely (!ntmp_get_free_cbd_num (cbdr))) + used_bds = cbdr->bd_num -ntmp_get_free_cbd_num (cbdr); +if (unlikely (used_bds >=NETC_CBDR_CLEAN_WORK )) {ntmp_clean_cbdr (cbdr); +if (unlikely (!ntmp_get_free_cbd_num (cbdr))) { +ntmp_free_data_mem (cbdr->dev, swcbd); +return -EBUSY ; + } + } i = cbdr->next_to_use; cur_cbd =ntmp_get_cbd (cbdr, i); *cur_cbd = *cbd; + cbdr->swcbd[i] = *swcbd;dma_wmb ();/* Update producer index of both software and hardware */
@@ -135,17 +175,16 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user, union netc_cbd *cbd) cbdr->next_to_use = i;netc_write (cbdr->regs.pir, i); - err =read_poll_timeout_atomic (netc_read, val, - (val &NETC_CBDRCIR_INDEX ) == i, -NETC_CBDR_DELAY_US ,NETC_CBDR_TIMEOUT , - true, cbdr->regs.cir); + err =read_poll_timeout (netc_read, val, + (val &NETC_CBDRCIR_INDEX ) == i, +NETC_CBDR_DELAY_US ,NETC_CBDR_TIMEOUT , + true, cbdr->regs.cir);if (unlikely (err)) - goto cbdr_unlock; +return err;if (unlikely (val &NETC_CBDRCIR_SBE )) { -dev_err (user->dev,"Command BD system bus error\n" ); - err = -EIO ; - goto cbdr_unlock; +dev_err (cbdr->dev,"Command BD system bus error\n" ); +return -EIO ; }dma_rmb ();
@@ -157,40 +196,29 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user, union netc_cbd *cbd)/* Check the writeback error status */ status =le16_to_cpu (cbd->resp_hdr.error_rr) &NTMP_RESP_ERROR ;if (unlikely (status)) { - err = -EIO ; -dev_err (user->dev,"Command BD error: 0x%04x\n" , status); +dev_err (cbdr->dev,"Command BD error: 0x%04x\n" , status); +return -EIO ; } -ntmp_clean_cbdr (cbdr); -dma_wmb (); - -cbdr_unlock: -spin_unlock_bh (&cbdr->ring_lock); - -return err; +return 0 ; } -static int ntmp_alloc_data_mem (struct ntmp_dma_buf *data,void **buf_align) +static int ntmp_alloc_data_mem (struct device *dev,struct netc_swcbd *swcbd, +void **buf_align) {void *buf; - buf =dma_alloc_coherent (data->dev, data->size +NTMP_DATA_ADDR_ALIGN , - &data->dma,GFP_KERNEL ); + buf =dma_alloc_coherent (dev, swcbd->size +NTMP_DATA_ADDR_ALIGN , + &swcbd->dma,GFP_KERNEL );if (!buf)return -ENOMEM ; - data->buf = buf; + swcbd->buf = buf; *buf_align =PTR_ALIGN (buf,NTMP_DATA_ADDR_ALIGN );return 0 ; } -static void ntmp_free_data_mem (struct ntmp_dma_buf *data) -{ -dma_free_coherent (data->dev, data->size +NTMP_DATA_ADDR_ALIGN , - data->buf, data->dma); -} -static void ntmp_fill_request_hdr (union netc_cbd *cbd,dma_addr_t dma,int len,int table_id,int cmd,int access_method)
@@ -241,37 +269,39 @@ static int ntmp_delete_entry_by_id(struct ntmp_user *user, int tbl_id, u8 tbl_ver, u32 entry_id, u32 req_len, u32 resp_len) { - struct ntmp_dma_buf data = { - .dev = user->dev, + struct netc_swcbd swcbd = { .size =max (req_len, resp_len), };struct ntmp_req_by_eid *req; +struct netc_cbdr *cbdr;union netc_cbd cbd;int err; - err =ntmp_alloc_data_mem (&data, (void **)&req); + err =ntmp_alloc_data_mem (user->dev, &swcbd, (void **)&req);if (err)return err;ntmp_fill_crd_eid (req, tbl_ver,0 ,0 , entry_id); -ntmp_fill_request_hdr (&cbd, data.dma,NTMP_LEN (req_len, resp_len), +ntmp_fill_request_hdr (&cbd, swcbd.dma,NTMP_LEN (req_len, resp_len), tbl_id,NTMP_CMD_DELETE ,NTMP_AM_ENTRY_ID ); - err =netc_xmit_ntmp_cmd (user, &cbd); +ntmp_select_and_lock_cbdr (user, &cbdr); + err =netc_xmit_ntmp_cmd (cbdr, &cbd, &swcbd);if (err)dev_err (user->dev,"Failed to delete entry 0x%x of %s, err: %pe" , entry_id,ntmp_table_name (tbl_id),ERR_PTR (err)); - -ntmp_free_data_mem (&data); +ntmp_unlock_cbdr (cbdr);return err; } -static int ntmp_query_entry_by_id (struct ntmp_user *user,int tbl_id, -u32 len,struct ntmp_req_by_eid *req, -dma_addr_t dma,bool compare_eid) +static int ntmp_query_entry_by_id (struct netc_cbdr *cbdr,int tbl_id, +struct ntmp_req_by_eid *req, +struct netc_swcbd *swcbd, +bool compare_eid) { +u32 len =NTMP_LEN (sizeof (*req), swcbd->size);struct ntmp_cmn_resp_query *resp;int cmd =NTMP_CMD_QUERY ;union netc_cbd cbd;
@@ -283,10 +313,11 @@ static int ntmp_query_entry_by_id(struct ntmp_user *user, int tbl_id, cmd =NTMP_CMD_QU ;/* Request header */ -ntmp_fill_request_hdr (&cbd, dma, len, tbl_id, cmd,NTMP_AM_ENTRY_ID ); - err =netc_xmit_ntmp_cmd (user, &cbd); +ntmp_fill_request_hdr (&cbd, swcbd->dma, len, tbl_id, cmd, +NTMP_AM_ENTRY_ID ); + err =netc_xmit_ntmp_cmd (cbdr, &cbd, swcbd);if (err) { -dev_err (user->dev, +dev_err (cbdr->dev,"Failed to query entry 0x%x of %s, err: %pe\n" , entry_id,ntmp_table_name (tbl_id),ERR_PTR (err));return err;
@@ -300,7 +331,7 @@ static int ntmp_query_entry_by_id(struct ntmp_user *user, int tbl_id, resp = (struct ntmp_cmn_resp_query *)req;if (unlikely (le32_to_cpu (resp->entry_id) != entry_id)) { -dev_err (user->dev, +dev_err (cbdr->dev,"%s: query EID 0x%x doesn't match response EID 0x%x\n" ,ntmp_table_name (tbl_id), entry_id,le32_to_cpu (resp->entry_id));return -EIO ;
@@ -312,15 +343,15 @@ static int ntmp_query_entry_by_id(struct ntmp_user *user, int tbl_id,int ntmp_maft_add_entry (struct ntmp_user *user,u32 entry_id,struct maft_entry_data *maft) { -struct ntmp_dma_buf data = { - .dev = user->dev, +struct netc_swcbd swcbd = { .size =sizeof (struct maft_req_add ), };struct maft_req_add *req; +struct netc_cbdr *cbdr;union netc_cbd cbd;int err; - err =ntmp_alloc_data_mem (&data, (void **)&req); + err =ntmp_alloc_data_mem (user->dev, &swcbd, (void **)&req);if (err)return err;
@@ -329,14 +360,15 @@ int ntmp_maft_add_entry(struct ntmp_user *user, u32 entry_id, req->keye = maft->keye; req->cfge = maft->cfge; -ntmp_fill_request_hdr (&cbd, data.dma,NTMP_LEN (data.size,0 ), +ntmp_fill_request_hdr (&cbd, swcbd.dma,NTMP_LEN (swcbd.size,0 ),NTMP_MAFT_ID ,NTMP_CMD_ADD ,NTMP_AM_ENTRY_ID ); - err =netc_xmit_ntmp_cmd (user, &cbd); + +ntmp_select_and_lock_cbdr (user, &cbdr); + err =netc_xmit_ntmp_cmd (cbdr, &cbd, &swcbd);if (err)dev_err (user->dev,"Failed to add MAFT entry 0x%x, err: %pe\n" , entry_id,ERR_PTR (err)); - -ntmp_free_data_mem (&data); +ntmp_unlock_cbdr (cbdr);return err; }
@@ -345,31 +377,31 @@ EXPORT_SYMBOL_GPL(ntmp_maft_add_entry);int ntmp_maft_query_entry (struct ntmp_user *user,u32 entry_id,struct maft_entry_data *maft) { -struct ntmp_dma_buf data = { - .dev = user->dev, +struct netc_swcbd swcbd = { .size =sizeof (struct maft_resp_query ), };struct maft_resp_query *resp;struct ntmp_req_by_eid *req; +struct netc_cbdr *cbdr;int err; - err =ntmp_alloc_data_mem (&data, (void **)&req); + err =ntmp_alloc_data_mem (user->dev, &swcbd, (void **)&req);if (err)return err;ntmp_fill_crd_eid (req, user->tbl.maft_ver,0 ,0 , entry_id); - err =ntmp_query_entry_by_id (user,NTMP_MAFT_ID , -NTMP_LEN (sizeof (*req), data.size), - req, data.dma, true); + +ntmp_select_and_lock_cbdr (user, &cbdr); + err =ntmp_query_entry_by_id (cbdr,NTMP_MAFT_ID , req, &swcbd, true);if (err) - goto end; + goto unlock_cbdr; resp = (struct maft_resp_query *)req; maft->keye = resp->keye; maft->cfge = resp->cfge; -end: -ntmp_free_data_mem (&data); +unlock_cbdr: +ntmp_unlock_cbdr (cbdr);return err; }
@@ -385,8 +417,9 @@ EXPORT_SYMBOL_GPL(ntmp_maft_delete_entry);int ntmp_rsst_update_entry (struct ntmp_user *user,const u32 *table,int count) { -struct ntmp_dma_buf data = {.dev = user->dev};struct rsst_req_update *req; +struct netc_swcbd swcbd; +struct netc_cbdr *cbdr;union netc_cbd cbd;int err, i;
@@ -394,8 +427,8 @@ int ntmp_rsst_update_entry(struct ntmp_user *user, const u32 *table,/* HW only takes in a full 64 entry table */ return -EINVAL ; - data.size =struct_size (req, groups, count); - err =ntmp_alloc_data_mem (&data, (void **)&req); + swcbd.size =struct_size (req, groups, count); + err =ntmp_alloc_data_mem (user->dev, &swcbd, (void **)&req);if (err)return err;
@@ -405,15 +438,15 @@ int ntmp_rsst_update_entry(struct ntmp_user *user, const u32 *table,for (i =0 ; i < count; i++) req->groups[i] = (u8)(table[i]); -ntmp_fill_request_hdr (&cbd, data.dma,NTMP_LEN (data.size,0 ), +ntmp_fill_request_hdr (&cbd, swcbd.dma,NTMP_LEN (swcbd.size,0 ),NTMP_RSST_ID ,NTMP_CMD_UPDATE ,NTMP_AM_ENTRY_ID ); - err =netc_xmit_ntmp_cmd (user, &cbd); +ntmp_select_and_lock_cbdr (user, &cbdr); + err =netc_xmit_ntmp_cmd (cbdr, &cbd, &swcbd);if (err)dev_err (user->dev,"Failed to update RSST entry, err: %pe\n" ,ERR_PTR (err)); - -ntmp_free_data_mem (&data); +ntmp_unlock_cbdr (cbdr);return err; }
@@ -421,8 +454,9 @@ EXPORT_SYMBOL_GPL(ntmp_rsst_update_entry);int ntmp_rsst_query_entry (struct ntmp_user *user,u32 *table,int count) { -struct ntmp_dma_buf data = {.dev = user->dev};struct ntmp_req_by_eid *req; +struct netc_swcbd swcbd; +struct netc_cbdr *cbdr;union netc_cbd cbd;int err, i;u8 *group;
@@ -431,21 +465,23 @@ int ntmp_rsst_query_entry(struct ntmp_user *user, u32 *table, int count)/* HW only takes in a full 64 entry table */ return -EINVAL ; - data.size =NTMP_ENTRY_ID_SIZE +RSST_STSE_DATA_SIZE (count) + -RSST_CFGE_DATA_SIZE (count); - err =ntmp_alloc_data_mem (&data, (void **)&req); + swcbd.size =NTMP_ENTRY_ID_SIZE +RSST_STSE_DATA_SIZE (count) + +RSST_CFGE_DATA_SIZE (count); + err =ntmp_alloc_data_mem (user->dev, &swcbd, (void **)&req);if (err)return err;/* Set the request data buffer */ ntmp_fill_crd_eid (req, user->tbl.rsst_ver,0 ,0 ,0 ); -ntmp_fill_request_hdr (&cbd, data.dma,NTMP_LEN (sizeof (*req), data.size), +ntmp_fill_request_hdr (&cbd, swcbd.dma,NTMP_LEN (sizeof (*req), swcbd.size),NTMP_RSST_ID ,NTMP_CMD_QUERY ,NTMP_AM_ENTRY_ID ); - err =netc_xmit_ntmp_cmd (user, &cbd); + +ntmp_select_and_lock_cbdr (user, &cbdr); + err =netc_xmit_ntmp_cmd (cbdr, &cbd, &swcbd);if (err) {dev_err (user->dev,"Failed to query RSST entry, err: %pe\n" ,ERR_PTR (err)); - goto end; + goto unlock_cbdr; } group = (u8 *)req;
@@ -453,8 +489,8 @@ int ntmp_rsst_query_entry(struct ntmp_user *user, u32 *table, int count)for (i =0 ; i < count; i++) table[i] = group[i]; -end: -ntmp_free_data_mem (&data); +unlock_cbdr: +ntmp_unlock_cbdr (cbdr);return err; }
drivers/net/ethernet/freescale/enetc/ntmp_private.h +1 -7
@@ -14,6 +14,7 @@#define NETC_CBDR_BD_NUM 256#define NETC_CBDRCIR_INDEX GENMASK(9, 0)#define NETC_CBDRCIR_SBE BIT(31) +#define NETC_CBDR_CLEAN_WORK 16 union netc_cbd { struct {
@@ -56,13 +57,6 @@ union netc_cbd { } resp_hdr;/* NTMP Response Message Header Format */ }; -struct ntmp_dma_buf { -struct device *dev; -size_t size; -void *buf; -dma_addr_t dma; -}; -struct ntmp_cmn_req_data {__le16 update_act;u8 dbg_opt;
include/linux/fsl/ntmp.h +8 -1
@@ -31,6 +31,12 @@ struct netc_tbl_vers {u8 rsst_ver; }; +struct netc_swcbd { +void *buf; +dma_addr_t dma; +size_t size; +}; +struct netc_cbdr {struct device *dev;struct netc_cbdr_regs regs;
@@ -44,9 +50,10 @@ struct netc_cbdr {void *addr_base_align;dma_addr_t dma_base;dma_addr_t dma_base_align; +struct netc_swcbd *swcbd;/* Serialize the order of command BD ring */ -spinlock_t ring_lock; +struct mutex ring_lock; };struct ntmp_user {
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 777/1146 ksmbd: fix use-after-free in smb2_open during durable reconnect
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akif <[email protected]>
[ Upstream commit 1baff47b81f94f9231c91236aa511420d0e266b9 ]
In smb2_open, the call to ksmbd_put_durable_fd(fp) drops the reference to the durable file descriptor early during the durable reconnect process. If an error occurs subsequently (eg, ksmbd_iov_pin_rsp fails) or a scavenger accesses the file, it leads to a use-after-free when accessing fp properties (eg fp->create_time).
Move the single put to the end of the function below err_out2 so fp stays valid until smb2_open returns.
--- fs/smb/server/smb2pdu.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
fs/smb/server/smb2pdu.c +5 -8
@@ -3015,29 +3015,23 @@ int smb2_open(struct ksmbd_work *work)if (dh_info.reconnected == true) { rc =smb2_check_durable_oplock (conn, share, dh_info.fp, lc, sess->user, name); -if (rc) { -ksmbd_put_durable_fd (dh_info.fp); +if (rc) goto err_out2; - } rc =ksmbd_reopen_durable_fd (work, dh_info.fp); -if (rc) { -ksmbd_put_durable_fd (dh_info.fp); +if (rc) goto err_out2; - } fp = dh_info.fp;if (ksmbd_override_fsids (work)) { rc = -ENOMEM ; -ksmbd_put_durable_fd (dh_info.fp); goto err_out2; } file_info =FILE_OPENED ; rc =ksmbd_vfs_getattr (&fp->filp->f_path, &stat); -ksmbd_put_durable_fd (fp);if (rc) goto err_out2;
@@ -3807,6 +3801,9 @@ int smb2_open(struct ksmbd_work *work)ksmbd_debug (SMB ,"Error response: %x\n" , rsp->hdr.Status); } +if (dh_info.reconnected) +ksmbd_put_durable_fd (dh_info.fp); +kfree (name);kfree (lc);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 778/1146 tcp: move tp->chrono_type next tp->chrono_stat[]
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4b78c9cbd8f1fbb9517aee48b372646f4cf05442 ]
chrono_type is currently in tcp_sock_read_txrx group, which is supposed to hold read-mostly fields.
But chrono_type is mostly written in tx path, it should be moved to tcp_sock_write_tx group, close to other chrono fields (chrono_stat[], chrono_start).
Note this adds holes, but data locality is far more important.
Use a full u8 for the time being, compiler can generate more efficient code.
Stable-dep-of: 267bf3cf9a6f ("tcp: annotate data-races in tcp_get_info_chrono_stats()")
--- include/linux/tcp.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/linux/tcp.h +2 -2
@@ -228,8 +228,7 @@ struct tcp_sock {u32 sacked_out;/* SACK'd packets */ u16 tcp_header_len;/* Bytes of tcp header to send */ u8 scaling_ratio;/* see tcp_win_from_space() */ - u8 chrono_type : 2, /* current chronograph type */ - repair : 1, + u8 repair : 1, tcp_usec_ts : 1, /* TSval values in usec */ is_sack_reneg:1, /* in recovery from loss with SACK reneg? */ is_cwnd_limited:1,/* forward progress limited by snd_cwnd? */
@@ -264,6 +263,7 @@ struct tcp_sock {* total number of data bytes sent. */ u32 snd_sml;/* Last byte of the most recently transmitted small packet */ +u8 chrono_type;/* current chronograph type */ u32 chrono_start;/* Start time in jiffies of a TCP chrono */ u32 chrono_stat[3 ];/* Time in jiffies for chrono_stat stats */ u32 write_seq;/* Tail(+1) of data held in tcp send buffer */
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 779/1146 tcp: inline tcp_chrono_start()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit d6d4ff335db2d9242937ca474d292010acd35c38 ]
tcp_chrono_start() is small enough, and used in TCP sendmsg() fast path (from tcp_skb_entail()).
Note clang is already inlining it from functions in tcp_output.c.
Inlining it improves performance and reduces bloat :
$ scripts/bloat-o-meter -t vmlinux.old vmlinux.new add/remove: 0/2 grow/shrink: 1/0 up/down: 1/-84 (-83) Function old new delta tcp_skb_entail 280 281 +1 __pfx_tcp_chrono_start 16 - -16 tcp_chrono_start 68 - -68 Total: Before=25192434, After=25192351, chg -0.00%
Note that tcp_chrono_stop() is too big.
Stable-dep-of: 267bf3cf9a6f ("tcp: annotate data-races in tcp_get_info_chrono_stats()")
--- include/net/tcp.h | 25 ++++++++++++++++++++++++- net/ipv4/tcp_output.c | 24 ------------------------ 2 files changed, 24 insertions(+), 25 deletions(-)
include/net/tcp.h +24 -1
@@ -2156,7 +2156,30 @@ enum tcp_chrono { __TCP_CHRONO_MAX, }; -void tcp_chrono_start (struct sock *sk,const enum tcp_chrono type); +static inline void tcp_chrono_set (struct tcp_sock *tp,const enum tcp_chrono new) +{ +const u32 now = tcp_jiffies32; +enum tcp_chrono old = tp->chrono_type; + +if (old >TCP_CHRONO_UNSPEC ) + tp->chrono_stat[old -1 ] += now - tp->chrono_start; + tp->chrono_start = now; + tp->chrono_type = new; +} + +static inline void tcp_chrono_start (struct sock *sk,const enum tcp_chrono type) +{ +struct tcp_sock *tp =tcp_sk (sk); + +/* If there are multiple conditions worthy of tracking in a +* chronograph then the highest priority enum takes precedence +* over the other conditions. So that if something "more interesting" +* starts happening, stop the previous chrono and start a new one. +*/ +if (type > tp->chrono_type) +tcp_chrono_set (tp, type); +} +void tcp_chrono_stop (struct sock *sk,const enum tcp_chrono type);/* This helper is needed, because skb->tcp_tsorted_anchor uses
net/ipv4/tcp_output.c +0 -24
@@ -2878,30 +2878,6 @@ static bool tcp_small_queue_check(struct sock *sk, const struct sk_buff *skb,return false; } -static void tcp_chrono_set (struct tcp_sock *tp,const enum tcp_chrono new) -{ -const u32 now = tcp_jiffies32; -enum tcp_chrono old = tp->chrono_type; - -if (old >TCP_CHRONO_UNSPEC ) - tp->chrono_stat[old -1 ] += now - tp->chrono_start; - tp->chrono_start = now; - tp->chrono_type = new; -} - -void tcp_chrono_start (struct sock *sk,const enum tcp_chrono type) -{ -struct tcp_sock *tp =tcp_sk (sk); - -/* If there are multiple conditions worthy of tracking in a -* chronograph then the highest priority enum takes precedence -* over the other conditions. So that if something "more interesting" -* starts happening, stop the previous chrono and start a new one. -*/ -if (type > tp->chrono_type) -tcp_chrono_set (tp, type); -} -void tcp_chrono_stop (struct sock *sk,const enum tcp_chrono type) {struct tcp_sock *tp =tcp_sk (sk);
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 780/1146 tcp: annotate data-races in tcp_get_info_chrono_stats()
In reply to Greg Kroah-Hartman7.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 267bf3cf9a6f0ffb98b8afd983c1950e835f07c9 ]
tcp_get_timestamping_opt_stats() does not own the socket lock, this is intentional.
It calls tcp_get_info_chrono_stats() while other threads could change chrono fields in tcp_chrono_set().
I do not think we need coherent TCP socket state snapshot in tcp_get_timestamping_opt_stats(), I chose to only add annotations to keep KCSAN happy.
--- include/net/tcp.h | 10 +++++++--- net/ipv4/tcp.c | 14 ++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-)
include/net/tcp.h +7 -3
@@ -2161,10 +2161,14 @@ static inline void tcp_chrono_set(struct tcp_sock *tp, const enum tcp_chrono newconst u32 now = tcp_jiffies32;enum tcp_chrono old = tp->chrono_type; +/* Following WRITE_ONCE()s pair with READ_ONCE()s in +* tcp_get_info_chrono_stats(). +*/ if (old >TCP_CHRONO_UNSPEC ) - tp->chrono_stat[old -1 ] += now - tp->chrono_start; - tp->chrono_start = now; - tp->chrono_type = new; +WRITE_ONCE (tp->chrono_stat[old -1 ], + tp->chrono_stat[old -1 ] + now - tp->chrono_start); +WRITE_ONCE (tp->chrono_start, now); +WRITE_ONCE (tp->chrono_type, new); }static inline void tcp_chrono_start (struct sock *sk,const enum tcp_chrono type)
net/ipv4/tcp.c +10 -4
@@ -4225,12 +4225,18 @@ static void tcp_get_info_chrono_stats(const struct tcp_sock *tp, struct tcp_info *info) {u64 stats[__TCP_CHRONO_MAX], total =0 ; -enum tcp_chrono i; +enum tcp_chrono i, cur; +/* Following READ_ONCE()s pair with WRITE_ONCE()s in tcp_chrono_set(). +* This is because socket lock might not be owned by us at this point. +* This is best effort, tcp_get_timestamping_opt_stats() can +* see wrong values. A real fix would be too costly for TCP fast path. +*/ + cur =READ_ONCE (tp->chrono_type);for (i =TCP_CHRONO_BUSY ; i < __TCP_CHRONO_MAX; ++i) { - stats[i] = tp->chrono_stat[i -1 ]; -if (i == tp->chrono_type) - stats[i] += tcp_jiffies32 - tp->chrono_start; + stats[i] =READ_ONCE (tp->chrono_stat[i -1 ]); +if (i == cur) + stats[i] += tcp_jiffies32 -READ_ONCE (tp->chrono_start); stats[i] *=USEC_PER_SEC /HZ ; total += stats[i]; }
Signature · 1 line
2.53.0
Greg Kroah-Hartman
maintainerPATCH 781/1146 tcp: add data-race annotations around tp->data_segs_out and tp->total_retrans
In reply to Greg Kroah-Hartman7.0-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
@@ -4468,9 +4468,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
@@ -1668,7 +1668,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; }
@@ -3624,7 +3625,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
@@ -4628,7 +4629,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);WRITE_ONCE (req->num_retrans, req->num_retrans +1 );
Signature · 1 line
2.53.0